content: {-# LANGUAGE OverloadedStrings #-}
  
  import qualified Data.Text as T
  import qualified Data.Text.IO as TIO
  
  import           Control.Monad (forever)
  import           Control.Concurrent      -- Chans and Threads
  
  import           Discord.Types
  import qualified Discord.Requests as R
  
  import           Discord.Internal.Rest (startRestThread, writeRestCall, RestCallInternalException(..))
  
  import ExampleUtils (getToken, getGuildId)
  
  {-
  Peel back the `runDiscord` abstraction
  
  Send an HTTP restcall without logging into the gateway
  -}
  main :: IO ()
  main = do
    tok <- getToken
    testserverid <- getGuildId
  
    -- SETUP LOG
    printQueue <- newChan :: IO (Chan T.Text)
    printThreadId <- forkIO $ forever $ readChan printQueue >>= TIO.putStrLn
  
    -- START REST LOOP THREAD
    (restChan, restThreadId) <- startRestThread (Auth tok) printQueue
  
    -- a rest call to get the channels in which we will post a message
    Right cs <- writeRestCall restChan (R.GetGuildChannels testserverid)
  
    -- ONE REST CALL
    resp <- writeRestCall restChan (R.CreateMessage (channelId (head $ filter isTextChannel cs)) "Message")
    case resp of
      Right msg -> print $ "created message: " <> show msg
      Left (RestCallInternalErrorCode _code _status _body) -> print "4XX style http error code"
      Left (RestCallInternalHttpException _err) -> print "http exception (likely no connection)"
      Left (RestCallInternalNoParse _err _jsondata) -> print "can't parse return JSON"
  
    -- CLEANUP
    killThread printThreadId
    killThread restThreadId
    where
      isTextChannel :: Channel -> Bool
      isTextChannel ChannelText {} = True
      isTextChannel _ = False
  