{-# 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