diff options
author | Till Hoeppner | 2015-04-20 22:38:56 +0200 |
---|---|---|
committer | Till Hoeppner | 2015-04-20 22:38:56 +0200 |
commit | 5f1ffd753af42357c8b074c7a8bc9be2eade002e (patch) | |
tree | c8df5fc525c7bca1a4a5b91d35ad0899da377558 | |
parent | c9776e2ad7ce0173b0820dbe2487c3cf8f0f3d1c (diff) | |
download | irsc-5f1ffd753af42357c8b074c7a8bc9be2eade002e.tar.gz irsc-5f1ffd753af42357c8b074c7a8bc9be2eade002e.tar.xz irsc-5f1ffd753af42357c8b074c7a8bc9be2eade002e.zip |
Add reply generation
-rw-r--r-- | build_commands.rs (renamed from build.rs) | 0 | ||||
-rw-r--r-- | build_replies.rs | 81 | ||||
-rw-r--r-- | rfc2812_replies.txt | 1352 | ||||
-rw-r--r-- | src/command.rs | 126 | ||||
-rw-r--r-- | src/lib.rs | 8 | ||||
-rw-r--r-- | src/reply.rs | 1331 |
6 files changed, 2153 insertions, 745 deletions
diff --git a/build.rs b/build_commands.rs index 53ab74c..53ab74c 100644 --- a/build.rs +++ b/build_commands.rs diff --git a/build_replies.rs b/build_replies.rs new file mode 100644 index 0000000..a9c00e4 --- /dev/null +++ b/build_replies.rs @@ -0,0 +1,81 @@ +use std::fs::File; +use std::io::{ Read }; +use std::borrow::ToOwned; + +#[derive(Debug)] +struct Reply { + number: String, + reply: String, + doc: String +} + +fn main() { + let mut f = File::open("rfc2812_replies.txt").unwrap(); + + let mut content = String::new(); + f.read_to_string(&mut content).unwrap(); + + let mut lines = content.lines(); + let mut line = lines.next(); + + let mut replies = Vec::new(); + + while let Some(l) = line { + // if is new command + if l.chars().next().map(char::is_whitespace) == Some(false) { + let t = l.split(" ").filter(|s| !s.is_empty()).collect::<Vec<&str>>(); + assert_eq!(t.len(), 2); + replies.push(Reply { + number: t[0].to_owned(), + reply: t[1].to_owned(), + doc: String::new() + }); + } + + let len = replies.len(); + replies[len - 1].doc.push_str(l); + replies[len - 1].doc.push_str("\n"); + + line = lines.next(); + } + + println!("use ::{{ Result, IrscError }};"); + println!("use std::str::FromStr;"); + println!("use std::borrow::ToOwned;"); + + println!("#[allow(non_camel_case_types)]"); + println!("#[derive(Debug, Hash, PartialEq, Eq)]"); + println!("pub enum Reply {{"); + for r in &replies { + for l in r.doc.lines() { + println!(" /// {}", l); + } + + println!(" {} = {},\n", r.reply, r.number); + } + println!("}}\n\n"); + + println!("impl FromStr for Reply {{"); + println!(" type Err = IrscError;"); + println!(" fn from_str(s: &str) -> Result<Reply> {{"); + println!(" use self::Reply::*;"); + println!(" match s {{"); + for r in &replies { + println!(" \"{}\" => Ok({}),", r.number, r.reply); + } + println!(" _ => Err(IrscError::NotFound)"); + println!(" }}"); + println!(" }}"); + println!("}}"); + + println!("impl ToString for Reply {{"); + println!(" fn to_string(&self) -> String {{"); + println!(" use self::Reply::*;"); + println!(" match *self {{"); + for r in &replies { + println!(" {} => \"{}\".to_owned(),", r.reply, r.number); + } + println!(" }}"); + println!(" }}"); + println!("}}"); +} diff --git a/rfc2812_replies.txt b/rfc2812_replies.txt index 52fd99c..4367fcc 100644 --- a/rfc2812_replies.txt +++ b/rfc2812_replies.txt @@ -1,760 +1,758 @@ - 001 RPL_WELCOME - "Welcome to the Internet Relay Network - <nick>!<user>@<host>" - 002 RPL_YOURHOST - "Your host is <servername>, running version <ver>" - 003 RPL_CREATED - "This server was created <date>" - 004 RPL_MYINFO - "<servername> <version> <available user modes> - <available channel modes>" - - - The server sends Replies 001 to 004 to a user upon - successful registration. - 005 RPL_BOUNCE - "Try server <server name>, port <port number>" - - - Sent by the server to a user to suggest an alternative - server. This is often used when the connection is - refused because the server is already full. - - 302 RPL_USERHOST - ":*1<reply> *( " " <reply> )" - - - Reply format used by USERHOST to list replies to - the query list. The reply string is composed as - follows: - - reply = nickname [ "*" ] "=" ( "+" / "-" ) hostname - - The '*' indicates whether the client has registered - as an Operator. The '-' or '+' characters represent - whether the client has set an AWAY message or not - respectively. - - 303 RPL_ISON - ":*1<nick> *( " " <nick> )" - - - Reply format used by ISON to list replies to the - query list. - - 301 RPL_AWAY - "<nick> :<away message>" - 305 RPL_UNAWAY - ":You are no longer marked as being away" - 306 RPL_NOWAWAY - ":You have been marked as being away" - - - These replies are used with the AWAY command (if - allowed). RPL_AWAY is sent to any client sending a - PRIVMSG to a client which is away. RPL_AWAY is only - sent by the server to which the client is connected. - Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the - client removes and sets an AWAY message. - - 311 RPL_WHOISUSER - "<nick> <user> <host> * :<real name>" - 312 RPL_WHOISSERVER - "<nick> <server> :<server info>" - 313 RPL_WHOISOPERATOR - "<nick> :is an IRC operator" - 317 RPL_WHOISIDLE - "<nick> <integer> :seconds idle" - 318 RPL_ENDOFWHOIS - "<nick> :End of WHOIS list" - 319 RPL_WHOISCHANNELS - "<nick> :*( ( "@" / "+" ) <channel> " " )" - - - Replies 311 - 313, 317 - 319 are all replies - generated in response to a WHOIS message. Given that - there are enough parameters present, the answering - server MUST either formulate a reply out of the above - numerics (if the query nick is found) or return an - error reply. The '*' in RPL_WHOISUSER is there as - the literal character and not as a wild card. For - each reply set, only RPL_WHOISCHANNELS may appear - more than once (for long lists of channel names). - The '@' and '+' characters next to the channel name - indicate whether a client is a channel operator or - has been granted permission to speak on a moderated - channel. The RPL_ENDOFWHOIS reply is used to mark - the end of processing a WHOIS message. - - 314 RPL_WHOWASUSER - "<nick> <user> <host> * :<real name>" - 369 RPL_ENDOFWHOWAS - "<nick> :End of WHOWAS" - - - When replying to a WHOWAS message, a server MUST use - the replies RPL_WHOWASUSER, RPL_WHOISSERVER or - ERR_WASNOSUCHNICK for each nickname in the presented - list. At the end of all reply batches, there MUST - be RPL_ENDOFWHOWAS (even if there was only one reply - and it was an error). - - 321 RPL_LISTSTART - Obsolete. Not used. - - 322 RPL_LIST - "<channel> <# visible> :<topic>" - 323 RPL_LISTEND - ":End of LIST" - - - Replies RPL_LIST, RPL_LISTEND mark the actual replies - with data and end of the server's response to a LIST - command. If there are no channels available to return, - only the end reply MUST be sent. - - 325 RPL_UNIQOPIS - "<channel> <nickname>" - - 324 RPL_CHANNELMODEIS - "<channel> <mode> <mode params>" - - 331 RPL_NOTOPIC - "<channel> :No topic is set" - 332 RPL_TOPIC - "<channel> :<topic>" - - - When sending a TOPIC message to determine the - channel topic, one of two replies is sent. If - the topic is set, RPL_TOPIC is sent back else - RPL_NOTOPIC. - - 341 RPL_INVITING - "<channel> <nick>" - - - Returned by the server to indicate that the - attempted INVITE message was successful and is - being passed onto the end client. - - 342 RPL_SUMMONING - "<user> :Summoning user to IRC" - - - Returned by a server answering a SUMMON message to - indicate that it is summoning that user. - - 346 RPL_INVITELIST - "<channel> <invitemask>" - 347 RPL_ENDOFINVITELIST - "<channel> :End of channel invite list" - - - When listing the 'invitations masks' for a given channel, - a server is required to send the list back using the - RPL_INVITELIST and RPL_ENDOFINVITELIST messages. A - separate RPL_INVITELIST is sent for each active mask. - After the masks have been listed (or if none present) a - RPL_ENDOFINVITELIST MUST be sent. - - 348 RPL_EXCEPTLIST - "<channel> <exceptionmask>" - 349 RPL_ENDOFEXCEPTLIST - "<channel> :End of channel exception list" - - - When listing the 'exception masks' for a given channel, - a server is required to send the list back using the - RPL_EXCEPTLIST and RPL_ENDOFEXCEPTLIST messages. A - separate RPL_EXCEPTLIST is sent for each active mask. - After the masks have been listed (or if none present) - a RPL_ENDOFEXCEPTLIST MUST be sent. - - 351 RPL_VERSION - "<version>.<debuglevel> <server> :<comments>" - - - Reply by the server showing its version details. - The <version> is the version of the software being - used (including any patchlevel revisions) and the - <debuglevel> is used to indicate if the server is - running in "debug mode". - - The "comments" field may contain any comments about - the version or further version details. - - 352 RPL_WHOREPLY - "<channel> <user> <host> <server> <nick> - ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] - :<hopcount> <real name>" - - 315 RPL_ENDOFWHO - "<name> :End of WHO list" - - - The RPL_WHOREPLY and RPL_ENDOFWHO pair are used - to answer a WHO message. The RPL_WHOREPLY is only - sent if there is an appropriate match to the WHO - query. If there is a list of parameters supplied - with a WHO message, a RPL_ENDOFWHO MUST be sent - after processing each list item with <name> being - the item. - - 353 RPL_NAMREPLY - "( "=" / "*" / "@" ) <channel> - :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> ) - - "@" is used for secret channels, "*" for private - channels, and "=" for others (public channels). - - 366 RPL_ENDOFNAMES - "<channel> :End of NAMES list" - - - To reply to a NAMES message, a reply pair consisting - of RPL_NAMREPLY and RPL_ENDOFNAMES is sent by the - server back to the client. If there is no channel - found as in the query, then only RPL_ENDOFNAMES is - returned. The exception to this is when a NAMES - message is sent with no parameters and all visible - channels and contents are sent back in a series of - RPL_NAMEREPLY messages with a RPL_ENDOFNAMES to mark - the end. - - 364 RPL_LINKS - "<mask> <server> :<hopcount> <server info>" - 365 RPL_ENDOFLINKS - "<mask> :End of LINKS list" - - - In replying to the LINKS message, a server MUST send - replies back using the RPL_LINKS numeric and mark the - end of the list using an RPL_ENDOFLINKS reply. - - 367 RPL_BANLIST - "<channel> <banmask>" - 368 RPL_ENDOFBANLIST - "<channel> :End of channel ban list" - - - When listing the active 'bans' for a given channel, - a server is required to send the list back using the - RPL_BANLIST and RPL_ENDOFBANLIST messages. A separate - RPL_BANLIST is sent for each active banmask. After the - banmasks have been listed (or if none present) a - RPL_ENDOFBANLIST MUST be sent. - - 371 RPL_INFO - ":<string>" - 374 RPL_ENDOFINFO - ":End of INFO list" - - - A server responding to an INFO message is required to - send all its 'info' in a series of RPL_INFO messages - with a RPL_ENDOFINFO reply to indicate the end of the - replies. - - 375 RPL_MOTDSTART - ":- <server> Message of the day - " - 372 RPL_MOTD - ":- <text>" - 376 RPL_ENDOFMOTD - ":End of MOTD command" - - - When responding to the MOTD message and the MOTD file - is found, the file is displayed line by line, with - each line no longer than 80 characters, using - RPL_MOTD format replies. These MUST be surrounded - by a RPL_MOTDSTART (before the RPL_MOTDs) and an - RPL_ENDOFMOTD (after). - - 381 RPL_YOUREOPER - ":You are now an IRC operator" - - - RPL_YOUREOPER is sent back to a client which has - just successfully issued an OPER message and gained - operator status. - - 382 RPL_REHASHING - "<config file> :Rehashing" - - - If the REHASH option is used and an operator sends - a REHASH message, an RPL_REHASHING is sent back to - the operator. - - 383 RPL_YOURESERVICE - "You are service <servicename>" - - - Sent by the server to a service upon successful - registration. - - 391 RPL_TIME - "<server> :<string showing server's local time>" - - - When replying to the TIME message, a server MUST send - the reply using the RPL_TIME format above. The string - showing the time need only contain the correct day and - time there. There is no further requirement for the - time string. - - 392 RPL_USERSSTART - ":UserID Terminal Host" - 393 RPL_USERS - ":<username> <ttyline> <hostname>" - 394 RPL_ENDOFUSERS - ":End of users" - 395 RPL_NOUSERS - ":Nobody logged in" - - - If the USERS message is handled by a server, the - replies RPL_USERSTART, RPL_USERS, RPL_ENDOFUSERS and - RPL_NOUSERS are used. RPL_USERSSTART MUST be sent - first, following by either a sequence of RPL_USERS - or a single RPL_NOUSER. Following this is - RPL_ENDOFUSERS. - - 200 RPL_TRACELINK - "Link <version & debug level> <destination> - <next server> V<protocol version> - <link uptime in seconds> <backstream sendq> - <upstream sendq>" - 201 RPL_TRACECONNECTING - "Try. <class> <server>" - 202 RPL_TRACEHANDSHAKE - "H.S. <class> <server>" - 203 RPL_TRACEUNKNOWN - "???? <class> [<client IP address in dot form>]" - 204 RPL_TRACEOPERATOR - "Oper <class> <nick>" - 205 RPL_TRACEUSER - "User <class> <nick>" - 206 RPL_TRACESERVER - "Serv <class> <int>S <int>C <server> - <nick!user|*!*>@<host|server> V<protocol version>" - 207 RPL_TRACESERVICE - "Service <class> <name> <type> <active type>" - 208 RPL_TRACENEWTYPE - "<newtype> 0 <client name>" - 209 RPL_TRACECLASS - "Class <class> <count>" - 210 RPL_TRACERECONNECT - Unused. - 261 RPL_TRACELOG - "File <logfile> <debug level>" - 262 RPL_TRACEEND - "<server name> <version & debug level> :End of TRACE" - - - The RPL_TRACE* are all returned by the server in - response to the TRACE message. How many are - returned is dependent on the TRACE message and - whether it was sent by an operator or not. There - is no predefined order for which occurs first. - Replies RPL_TRACEUNKNOWN, RPL_TRACECONNECTING and - RPL_TRACEHANDSHAKE are all used for connections - which have not been fully established and are either - unknown, still attempting to connect or in the - process of completing the 'server handshake'. - RPL_TRACELINK is sent by any server which handles - a TRACE message and has to pass it on to another - server. The list of RPL_TRACELINKs sent in - response to a TRACE command traversing the IRC - network should reflect the actual connectivity of - the servers themselves along that path. - - RPL_TRACENEWTYPE is to be used for any connection - which does not fit in the other categories but is - being displayed anyway. - RPL_TRACEEND is sent to indicate the end of the list. - - 211 RPL_STATSLINKINFO - "<linkname> <sendq> <sent messages> - <sent Kbytes> <received messages> - <received Kbytes> <time open>" - - - reports statistics on a connection. <linkname> - identifies the particular connection, <sendq> is - the amount of data that is queued and waiting to be - sent <sent messages> the number of messages sent, - and <sent Kbytes> the amount of data sent, in - Kbytes. <received messages> and <received Kbytes> - are the equivalent of <sent messages> and <sent - Kbytes> for received data, respectively. <time - open> indicates how long ago the connection was - opened, in seconds. - - 212 RPL_STATSCOMMANDS - "<command> <count> <byte count> <remote count>" - - - reports statistics on commands usage. - - 219 RPL_ENDOFSTATS - "<stats letter> :End of STATS report" - - 242 RPL_STATSUPTIME - ":Server Up %d days %d:%02d:%02d" - - - reports the server uptime. - - 243 RPL_STATSOLINE - "O <hostmask> * <name>" - - - reports the allowed hosts from where user may become IRC - operators. - - 221 RPL_UMODEIS - "<user mode string>" - - - To answer a query about a client's own mode, - RPL_UMODEIS is sent back. - - 234 RPL_SERVLIST - "<name> <server> <mask> <type> <hopcount> <info>" - - 235 RPL_SERVLISTEND - "<mask> <type> :End of service listing" - - - When listing services in reply to a SERVLIST message, - a server is required to send the list back using the - RPL_SERVLIST and RPL_SERVLISTEND messages. A separate - RPL_SERVLIST is sent for each service. After the - services have been listed (or if none present) a - RPL_SERVLISTEND MUST be sent. - - 251 RPL_LUSERCLIENT - ":There are <integer> users and <integer> - services on <integer> servers" - 252 RPL_LUSEROP - "<integer> :operator(s) online" - 253 RPL_LUSERUNKNOWN - "<integer> :unknown connection(s)" - 254 RPL_LUSERCHANNELS - "<integer> :channels formed" - 255 RPL_LUSERME - ":I have <integer> clients and <integer> - servers" - - - In processing an LUSERS message, the server - sends a set of replies from RPL_LUSERCLIENT, - RPL_LUSEROP, RPL_USERUNKNOWN, - RPL_LUSERCHANNELS and RPL_LUSERME. When - replying, a server MUST send back - RPL_LUSERCLIENT and RPL_LUSERME. The other - replies are only sent back if a non-zero count - is found for them. - - 256 RPL_ADMINME - "<server> :Administrative info" - 257 RPL_ADMINLOC1 - ":<admin info>" - 258 RPL_ADMINLOC2 - ":<admin info>" - 259 RPL_ADMINEMAIL - ":<admin info>" - - - When replying to an ADMIN message, a server - is expected to use replies RPL_ADMINME - through to RPL_ADMINEMAIL and provide a text - message with each. For RPL_ADMINLOC1 a - description of what city, state and country - the server is in is expected, followed by - details of the institution (RPL_ADMINLOC2) - - and finally the administrative contact for the - server (an email address here is REQUIRED) - in RPL_ADMINEMAIL. - - 263 RPL_TRYAGAIN - "<command> :Please wait a while and try again." +001 RPL_WELCOME + "Welcome to the Internet Relay Network + <nick>!<user>@<host>" +002 RPL_YOURHOST + "Your host is <servername>, running version <ver>" +003 RPL_CREATED + "This server was created <date>" +004 RPL_MYINFO + "<servername> <version> <available user modes> + <available channel modes>" + + - The server sends Replies 001 to 004 to a user upon + successful registration. + +005 RPL_BOUNCE + "Try server <server name>, port <port number>" + + - Sent by the server to a user to suggest an alternative + server. This is often used when the connection is + refused because the server is already full. + +302 RPL_USERHOST + ":*1<reply> *( " " <reply> )" + + - Reply format used by USERHOST to list replies to + the query list. The reply string is composed as + follows: + + reply = nickname [ "*" ] "=" ( "+" / "-" ) hostname + + The '*' indicates whether the client has registered + as an Operator. The '-' or '+' characters represent + whether the client has set an AWAY message or not + respectively. + +303 RPL_ISON + ":*1<nick> *( " " <nick> )" + + - Reply format used by ISON to list replies to the + query list. + +301 RPL_AWAY + "<nick> :<away message>" +305 RPL_UNAWAY + ":You are no longer marked as being away" +306 RPL_NOWAWAY + ":You have been marked as being away" + + - These replies are used with the AWAY command (if + allowed). RPL_AWAY is sent to any client sending a + PRIVMSG to a client which is away. RPL_AWAY is only + sent by the server to which the client is connected. + Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the + client removes and sets an AWAY message. + +311 RPL_WHOISUSER + "<nick> <user> <host> * :<real name>" +312 RPL_WHOISSERVER + "<nick> <server> :<server info>" +313 RPL_WHOISOPERATOR + "<nick> :is an IRC operator" +317 RPL_WHOISIDLE + "<nick> <integer> :seconds idle" +318 RPL_ENDOFWHOIS + "<nick> :End of WHOIS list" +319 RPL_WHOISCHANNELS + "<nick> :*( ( "@" / "+" ) <channel> " " )" + + - Replies 311 - 313, 317 - 319 are all replies + generated in response to a WHOIS message. Given that + there are enough parameters present, the answering + server MUST either formulate a reply out of the above + numerics (if the query nick is found) or return an + error reply. The '*' in RPL_WHOISUSER is there as + the literal character and not as a wild card. For + each reply set, only RPL_WHOISCHANNELS may appear + more than once (for long lists of channel names). + The '@' and '+' characters next to the channel name + indicate whether a client is a channel operator or + has been granted permission to speak on a moderated + channel. The RPL_ENDOFWHOIS reply is used to mark + the end of processing a WHOIS message. + +314 RPL_WHOWASUSER + "<nick> <user> <host> * :<real name>" +369 RPL_ENDOFWHOWAS + "<nick> :End of WHOWAS" + + - When replying to a WHOWAS message, a server MUST use + the replies RPL_WHOWASUSER, RPL_WHOISSERVER or + ERR_WASNOSUCHNICK for each nickname in the presented + list. At the end of all reply batches, there MUST + be RPL_ENDOFWHOWAS (even if there was only one reply + and it was an error). + +321 RPL_LISTSTART + Obsolete. Not used. + +322 RPL_LIST + "<channel> <# visible> :<topic>" +323 RPL_LISTEND + ":End of LIST" + + - Replies RPL_LIST, RPL_LISTEND mark the actual replies + with data and end of the server's response to a LIST + command. If there are no channels available to return, + only the end reply MUST be sent. + +325 RPL_UNIQOPIS + "<channel> <nickname>" + +324 RPL_CHANNELMODEIS + "<channel> <mode> <mode params>" + +331 RPL_NOTOPIC + "<channel> :No topic is set" +332 RPL_TOPIC + "<channel> :<topic>" + + - When sending a TOPIC message to determine the + channel topic, one of two replies is sent. If + the topic is set, RPL_TOPIC is sent back else + RPL_NOTOPIC. + +341 RPL_INVITING + "<channel> <nick>" + + - Returned by the server to indicate that the + attempted INVITE message was successful and is + being passed onto the end client. + +342 RPL_SUMMONING + "<user> :Summoning user to IRC" + + - Returned by a server answering a SUMMON message to + indicate that it is summoning that user. + +346 RPL_INVITELIST + "<channel> <invitemask>" +347 RPL_ENDOFINVITELIST + "<channel> :End of channel invite list" + + - When listing the 'invitations masks' for a given channel, + a server is required to send the list back using the + RPL_INVITELIST and RPL_ENDOFINVITELIST messages. A + separate RPL_INVITELIST is sent for each active mask. + After the masks have been listed (or if none present) a + RPL_ENDOFINVITELIST MUST be sent. + +348 RPL_EXCEPTLIST + "<channel> <exceptionmask>" +349 RPL_ENDOFEXCEPTLIST + "<channel> :End of channel exception list" + + - When listing the 'exception masks' for a given channel, + a server is required to send the list back using the + RPL_EXCEPTLIST and RPL_ENDOFEXCEPTLIST messages. A + separate RPL_EXCEPTLIST is sent for each active mask. + After the masks have been listed (or if none present) + a RPL_ENDOFEXCEPTLIST MUST be sent. + +351 RPL_VERSION + "<version>.<debuglevel> <server> :<comments>" + + - Reply by the server showing its version details. + The <version> is the version of the software being + used (including any patchlevel revisions) and the + <debuglevel> is used to indicate if the server is + running in "debug mode". + + The "comments" field may contain any comments about + the version or further version details. + +352 RPL_WHOREPLY + "<channel> <user> <host> <server> <nick> + ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] + :<hopcount> <real name>" + +315 RPL_ENDOFWHO + "<name> :End of WHO list" + + - The RPL_WHOREPLY and RPL_ENDOFWHO pair are used + to answer a WHO message. The RPL_WHOREPLY is only + sent if there is an appropriate match to the WHO + query. If there is a list of parameters supplied + with a WHO message, a RPL_ENDOFWHO MUST be sent + after processing each list item with <name> being + the item. + +353 RPL_NAMREPLY + "( "=" / "*" / "@" ) <channel> + :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> ) + - "@" is used for secret channels, "*" for private + channels, and "=" for others (public channels). + +366 RPL_ENDOFNAMES + "<channel> :End of NAMES list" + + - To reply to a NAMES message, a reply pair consisting + of RPL_NAMREPLY and RPL_ENDOFNAMES is sent by the + server back to the client. If there is no channel + found as in the query, then only RPL_ENDOFNAMES is + returned. The exception to this is when a NAMES + message is sent with no parameters and all visible + channels and contents are sent back in a series of + RPL_NAMEREPLY messages with a RPL_ENDOFNAMES to mark + the end. + +364 RPL_LINKS + "<mask> <server> :<hopcount> <server info>" +365 RPL_ENDOFLINKS + "<mask> :End of LINKS list" + + - In replying to the LINKS message, a server MUST send + replies back using the RPL_LINKS numeric and mark the + end of the list using an RPL_ENDOFLINKS reply. + +367 RPL_BANLIST + "<channel> <banmask>" +368 RPL_ENDOFBANLIST + "<channel> :End of channel ban list" + + - When listing the active 'bans' for a given channel, + a server is required to send the list back using the + RPL_BANLIST and RPL_ENDOFBANLIST messages. A separate + RPL_BANLIST is sent for each active banmask. After the + banmasks have been listed (or if none present) a + RPL_ENDOFBANLIST MUST be sent. + +371 RPL_INFO + ":<string>" +374 RPL_ENDOFINFO + ":End of INFO list" + + - A server responding to an INFO message is required to + send all its 'info' in a series of RPL_INFO messages + with a RPL_ENDOFINFO reply to indicate the end of the + replies. + +375 RPL_MOTDSTART + ":- <server> Message of the day - " +372 RPL_MOTD + ":- <text>" +376 RPL_ENDOFMOTD + ":End of MOTD command" + + - When responding to the MOTD message and the MOTD file + is found, the file is displayed line by line, with + each line no longer than 80 characters, using + RPL_MOTD format replies. These MUST be surrounded + by a RPL_MOTDSTART (before the RPL_MOTDs) and an + RPL_ENDOFMOTD (after). + +381 RPL_YOUREOPER + ":You are now an IRC operator" + + - RPL_YOUREOPER is sent back to a client which has + just successfully issued an OPER message and gained + operator status. + +382 RPL_REHASHING + "<config file> :Rehashing" + + - If the REHASH option is used and an operator sends + a REHASH message, an RPL_REHASHING is sent back to + the operator. + +383 RPL_YOURESERVICE + "You are service <servicename>" + + - Sent by the server to a service upon successful + registration. + +391 RPL_TIME + "<server> :<string showing server's local time>" + + - When replying to the TIME message, a server MUST send + the reply using the RPL_TIME format above. The string + showing the time need only contain the correct day and + time there. There is no further requirement for the + time string. + +392 RPL_USERSSTART + ":UserID Terminal Host" +393 RPL_USERS + ":<username> <ttyline> <hostname>" +394 RPL_ENDOFUSERS + ":End of users" +395 RPL_NOUSERS + ":Nobody logged in" + + - If the USERS message is handled by a server, the + replies RPL_USERSTART, RPL_USERS, RPL_ENDOFUSERS and + RPL_NOUSERS are used. RPL_USERSSTART MUST be sent + first, following by either a sequence of RPL_USERS + or a single RPL_NOUSER. Following this is + RPL_ENDOFUSERS. + +200 RPL_TRACELINK + "Link <version & debug level> <destination> + <next server> V<protocol version> + <link uptime in seconds> <backstream sendq> + <upstream sendq>" +201 RPL_TRACECONNECTING + "Try. <class> <server>" +202 RPL_TRACEHANDSHAKE + "H.S. <class> <server>" +203 RPL_TRACEUNKNOWN + "???? <class> [<client IP address in dot form>]" +204 RPL_TRACEOPERATOR + "Oper <class> <nick>" +205 RPL_TRACEUSER + "User <class> <nick>" +206 RPL_TRACESERVER + "Serv <class> <int>S <int>C <server> + <nick!user|*!*>@<host|server> V<protocol version>" +207 RPL_TRACESERVICE + "Service <class> <name> <type> <active type>" +208 RPL_TRACENEWTYPE + "<newtype> 0 <client name>" +209 RPL_TRACECLASS + "Class <class> <count>" +210 RPL_TRACERECONNECT + Unused. +261 RPL_TRACELOG + "File <logfile> <debug level>" +262 RPL_TRACEEND + "<server name> <version & debug level> :End of TRACE" + + - The RPL_TRACE* are all returned by the server in + response to the TRACE message. How many are + returned is dependent on the TRACE message and + whether it was sent by an operator or not. There + is no predefined order for which occurs first. + Replies RPL_TRACEUNKNOWN, RPL_TRACECONNECTING and + RPL_TRACEHANDSHAKE are all used for connections + which have not been fully established and are either + unknown, still attempting to connect or in the + process of completing the 'server handshake'. + RPL_TRACELINK is sent by any server which handles + a TRACE message and has to pass it on to another + server. The list of RPL_TRACELINKs sent in + response to a TRACE command traversing the IRC + network should reflect the actual connectivity of + the servers themselves along that path. + + RPL_TRACENEWTYPE is to be used for any connection + which does not fit in the other categories but is + being displayed anyway. + RPL_TRACEEND is sent to indicate the end of the list. + +211 RPL_STATSLINKINFO + "<linkname> <sendq> <sent messages> + <sent Kbytes> <received messages> + <received Kbytes> <time open>" + + - reports statistics on a connection. <linkname> + identifies the particular connection, <sendq> is + the amount of data that is queued and waiting to be + sent <sent messages> the number of messages sent, + and <sent Kbytes> the amount of data sent, in + Kbytes. <received messages> and <received Kbytes> + are the equivalent of <sent messages> and <sent + Kbytes> for received data, respectively. <time + open> indicates how long ago the connection was + opened, in seconds. + +212 RPL_STATSCOMMANDS + "<command> <count> <byte count> <remote count>" + + - reports statistics on commands usage. + +219 RPL_ENDOFSTATS + "<stats letter> :End of STATS report" + +242 RPL_STATSUPTIME + ":Server Up %d days %d:%02d:%02d" + + - reports the server uptime. + +243 RPL_STATSOLINE + "O <hostmask> * <name>" + + - reports the allowed hosts from where user may become IRC + operators. + +221 RPL_UMODEIS + "<user mode string>" + + - To answer a query about a client's own mode, + RPL_UMODEIS is sent back. + +234 RPL_SERVLIST + "<name> <server> <mask> <type> <hopcount> <info>" + +235 RPL_SERVLISTEND + "<mask> <type> :End of service listing" + + - When listing services in reply to a SERVLIST message, + a server is required to send the list back using the + RPL_SERVLIST and RPL_SERVLISTEND messages. A separate + RPL_SERVLIST is sent for each service. After the + services have been listed (or if none present) a + RPL_SERVLISTEND MUST be sent. + +251 RPL_LUSERCLIENT + ":There are <integer> users and <integer> + services on <integer> servers" +252 RPL_LUSEROP + "<integer> :operator(s) online" +253 RPL_LUSERUNKNOWN + "<integer> :unknown connection(s)" +254 RPL_LUSERCHANNELS + "<integer> :channels formed" +255 RPL_LUSERME + ":I have <integer> clients and <integer> + servers" + + - In processing an LUSERS message, the server + sends a set of replies from RPL_LUSERCLIENT, + RPL_LUSEROP, RPL_USERUNKNOWN, + RPL_LUSERCHANNELS and RPL_LUSERME. When + replying, a server MUST send back + RPL_LUSERCLIENT and RPL_LUSERME. The other + replies are only sent back if a non-zero count + is found for them. + +256 RPL_ADMINME + "<server> :Administrative info" +257 RPL_ADMINLOC1 + ":<admin info>" +258 RPL_ADMINLOC2 + ":<admin info>" +259 RPL_ADMINEMAIL + ":<admin info>" + + - When replying to an ADMIN message, a server + is expected to use replies RPL_ADMINME + through to RPL_ADMINEMAIL and provide a text + message with each. For RPL_ADMINLOC1 a + description of what city, state and country + the server is in is expected, followed by + details of the institution (RPL_ADMINLOC2) + + and finally the administrative contact for the + server (an email address here is REQUIRED) + in RPL_ADMINEMAIL. + +263 RPL_TRYAGAIN + "<command> :Please wait a while and try again." + + - When a server drops a command without processing it, + it MUST use the reply RPL_TRYAGAIN to inform the + originating client. + +401 ERR_NOSUCHNICK + "<nickname> :No such nick/channel" + + - Used to indicate the nickname parameter supplied to a + command is currently unused. - - When a server drops a command without processing it, - it MUST use the reply RPL_TRYAGAIN to inform the - originating client. +402 ERR_NOSUCHSERVER + "<server name> :No such server" -5.2 Error Replies - - Error replies are found in the range from 400 to 599. + - Used to indicate the server name given currently + does not exist. - 401 ERR_NOSUCHNICK - "<nickname> :No such nick/channel" +403 ERR_NOSUCHCHANNEL + "<channel name> :No such channel" - - Used to indicate the nickname parameter supplied to a - command is currently unused. + - Used to indicate the given channel name is invalid. - 402 ERR_NOSUCHSERVER - "<server name> :No such server" +404 ERR_CANNOTSENDTOCHAN + "<channel name> :Cannot send to channel" - - Used to indicate the server name given currently - does not exist. + - Sent to a user who is either (a) not on a channel + which is mode +n or (b) not a chanop (or mode +v) on + a channel which has mode +m set or where the user is + banned and is trying to send a PRIVMSG message to + that channel. - 403 ERR_NOSUCHCHANNEL - "<channel name> :No such channel" +405 ERR_TOOMANYCHANNELS + "<channel name> :You have joined too many channels" - - Used to indicate the given channel name is invalid. + - Sent to a user when they have joined the maximum + number of allowed channels and they try to join + another channel. - 404 ERR_CANNOTSENDTOCHAN - "<channel name> :Cannot send to channel" +406 ERR_WASNOSUCHNICK + "<nickname> :There was no such nickname" - - Sent to a user who is either (a) not on a channel - which is mode +n or (b) not a chanop (or mode +v) on - a channel which has mode +m set or where the user is - banned and is trying to send a PRIVMSG message to - that channel. + - Returned by WHOWAS to indicate there is no history + information for that nickname. - 405 ERR_TOOMANYCHANNELS - "<channel name> :You have joined too many channels" +407 ERR_TOOMANYTARGETS + "<target> :<error code> recipients. <abort message>" - - Sent to a user when they have joined the maximum - number of allowed channels and they try to join - another channel. + - Returned to a client which is attempting to send a + PRIVMSG/NOTICE using the user@host destination format + and for a user@host which has several occurrences. - 406 ERR_WASNOSUCHNICK - "<nickname> :There was no such nickname" + - Returned to a client which trying to send a + PRIVMSG/NOTICE to too many recipients. - - Returned by WHOWAS to indicate there is no history - information for that nickname. + - Returned to a client which is attempting to JOIN a safe + channel using the shortname when there are more than one + such channel. - 407 ERR_TOOMANYTARGETS - "<target> :<error code> recipients. <abort message>" +408 ERR_NOSUCHSERVICE + "<service name> :No such service" - - Returned to a client which is attempting to send a - PRIVMSG/NOTICE using the user@host destination format - and for a user@host which has several occurrences. + - Returned to a client which is attempting to send a SQUERY + to a service which does not exist. - - Returned to a client which trying to send a - PRIVMSG/NOTICE to too many recipients. +409 ERR_NOORIGIN + ":No origin specified" - - Returned to a client which is attempting to JOIN a safe - channel using the shortname when there are more than one - such channel. + - PING or PONG message missing the originator parameter. - 408 ERR_NOSUCHSERVICE - "<service name> :No such service" +411 ERR_NORECIPIENT + ":No recipient given (<command>)" +412 ERR_NOTEXTTOSEND + ":No text to send" +413 ERR_NOTOPLEVEL + "<mask> :No toplevel domain specified" +414 ERR_WILDTOPLEVEL + "<mask> :Wildcard in toplevel domain" +415 ERR_BADMASK + "<mask> :Bad Server/host mask" - - Returned to a client which is attempting to send a SQUERY - to a service which does not exist. + - 412 - 415 are returned by PRIVMSG to indicate that + the message wasn't delivered for some reason. + ERR_NOTOPLEVEL and ERR_WILDTOPLEVEL are errors that + are returned when an invalid use of + "PRIVMSG $<server>" or "PRIVMSG #<host>" is attempted. - 409 ERR_NOORIGIN - ":No origin specified" +421 ERR_UNKNOWNCOMMAND + "<command> :Unknown command" - - PING or PONG message missing the originator parameter. + - Returned to a registered client to indicate that the + command sent is unknown by the server. - 411 ERR_NORECIPIENT - ":No recipient given (<command>)" - 412 ERR_NOTEXTTOSEND - ":No text to send" - 413 ERR_NOTOPLEVEL - "<mask> :No toplevel domain specified" - 414 ERR_WILDTOPLEVEL - "<mask> :Wildcard in toplevel domain" - 415 ERR_BADMASK - "<mask> :Bad Server/host mask" +422 ERR_NOMOTD + ":MOTD File is missing" - - 412 - 415 are returned by PRIVMSG to indicate that - the message wasn't delivered for some reason. - ERR_NOTOPLEVEL and ERR_WILDTOPLEVEL are errors that - are returned when an invalid use of - "PRIVMSG $<server>" or "PRIVMSG #<host>" is attempted. + - Server's MOTD file could not be opened by the server. - 421 ERR_UNKNOWNCOMMAND - "<command> :Unknown command" +423 ERR_NOADMININFO + "<server> :No administrative info available" - - Returned to a registered client to indicate that the - command sent is unknown by the server. + - Returned by a server in response to an ADMIN message + when there is an error in finding the appropriate + information. - 422 ERR_NOMOTD - ":MOTD File is missing" +424 ERR_FILEERROR + ":File error doing <file op> on <file>" - - Server's MOTD file could not be opened by the server. + - Generic error message used to report a failed file + operation during the processing of a message. - 423 ERR_NOADMININFO - "<server> :No administrative info available" +431 ERR_NONICKNAMEGIVEN + ":No nickname given" - - Returned by a server in response to an ADMIN message - when there is an error in finding the appropriate - information. + - Returned when a nickname parameter expected for a + command and isn't found. - 424 ERR_FILEERROR - ":File error doing <file op> on <file>" +432 ERR_ERRONEUSNICKNAME + "<nick> :Erroneous nickname" - - Generic error message used to report a failed file - operation during the processing of a message. + - Returned after receiving a NICK message which contains + characters which do not fall in the defined set. See + section 2.3.1 for details on valid nicknames. - 431 ERR_NONICKNAMEGIVEN - ":No nickname given" +433 ERR_NICKNAMEINUSE + "<nick> :Nickname is already in use" - - Returned when a nickname parameter expected for a - command and isn't found. + - Returned when a NICK message is processed that results + in an attempt to change to a currently existing + nickname. - 432 ERR_ERRONEUSNICKNAME - "<nick> :Erroneous nickname" +436 ERR_NICKCOLLISION + "<nick> :Nickname collision KILL from <user>@<host>" - - Returned after receiving a NICK message which contains - characters which do not fall in the defined set. See - section 2.3.1 for details on valid nicknames. + - Returned by a server to a client when it detects a + nickname collision (registered of a NICK that + already exists by another server). - 433 ERR_NICKNAMEINUSE - "<nick> :Nickname is already in use" +437 ERR_UNAVAILRESOURCE + "<nick/channel> :Nick/channel is temporarily unavailable" - - Returned when a NICK message is processed that results - in an attempt to change to a currently existing - nickname. + - Returned by a server to a user trying to join a channel + currently blocked by the channel delay mechanism. - 436 ERR_NICKCOLLISION - "<nick> :Nickname collision KILL from <user>@<host>" + - Returned by a server to a user trying to change nickname + when the desired nickname is blocked by the nick delay + mechanism. - - Returned by a server to a client when it detects a - nickname collision (registered of a NICK that - already exists by another server). +441 ERR_USERNOTINCHANNEL + "<nick> <channel> :They aren't on that channel" - 437 ERR_UNAVAILRESOURCE - "<nick/channel> :Nick/channel is temporarily unavailable" + - Returned by the server to indicate that the target + user of the command is not on the given channel. - - Returned by a server to a user trying to join a channel - currently blocked by the channel delay mechanism. +442 ERR_NOTONCHANNEL + "<channel> :You're not on that channel" - - Returned by a server to a user trying to change nickname - when the desired nickname is blocked by the nick delay - mechanism. + - Returned by the server whenever a client tries to + perform a channel affecting command for which the + client isn't a member. - 441 ERR_USERNOTINCHANNEL - "<nick> <channel> :They aren't on that channel" +443 ERR_USERONCHANNEL + "<user> <channel> :is already on channel" - - Returned by the server to indicate that the target - user of the command is not on the given channel. + - Returned when a client tries to invite a user to a + channel they are already on. - 442 ERR_NOTONCHANNEL - "<channel> :You're not on that channel" +444 ERR_NOLOGIN + "<user> :User not logged in" - - Returned by the server whenever a client tries to - perform a channel affecting command for which the - client isn't a member. + - Returned by the summon after a SUMMON command for a + user was unable to be performed since they were not + logged in. - 443 ERR_USERONCHANNEL - "<user> <channel> :is already on channel" +445 ERR_SUMMONDISABLED + ":SUMMON has been disabled" - - Returned when a client tries to invite a user to a - channel they are already on. + - Returned as a response to the SUMMON command. MUST be + returned by any server which doesn't implement it. - 444 ERR_NOLOGIN - "<user> :User not logged in" +446 ERR_USERSDISABLED + ":USERS has been disabled" - - Returned by the summon after a SUMMON command for a - user was unable to be performed since they were not - logged in. + - Returned as a response to the USERS command. MUST be + returned by any server which does not implement it. - 445 ERR_SUMMONDISABLED - ":SUMMON has been disabled" +451 ERR_NOTREGISTERED + ":You have not registered" - - Returned as a response to the SUMMON command. MUST be - returned by any server which doesn't implement it. + - Returned by the server to indicate that the client + MUST be registered before the server will allow it + to be parsed in detail. - 446 ERR_USERSDISABLED - ":USERS has been disabled" +461 ERR_NEEDMOREPARAMS + "<command> :Not enough parameters" - - Returned as a response to the USERS command. MUST be - returned by any server which does not implement it. + - Returned by the server by numerous commands to + indicate to the client that it didn't supply enough + parameters. - 451 ERR_NOTREGISTERED - ":You have not registered" +462 ERR_ALREADYREGISTRED + ":Unauthorized command (already registered)" - - Returned by the server to indicate that the client - MUST be registered before the server will allow it - to be parsed in detail. + - Returned by the server to any link which tries to + change part of the registered details (such as + password or user details from second USER message). - 461 ERR_NEEDMOREPARAMS - "<command> :Not enough parameters" +463 ERR_NOPERMFORHOST + ":Your host isn't among the privileged" - - Returned by the server by numerous commands to - indicate to the client that it didn't supply enough - parameters. + - Returned to a client which attempts to register with + a server which does not been setup to allow + connections from the host the attempted connection + is tried. - 462 ERR_ALREADYREGISTRED - ":Unauthorized command (already registered)" +464 ERR_PASSWDMISMATCH + ":Password incorrect" - - Returned by the server to any link which tries to - change part of the registered details (such as - password or user details from second USER message). + - Returned to indicate a failed attempt at registering + a connection for which a password was required and + was either not given or incorrect. - 463 ERR_NOPERMFORHOST - ":Your host isn't among the privileged" +465 ERR_YOUREBANNEDCREEP + ":You are banned from this server" - - Returned to a client which attempts to register with - a server which does not been setup to allow - connections from the host the attempted connection - is tried. + - Returned after an attempt to connect and register + yourself with a server which has been setup to + explicitly deny connections to you. - 464 ERR_PASSWDMISMATCH - ":Password incorrect" +466 ERR_YOUWILLBEBANNED - - Returned to indicate a failed attempt at registering - a connection for which a password was required and - was either not given or incorrect. + - Sent by a server to a user to inform that access to the + server will soon be denied. - 465 ERR_YOUREBANNEDCREEP - ":You are banned from this server" +467 ERR_KEYSET + "<channel> :Channel key already set" +471 ERR_CHANNELISFULL + "<channel> :Cannot join channel (+l)" +472 ERR_UNKNOWNMODE + "<char> :is unknown mode char to me for <channel>" +473 ERR_INVITEONLYCHAN + "<channel> :Cannot join channel (+i)" +474 ERR_BANNEDFROMCHAN + "<channel> :Cannot join channel (+b)" +475 ERR_BADCHANNELKEY + "<channel> :Cannot join channel (+k)" +476 ERR_BADCHANMASK + "<channel> :Bad Channel Mask" +477 ERR_NOCHANMODES + "<channel> :Channel doesn't support modes" +478 ERR_BANLISTFULL + "<channel> <char> :Channel list is full" - - Returned after an attempt to connect and register - yourself with a server which has been setup to - explicitly deny connections to you. +481 ERR_NOPRIVILEGES + ":Permission Denied- You're not an IRC operator" - 466 ERR_YOUWILLBEBANNED + - Any command requiring operator privileges to operate + MUST return this error to indicate the attempt was + unsuccessful. - - Sent by a server to a user to inform that access to the - server will soon be denied. +482 ERR_CHANOPRIVSNEEDED + "<channel> :You're not channel operator" - 467 ERR_KEYSET - "<channel> :Channel key already set" - 471 ERR_CHANNELISFULL - "<channel> :Cannot join channel (+l)" - 472 ERR_UNKNOWNMODE - "<char> :is unknown mode char to me for <channel>" - 473 ERR_INVITEONLYCHAN - "<channel> :Cannot join channel (+i)" - 474 ERR_BANNEDFROMCHAN - "<channel> :Cannot join channel (+b)" - 475 ERR_BADCHANNELKEY - "<channel> :Cannot join channel (+k)" - 476 ERR_BADCHANMASK - "<channel> :Bad Channel Mask" - 477 ERR_NOCHANMODES - "<channel> :Channel doesn't support modes" - 478 ERR_BANLISTFULL - "<channel> <char> :Channel list is full" + - Any command requiring 'chanop' privileges (such as + MODE messages) MUST return this error if the client + making the attempt is not a chanop on the specified + channel. - 481 ERR_NOPRIVILEGES - ":Permission Denied- You're not an IRC operator" +483 ERR_CANTKILLSERVER + ":You can't kill a server!" - - Any command requiring operator privileges to operate - MUST return this error to indicate the attempt was - unsuccessful. + - Any attempts to use the KILL command on a server + are to be refused and this error returned directly + to the client. - 482 ERR_CHANOPRIVSNEEDED - "<channel> :You're not channel operator" +484 ERR_RESTRICTED + ":Your connection is restricted!" - - Any command requiring 'chanop' privileges (such as - MODE messages) MUST return this error if the client - making the attempt is not a chanop on the specified - channel. + - Sent by the server to a user upon connection to indicate + the restricted nature of the connection (user mode "+r"). - 483 ERR_CANTKILLSERVER - ":You can't kill a server!" +485 ERR_UNIQOPPRIVSNEEDED + ":You're not the original channel operator" - - Any attempts to use the KILL command on a server - are to be refused and this error returned directly - to the client. + - Any MODE requiring "channel creator" privileges MUST + return this error if the client making the attempt is not + a chanop on the specified channel. - 484 ERR_RESTRICTED - ":Your connection is restricted!" +491 ERR_NOOPERHOST + ":No O-lines for your host" - - Sent by the server to a user upon connection to indicate - the restricted nature of the connection (user mode "+r"). + - If a client sends an OPER message and the server has + not been configured to allow connections from the + client's host as an operator, this error MUST be + returned. - 485 ERR_UNIQOPPRIVSNEEDED - ":You're not the original channel operator" +501 ERR_UMODEUNKNOWNFLAG + ":Unknown MODE flag" - - Any MODE requiring "channel creator" privileges MUST - return this error if the client making the attempt is not - a chanop on the specified channel. + - Returned by the server to indicate that a MODE + message was sent with a nickname parameter and that + the a mode flag sent was not recognized. - 491 ERR_NOOPERHOST - ":No O-lines for your host" +502 ERR_USERSDONTMATCH + ":Cannot change mode for other users" - - If a client sends an OPER message and the server has - not been configured to allow connections from the - client's host as an operator, this error MUST be - returned. + - Error sent to any user trying to view or change the + user mode for a user other than themselves. - 501 ERR_UMODEUNKNOWNFLAG - ":Unknown MODE flag" - - - Returned by the server to indicate that a MODE - message was sent with a nickname parameter and that - the a mode flag sent was not recognized. - - 502 ERR_USERSDONTMATCH - ":Cannot change mode for other users" - - - Error sent to any user trying to view or change the - user mode for a user other than themselves. diff --git a/src/command.rs b/src/command.rs index 828c7a5..1a2324a 100644 --- a/src/command.rs +++ b/src/command.rs @@ -1,4 +1,4 @@ -use std::borrow::{ ToOwned, Cow }; +#![allow(non_camel_case_types)] use message::{ Message, MsgType }; @@ -1530,54 +1530,55 @@ pub enum Command<'a> { USERHOST(Vec<&'a str>), } -impl<'a> Command<'a> { - fn to_name(&self) -> &'static str { +/*impl<'a> Command<'a> { + pub fn to_name(&self) -> &'static str { + use self::Command::*; match self { - PASS => "PING", - NICK => "NICK", - USER => "USER", - OPER => "1004", - MODE => "1005", - SERVICE => "1006", - QUIT => "1007", - SQUIT => "1008", - JOIN => "1009", - PART => "1010", - TOPIC => "1011", - NAMES => "1012", - LIST => "1013", - INVITE => "1014", - KICK => "1015", - PRIVMSG => "1016", - NOTICE => "1017", - MOTD => "1018", - LUSERS => "1019", - VERSION => "1020", - STATS => "1021", - LINKS => "1022", - TIME => "1023", - CONNECT => "1024", - TRACE => "1025", - ADMIN => "1026", - INFO => "1027", - SERVLIST => "1028", - SQUERY => "1029", - WHO => "1030", - WHOIS => "1031", - WHOWAS => "1032", - KILL => "1033", - PING => "1034", - PONG => "1035", - ERROR => "1036", - AWAY => "1037", - REHASH => "1038", - DIE => "1039", - RESTART => "1040", - SUMMON => "1041", - USERS => "1042", - WALLOPS => "1043", - USERHOST => "1044", - ISON => "1045", + &PASS => "PING", + &NICK => "NICK", + &USER => "USER", + &OPER => "1004", + &MODE => "1005", + &SERVICE => "1006", + &QUIT => "1007", + &SQUIT => "1008", + &JOIN => "1009", + &PART => "1010", + &TOPIC => "1011", + &NAMES => "1012", + &LIST => "1013", + &INVITE => "1014", + &KICK => "1015", + &PRIVMSG => "1016", + &NOTICE => "1017", + &MOTD => "1018", + &LUSERS => "1019", + &VERSION => "1020", + &STATS => "1021", + &LINKS => "1022", + &TIME => "1023", + &CONNECT => "1024", + &TRACE => "1025", + &ADMIN => "1026", + &INFO => "1027", + &SERVLIST => "1028", + &SQUERY => "1029", + &WHO => "1030", + &WHOIS => "1031", + &WHOWAS => "1032", + &KILL => "1033", + &PING => "1034", + &PONG => "1035", + &ERROR => "1036", + &AWAY => "1037", + &REHASH => "1038", + &DIE => "1039", + &RESTART => "1040", + &SUMMON => "1041", + &USERS => "1042", + &WALLOPS => "1043", + &USERHOST => "1044", + &ISON => "1045", /* RPL_WELCOME => "001", RPL_YOURHOST => "002", @@ -1718,37 +1719,32 @@ impl<'a> Command<'a> { ERR_UMODEUNKNOWNFLAG => "501",*/ } } -} +}*/ impl<'a> Command<'a> { pub fn from_message(msg: &'a Message) -> Option<Command<'a>> { - match &msg.command.as_ref()[..] { - "NOTICE" => msg.content.get(0).and_then(|c| msg.content.get(1).map(|t| - Command::NOTICE { to: Cow::Borrowed(&t), content: Cow::Borrowed(&c) })), - "PING" => msg.content.get(0).and_then(|s1| msg.content.get(1).map(|s2| - Command::PING { server1: Some(Cow::Borrowed(&s1)), server2: Some(Cow::Borrowed(&s2)) })), - "001" => Some(Command::RPL_WELCOME), - "002" => Some(Command::RPL_YOURHOST), - "003" => Some(Command::RPL_CREATED), - "004" => Some(Command::RPL_MYINFO), - "451" => Some(Command::ErrNotRegistered), + match msg.command() { + "NOTICE" => msg.content().get(0).and_then(|c| msg.content().get(1).map(|t| + Command::NOTICE(t, c))), + "PING" => msg.content().get(0).map(|s1| + Command::PING(&s1, msg.content().get(1).map(|&s| s))), _ => unimplemented!() } } pub fn to_message(&'a self) -> Message { match self { - &Command::PING { ref server1, ref server2 } => { + &Command::PING(ref server1, ref server2) => { let mut c = Vec::new(); - if let &Some(ref s) = server1 { c.push(s.clone()) } + c.push(server1.clone()); if let &Some(ref s) = server2 { c.push(s.clone()) } - Message::new(None, Cow::Owned("PING".to_owned()), c, None, MsgType::Irc) + Message::format(None, "PING", c, None, MsgType::Irc) }, - &Command::PONG { ref server1, ref server2 } => { + &Command::PONG(ref server1, ref server2) => { let mut c = Vec::new(); - if let &Some(ref s) = server1 { c.push(s.clone()) } + c.push(server1.clone()); if let &Some(ref s) = server2 { c.push(s.clone()) } - Message::new(None, Cow::Owned("PONG".to_owned()), c, None, MsgType::Irc) + Message::format(None, "PONG", c, None, MsgType::Irc) }, _ => unimplemented!() } @@ -1,4 +1,4 @@ -#![feature(plugin, collections)] +#![feature(plugin, collections, custom_derive)] #![plugin(regex_macros)] extern crate regex; @@ -11,7 +11,8 @@ pub mod color; pub mod ident; pub mod callback; pub mod message; -// pub mod command; +pub mod command; +pub mod reply; use std::io; use std::result; @@ -20,7 +21,8 @@ use std::result; pub enum IrscError { Io(io::Error), AlreadyConnected, - NotConnected + NotConnected, + NotFound } pub type Result<T> = result::Result<T, IrscError>; diff --git a/src/reply.rs b/src/reply.rs new file mode 100644 index 0000000..005ec80 --- /dev/null +++ b/src/reply.rs @@ -0,0 +1,1331 @@ +use ::{ Result, IrscError }; +use std::str::FromStr; +use std::borrow::ToOwned; +#[allow(non_camel_case_types)] +#[derive(Debug, Hash, PartialEq, Eq)] +pub enum Reply { + /// 001 RPL_WELCOME + /// "Welcome to the Internet Relay Network + /// <nick>!<user>@<host>" + RPL_WELCOME = 001, + + /// 002 RPL_YOURHOST + /// "Your host is <servername>, running version <ver>" + RPL_YOURHOST = 002, + + /// 003 RPL_CREATED + /// "This server was created <date>" + RPL_CREATED = 003, + + /// 004 RPL_MYINFO + /// "<servername> <version> <available user modes> + /// <available channel modes>" + /// + /// - The server sends Replies 001 to 004 to a user upon + /// successful registration. + /// + RPL_MYINFO = 004, + + /// 005 RPL_BOUNCE + /// "Try server <server name>, port <port number>" + /// + /// - Sent by the server to a user to suggest an alternative + /// server. This is often used when the connection is + /// refused because the server is already full. + /// + RPL_BOUNCE = 005, + + /// 302 RPL_USERHOST + /// ":*1<reply> *( " " <reply> )" + /// + /// - Reply format used by USERHOST to list replies to + /// the query list. The reply string is composed as + /// follows: + /// + /// reply = nickname [ "*" ] "=" ( "+" / "-" ) hostname + /// + /// The '*' indicates whether the client has registered + /// as an Operator. The '-' or '+' characters represent + /// whether the client has set an AWAY message or not + /// respectively. + /// + RPL_USERHOST = 302, + + /// 303 RPL_ISON + /// ":*1<nick> *( " " <nick> )" + /// + /// - Reply format used by ISON to list replies to the + /// query list. + /// + RPL_ISON = 303, + + /// 301 RPL_AWAY + /// "<nick> :<away message>" + RPL_AWAY = 301, + + /// 305 RPL_UNAWAY + /// ":You are no longer marked as being away" + RPL_UNAWAY = 305, + + /// 306 RPL_NOWAWAY + /// ":You have been marked as being away" + /// + /// - These replies are used with the AWAY command (if + /// allowed). RPL_AWAY is sent to any client sending a + /// PRIVMSG to a client which is away. RPL_AWAY is only + /// sent by the server to which the client is connected. + /// Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the + /// client removes and sets an AWAY message. + /// + RPL_NOWAWAY = 306, + + /// 311 RPL_WHOISUSER + /// "<nick> <user> <host> * :<real name>" + RPL_WHOISUSER = 311, + + /// 312 RPL_WHOISSERVER + /// "<nick> <server> :<server info>" + RPL_WHOISSERVER = 312, + + /// 313 RPL_WHOISOPERATOR + /// "<nick> :is an IRC operator" + RPL_WHOISOPERATOR = 313, + + /// 317 RPL_WHOISIDLE + /// "<nick> <integer> :seconds idle" + RPL_WHOISIDLE = 317, + + /// 318 RPL_ENDOFWHOIS + /// "<nick> :End of WHOIS list" + RPL_ENDOFWHOIS = 318, + + /// 319 RPL_WHOISCHANNELS + /// "<nick> :*( ( "@" / "+" ) <channel> " " )" + /// + /// - Replies 311 - 313, 317 - 319 are all replies + /// generated in response to a WHOIS message. Given that + /// there are enough parameters present, the answering + /// server MUST either formulate a reply out of the above + /// numerics (if the query nick is found) or return an + /// error reply. The '*' in RPL_WHOISUSER is there as + /// the literal character and not as a wild card. For + /// each reply set, only RPL_WHOISCHANNELS may appear + /// more than once (for long lists of channel names). + /// The '@' and '+' characters next to the channel name + /// indicate whether a client is a channel operator or + /// has been granted permission to speak on a moderated + /// channel. The RPL_ENDOFWHOIS reply is used to mark + /// the end of processing a WHOIS message. + /// + RPL_WHOISCHANNELS = 319, + + /// 314 RPL_WHOWASUSER + /// "<nick> <user> <host> * :<real name>" + RPL_WHOWASUSER = 314, + + /// 369 RPL_ENDOFWHOWAS + /// "<nick> :End of WHOWAS" + /// + /// - When replying to a WHOWAS message, a server MUST use + /// the replies RPL_WHOWASUSER, RPL_WHOISSERVER or + /// ERR_WASNOSUCHNICK for each nickname in the presented + /// list. At the end of all reply batches, there MUST + /// be RPL_ENDOFWHOWAS (even if there was only one reply + /// and it was an error). + /// + RPL_ENDOFWHOWAS = 369, + + /// 321 RPL_LISTSTART + /// Obsolete. Not used. + /// + RPL_LISTSTART = 321, + + /// 322 RPL_LIST + /// "<channel> <# visible> :<topic>" + RPL_LIST = 322, + + /// 323 RPL_LISTEND + /// ":End of LIST" + /// + /// - Replies RPL_LIST, RPL_LISTEND mark the actual replies + /// with data and end of the server's response to a LIST + /// command. If there are no channels available to return, + /// only the end reply MUST be sent. + /// + RPL_LISTEND = 323, + + /// 325 RPL_UNIQOPIS + /// "<channel> <nickname>" + /// + RPL_UNIQOPIS = 325, + + /// 324 RPL_CHANNELMODEIS + /// "<channel> <mode> <mode params>" + /// + RPL_CHANNELMODEIS = 324, + + /// 331 RPL_NOTOPIC + /// "<channel> :No topic is set" + RPL_NOTOPIC = 331, + + /// 332 RPL_TOPIC + /// "<channel> :<topic>" + /// + /// - When sending a TOPIC message to determine the + /// channel topic, one of two replies is sent. If + /// the topic is set, RPL_TOPIC is sent back else + /// RPL_NOTOPIC. + /// + RPL_TOPIC = 332, + + /// 341 RPL_INVITING + /// "<channel> <nick>" + /// + /// - Returned by the server to indicate that the + /// attempted INVITE message was successful and is + /// being passed onto the end client. + /// + RPL_INVITING = 341, + + /// 342 RPL_SUMMONING + /// "<user> :Summoning user to IRC" + /// + /// - Returned by a server answering a SUMMON message to + /// indicate that it is summoning that user. + /// + RPL_SUMMONING = 342, + + /// 346 RPL_INVITELIST + /// "<channel> <invitemask>" + RPL_INVITELIST = 346, + + /// 347 RPL_ENDOFINVITELIST + /// "<channel> :End of channel invite list" + /// + /// - When listing the 'invitations masks' for a given channel, + /// a server is required to send the list back using the + /// RPL_INVITELIST and RPL_ENDOFINVITELIST messages. A + /// separate RPL_INVITELIST is sent for each active mask. + /// After the masks have been listed (or if none present) a + /// RPL_ENDOFINVITELIST MUST be sent. + /// + RPL_ENDOFINVITELIST = 347, + + /// 348 RPL_EXCEPTLIST + /// "<channel> <exceptionmask>" + RPL_EXCEPTLIST = 348, + + /// 349 RPL_ENDOFEXCEPTLIST + /// "<channel> :End of channel exception list" + /// + /// - When listing the 'exception masks' for a given channel, + /// a server is required to send the list back using the + /// RPL_EXCEPTLIST and RPL_ENDOFEXCEPTLIST messages. A + /// separate RPL_EXCEPTLIST is sent for each active mask. + /// After the masks have been listed (or if none present) + /// a RPL_ENDOFEXCEPTLIST MUST be sent. + /// + RPL_ENDOFEXCEPTLIST = 349, + + /// 351 RPL_VERSION + /// "<version>.<debuglevel> <server> :<comments>" + /// + /// - Reply by the server showing its version details. + /// The <version> is the version of the software being + /// used (including any patchlevel revisions) and the + /// <debuglevel> is used to indicate if the server is + /// running in "debug mode". + /// + /// The "comments" field may contain any comments about + /// the version or further version details. + /// + RPL_VERSION = 351, + + /// 352 RPL_WHOREPLY + /// "<channel> <user> <host> <server> <nick> + /// ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] + /// :<hopcount> <real name>" + /// + RPL_WHOREPLY = 352, + + /// 315 RPL_ENDOFWHO + /// "<name> :End of WHO list" + /// + /// - The RPL_WHOREPLY and RPL_ENDOFWHO pair are used + /// to answer a WHO message. The RPL_WHOREPLY is only + /// sent if there is an appropriate match to the WHO + /// query. If there is a list of parameters supplied + /// with a WHO message, a RPL_ENDOFWHO MUST be sent + /// after processing each list item with <name> being + /// the item. + /// + RPL_ENDOFWHO = 315, + + /// 353 RPL_NAMREPLY + /// "( "=" / "*" / "@" ) <channel> + /// :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> ) + /// - "@" is used for secret channels, "*" for private + /// channels, and "=" for others (public channels). + /// + RPL_NAMREPLY = 353, + + /// 366 RPL_ENDOFNAMES + /// "<channel> :End of NAMES list" + /// + /// - To reply to a NAMES message, a reply pair consisting + /// of RPL_NAMREPLY and RPL_ENDOFNAMES is sent by the + /// server back to the client. If there is no channel + /// found as in the query, then only RPL_ENDOFNAMES is + /// returned. The exception to this is when a NAMES + /// message is sent with no parameters and all visible + /// channels and contents are sent back in a series of + /// RPL_NAMEREPLY messages with a RPL_ENDOFNAMES to mark + /// the end. + /// + RPL_ENDOFNAMES = 366, + + /// 364 RPL_LINKS + /// "<mask> <server> :<hopcount> <server info>" + RPL_LINKS = 364, + + /// 365 RPL_ENDOFLINKS + /// "<mask> :End of LINKS list" + /// + /// - In replying to the LINKS message, a server MUST send + /// replies back using the RPL_LINKS numeric and mark the + /// end of the list using an RPL_ENDOFLINKS reply. + /// + RPL_ENDOFLINKS = 365, + + /// 367 RPL_BANLIST + /// "<channel> <banmask>" + RPL_BANLIST = 367, + + /// 368 RPL_ENDOFBANLIST + /// "<channel> :End of channel ban list" + /// + /// - When listing the active 'bans' for a given channel, + /// a server is required to send the list back using the + /// RPL_BANLIST and RPL_ENDOFBANLIST messages. A separate + /// RPL_BANLIST is sent for each active banmask. After the + /// banmasks have been listed (or if none present) a + /// RPL_ENDOFBANLIST MUST be sent. + /// + RPL_ENDOFBANLIST = 368, + + /// 371 RPL_INFO + /// ":<string>" + RPL_INFO = 371, + + /// 374 RPL_ENDOFINFO + /// ":End of INFO list" + /// + /// - A server responding to an INFO message is required to + /// send all its 'info' in a series of RPL_INFO messages + /// with a RPL_ENDOFINFO reply to indicate the end of the + /// replies. + /// + RPL_ENDOFINFO = 374, + + /// 375 RPL_MOTDSTART + /// ":- <server> Message of the day - " + RPL_MOTDSTART = 375, + + /// 372 RPL_MOTD + /// ":- <text>" + RPL_MOTD = 372, + + /// 376 RPL_ENDOFMOTD + /// ":End of MOTD command" + /// + /// - When responding to the MOTD message and the MOTD file + /// is found, the file is displayed line by line, with + /// each line no longer than 80 characters, using + /// RPL_MOTD format replies. These MUST be surrounded + /// by a RPL_MOTDSTART (before the RPL_MOTDs) and an + /// RPL_ENDOFMOTD (after). + /// + RPL_ENDOFMOTD = 376, + + /// 381 RPL_YOUREOPER + /// ":You are now an IRC operator" + /// + /// - RPL_YOUREOPER is sent back to a client which has + /// just successfully issued an OPER message and gained + /// operator status. + /// + RPL_YOUREOPER = 381, + + /// 382 RPL_REHASHING + /// "<config file> :Rehashing" + /// + /// - If the REHASH option is used and an operator sends + /// a REHASH message, an RPL_REHASHING is sent back to + /// the operator. + /// + RPL_REHASHING = 382, + + /// 383 RPL_YOURESERVICE + /// "You are service <servicename>" + /// + /// - Sent by the server to a service upon successful + /// registration. + /// + RPL_YOURESERVICE = 383, + + /// 391 RPL_TIME + /// "<server> :<string showing server's local time>" + /// + /// - When replying to the TIME message, a server MUST send + /// the reply using the RPL_TIME format above. The string + /// showing the time need only contain the correct day and + /// time there. There is no further requirement for the + /// time string. + /// + RPL_TIME = 391, + + /// 392 RPL_USERSSTART + /// ":UserID Terminal Host" + RPL_USERSSTART = 392, + + /// 393 RPL_USERS + /// ":<username> <ttyline> <hostname>" + RPL_USERS = 393, + + /// 394 RPL_ENDOFUSERS + /// ":End of users" + RPL_ENDOFUSERS = 394, + + /// 395 RPL_NOUSERS + /// ":Nobody logged in" + /// + /// - If the USERS message is handled by a server, the + /// replies RPL_USERSTART, RPL_USERS, RPL_ENDOFUSERS and + /// RPL_NOUSERS are used. RPL_USERSSTART MUST be sent + /// first, following by either a sequence of RPL_USERS + /// or a single RPL_NOUSER. Following this is + /// RPL_ENDOFUSERS. + /// + RPL_NOUSERS = 395, + + /// 200 RPL_TRACELINK + /// "Link <version & debug level> <destination> + /// <next server> V<protocol version> + /// <link uptime in seconds> <backstream sendq> + /// <upstream sendq>" + RPL_TRACELINK = 200, + + /// 201 RPL_TRACECONNECTING + /// "Try. <class> <server>" + RPL_TRACECONNECTING = 201, + + /// 202 RPL_TRACEHANDSHAKE + /// "H.S. <class> <server>" + RPL_TRACEHANDSHAKE = 202, + + /// 203 RPL_TRACEUNKNOWN + /// "???? <class> [<client IP address in dot form>]" + RPL_TRACEUNKNOWN = 203, + + /// 204 RPL_TRACEOPERATOR + /// "Oper <class> <nick>" + RPL_TRACEOPERATOR = 204, + + /// 205 RPL_TRACEUSER + /// "User <class> <nick>" + RPL_TRACEUSER = 205, + + /// 206 RPL_TRACESERVER + /// "Serv <class> <int>S <int>C <server> + /// <nick!user|*!*>@<host|server> V<protocol version>" + RPL_TRACESERVER = 206, + + /// 207 RPL_TRACESERVICE + /// "Service <class> <name> <type> <active type>" + RPL_TRACESERVICE = 207, + + /// 208 RPL_TRACENEWTYPE + /// "<newtype> 0 <client name>" + RPL_TRACENEWTYPE = 208, + + /// 209 RPL_TRACECLASS + /// "Class <class> <count>" + RPL_TRACECLASS = 209, + + /// 210 RPL_TRACERECONNECT + /// Unused. + RPL_TRACERECONNECT = 210, + + /// 261 RPL_TRACELOG + /// "File <logfile> <debug level>" + RPL_TRACELOG = 261, + + /// 262 RPL_TRACEEND + /// "<server name> <version & debug level> :End of TRACE" + /// + /// - The RPL_TRACE* are all returned by the server in + /// response to the TRACE message. How many are + /// returned is dependent on the TRACE message and + /// whether it was sent by an operator or not. There + /// is no predefined order for which occurs first. + /// Replies RPL_TRACEUNKNOWN, RPL_TRACECONNECTING and + /// RPL_TRACEHANDSHAKE are all used for connections + /// which have not been fully established and are either + /// unknown, still attempting to connect or in the + /// process of completing the 'server handshake'. + /// RPL_TRACELINK is sent by any server which handles + /// a TRACE message and has to pass it on to another + /// server. The list of RPL_TRACELINKs sent in + /// response to a TRACE command traversing the IRC + /// network should reflect the actual connectivity of + /// the servers themselves along that path. + /// + /// RPL_TRACENEWTYPE is to be used for any connection + /// which does not fit in the other categories but is + /// being displayed anyway. + /// RPL_TRACEEND is sent to indicate the end of the list. + /// + RPL_TRACEEND = 262, + + /// 211 RPL_STATSLINKINFO + /// "<linkname> <sendq> <sent messages> + /// <sent Kbytes> <received messages> + /// <received Kbytes> <time open>" + /// + /// - reports statistics on a connection. <linkname> + /// identifies the particular connection, <sendq> is + /// the amount of data that is queued and waiting to be + /// sent <sent messages> the number of messages sent, + /// and <sent Kbytes> the amount of data sent, in + /// Kbytes. <received messages> and <received Kbytes> + /// are the equivalent of <sent messages> and <sent + /// Kbytes> for received data, respectively. <time + /// open> indicates how long ago the connection was + /// opened, in seconds. + /// + RPL_STATSLINKINFO = 211, + + /// 212 RPL_STATSCOMMANDS + /// "<command> <count> <byte count> <remote count>" + /// + /// - reports statistics on commands usage. + /// + RPL_STATSCOMMANDS = 212, + + /// 219 RPL_ENDOFSTATS + /// "<stats letter> :End of STATS report" + /// + RPL_ENDOFSTATS = 219, + + /// 242 RPL_STATSUPTIME + /// ":Server Up %d days %d:%02d:%02d" + /// + /// - reports the server uptime. + /// + RPL_STATSUPTIME = 242, + + /// 243 RPL_STATSOLINE + /// "O <hostmask> * <name>" + /// + /// - reports the allowed hosts from where user may become IRC + /// operators. + /// + RPL_STATSOLINE = 243, + + /// 221 RPL_UMODEIS + /// "<user mode string>" + /// + /// - To answer a query about a client's own mode, + /// RPL_UMODEIS is sent back. + /// + RPL_UMODEIS = 221, + + /// 234 RPL_SERVLIST + /// "<name> <server> <mask> <type> <hopcount> <info>" + /// + RPL_SERVLIST = 234, + + /// 235 RPL_SERVLISTEND + /// "<mask> <type> :End of service listing" + /// + /// - When listing services in reply to a SERVLIST message, + /// a server is required to send the list back using the + /// RPL_SERVLIST and RPL_SERVLISTEND messages. A separate + /// RPL_SERVLIST is sent for each service. After the + /// services have been listed (or if none present) a + /// RPL_SERVLISTEND MUST be sent. + /// + RPL_SERVLISTEND = 235, + + /// 251 RPL_LUSERCLIENT + /// ":There are <integer> users and <integer> + /// services on <integer> servers" + RPL_LUSERCLIENT = 251, + + /// 252 RPL_LUSEROP + /// "<integer> :operator(s) online" + RPL_LUSEROP = 252, + + /// 253 RPL_LUSERUNKNOWN + /// "<integer> :unknown connection(s)" + RPL_LUSERUNKNOWN = 253, + + /// 254 RPL_LUSERCHANNELS + /// "<integer> :channels formed" + RPL_LUSERCHANNELS = 254, + + /// 255 RPL_LUSERME + /// ":I have <integer> clients and <integer> + /// servers" + /// + /// - In processing an LUSERS message, the server + /// sends a set of replies from RPL_LUSERCLIENT, + /// RPL_LUSEROP, RPL_USERUNKNOWN, + /// RPL_LUSERCHANNELS and RPL_LUSERME. When + /// replying, a server MUST send back + /// RPL_LUSERCLIENT and RPL_LUSERME. The other + /// replies are only sent back if a non-zero count + /// is found for them. + /// + RPL_LUSERME = 255, + + /// 256 RPL_ADMINME + /// "<server> :Administrative info" + RPL_ADMINME = 256, + + /// 257 RPL_ADMINLOC1 + /// ":<admin info>" + RPL_ADMINLOC1 = 257, + + /// 258 RPL_ADMINLOC2 + /// ":<admin info>" + RPL_ADMINLOC2 = 258, + + /// 259 RPL_ADMINEMAIL + /// ":<admin info>" + /// + /// - When replying to an ADMIN message, a server + /// is expected to use replies RPL_ADMINME + /// through to RPL_ADMINEMAIL and provide a text + /// message with each. For RPL_ADMINLOC1 a + /// description of what city, state and country + /// the server is in is expected, followed by + /// details of the institution (RPL_ADMINLOC2) + /// + /// and finally the administrative contact for the + /// server (an email address here is REQUIRED) + /// in RPL_ADMINEMAIL. + /// + RPL_ADMINEMAIL = 259, + + /// 263 RPL_TRYAGAIN + /// "<command> :Please wait a while and try again." + /// + /// - When a server drops a command without processing it, + /// it MUST use the reply RPL_TRYAGAIN to inform the + /// originating client. + /// + RPL_TRYAGAIN = 263, + + /// 401 ERR_NOSUCHNICK + /// "<nickname> :No such nick/channel" + /// + /// - Used to indicate the nickname parameter supplied to a + /// command is currently unused. + /// + ERR_NOSUCHNICK = 401, + + /// 402 ERR_NOSUCHSERVER + /// "<server name> :No such server" + /// + /// - Used to indicate the server name given currently + /// does not exist. + /// + ERR_NOSUCHSERVER = 402, + + /// 403 ERR_NOSUCHCHANNEL + /// "<channel name> :No such channel" + /// + /// - Used to indicate the given channel name is invalid. + /// + ERR_NOSUCHCHANNEL = 403, + + /// 404 ERR_CANNOTSENDTOCHAN + /// "<channel name> :Cannot send to channel" + /// + /// - Sent to a user who is either (a) not on a channel + /// which is mode +n or (b) not a chanop (or mode +v) on + /// a channel which has mode +m set or where the user is + /// banned and is trying to send a PRIVMSG message to + /// that channel. + /// + ERR_CANNOTSENDTOCHAN = 404, + + /// 405 ERR_TOOMANYCHANNELS + /// "<channel name> :You have joined too many channels" + /// + /// - Sent to a user when they have joined the maximum + /// number of allowed channels and they try to join + /// another channel. + /// + ERR_TOOMANYCHANNELS = 405, + + /// 406 ERR_WASNOSUCHNICK + /// "<nickname> :There was no such nickname" + /// + /// - Returned by WHOWAS to indicate there is no history + /// information for that nickname. + /// + ERR_WASNOSUCHNICK = 406, + + /// 407 ERR_TOOMANYTARGETS + /// "<target> :<error code> recipients. <abort message>" + /// + /// - Returned to a client which is attempting to send a + /// PRIVMSG/NOTICE using the user@host destination format + /// and for a user@host which has several occurrences. + /// + /// - Returned to a client which trying to send a + /// PRIVMSG/NOTICE to too many recipients. + /// + /// - Returned to a client which is attempting to JOIN a safe + /// channel using the shortname when there are more than one + /// such channel. + /// + ERR_TOOMANYTARGETS = 407, + + /// 408 ERR_NOSUCHSERVICE + /// "<service name> :No such service" + /// + /// - Returned to a client which is attempting to send a SQUERY + /// to a service which does not exist. + /// + ERR_NOSUCHSERVICE = 408, + + /// 409 ERR_NOORIGIN + /// ":No origin specified" + /// + /// - PING or PONG message missing the originator parameter. + /// + ERR_NOORIGIN = 409, + + /// 411 ERR_NORECIPIENT + /// ":No recipient given (<command>)" + ERR_NORECIPIENT = 411, + + /// 412 ERR_NOTEXTTOSEND + /// ":No text to send" + ERR_NOTEXTTOSEND = 412, + + /// 413 ERR_NOTOPLEVEL + /// "<mask> :No toplevel domain specified" + ERR_NOTOPLEVEL = 413, + + /// 414 ERR_WILDTOPLEVEL + /// "<mask> :Wildcard in toplevel domain" + ERR_WILDTOPLEVEL = 414, + + /// 415 ERR_BADMASK + /// "<mask> :Bad Server/host mask" + /// + /// - 412 - 415 are returned by PRIVMSG to indicate that + /// the message wasn't delivered for some reason. + /// ERR_NOTOPLEVEL and ERR_WILDTOPLEVEL are errors that + /// are returned when an invalid use of + /// "PRIVMSG $<server>" or "PRIVMSG #<host>" is attempted. + /// + ERR_BADMASK = 415, + + /// 421 ERR_UNKNOWNCOMMAND + /// "<command> :Unknown command" + /// + /// - Returned to a registered client to indicate that the + /// command sent is unknown by the server. + /// + ERR_UNKNOWNCOMMAND = 421, + + /// 422 ERR_NOMOTD + /// ":MOTD File is missing" + /// + /// - Server's MOTD file could not be opened by the server. + /// + ERR_NOMOTD = 422, + + /// 423 ERR_NOADMININFO + /// "<server> :No administrative info available" + /// + /// - Returned by a server in response to an ADMIN message + /// when there is an error in finding the appropriate + /// information. + /// + ERR_NOADMININFO = 423, + + /// 424 ERR_FILEERROR + /// ":File error doing <file op> on <file>" + /// + /// - Generic error message used to report a failed file + /// operation during the processing of a message. + /// + ERR_FILEERROR = 424, + + /// 431 ERR_NONICKNAMEGIVEN + /// ":No nickname given" + /// + /// - Returned when a nickname parameter expected for a + /// command and isn't found. + /// + ERR_NONICKNAMEGIVEN = 431, + + /// 432 ERR_ERRONEUSNICKNAME + /// "<nick> :Erroneous nickname" + /// + /// - Returned after receiving a NICK message which contains + /// characters which do not fall in the defined set. See + /// section 2.3.1 for details on valid nicknames. + /// + ERR_ERRONEUSNICKNAME = 432, + + /// 433 ERR_NICKNAMEINUSE + /// "<nick> :Nickname is already in use" + /// + /// - Returned when a NICK message is processed that results + /// in an attempt to change to a currently existing + /// nickname. + /// + ERR_NICKNAMEINUSE = 433, + + /// 436 ERR_NICKCOLLISION + /// "<nick> :Nickname collision KILL from <user>@<host>" + /// + /// - Returned by a server to a client when it detects a + /// nickname collision (registered of a NICK that + /// already exists by another server). + /// + ERR_NICKCOLLISION = 436, + + /// 437 ERR_UNAVAILRESOURCE + /// "<nick/channel> :Nick/channel is temporarily unavailable" + /// + /// - Returned by a server to a user trying to join a channel + /// currently blocked by the channel delay mechanism. + /// + /// - Returned by a server to a user trying to change nickname + /// when the desired nickname is blocked by the nick delay + /// mechanism. + /// + ERR_UNAVAILRESOURCE = 437, + + /// 441 ERR_USERNOTINCHANNEL + /// "<nick> <channel> :They aren't on that channel" + /// + /// - Returned by the server to indicate that the target + /// user of the command is not on the given channel. + /// + ERR_USERNOTINCHANNEL = 441, + + /// 442 ERR_NOTONCHANNEL + /// "<channel> :You're not on that channel" + /// + /// - Returned by the server whenever a client tries to + /// perform a channel affecting command for which the + /// client isn't a member. + /// + ERR_NOTONCHANNEL = 442, + + /// 443 ERR_USERONCHANNEL + /// "<user> <channel> :is already on channel" + /// + /// - Returned when a client tries to invite a user to a + /// channel they are already on. + /// + ERR_USERONCHANNEL = 443, + + /// 444 ERR_NOLOGIN + /// "<user> :User not logged in" + /// + /// - Returned by the summon after a SUMMON command for a + /// user was unable to be performed since they were not + /// logged in. + /// + ERR_NOLOGIN = 444, + + /// 445 ERR_SUMMONDISABLED + /// ":SUMMON has been disabled" + /// + /// - Returned as a response to the SUMMON command. MUST be + /// returned by any server which doesn't implement it. + /// + ERR_SUMMONDISABLED = 445, + + /// 446 ERR_USERSDISABLED + /// ":USERS has been disabled" + /// + /// - Returned as a response to the USERS command. MUST be + /// returned by any server which does not implement it. + /// + ERR_USERSDISABLED = 446, + + /// 451 ERR_NOTREGISTERED + /// ":You have not registered" + /// + /// - Returned by the server to indicate that the client + /// MUST be registered before the server will allow it + /// to be parsed in detail. + /// + ERR_NOTREGISTERED = 451, + + /// 461 ERR_NEEDMOREPARAMS + /// "<command> :Not enough parameters" + /// + /// - Returned by the server by numerous commands to + /// indicate to the client that it didn't supply enough + /// parameters. + /// + ERR_NEEDMOREPARAMS = 461, + + /// 462 ERR_ALREADYREGISTRED + /// ":Unauthorized command (already registered)" + /// + /// - Returned by the server to any link which tries to + /// change part of the registered details (such as + /// password or user details from second USER message). + /// + ERR_ALREADYREGISTRED = 462, + + /// 463 ERR_NOPERMFORHOST + /// ":Your host isn't among the privileged" + /// + /// - Returned to a client which attempts to register with + /// a server which does not been setup to allow + /// connections from the host the attempted connection + /// is tried. + /// + ERR_NOPERMFORHOST = 463, + + /// 464 ERR_PASSWDMISMATCH + /// ":Password incorrect" + /// + /// - Returned to indicate a failed attempt at registering + /// a connection for which a password was required and + /// was either not given or incorrect. + /// + ERR_PASSWDMISMATCH = 464, + + /// 465 ERR_YOUREBANNEDCREEP + /// ":You are banned from this server" + /// + /// - Returned after an attempt to connect and register + /// yourself with a server which has been setup to + /// explicitly deny connections to you. + /// + ERR_YOUREBANNEDCREEP = 465, + + /// 466 ERR_YOUWILLBEBANNED + /// + /// - Sent by a server to a user to inform that access to the + /// server will soon be denied. + /// + ERR_YOUWILLBEBANNED = 466, + + /// 467 ERR_KEYSET + /// "<channel> :Channel key already set" + ERR_KEYSET = 467, + + /// 471 ERR_CHANNELISFULL + /// "<channel> :Cannot join channel (+l)" + ERR_CHANNELISFULL = 471, + + /// 472 ERR_UNKNOWNMODE + /// "<char> :is unknown mode char to me for <channel>" + ERR_UNKNOWNMODE = 472, + + /// 473 ERR_INVITEONLYCHAN + /// "<channel> :Cannot join channel (+i)" + ERR_INVITEONLYCHAN = 473, + + /// 474 ERR_BANNEDFROMCHAN + /// "<channel> :Cannot join channel (+b)" + ERR_BANNEDFROMCHAN = 474, + + /// 475 ERR_BADCHANNELKEY + /// "<channel> :Cannot join channel (+k)" + ERR_BADCHANNELKEY = 475, + + /// 476 ERR_BADCHANMASK + /// "<channel> :Bad Channel Mask" + ERR_BADCHANMASK = 476, + + /// 477 ERR_NOCHANMODES + /// "<channel> :Channel doesn't support modes" + ERR_NOCHANMODES = 477, + + /// 478 ERR_BANLISTFULL + /// "<channel> <char> :Channel list is full" + /// + ERR_BANLISTFULL = 478, + + /// 481 ERR_NOPRIVILEGES + /// ":Permission Denied- You're not an IRC operator" + /// + /// - Any command requiring operator privileges to operate + /// MUST return this error to indicate the attempt was + /// unsuccessful. + /// + ERR_NOPRIVILEGES = 481, + + /// 482 ERR_CHANOPRIVSNEEDED + /// "<channel> :You're not channel operator" + /// + /// - Any command requiring 'chanop' privileges (such as + /// MODE messages) MUST return this error if the client + /// making the attempt is not a chanop on the specified + /// channel. + /// + ERR_CHANOPRIVSNEEDED = 482, + + /// 483 ERR_CANTKILLSERVER + /// ":You can't kill a server!" + /// + /// - Any attempts to use the KILL command on a server + /// are to be refused and this error returned directly + /// to the client. + /// + ERR_CANTKILLSERVER = 483, + + /// 484 ERR_RESTRICTED + /// ":Your connection is restricted!" + /// + /// - Sent by the server to a user upon connection to indicate + /// the restricted nature of the connection (user mode "+r"). + /// + ERR_RESTRICTED = 484, + + /// 485 ERR_UNIQOPPRIVSNEEDED + /// ":You're not the original channel operator" + /// + /// - Any MODE requiring "channel creator" privileges MUST + /// return this error if the client making the attempt is not + /// a chanop on the specified channel. + /// + ERR_UNIQOPPRIVSNEEDED = 485, + + /// 491 ERR_NOOPERHOST + /// ":No O-lines for your host" + /// + /// - If a client sends an OPER message and the server has + /// not been configured to allow connections from the + /// client's host as an operator, this error MUST be + /// returned. + /// + ERR_NOOPERHOST = 491, + + /// 501 ERR_UMODEUNKNOWNFLAG + /// ":Unknown MODE flag" + /// + /// - Returned by the server to indicate that a MODE + /// message was sent with a nickname parameter and that + /// the a mode flag sent was not recognized. + /// + ERR_UMODEUNKNOWNFLAG = 501, + + /// 502 ERR_USERSDONTMATCH + /// ":Cannot change mode for other users" + /// + /// - Error sent to any user trying to view or change the + /// user mode for a user other than themselves. + /// + ERR_USERSDONTMATCH = 502, + +} + + +impl FromStr for Reply { + type Err = IrscError; + fn from_str(s: &str) -> Result<Reply> { + use self::Reply::*; + match s { + "001" => Ok(RPL_WELCOME), + "002" => Ok(RPL_YOURHOST), + "003" => Ok(RPL_CREATED), + "004" => Ok(RPL_MYINFO), + "005" => Ok(RPL_BOUNCE), + "302" => Ok(RPL_USERHOST), + "303" => Ok(RPL_ISON), + "301" => Ok(RPL_AWAY), + "305" => Ok(RPL_UNAWAY), + "306" => Ok(RPL_NOWAWAY), + "311" => Ok(RPL_WHOISUSER), + "312" => Ok(RPL_WHOISSERVER), + "313" => Ok(RPL_WHOISOPERATOR), + "317" => Ok(RPL_WHOISIDLE), + "318" => Ok(RPL_ENDOFWHOIS), + "319" => Ok(RPL_WHOISCHANNELS), + "314" => Ok(RPL_WHOWASUSER), + "369" => Ok(RPL_ENDOFWHOWAS), + "321" => Ok(RPL_LISTSTART), + "322" => Ok(RPL_LIST), + "323" => Ok(RPL_LISTEND), + "325" => Ok(RPL_UNIQOPIS), + "324" => Ok(RPL_CHANNELMODEIS), + "331" => Ok(RPL_NOTOPIC), + "332" => Ok(RPL_TOPIC), + "341" => Ok(RPL_INVITING), + "342" => Ok(RPL_SUMMONING), + "346" => Ok(RPL_INVITELIST), + "347" => Ok(RPL_ENDOFINVITELIST), + "348" => Ok(RPL_EXCEPTLIST), + "349" => Ok(RPL_ENDOFEXCEPTLIST), + "351" => Ok(RPL_VERSION), + "352" => Ok(RPL_WHOREPLY), + "315" => Ok(RPL_ENDOFWHO), + "353" => Ok(RPL_NAMREPLY), + "366" => Ok(RPL_ENDOFNAMES), + "364" => Ok(RPL_LINKS), + "365" => Ok(RPL_ENDOFLINKS), + "367" => Ok(RPL_BANLIST), + "368" => Ok(RPL_ENDOFBANLIST), + "371" => Ok(RPL_INFO), + "374" => Ok(RPL_ENDOFINFO), + "375" => Ok(RPL_MOTDSTART), + "372" => Ok(RPL_MOTD), + "376" => Ok(RPL_ENDOFMOTD), + "381" => Ok(RPL_YOUREOPER), + "382" => Ok(RPL_REHASHING), + "383" => Ok(RPL_YOURESERVICE), + "391" => Ok(RPL_TIME), + "392" => Ok(RPL_USERSSTART), + "393" => Ok(RPL_USERS), + "394" => Ok(RPL_ENDOFUSERS), + "395" => Ok(RPL_NOUSERS), + "200" => Ok(RPL_TRACELINK), + "201" => Ok(RPL_TRACECONNECTING), + "202" => Ok(RPL_TRACEHANDSHAKE), + "203" => Ok(RPL_TRACEUNKNOWN), + "204" => Ok(RPL_TRACEOPERATOR), + "205" => Ok(RPL_TRACEUSER), + "206" => Ok(RPL_TRACESERVER), + "207" => Ok(RPL_TRACESERVICE), + "208" => Ok(RPL_TRACENEWTYPE), + "209" => Ok(RPL_TRACECLASS), + "210" => Ok(RPL_TRACERECONNECT), + "261" => Ok(RPL_TRACELOG), + "262" => Ok(RPL_TRACEEND), + "211" => Ok(RPL_STATSLINKINFO), + "212" => Ok(RPL_STATSCOMMANDS), + "219" => Ok(RPL_ENDOFSTATS), + "242" => Ok(RPL_STATSUPTIME), + "243" => Ok(RPL_STATSOLINE), + "221" => Ok(RPL_UMODEIS), + "234" => Ok(RPL_SERVLIST), + "235" => Ok(RPL_SERVLISTEND), + "251" => Ok(RPL_LUSERCLIENT), + "252" => Ok(RPL_LUSEROP), + "253" => Ok(RPL_LUSERUNKNOWN), + "254" => Ok(RPL_LUSERCHANNELS), + "255" => Ok(RPL_LUSERME), + "256" => Ok(RPL_ADMINME), + "257" => Ok(RPL_ADMINLOC1), + "258" => Ok(RPL_ADMINLOC2), + "259" => Ok(RPL_ADMINEMAIL), + "263" => Ok(RPL_TRYAGAIN), + "401" => Ok(ERR_NOSUCHNICK), + "402" => Ok(ERR_NOSUCHSERVER), + "403" => Ok(ERR_NOSUCHCHANNEL), + "404" => Ok(ERR_CANNOTSENDTOCHAN), + "405" => Ok(ERR_TOOMANYCHANNELS), + "406" => Ok(ERR_WASNOSUCHNICK), + "407" => Ok(ERR_TOOMANYTARGETS), + "408" => Ok(ERR_NOSUCHSERVICE), + "409" => Ok(ERR_NOORIGIN), + "411" => Ok(ERR_NORECIPIENT), + "412" => Ok(ERR_NOTEXTTOSEND), + "413" => Ok(ERR_NOTOPLEVEL), + "414" => Ok(ERR_WILDTOPLEVEL), + "415" => Ok(ERR_BADMASK), + "421" => Ok(ERR_UNKNOWNCOMMAND), + "422" => Ok(ERR_NOMOTD), + "423" => Ok(ERR_NOADMININFO), + "424" => Ok(ERR_FILEERROR), + "431" => Ok(ERR_NONICKNAMEGIVEN), + "432" => Ok(ERR_ERRONEUSNICKNAME), + "433" => Ok(ERR_NICKNAMEINUSE), + "436" => Ok(ERR_NICKCOLLISION), + "437" => Ok(ERR_UNAVAILRESOURCE), + "441" => Ok(ERR_USERNOTINCHANNEL), + "442" => Ok(ERR_NOTONCHANNEL), + "443" => Ok(ERR_USERONCHANNEL), + "444" => Ok(ERR_NOLOGIN), + "445" => Ok(ERR_SUMMONDISABLED), + "446" => Ok(ERR_USERSDISABLED), + "451" => Ok(ERR_NOTREGISTERED), + "461" => Ok(ERR_NEEDMOREPARAMS), + "462" => Ok(ERR_ALREADYREGISTRED), + "463" => Ok(ERR_NOPERMFORHOST), + "464" => Ok(ERR_PASSWDMISMATCH), + "465" => Ok(ERR_YOUREBANNEDCREEP), + "466" => Ok(ERR_YOUWILLBEBANNED), + "467" => Ok(ERR_KEYSET), + "471" => Ok(ERR_CHANNELISFULL), + "472" => Ok(ERR_UNKNOWNMODE), + "473" => Ok(ERR_INVITEONLYCHAN), + "474" => Ok(ERR_BANNEDFROMCHAN), + "475" => Ok(ERR_BADCHANNELKEY), + "476" => Ok(ERR_BADCHANMASK), + "477" => Ok(ERR_NOCHANMODES), + "478" => Ok(ERR_BANLISTFULL), + "481" => Ok(ERR_NOPRIVILEGES), + "482" => Ok(ERR_CHANOPRIVSNEEDED), + "483" => Ok(ERR_CANTKILLSERVER), + "484" => Ok(ERR_RESTRICTED), + "485" => Ok(ERR_UNIQOPPRIVSNEEDED), + "491" => Ok(ERR_NOOPERHOST), + "501" => Ok(ERR_UMODEUNKNOWNFLAG), + "502" => Ok(ERR_USERSDONTMATCH), + _ => Err(IrscError::NotFound) + } + } +} +impl ToString for Reply { + fn to_string(&self) -> String { + use self::Reply::*; + match *self { + RPL_WELCOME => "001".to_owned(), + RPL_YOURHOST => "002".to_owned(), + RPL_CREATED => "003".to_owned(), + RPL_MYINFO => "004".to_owned(), + RPL_BOUNCE => "005".to_owned(), + RPL_USERHOST => "302".to_owned(), + RPL_ISON => "303".to_owned(), + RPL_AWAY => "301".to_owned(), + RPL_UNAWAY => "305".to_owned(), + RPL_NOWAWAY => "306".to_owned(), + RPL_WHOISUSER => "311".to_owned(), + RPL_WHOISSERVER => "312".to_owned(), + RPL_WHOISOPERATOR => "313".to_owned(), + RPL_WHOISIDLE => "317".to_owned(), + RPL_ENDOFWHOIS => "318".to_owned(), + RPL_WHOISCHANNELS => "319".to_owned(), + RPL_WHOWASUSER => "314".to_owned(), + RPL_ENDOFWHOWAS => "369".to_owned(), + RPL_LISTSTART => "321".to_owned(), + RPL_LIST => "322".to_owned(), + RPL_LISTEND => "323".to_owned(), + RPL_UNIQOPIS => "325".to_owned(), + RPL_CHANNELMODEIS => "324".to_owned(), + RPL_NOTOPIC => "331".to_owned(), + RPL_TOPIC => "332".to_owned(), + RPL_INVITING => "341".to_owned(), + RPL_SUMMONING => "342".to_owned(), + RPL_INVITELIST => "346".to_owned(), + RPL_ENDOFINVITELIST => "347".to_owned(), + RPL_EXCEPTLIST => "348".to_owned(), + RPL_ENDOFEXCEPTLIST => "349".to_owned(), + RPL_VERSION => "351".to_owned(), + RPL_WHOREPLY => "352".to_owned(), + RPL_ENDOFWHO => "315".to_owned(), + RPL_NAMREPLY => "353".to_owned(), + RPL_ENDOFNAMES => "366".to_owned(), + RPL_LINKS => "364".to_owned(), + RPL_ENDOFLINKS => "365".to_owned(), + RPL_BANLIST => "367".to_owned(), + RPL_ENDOFBANLIST => "368".to_owned(), + RPL_INFO => "371".to_owned(), + RPL_ENDOFINFO => "374".to_owned(), + RPL_MOTDSTART => "375".to_owned(), + RPL_MOTD => "372".to_owned(), + RPL_ENDOFMOTD => "376".to_owned(), + RPL_YOUREOPER => "381".to_owned(), + RPL_REHASHING => "382".to_owned(), + RPL_YOURESERVICE => "383".to_owned(), + RPL_TIME => "391".to_owned(), + RPL_USERSSTART => "392".to_owned(), + RPL_USERS => "393".to_owned(), + RPL_ENDOFUSERS => "394".to_owned(), + RPL_NOUSERS => "395".to_owned(), + RPL_TRACELINK => "200".to_owned(), + RPL_TRACECONNECTING => "201".to_owned(), + RPL_TRACEHANDSHAKE => "202".to_owned(), + RPL_TRACEUNKNOWN => "203".to_owned(), + RPL_TRACEOPERATOR => "204".to_owned(), + RPL_TRACEUSER => "205".to_owned(), + RPL_TRACESERVER => "206".to_owned(), + RPL_TRACESERVICE => "207".to_owned(), + RPL_TRACENEWTYPE => "208".to_owned(), + RPL_TRACECLASS => "209".to_owned(), + RPL_TRACERECONNECT => "210".to_owned(), + RPL_TRACELOG => "261".to_owned(), + RPL_TRACEEND => "262".to_owned(), + RPL_STATSLINKINFO => "211".to_owned(), + RPL_STATSCOMMANDS => "212".to_owned(), + RPL_ENDOFSTATS => "219".to_owned(), + RPL_STATSUPTIME => "242".to_owned(), + RPL_STATSOLINE => "243".to_owned(), + RPL_UMODEIS => "221".to_owned(), + RPL_SERVLIST => "234".to_owned(), + RPL_SERVLISTEND => "235".to_owned(), + RPL_LUSERCLIENT => "251".to_owned(), + RPL_LUSEROP => "252".to_owned(), + RPL_LUSERUNKNOWN => "253".to_owned(), + RPL_LUSERCHANNELS => "254".to_owned(), + RPL_LUSERME => "255".to_owned(), + RPL_ADMINME => "256".to_owned(), + RPL_ADMINLOC1 => "257".to_owned(), + RPL_ADMINLOC2 => "258".to_owned(), + RPL_ADMINEMAIL => "259".to_owned(), + RPL_TRYAGAIN => "263".to_owned(), + ERR_NOSUCHNICK => "401".to_owned(), + ERR_NOSUCHSERVER => "402".to_owned(), + ERR_NOSUCHCHANNEL => "403".to_owned(), + ERR_CANNOTSENDTOCHAN => "404".to_owned(), + ERR_TOOMANYCHANNELS => "405".to_owned(), + ERR_WASNOSUCHNICK => "406".to_owned(), + ERR_TOOMANYTARGETS => "407".to_owned(), + ERR_NOSUCHSERVICE => "408".to_owned(), + ERR_NOORIGIN => "409".to_owned(), + ERR_NORECIPIENT => "411".to_owned(), + ERR_NOTEXTTOSEND => "412".to_owned(), + ERR_NOTOPLEVEL => "413".to_owned(), + ERR_WILDTOPLEVEL => "414".to_owned(), + ERR_BADMASK => "415".to_owned(), + ERR_UNKNOWNCOMMAND => "421".to_owned(), + ERR_NOMOTD => "422".to_owned(), + ERR_NOADMININFO => "423".to_owned(), + ERR_FILEERROR => "424".to_owned(), + ERR_NONICKNAMEGIVEN => "431".to_owned(), + ERR_ERRONEUSNICKNAME => "432".to_owned(), + ERR_NICKNAMEINUSE => "433".to_owned(), + ERR_NICKCOLLISION => "436".to_owned(), + ERR_UNAVAILRESOURCE => "437".to_owned(), + ERR_USERNOTINCHANNEL => "441".to_owned(), + ERR_NOTONCHANNEL => "442".to_owned(), + ERR_USERONCHANNEL => "443".to_owned(), + ERR_NOLOGIN => "444".to_owned(), + ERR_SUMMONDISABLED => "445".to_owned(), + ERR_USERSDISABLED => "446".to_owned(), + ERR_NOTREGISTERED => "451".to_owned(), + ERR_NEEDMOREPARAMS => "461".to_owned(), + ERR_ALREADYREGISTRED => "462".to_owned(), + ERR_NOPERMFORHOST => "463".to_owned(), + ERR_PASSWDMISMATCH => "464".to_owned(), + ERR_YOUREBANNEDCREEP => "465".to_owned(), + ERR_YOUWILLBEBANNED => "466".to_owned(), + ERR_KEYSET => "467".to_owned(), + ERR_CHANNELISFULL => "471".to_owned(), + ERR_UNKNOWNMODE => "472".to_owned(), + ERR_INVITEONLYCHAN => "473".to_owned(), + ERR_BANNEDFROMCHAN => "474".to_owned(), + ERR_BADCHANNELKEY => "475".to_owned(), + ERR_BADCHANMASK => "476".to_owned(), + ERR_NOCHANMODES => "477".to_owned(), + ERR_BANLISTFULL => "478".to_owned(), + ERR_NOPRIVILEGES => "481".to_owned(), + ERR_CHANOPRIVSNEEDED => "482".to_owned(), + ERR_CANTKILLSERVER => "483".to_owned(), + ERR_RESTRICTED => "484".to_owned(), + ERR_UNIQOPPRIVSNEEDED => "485".to_owned(), + ERR_NOOPERHOST => "491".to_owned(), + ERR_UMODEUNKNOWNFLAG => "501".to_owned(), + ERR_USERSDONTMATCH => "502".to_owned(), + } + } +} |