aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build_commands.rs (renamed from build.rs)0
-rw-r--r--build_replies.rs81
-rw-r--r--rfc2812_replies.txt1352
-rw-r--r--src/command.rs126
-rw-r--r--src/lib.rs8
-rw-r--r--src/reply.rs1331
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!()
}
diff --git a/src/lib.rs b/src/lib.rs
index f37c9a4..bf85c49 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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(),
+ }
+ }
+}