module Network.IRC.Fun.Bot.Internal.State
( askConfig
, askConfigS
, askBehavior
, askBehaviorS
, askEnv
, askEnvS
, askHandle
, askTimeGetter
, getState
, getStateS
, putState
, modifyState
, getChannelState
, getChans
, putChans
, modifyChans
, addCurrChan
, removeCurrChan
, clearCurrChans
, channelSelected
, botMemberOf
)
where
import Control.Monad (liftM)
import Control.Monad.Trans.RWS
import Data.HashMap.Lazy (HashMap)
import Data.Maybe (isJust)
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
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 }
getChannelState :: Session e s (HashMap String (Bool, Bool))
getChannelState = do
chans <- getChans
let f cstate = (chanTracking cstate, isJust $ chanLogger cstate)
return $ M.map f chans
getChans :: Session e s (HashMap String ChannelState)
getChans = gets bsChannels
putChans :: HashMap String ChannelState -> Session e s ()
putChans chans = modify $ \ s -> s { bsChannels = chans }
modifyChans :: (HashMap String ChannelState -> HashMap String ChannelState)
-> 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