module Network.IRC.Fun.Bot.Internal.State
( askConfig
, askConfigS
, askBehavior
, askBehaviorS
, askEnv
, askEnvS
, askHandle
, askTimeGetter
, askMinuteGetter
, getMinutes
, getState
, getStateS
, putState
, modifyState
, getHistory
, stateToInfo
, getChanInfo
, getChans
, putChans
, modifyChans
, addCurrChan
, removeCurrChan
, clearCurrChans
, channelSelected
, botMemberOf
)
where
import Control.Monad (liftM)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.RWS
import Data.HashMap.Lazy (HashMap)
import Data.Int (Int64)
import Data.Maybe (isJust)
import Data.Sequence (Seq)
import Data.Time.Clock (UTCTime)
import Network.IRC.Fun.Bot.Internal.Types
import Network.IRC.Fun.Client.IO (Handle)
import qualified Data.HashMap.Lazy as M
import qualified Data.HashSet as S
askConfig :: Session e s Config
askConfig = asks beConfig
askConfigS :: (Config -> a) -> Session e s a
askConfigS f = asks $ f . beConfig
askBehavior :: Session e s (Behavior e s)
askBehavior = asks beBehavior
askBehaviorS :: (Behavior e s -> a) -> Session e s a
askBehaviorS f = asks $ f . beBehavior
askEnv :: Session e s e
askEnv = asks beCustom
askEnvS :: (e -> a) -> Session e s a
askEnvS f = asks $ f . beCustom
askHandle :: Session e s Handle
askHandle = asks beHandle
askTimeGetter :: Session e s (IO (UTCTime, String))
askTimeGetter = asks beGetTime
askMinuteGetter :: Session e s (IO Int64)
askMinuteGetter = asks beGetMinute
getMinutes :: Session e s Int64
getMinutes = do
getMin <- askMinuteGetter
liftIO getMin
getState :: Session e s s
getState = gets bsPublic
getStateS :: (s -> a) -> Session e s a
getStateS f = gets $ f . bsPublic
putState :: s -> Session e s ()
putState st = modify $ \ old -> old { bsPublic = st }
modifyState :: (s -> s) -> Session e s ()
modifyState f =
modify $ \ old@(BotState { bsPublic = st }) -> old { bsPublic = f st }
getHistory :: Session e s (HashMap String (Seq HistoryLine))
getHistory = gets bsHistory
stateToInfo :: ChanState -> ChanInfo
stateToInfo (ChanState track count mlogger hls) =
ChanInfo track count (isJust mlogger) hls
getChanInfo :: Session e s (HashMap String ChanInfo)
getChanInfo = liftM (M.map stateToInfo) getChans
getChans :: Session e s (HashMap String ChanState)
getChans = gets bsChannels
putChans :: HashMap String ChanState -> Session e s ()
putChans chans = modify $ \ s -> s { bsChannels = chans }
modifyChans :: (HashMap String ChanState -> HashMap String ChanState)
-> Session e s ()
modifyChans f = modify $ \ s -> s { bsChannels = f $ bsChannels s }
addCurrChan :: String -> Session e s ()
addCurrChan chan =
let f = S.insert chan
in modify $ \ s -> s { bsCurrChans = f $ bsCurrChans s }
removeCurrChan :: String -> Session e s ()
removeCurrChan chan =
let f = S.delete chan
in modify $ \ s -> s { bsCurrChans = f $ bsCurrChans s }
clearCurrChans :: Session e s ()
clearCurrChans = modify $ \ s -> s { bsCurrChans = S.empty }
channelSelected :: String -> Session e s Bool
channelSelected chan = liftM (chan `S.member`) $ gets bsSelChans
botMemberOf :: String -> Session e s Bool
botMemberOf chan = liftM (chan `S.member`) $ gets bsCurrChans