module Network.FastIRC.Messages
(
Message(..),
messageParser,
Command(..),
commandParser
)
where
import qualified Data.ByteString.Char8 as B
import Control.Applicative
import Data.Attoparsec.Char8 as P hiding (many)
import Network.FastIRC.ServerSet
import Network.FastIRC.Users
import Network.FastIRC.Utils
data Message =
Message {
msgOrigin :: !(Maybe UserSpec),
msgCommand :: !Command
}
deriving (Eq, Show)
data Command
= StringCmd B.ByteString [B.ByteString]
| NumericCmd Integer [B.ByteString]
deriving (Eq, Show)
commandParser :: Parser Command
commandParser =
try numCmd <|> stringCmd
where
lastArg :: Parser B.ByteString
lastArg =
char ':' *>
P.takeWhile isMessageChar
cmdArgs :: Parser [B.ByteString]
cmdArgs =
many $ do
skipMany1 (char ' ')
try lastArg <|> takeWhile1 isIRCTokChar
stringCmd :: Parser Command
stringCmd = StringCmd <$> takeWhile1 isCommandChar <*> cmdArgs
numCmd :: Parser Command
numCmd = NumericCmd <$> decimal <*> cmdArgs
messageParser :: ServerSet -> Parser Message
messageParser servers =
Message <$> option Nothing (Just <$> try userSpec)
<*> commandParser
where
userSpec :: Parser UserSpec
userSpec = char ':' *> userParser servers <* skipMany1 (char ' ')