{-# 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) import Data.Maybe (catMaybes) import qualified Data.Text as T 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 (`act` msg) extensions mapM_ putMsg responses