marvin-0.0.5: src/Marvin/Adapter.hs
{-|
Module : $Header$
Description : The adapter interface
Copyright : (c) Justus Adam, 2016
License : BSD3
Maintainer : dev@justus.science
Stability : experimental
Portability : POSIX
-}
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Marvin.Adapter
( Event(..)
, RunWithAdapter, EventHandler, InitEventHandler, RunnerM
, IsAdapter(..)
, liftAdapterAction
) where
import Control.Monad.IO.Class
import Control.Monad.Logger
import qualified Data.Configurator.Types as C
import qualified Data.Text.Lazy as L
import Marvin.Internal.Types
-- | Representation for the types of events which can occur
data Event
= MessageEvent Message
| ChannelJoinEvent User Channel
| ChannelLeaveEvent User Channel
| TopicChangeEvent L.Text Channel
type EventHandler a = Event -> IO ()
type InitEventHandler a = a -> IO (EventHandler a)
type RunWithAdapter a = C.Config -> InitEventHandler a -> RunnerM ()
-- | Basic functionality required of any adapter
class IsAdapter a where
-- | Used for scoping config and logging
adapterId :: AdapterId a
-- | Post a message to a channel given the internal channel identifier
messageChannel :: a -> Channel -> L.Text -> RunnerM ()
-- | Initialize and run the bot
runWithAdapter :: RunWithAdapter a
-- | Resolve a username given the internal user identifier
getUsername :: a -> User -> RunnerM L.Text
-- | Resolve the human readable name for a channel given the internal channel identifier
getChannelName :: a -> Channel -> RunnerM L.Text
-- | Resolve to the internal channel identifier given a human readable name
resolveChannel :: a -> L.Text -> RunnerM (Maybe Channel)
liftAdapterAction :: MonadIO m => RunnerM a -> m a
liftAdapterAction = liftIO . runStderrLoggingT