hask-irc/hask-irc-core/Network/IRC/Handlers/Core.hs

65 lines
2.6 KiB
Haskell
Raw Normal View History

module Network.IRC.Handlers.Core (coreMsgHandlerMakers) where
2014-05-04 02:57:43 +05:30
2014-05-10 21:45:16 +05:30
import ClassyPrelude
import Control.Monad.Reader (ask)
import Data.Convertible (convert)
import Data.Time (addUTCTime)
2014-05-04 02:57:43 +05:30
import Network.IRC.Types
2014-05-22 20:59:02 +05:30
import Network.IRC.Util
2014-05-04 02:57:43 +05:30
coreMsgHandlerMakers :: Map MsgHandlerName MsgHandlerMaker
coreMsgHandlerMakers = mapFromList [
("pingpong", pingPongMsgHandlerMaker)
, ("help", helpMsgHandlerMaker)
]
pingPongMsgHandlerMaker :: MsgHandlerMaker
pingPongMsgHandlerMaker = MsgHandlerMaker "pingpong" go
2014-05-22 20:59:02 +05:30
where
go _ _ = do
state <- io $ getCurrentTime >>= newIORef
return $ newMsgHandler { onMessage = pingPong state }
helpMsgHandlerMaker :: MsgHandlerMaker
helpMsgHandlerMaker = MsgHandlerMaker "help" go
where
go _ _ = return $ newMsgHandler { onMessage = help
, handlerHelp = return $ singletonMap "!help" helpMsg }
2014-05-22 20:59:02 +05:30
helpMsg = "Get help. !help or !help <command>"
2014-05-04 02:57:43 +05:30
pingPong :: MonadMsgHandler m => IORef UTCTime -> Message -> m [Message]
pingPong state Message { .. }
| Just (PingMsg msg) <- fromMessage message =
io (atomicWriteIORef state msgTime) >> map singleton (newMessage . PongCmd $ msg)
| Just (PongMsg _) <- fromMessage message =
io (atomicWriteIORef state msgTime) >> return []
| Just IdleMsg <- fromMessage message
, even (convert msgTime :: Int) = do
2014-05-22 20:59:02 +05:30
BotConfig { .. } <- ask
let limit = fromIntegral $ botTimeout `div` 2
lastComm <- io $ readIORef state
if addUTCTime limit lastComm < msgTime
then map singleton . newMessage . PingCmd . pack . formatTime defaultTimeLocale "%s" $ msgTime
else return []
| otherwise = return []
help :: MonadMsgHandler m => Message -> m [Message]
help Message { .. } = case fromMessage message of
Just (ChannelMsg _ msg)
| "!help" == clean msg -> do
BotConfig { .. } <- ask
let commands = concatMap mapKeys . mapValues $ msgHandlerInfo
mapM (newMessage . ChannelMsgReply) [
"I know these commands: " ++ unwords commands
, "Type !help <command> to know more about any command"
]
| "!help" `isPrefixOf` msg -> do
BotConfig { .. } <- ask
let command = dropWhile (== '!') . clean . unwords . drop 1 . words $ msg
let mHelp = find ((\c -> c == command || c == cons '!' command) . fst)
. concatMap mapToList . mapValues $ msgHandlerInfo
map singleton . newMessage . ChannelMsgReply
$ maybe ("No such command found: " ++ command) snd mHelp
2014-06-08 07:12:33 +05:30
_ -> return []