module Network.IRC.Fun.Bot.Internal.State
( askConfig
, askConfigS
, askBehavior
, askBehaviorS
, askEnv
, askEnvS
, askHandle
, askTimeGetter
, getState
, getStateS
, putState
, modifyState
, getChannelState
, getChans
, putChans
, modifyChans
)
where
import Control.Monad.Trans.RWS
import Data.HashMap.Lazy (HashMap)
import qualified Data.HashMap.Lazy as M
import Data.Maybe (isJust)
import Data.Time.Clock (UTCTime)
import Network.IRC.Fun.Bot.Internal.Types
import Network.IRC.Fun.Client.IO (Handle)
askConfig :: Session e s Config
askConfig = asks config
askConfigS :: (Config -> a) -> Session e s a
askConfigS f = asks $ f . config
askBehavior :: Session e s (Behavior e s)
askBehavior = asks behavior
askBehaviorS :: (Behavior e s -> a) -> Session e s a
askBehaviorS f = asks $ f . behavior
askEnv :: Session e s e
askEnv = asks custom
askEnvS :: (e -> a) -> Session e s a
askEnvS f = asks $ f . custom
askHandle :: Session e s Handle
askHandle = asks handle
askTimeGetter :: Session e s (IO (UTCTime, String))
askTimeGetter = asks getTime
getState :: Session e s s
getState = gets public
getStateS :: (s -> a) -> Session e s a
getStateS f = gets $ f . public
putState :: s -> Session e s ()
putState st = modify $ \ old -> old { public = st }
modifyState :: (s -> s) -> Session e s ()
modifyState f =
modify $ \ old@(BotState { public = st }) -> old { public = 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 chanstate
putChans :: HashMap String ChannelState -> Session e s ()
putChans chans = modify $ \ s -> s { chanstate = chans }
modifyChans :: (HashMap String ChannelState -> HashMap String ChannelState)
-> Session e s ()
modifyChans f = modify $ \ s -> s { chanstate = f $ chanstate s }