matterhorn-40400.0.0: src/Connection.hs
module Connection where
import Prelude ()
import Prelude.Compat
import Brick.BChan
import Control.Concurrent (forkIO, threadDelay)
import Control.Concurrent.MVar
import Control.Exception (SomeException, catch)
import Control.Monad (void)
import Lens.Micro.Platform
import Network.Mattermost.WebSocket
import Types
connectWebsockets :: ChatState -> IO ()
connectWebsockets st = do
let shunt (Left msg) = writeBChan (st^.csResources.crEventQueue) (WebsocketParseError msg)
shunt (Right e) = writeBChan (st^.csResources.crEventQueue) (WSEvent e)
runWS = mmWithWebSocket (st^.csResources.crSession) shunt $ \ _ -> do
writeBChan (st^.csResources.crEventQueue) WebsocketConnect
waitAndQuit st
void $ forkIO $ runWS `catch` handleTimeout 1 st
`catch` handleError 5 st
waitAndQuit :: ChatState -> IO ()
waitAndQuit st =
void (takeMVar (st^.csResources.crQuitCondition))
handleTimeout :: Int -> ChatState -> MMWebSocketTimeoutException -> IO ()
handleTimeout seconds st _ = reconnectAfter seconds st
handleError :: Int -> ChatState -> SomeException -> IO ()
handleError seconds st _ = reconnectAfter seconds st
reconnectAfter :: Int -> ChatState -> IO ()
reconnectAfter seconds st = do
writeBChan (st^.csResources.crEventQueue) WebsocketDisconnect
threadDelay (seconds * 1000 * 1000)
writeBChan (st^.csResources.crEventQueue) RefreshWebsocketEvent