packages feed

replicant-0.1.0.0: app/Main.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Main where

import Replicant
import qualified Replicant.Adapters.CLI as CLI

import Control.Monad        (void)
import Control.Monad.Except (throwError)
import Control.Monad.Reader (asks, liftIO)
import qualified Database.Redis.Namespace as R

type B = ReplicantT AppError AppConf IO

data AppConf = AppConf
  { connection :: R.Connection
  , working    :: Supervisor B BotId
  }

data AppError = RedisError | OtherError deriving Show

instance Replicant AppError B where
  redisPool      = asks connection
  redisNamespace = return "replicant"
  redisError _   = throwError RedisError

runB :: AppConf -> B a -> IO (Either AppError a)
runB = runReplicantT

bot :: Bot
bot = Bot
  { botId     = "1"
  , botName   = "repl"
  , botIcon   = "^_^"
  , botToken  = ""
  , botUserId = "1"
  }

plugins :: [Plugin B]
plugins = [divide, echo, help, score]

mkConf :: IO AppConf
mkConf = AppConf <$> R.connect R.defaultConnectInfo <*> newSupervisor

main :: IO ()
main = do
  conf <- mkConf
  result <- runB conf $ do
    startBot (working conf) (liftIO . print) (buildBot CLI.adapter plugins bot)
    CLI.wait
  either (error . show) return result