pipes-irc-server/src/Pipes/IRC/Message/Types.hs

558 lines
15 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module Pipes.IRC.Message.Types where
import qualified Data.ByteString as B
data IrcMessage =
IrcMessage { prefix :: Maybe MsgPrefix
, command :: MsgCommand
, params :: [IrcParam]
} deriving (Show, Eq)
type MsgPrefix = Either ServerName NickName
type ServerName = B.ByteString
data NickName =
NickName { nick :: B.ByteString
, user :: Maybe B.ByteString
, host :: Maybe B.ByteString
} deriving (Show, Eq)
type MsgCommand = Either IrcCommand IrcReply
type IrcParam = B.ByteString
data IrcCommand = PASS
| NICK
| USER
| SERVER
| OPER
| QUIT
| SQUIT
| JOIN
| PART
| MODE
| TOPIC
| NAMES
| LIST
| INVITE
| KICK
| VERSION
| STATS
| LINKS
| TIME
| CONNECT
| TRACE
| ADMIN
| INFO
| PRIVMSG
| NOTICE
| WHO
| WHOIS
| WHOWAS
| KILL
| PING
| PONG
| ERROR
| AWAY
| REHASH
| RESTART
| SUMMON
| USERS
| WALLOPS
| USERHOST
| ISON
| Unknown B.ByteString
deriving (Show, Eq, Ord)
data IrcReply = IrcReply
{ replyCode :: !Int
, replyName :: !B.ByteString
} deriving (Show)
instance Eq IrcReply where
IrcReply { replyCode = a } == IrcReply { replyCode = b } = a == b
instance Ord IrcReply where
IrcReply { replyCode = a } `compare` IrcReply { replyCode = b } =
a `compare` b
instance Enum IrcReply where
fromEnum = replyCode
toEnum 200 = rpl_tracelink
toEnum 201 = rpl_traceconnecting
toEnum 202 = rpl_tracehandshake
toEnum 203 = rpl_traceunknown
toEnum 204 = rpl_traceoperator
toEnum 205 = rpl_traceuser
toEnum 206 = rpl_traceserver
toEnum 208 = rpl_tracenewtype
toEnum 211 = rpl_statslinkinfo
toEnum 212 = rpl_statscommands
toEnum 213 = rpl_statscline
toEnum 214 = rpl_statsnline
toEnum 215 = rpl_statsiline
toEnum 216 = rpl_statskline
toEnum 218 = rpl_statsyline
toEnum 219 = rpl_endofstats
toEnum 221 = rpl_umodeis
toEnum 241 = rpl_statslline
toEnum 242 = rpl_statsuptime
toEnum 243 = rpl_statsoline
toEnum 244 = rpl_statshline
toEnum 251 = rpl_luserclient
toEnum 252 = rpl_luserop
toEnum 253 = rpl_luserunknown
toEnum 254 = rpl_luserchannels
toEnum 255 = rpl_luserme
toEnum 256 = rpl_adminme
toEnum 257 = rpl_adminloc1
toEnum 258 = rpl_adminloc2
toEnum 259 = rpl_adminemail
toEnum 261 = rpl_tracelog
toEnum 300 = rpl_none
toEnum 301 = rpl_away
toEnum 302 = rpl_userhost
toEnum 303 = rpl_ison
toEnum 305 = rpl_unaway
toEnum 306 = rpl_nowaway
toEnum 311 = rpl_whoisuser
toEnum 312 = rpl_whoisserver
toEnum 313 = rpl_whoisoperator
toEnum 314 = rpl_whowasuser
toEnum 315 = rpl_endofwho
toEnum 317 = rpl_whoisidle
toEnum 318 = rpl_endofwhois
toEnum 319 = rpl_whoischannels
toEnum 321 = rpl_liststart
toEnum 322 = rpl_list
toEnum 323 = rpl_listend
toEnum 324 = rpl_channelmodeis
toEnum 331 = rpl_notopic
toEnum 332 = rpl_topic
toEnum 341 = rpl_inviting
toEnum 342 = rpl_summoning
toEnum 351 = rpl_version
toEnum 352 = rpl_whoreply
toEnum 353 = rpl_namreply
toEnum 364 = rpl_links
toEnum 365 = rpl_endoflinks
toEnum 366 = rpl_endofnames
toEnum 367 = rpl_banlist
toEnum 368 = rpl_endofbanlist
toEnum 369 = rpl_endofwhowas
toEnum 371 = rpl_info
toEnum 374 = rpl_endofinfo
toEnum 375 = rpl_motdstart
toEnum 376 = rpl_endofmotd
toEnum 381 = rpl_youreoper
toEnum 382 = rpl_rehashing
toEnum 391 = rpl_time
toEnum 392 = rpl_usersstart
toEnum 393 = rpl_users
toEnum 394 = rpl_endofusers
toEnum 395 = rpl_nousers
toEnum 401 = err_nosuchnick
toEnum 402 = err_nosuchserver
toEnum 403 = err_nosuchchannel
toEnum 404 = err_cannotsendtochan
toEnum 405 = err_toomanychannels
toEnum 406 = err_wasnosuchnick
toEnum 407 = err_toomanytargets
toEnum 409 = err_noorigin
toEnum 411 = err_norecipient
toEnum 412 = err_notexttosend
toEnum 413 = err_notoplevel
toEnum 414 = err_wildtoplevel
toEnum 421 = err_unknowncommand
toEnum 422 = err_nomotd
toEnum 423 = err_noadmininfo
toEnum 424 = err_fileerror
toEnum 431 = err_nonicknamegiven
toEnum 432 = err_erroneusnickname
toEnum 433 = err_nicknameinuse
toEnum 436 = err_nickcollision
toEnum 441 = err_usernotinchannel
toEnum 442 = err_notonchannel
toEnum 443 = err_useronchannel
toEnum 444 = err_nologin
toEnum 445 = err_summondisabled
toEnum 446 = err_usersdisabled
toEnum 451 = err_notregistered
toEnum 461 = err_needmoreparams
toEnum 462 = err_alreadyregistered
toEnum 463 = err_nopermforhost
toEnum 464 = err_passwdmismatch
toEnum 465 = err_yourebannedcreep
toEnum 467 = err_keyset
toEnum 471 = err_channelisfull
toEnum 472 = err_unknownmode
toEnum 473 = err_inviteonlychan
toEnum 474 = err_bannedfromchan
toEnum 475 = err_badchannelkey
toEnum 481 = err_noprivileges
toEnum 482 = err_chanoprivsneeded
toEnum 483 = err_cantkillserver
toEnum 491 = err_nooperhost
toEnum 501 = err_umodeunknownflag
toEnum 502 = err_usersdontmatch
toEnum c = mkIrcReply c B.empty
mkIrcReply :: Int -> B.ByteString -> IrcReply
mkIrcReply = IrcReply
rpl_tracelink :: IrcReply
rpl_tracelink = mkIrcReply 200 "RPL_TRACELINK"
rpl_traceconnecting :: IrcReply
rpl_traceconnecting = mkIrcReply 201 "RPL_TRACECONNECTING"
rpl_tracehandshake :: IrcReply
rpl_tracehandshake = mkIrcReply 202 "RPL_TRACEHANDSHAKE"
rpl_traceunknown :: IrcReply
rpl_traceunknown = mkIrcReply 203 "RPL_TRACEUNKNOWN"
rpl_traceoperator :: IrcReply
rpl_traceoperator = mkIrcReply 204 "RPL_TRACEOPERATOR"
rpl_traceuser :: IrcReply
rpl_traceuser = mkIrcReply 205 "RPL_TRACEUSER"
rpl_traceserver :: IrcReply
rpl_traceserver = mkIrcReply 206 "RPL_TRACESERVER"
rpl_tracenewtype :: IrcReply
rpl_tracenewtype = mkIrcReply 208 "RPL_TRACENEWTYPE"
rpl_statslinkinfo :: IrcReply
rpl_statslinkinfo = mkIrcReply 211 "RPL_STATSLINKINFO"
rpl_statscommands :: IrcReply
rpl_statscommands = mkIrcReply 212 "RPL_STATSCOMMANDS"
rpl_statscline :: IrcReply
rpl_statscline = mkIrcReply 213 "RPL_STATSCLINE"
rpl_statsnline :: IrcReply
rpl_statsnline = mkIrcReply 214 "RPL_STATSNLINE"
rpl_statsiline :: IrcReply
rpl_statsiline = mkIrcReply 215 "RPL_STATSILINE"
rpl_statskline :: IrcReply
rpl_statskline = mkIrcReply 216 "RPL_STATSKLINE"
rpl_statsyline :: IrcReply
rpl_statsyline = mkIrcReply 218 "RPL_STATSYLINE"
rpl_endofstats :: IrcReply
rpl_endofstats = mkIrcReply 219 "RPL_ENDOFSTATS"
rpl_umodeis :: IrcReply
rpl_umodeis = mkIrcReply 221 "RPL_UMODEIS"
rpl_statslline :: IrcReply
rpl_statslline = mkIrcReply 241 "RPL_STATSLLINE"
rpl_statsuptime :: IrcReply
rpl_statsuptime = mkIrcReply 242 "RPL_STATSUPTIME"
rpl_statsoline :: IrcReply
rpl_statsoline = mkIrcReply 243 "RPL_STATSOLINE"
rpl_statshline :: IrcReply
rpl_statshline = mkIrcReply 244 "RPL_STATSHLINE"
rpl_luserclient :: IrcReply
rpl_luserclient = mkIrcReply 251 "RPL_LUSERCLIENT"
rpl_luserop :: IrcReply
rpl_luserop = mkIrcReply 252 "RPL_LUSEROP"
rpl_luserunknown :: IrcReply
rpl_luserunknown = mkIrcReply 253 "RPL_LUSERUNKNOWN"
rpl_luserchannels :: IrcReply
rpl_luserchannels = mkIrcReply 254 "RPL_LUSERCHANNELS"
rpl_luserme :: IrcReply
rpl_luserme = mkIrcReply 255 "RPL_LUSERME"
rpl_adminme :: IrcReply
rpl_adminme = mkIrcReply 256 "RPL_ADMINME"
rpl_adminloc1 :: IrcReply
rpl_adminloc1 = mkIrcReply 257 "RPL_ADMINLOC1"
rpl_adminloc2 :: IrcReply
rpl_adminloc2 = mkIrcReply 258 "RPL_ADMINLOC2"
rpl_adminemail :: IrcReply
rpl_adminemail = mkIrcReply 259 "RPL_ADMINEMAIL"
rpl_tracelog :: IrcReply
rpl_tracelog = mkIrcReply 261 "RPL_TRACELOG"
rpl_none :: IrcReply
rpl_none = mkIrcReply 300 "RPL_NONE"
rpl_away :: IrcReply
rpl_away = mkIrcReply 301 "RPL_AWAY"
rpl_userhost :: IrcReply
rpl_userhost = mkIrcReply 302 "RPL_USERHOST"
rpl_ison :: IrcReply
rpl_ison = mkIrcReply 303 "RPL_ISON"
rpl_unaway :: IrcReply
rpl_unaway = mkIrcReply 305 "RPL_UNAWAY"
rpl_nowaway :: IrcReply
rpl_nowaway = mkIrcReply 306 "RPL_NOWAWAY"
rpl_whoisuser :: IrcReply
rpl_whoisuser = mkIrcReply 311 "RPL_WHOISUSER"
rpl_whoisserver :: IrcReply
rpl_whoisserver = mkIrcReply 312 "RPL_WHOISSERVER"
rpl_whoisoperator :: IrcReply
rpl_whoisoperator = mkIrcReply 313 "RPL_WHOISOPERATOR"
rpl_whowasuser :: IrcReply
rpl_whowasuser = mkIrcReply 314 "RPL_WHOWASUSER"
rpl_endofwho :: IrcReply
rpl_endofwho = mkIrcReply 315 "RPL_ENDOFWHO"
rpl_whoisidle :: IrcReply
rpl_whoisidle = mkIrcReply 317 "RPL_WHOISIDLE"
rpl_endofwhois :: IrcReply
rpl_endofwhois = mkIrcReply 318 "RPL_ENDOFWHOIS"
rpl_whoischannels :: IrcReply
rpl_whoischannels = mkIrcReply 319 "RPL_WHOISCHANNELS"
rpl_liststart :: IrcReply
rpl_liststart = mkIrcReply 321 "RPL_LISTSTART"
rpl_list :: IrcReply
rpl_list = mkIrcReply 322 "RPL_LIST"
rpl_listend :: IrcReply
rpl_listend = mkIrcReply 323 "RPL_LISTEND"
rpl_channelmodeis :: IrcReply
rpl_channelmodeis = mkIrcReply 234 "RPL_CHANNELMODEIS"
rpl_notopic :: IrcReply
rpl_notopic = mkIrcReply 331 "RPL_NOTOPIC"
rpl_topic :: IrcReply
rpl_topic = mkIrcReply 332 "RPL_TOPIC"
rpl_inviting :: IrcReply
rpl_inviting = mkIrcReply 341 "RPL_INVITING"
rpl_summoning :: IrcReply
rpl_summoning = mkIrcReply 342 "RPL_SUMMONING"
rpl_version :: IrcReply
rpl_version = mkIrcReply 351 "RPL_VERSION"
rpl_whoreply :: IrcReply
rpl_whoreply = mkIrcReply 352 "RPL_WHOREPLY"
rpl_namreply :: IrcReply
rpl_namreply = mkIrcReply 353 "RPL_NAMREPLY"
rpl_links :: IrcReply
rpl_links = mkIrcReply 364 "RPL_LINKS"
rpl_endoflinks :: IrcReply
rpl_endoflinks = mkIrcReply 365 "RPL_ENDOFLINKS"
rpl_endofnames :: IrcReply
rpl_endofnames = mkIrcReply 366 "RPL_ENDOFNAMES"
rpl_banlist :: IrcReply
rpl_banlist = mkIrcReply 367 "RPL_BANLIST"
rpl_endofbanlist :: IrcReply
rpl_endofbanlist = mkIrcReply 368 "RPL_ENDOFBANLIST"
rpl_endofwhowas :: IrcReply
rpl_endofwhowas = mkIrcReply 369 "RPL_ENDOFWHOWAS"
rpl_info :: IrcReply
rpl_info = mkIrcReply 371 "RPL_INFO"
rpl_endofinfo :: IrcReply
rpl_endofinfo = mkIrcReply 374 "RPL_ENDOFINFO"
rpl_motdstart :: IrcReply
rpl_motdstart = mkIrcReply 375 "RPL_MOTDSTART"
rpl_endofmotd :: IrcReply
rpl_endofmotd = mkIrcReply 376 "RPL_ENDOFMOTD"
rpl_youreoper :: IrcReply
rpl_youreoper = mkIrcReply 381 "RPL_YOUREOPER"
rpl_rehashing :: IrcReply
rpl_rehashing = mkIrcReply 382 "RPL_REHASHING"
rpl_time :: IrcReply
rpl_time = mkIrcReply 391 "RPL_TIME"
rpl_usersstart :: IrcReply
rpl_usersstart = mkIrcReply 392 "RPL_USERSSTART"
rpl_users :: IrcReply
rpl_users = mkIrcReply 393 "RPL_USERS"
rpl_endofusers :: IrcReply
rpl_endofusers = mkIrcReply 394 "RPL_ENDOFUSERS"
rpl_nousers :: IrcReply
rpl_nousers = mkIrcReply 395 "RPL_NOUSERS"
err_nosuchnick :: IrcReply
err_nosuchnick = mkIrcReply 401 "ERR_NOSUCHNICK"
err_nosuchserver :: IrcReply
err_nosuchserver = mkIrcReply 402 "ERR_NOSUCHSERVER"
err_nosuchchannel :: IrcReply
err_nosuchchannel = mkIrcReply 403 "ERR_NOSUCHCHANNEL"
err_cannotsendtochan :: IrcReply
err_cannotsendtochan = mkIrcReply 404 "ERR_CANNOTSENDTOCHAN"
err_toomanychannels :: IrcReply
err_toomanychannels = mkIrcReply 405 "ERR_TOOMANYCHANNELS"
err_wasnosuchnick :: IrcReply
err_wasnosuchnick = mkIrcReply 406 "ERR_WASNOSUCHNICK"
err_toomanytargets :: IrcReply
err_toomanytargets = mkIrcReply 407 "ERR_TOOMANYTARGETS"
err_noorigin :: IrcReply
err_noorigin = mkIrcReply 409 "ERR_NOORIGIN"
err_norecipient :: IrcReply
err_norecipient = mkIrcReply 411 "ERR_NORECIPIENT"
err_notexttosend :: IrcReply
err_notexttosend = mkIrcReply 412 "ERR_NOTEXTTOSEND"
err_notoplevel :: IrcReply
err_notoplevel = mkIrcReply 413 "ERR_NOTOPLEVEL"
err_wildtoplevel :: IrcReply
err_wildtoplevel = mkIrcReply 414 "ERR_WILDTOPLEVEL"
err_unknowncommand :: IrcReply
err_unknowncommand = mkIrcReply 421 "ERR_UNKNOWNCOMMAND"
err_nomotd :: IrcReply
err_nomotd = mkIrcReply 422 "ERR_NOMOTD"
err_noadmininfo :: IrcReply
err_noadmininfo = mkIrcReply 423 "ERR_NOADMININFO"
err_fileerror :: IrcReply
err_fileerror = mkIrcReply 424 "ERR_FILEERROR"
err_nonicknamegiven :: IrcReply
err_nonicknamegiven = mkIrcReply 431 "ERR_NONICKNAMEGIVEN"
err_erroneusnickname :: IrcReply
err_erroneusnickname = mkIrcReply 432 "ERR_ERRONEUSNICKNAME"
err_nicknameinuse :: IrcReply
err_nicknameinuse = mkIrcReply 433 "ERR_NICKNAMEINUSE"
err_nickcollision :: IrcReply
err_nickcollision = mkIrcReply 436 "ERR_NICKCOLLISION"
err_usernotinchannel :: IrcReply
err_usernotinchannel = mkIrcReply 441 "ERR_USERNOTINCHANNEL"
err_notonchannel :: IrcReply
err_notonchannel = mkIrcReply 442 "ERR_NOTONCHANNEL"
err_useronchannel :: IrcReply
err_useronchannel = mkIrcReply 443 "ERR_USERONCHANNEL"
err_nologin :: IrcReply
err_nologin = mkIrcReply 444 "ERR_NOLOGIN"
err_summondisabled :: IrcReply
err_summondisabled = mkIrcReply 445 "ERR_SUMMONDISABLED"
err_usersdisabled :: IrcReply
err_usersdisabled = mkIrcReply 446 "ERR_USERSDISABLED"
err_notregistered :: IrcReply
err_notregistered = mkIrcReply 451 "ERR_NOTREGISTERED"
err_needmoreparams :: IrcReply
err_needmoreparams = mkIrcReply 461 "ERR_NEEDMOREPARAMS"
err_alreadyregistered :: IrcReply
err_alreadyregistered = mkIrcReply 462 "ERR_ALREADYREGISTERED"
err_nopermforhost :: IrcReply
err_nopermforhost = mkIrcReply 463 "ERR_NOPERMFORHOST"
err_passwdmismatch :: IrcReply
err_passwdmismatch = mkIrcReply 464 "ERR_PASSWDMISMATCH"
err_yourebannedcreep :: IrcReply
err_yourebannedcreep = mkIrcReply 465 "ERR_YOUREBANNEDCREEP"
err_keyset :: IrcReply
err_keyset = mkIrcReply 467 "ERR_KEYSET"
err_channelisfull :: IrcReply
err_channelisfull = mkIrcReply 471 "ERR_CHANNELISFULL"
err_unknownmode :: IrcReply
err_unknownmode = mkIrcReply 472 "ERR_UNKNOWNMODE"
err_inviteonlychan :: IrcReply
err_inviteonlychan = mkIrcReply 473 "ERR_INVITEONLYCHAN"
err_bannedfromchan :: IrcReply
err_bannedfromchan = mkIrcReply 474 "ERR_BANNEDFROMCHAN"
err_badchannelkey :: IrcReply
err_badchannelkey = mkIrcReply 475 "ERR_BADCHANNELKEY"
err_noprivileges :: IrcReply
err_noprivileges = mkIrcReply 481 "ERR_NOPRIVILEGES"
err_chanoprivsneeded :: IrcReply
err_chanoprivsneeded = mkIrcReply 482 "ERR_CHANOPRIVSNEEDED"
err_cantkillserver :: IrcReply
err_cantkillserver = mkIrcReply 483 "ERR_CANTKILLSERVER"
err_nooperhost :: IrcReply
err_nooperhost = mkIrcReply 491 "ERR_NOOPERHOST"
err_umodeunknownflag :: IrcReply
err_umodeunknownflag = mkIrcReply 501 "ERR_UMODEUNKNOWNFLAG"
err_usersdontmatch :: IrcReply
err_usersdontmatch = mkIrcReply 502 "ERR_USERSDONTMATCH"
ircReplyIsErr :: IrcReply -> Bool
ircReplyIsErr (IrcReply {replyCode = c}) = c >= 400 && c <= 502