replicant-0.1.0.0: src/Replicant/Plugins/Base.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE Rank2Types #-}
module Replicant.Plugins.Base
( module Replicant.Base
-- re-exports
, Example(..)
, Handler
, H
, Plugin(..)
, botHandlers
, mkHandler
, redis
-- locals
, getBot
, getMessage
, getRoomByName
, getRoomMembers
, getSender
, reply
, sendToRoom
, sendToUser
, sendToUserId
, whitespace
, word
) where
import Replicant.Base
import Replicant.Bot (redis)
import Replicant.Plugin (Adapter, BotSpec(..), Example(..), H, Handler, Plugin(..), botHandlers, mkHandler)
import qualified Replicant.Plugin as P
import Control.Monad.Reader (lift)
import Data.Attoparsec.Text
import qualified Data.Text as T
whitespace :: Parser ()
whitespace = void . many . satisfy $ inClass [' ', '\t', '\n']
word :: Parser Text
word = T.pack <$> many' letter
getMessage :: Monad m => H m Message
getMessage = asks P.handlerMessage
getBot :: Monad m => H m (BotSpec m)
getBot = asks P.handlerBot
getSender :: Monad m => H m User
getSender = messageUser <$> getMessage
reply :: Monad m => Text -> H m ()
reply text = do
BotSpec{..} <- getBot
Message{..} <- getMessage
if messageDirect
then sendToUser messageUser text
else sendToRoom messageRoom text
-- Lifted versions of handler helper functions
sendToUser :: Monad m => User -> Text -> H m ()
sendToUser = liftH2 P.sendToUser
sendToUserId :: Monad m => UserId -> Text -> H m ()
sendToUserId = liftH2 P.sendToUserId
sendToRoom :: Monad m => Room -> Text -> H m ()
sendToRoom = liftH2 P.sendToRoom
getRoomByName :: Monad m => Text -> H m (Maybe Room)
getRoomByName = liftH P.getRoomByName
getRoomMembers :: Monad m => Room -> H m [User]
getRoomMembers = liftH P.getRoomMembers
liftH :: Monad m => (Adapter m -> Bot -> a -> m r) -> a -> H m r
liftH h a = do
BotSpec{..} <- getBot
lift $ h botAdapter botRecord a
liftH2 :: Monad m => (Adapter m -> Bot -> a -> b -> m r) -> a -> b -> H m r
liftH2 h a b = do
BotSpec{..} <- getBot
lift $ h botAdapter botRecord a b