module Discord.Internal.Gateway
( DiscordHandleGateway
, DiscordHandleCache
, GatewayException(..)
, Cache(..)
, startCacheThread
, startGatewayThread
, module Discord.Internal.Types
) where
import Prelude hiding (log)
import Control.Concurrent.Chan (newChan, dupChan, Chan)
import Control.Concurrent (forkIO, ThreadId, newEmptyMVar, MVar)
import qualified Data.Text as T
import Discord.Internal.Types (Auth, Event, GatewaySendable)
import Discord.Internal.Gateway.EventLoop (connectionLoop, DiscordHandleGateway, GatewayException(..))
import Discord.Internal.Gateway.Cache (cacheLoop, Cache(..), DiscordHandleCache)
startCacheThread :: Chan T.Text -> IO (DiscordHandleCache, ThreadId)
startCacheThread log = do
events <- newChan :: IO (Chan (Either GatewayException Event))
cache <- newEmptyMVar :: IO (MVar (Either (Cache, GatewayException) Cache))
tid <- forkIO $ cacheLoop (events, cache) log
pure ((events, cache), tid)
startGatewayThread :: Auth -> DiscordHandleCache -> Chan T.Text -> IO (DiscordHandleGateway, ThreadId)
startGatewayThread auth (_events, _) log = do
events <- dupChan _events
sends <- newChan
tid <- forkIO $ connectionLoop auth (events, sends) log
pure ((events, sends), tid)