irc 0.1 → 0.2
raw patch · 2 files changed
+20/−279 lines, 2 filesdep −mtl
Dependencies removed: mtl
Files
- Network/IRC.hs +7/−268
- irc.cabal +13/−11
Network/IRC.hs view
@@ -23,275 +23,14 @@ -- Portability : non-portable (not tested) -- -- library for parsing IRC messages+-- module Network.IRC (- -- * Type Synonyms- Parameter- , ServerName- , UserName- , RealName- , Command-- -- * IRC Datatypes- , Prefix(Server, NickName)- , Message(Message)-- -- * Parsing and Formatting Functions- , parseMessage -- :: String -> Maybe Message- , formatMessage -- :: Message -> String- , translateReply -- :: String -> String-- -- * Parsec Combinators for Parsing IRC messages- , prefix -- :: CharParser st Prefix- , server -- :: CharParser st Prefix- , nickname -- :: CharParser st Prefix- , command -- :: CharParser st Command- , parameter -- :: CharParser st Parameter- , message -- :: CharParser st Message- , crlf -- :: CharParser st ()- , spaces -- :: CharParser st ()+ -- * Parsers+ module Network.IRC.Parser - -- * Other Parser Combinators- , maybeP -- :: GenParser tok st a -> GenParser tok st (Maybe a)- , tokenize -- :: CharParser st a -> CharParser st a- , takeUntil -- :: String -> CharParser st String+ -- * Types+ , module Network.IRC.Types ) where -import Control.Monad-import Data.Maybe-import Text.ParserCombinators.Parsec hiding (spaces)--type Command = String-type Parameter = String-type ServerName = String-type UserName = String-type RealName = String---- | IRC messages are parsed as:--- [ ':' prefix space ] command { space param } crlf-data Message- = -- | IRC Message- Message (Maybe Prefix) Command [Parameter]- deriving (Show)---- | The optional beginning of an IRC messages-data Prefix- = -- | Server Prefix- Server ServerName- | -- | Nickname Prefix- NickName String (Maybe UserName) (Maybe ServerName)- deriving (Show)---- | Parse a String into a Message.-parseMessage :: String -- ^ Message string- -> Maybe Message -- ^ Parsed message-parseMessage = (either (const Nothing) Just) . (parse message "")---- | Take all tokens until one character from a given string is found-takeUntil :: String -> CharParser st String-takeUntil = many1 . noneOf---- | Convert a parser into an optional one that returns a Maybe-maybeP :: GenParser tok st a -> GenParser tok st (Maybe a)-maybeP p = option Nothing (liftM Just p)---- | Convert a parser that consumes all space after it-tokenize :: CharParser st a -> CharParser st a-tokenize p = p >>= \x -> spaces >> return x---- | Consume only spaces tabs or the bell character-spaces :: CharParser st ()-spaces = skipMany1 (oneOf " \t\b")---- | Parse a Prefix-prefix :: CharParser st Prefix-prefix = char ':' >> (try nickname <|> server)---- | Parse a Server prefix-server :: CharParser st Prefix-server = takeUntil " " >>= return . Server---- | Parse a NickName prefix-nickname :: CharParser st Prefix-nickname = do- n <- takeUntil " .!@"- p <- option False (char '.' >> return True)- when p (fail "")- u <- maybeP $ char '!' >> takeUntil " @"- s <- maybeP $ char '@' >> takeUntil " "- return $ NickName n u s---- | Parse a command. Either a string of capital letters, or 3 digits.-command :: CharParser st Command-command = many1 upper- <|> do x <- digit- y <- digit- z <- digit- return [x,y,z]---- | Parse a command parameter.-parameter :: CharParser st Parameter-parameter = (char ':' >> takeUntil "\r\n")- <|> (takeUntil " \r\n")---- | Parse a cr lf-crlf :: CharParser st ()-crlf = string "\r\n" >> return ()---- | Parse a Message-message :: CharParser st Message-message = do- p <- maybeP $ tokenize prefix- c <- command- ps <- many (spaces >> parameter)- crlf <|> eof- return $ Message p c ps---- | Message formatting-formatMessage :: Message -- ^ IRC Message- -> String -- ^ Formatted message-formatMessage m@(Message p c args) =- (maybe "" (\p' -> formatPrefix p' ++ " ") p) ++ c ++ " "- ++ formatArgs args- -formatPrefix :: Prefix -> String-formatPrefix (Server n) = ":" ++ n-formatPrefix (NickName n u s) = ":" ++ n- ++ maybe "" (\u' -> "!" ++ u') u- ++ maybe "" (\s' -> "@" ++ s') s--formatArgs :: [Parameter] -> String-formatArgs = unwords . formatArgs' . filter ((>0) . length)--formatArgs' :: [Parameter] -> [String]-formatArgs' [] = []-formatArgs' l@(p:ps) | elem ' ' p = [":" ++ unwords l]- | otherwise = p : formatArgs' ps---- | Translate a reply into the text version of the reply.--- If no text version is available, the argument is returned.-translateReply :: Command -- ^ Reply- -> String -- ^ Text translation-translateReply r = fromMaybe r $ lookup r replyTable--replyTable :: [(String,String)]-replyTable =- [ ("401","ERR_NOSUCHNICK")- , ("402","ERR_NOSUCHSERVER")- , ("403","ERR_NOSUCHCHANNEL")- , ("404","ERR_CANNOTSENDTOCHAN")- , ("405","ERR_TOOMANYCHANNELS")- , ("406","ERR_WASNOSUCHNICK")- , ("407","ERR_TOOMANYTARGETS")- , ("409","ERR_NOORIGIN")- , ("411","ERR_NORECIPIENT")- , ("412","ERR_NOTEXTTOSEND")- , ("413","ERR_NOTOPLEVEL")- , ("414","ERR_WILDTOPLEVEL")- , ("421","ERR_UNKNOWNCOMMAND")- , ("422","ERR_NOMOTD")- , ("423","ERR_NOADMININFO")- , ("424","ERR_FILEERROR")- , ("431","ERR_NONICKNAMEGIVEN")- , ("432","ERR_ERRONEUSNICKNAME")- , ("433","ERR_NICKNAMEINUSE")- , ("436","ERR_NICKCOLLISION")- , ("441","ERR_USERNOTINCHANNEL")- , ("442","ERR_NOTONCHANNEL")- , ("443","ERR_USERONCHANNEL")- , ("444","ERR_NOLOGIN")- , ("445","ERR_SUMMONDISABLED")- , ("446","ERR_USERSDISABLED")- , ("451","ERR_NOTREGISTERED")- , ("461","ERR_NEEDMOREPARAMS")- , ("462","ERR_ALREADYREGISTRED")- , ("463","ERR_NOPERMFORHOST")- , ("464","ERR_PASSWDMISMATCH")- , ("465","ERR_YOUREBANNEDCREEP")- , ("467","ERR_KEYSET")- , ("471","ERR_CHANNELISFULL")- , ("472","ERR_UNKNOWNMODE")- , ("473","ERR_INVITEONLYCHAN")- , ("474","ERR_BANNEDFROMCHAN")- , ("475","ERR_BADCHANNELKEY")- , ("481","ERR_NOPRIVILEGES")- , ("482","ERR_CHANOPRIVSNEEDED")- , ("483","ERR_CANTKILLSERVER")- , ("491","ERR_NOOPERHOST")- , ("501","ERR_UMODEUNKNOWNFLAG")- , ("502","ERR_USERSDONTMATCH")- , ("300","RPL_NONE")- , ("302","RPL_USERHOST")- , ("303","RPL_ISON")- , ("301","RPL_AWAY")- , ("305","RPL_UNAWAY")- , ("306","RPL_NOWAWAY")- , ("311","RPL_WHOISUSER")- , ("312","RPL_WHOISSERVER")- , ("313","RPL_WHOISOPERATOR")- , ("317","RPL_WHOISIDLE")- , ("318","RPL_ENDOFWHOIS")- , ("319","RPL_WHOISCHANNELS")- , ("314","RPL_WHOWASUSER")- , ("369","RPL_ENDOFWHOWAS")- , ("321","RPL_LISTSTART")- , ("322","RPL_LIST")- , ("323","RPL_LISTEND")- , ("324","RPL_CHANNELMODEIS")- , ("331","RPL_NOTOPIC")- , ("332","RPL_TOPIC")- , ("341","RPL_INVITING")- , ("342","RPL_SUMMONING")- , ("351","RPL_VERSION")- , ("352","RPL_WHOREPLY")- , ("315","RPL_ENDOFWHO")- , ("353","RPL_NAMREPLY")- , ("366","RPL_ENDOFNAMES")- , ("364","RPL_LINKS")- , ("365","RPL_ENDOFLINKS")- , ("367","RPL_BANLIST")- , ("368","RPL_ENDOFBANLIST")- , ("371","RPL_INFO")- , ("374","RPL_ENDOFINFO")- , ("375","RPL_MOTDSTART")- , ("372","RPL_MOTD")- , ("376","RPL_ENDOFMOTD")- , ("381","RPL_YOUREOPER")- , ("382","RPL_REHASHING")- , ("391","RPL_TIME")- , ("392","RPL_USERSSTART")- , ("393","RPL_USERS")- , ("394","RPL_ENDOFUSERS")- , ("395","RPL_NOUSERS")- , ("200","RPL_TRACELINK")- , ("201","RPL_TRACECONNECTING")- , ("202","RPL_TRACEHANDSHAKE")- , ("203","RPL_TRACEUNKNOWN")- , ("204","RPL_TRACEOPERATOR")- , ("205","RPL_TRACEUSER")- , ("206","RPL_TRACESERVER")- , ("208","RPL_TRACENEWTYPE")- , ("261","RPL_TRACELOG")- , ("211","RPL_STATSLINKINFO")- , ("212","RPL_STATSCOMMANDS")- , ("213","RPL_STATSCLINE")- , ("214","RPL_STATSNLINE")- , ("215","RPL_STATSILINE")- , ("216","RPL_STATSKLINE")- , ("218","RPL_STATSYLINE")- , ("219","RPL_ENDOFSTATS")- , ("241","RPL_STATSLLINE")- , ("242","RPL_STATSUPTIME")- , ("243","RPL_STATSOLINE")- , ("244","RPL_STATSHLINE")- , ("221","RPL_UMODEIS")- , ("251","RPL_LUSERCLIENT")- , ("252","RPL_LUSEROP")- , ("253","RPL_LUSERUNKNOWN")- , ("254","RPL_LUSERCHANNELS")- , ("255","RPL_LUSERME")- , ("256","RPL_ADMINME")- , ("257","RPL_ADMINLOC1")- , ("258","RPL_ADMINLOC2")- , ("259","RPL_ADMINEMAIL")- ]-+import Network.IRC.Parser+import Network.IRC.Types
irc.cabal view
@@ -1,11 +1,13 @@-Name: irc-Synopsis: A small library for parsing IRC messages-Version: 0.1-Category: Data-License: LGPL-License-File: COPYING-Author: Trevor Elliott-Maintainer: trevor@geekgateway.com-Extra-source-files: COPYING.LESSER-Build-depends: base, mtl, parsec >= 2.0-Exposed-Modules: Network.IRC+name: irc+synopsis: A small library for parsing IRC messages.+description: A set of combinators and types for parsing IRC messages.+version: 0.2+category: Data+license: LGPL+license-file: COPYING+author: Trevor Elliott+maintainer: trevor@geekgateway.com+extra-source-files: COPYING.LESSER+build-depends: base, parsec >= 2.0+exposed-Modules: Network.IRC+ghc-options: -Wall -fglasgow-exts