From c1662ba7b982a8502dc9f32031b7cb518df7f60e Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Sun, 16 May 2010 00:01:00 +0200 Subject: Rewrote nearly everything! * Rewrote the whole architecture to achieve extreme modularity * Added the ability to build a multiprotocol bot * Added cabal integration * Added configuration handling the XMonad style * Added configuration in ~/.hsbot * Refactored many many named and functions * Refactored data structures * Cleaned a big bunch of stuff --- Hsbot/Irc/Message.hs | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Hsbot/Irc/Message.hs (limited to 'Hsbot/Irc/Message.hs') diff --git a/Hsbot/Irc/Message.hs b/Hsbot/Irc/Message.hs new file mode 100644 index 0000000..e92a9d0 --- /dev/null +++ b/Hsbot/Irc/Message.hs @@ -0,0 +1,73 @@ +module Hsbot.Irc.Message + ( IrcBotMsg (..) + , IrcCmd (..) + , IrcMsg (..) + , emptyIrcMsg + , parseIrcMsg + , serializeIrcMsg + ) where + +import Control.Monad.Identity +import Text.Parsec + +-- | An IRC message +data IrcMsg = IrcMsg + { ircMsgPrefix :: Maybe String -- the message prefix + , ircMsgCommand :: String -- the message command + , ircMsgParameters :: [String] -- the message parameters + } deriving (Show) + +emptyIrcMsg :: IrcMsg +emptyIrcMsg = IrcMsg Nothing "" [] + +-- | An internal command +data IrcCmd = IrcCmd + { ircCmdCmd :: String -- the internal command + , ircCmdFrom :: String -- who issues it + , ircCmdTo :: String -- who it is destinated to + , ircCmdMsg :: String -- the message to be transfered + , ircCmdBotMsg :: IrcMsg -- An IrcMsg attached to the command + } deriving (Show) + +data IrcBotMsg = InIrcMsg IrcMsg | OutIrcMsg IrcMsg | IntIrcCmd IrcCmd deriving (Show) + +-- | Parses an IrcInput +parseIrcMsg :: String -> Either ParseError IrcMsg +parseIrcMsg line = parse pMsg "" line + +pMsg :: ParsecT String u Identity IrcMsg +pMsg = do + pfx <- optionMaybe pPrefix + cmd <- pCommand + params <- many (char ' ' >> (pLongParam <|> pShortParam)) + _ <- char '\r' + --eof + return $ IrcMsg pfx cmd params + +pPrefix :: ParsecT String u Identity [Char] +pPrefix = do + _ <- char ':' + pfx <- many1 (noneOf " ") + _ <- space + return pfx + +pCommand :: ParsecT String u Identity [Char] +pCommand = count 3 digit <|> many1 upper + +pLongParam :: ParsecT String u Identity [Char] +pLongParam = char ':' >> (many1 (noneOf "\r")) + +pShortParam :: ParsecT String u Identity [Char] +pShortParam = many1 (noneOf " \r") + +-- | Serialize an IRC message to a string. +serializeIrcMsg :: IrcMsg -> String +serializeIrcMsg (IrcMsg pfx cmd params) = pfxStr ++ cmd ++ paramStr + where pfxStr = case pfx of + Nothing -> "" + Just pfx' -> ":" ++ pfx' ++ " " + paramStr = concat (map paramToStr (init params) + ++ [lastParamToStr (last params)]) + paramToStr p = " " ++ p + lastParamToStr p = " :" ++ p + -- cgit v1.2.3