30 lines
911 B
Haskell
30 lines
911 B
Haskell
|
{-# LANGUAGE OverloadedStrings #-}
|
||
|
{-# LANGUAGE Safe #-}
|
||
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||
|
{-# LANGUAGE TypeFamilies #-}
|
||
|
|
||
|
module Bot.Lib where
|
||
|
|
||
|
import Bot.DSL
|
||
|
import Bot.Extension
|
||
|
import Bot.Log
|
||
|
import Control.Monad (forever)
|
||
|
import Control.Monad.Catch (MonadCatch, SomeException, catch, try)
|
||
|
import Data.Maybe (catMaybes)
|
||
|
import qualified Data.Text as T
|
||
|
import GHC.Stack
|
||
|
|
||
|
tshow :: Show a => a -> T.Text
|
||
|
tshow = T.pack . show
|
||
|
|
||
|
mainLoop :: forall m. (MonadCatch m, MonadBot m) => [Extension (Meta m)] -> m ()
|
||
|
mainLoop extensions = forever $ catch go handleFail
|
||
|
where
|
||
|
handleFail :: SomeException -> m ()
|
||
|
handleFail e = logError $ tshow e
|
||
|
go :: m ()
|
||
|
go = do
|
||
|
msg <- recvMsg
|
||
|
responses <- catMaybes <$> mapM (\ext -> (act ext) msg) extensions
|
||
|
mapM_ putMsg responses
|