diff --git a/plugins/irc/ircclient.c b/plugins/irc/ircclient.c index fbf7e3c83..7d4410227 100644 --- a/plugins/irc/ircclient.c +++ b/plugins/irc/ircclient.c @@ -1,6 +1,10 @@ //Released under the terms of the gpl as this file uses a bit of quake derived code. All sections of the like are marked as such // changes name to while in channel // mode command +// Spike can you implement nick tab completion. ~moodles +// need option for whois on receiving PM +// bug: setting channel to private, crashes fte when trying to join it. +// http://www.mirc.net/raws/ #include "../plugin.h" @@ -31,6 +35,9 @@ vmcvar_t *cvarlist[] ={ char commandname[64]; // belongs to magic tokenizer char subvar[9][1000]; // etghack char casevar[9][1000]; //numbered_command +time_t seconds; // irc_connect +int irc_connecting = 0; +#define CURRENTCONSOLE "" // need to make this the current console #define DEFAULTCONSOLE "" #define RELEASE "Febuary 2 2006" @@ -316,6 +323,8 @@ ircclient_t *IRC_Connect(char *server, int defport) ircclient_t *irc; unsigned long _true = true; + seconds = time (NULL); // when we connected + irc_connecting = 1; //we are connecting.. so lets do the nickname stuff irc = IRC_Malloc(sizeof(ircclient_t)); if (!irc) @@ -368,6 +377,14 @@ void IRC_SetUser(ircclient_t *irc, char *user) IRC_AddClientMessage(irc, va("USER %s %s %s :%s", irc_ident.string, irc->hostname, irc->server, irc_realname.string)); } +void IRC_JoinChannel(ircclient_t *irc, char *channel, char *key) // i screwed up, its actually: {,} [{,}] +{ + if ( *channel != '#' ) + IRC_AddClientMessage(irc, va("JOIN #%s %s", channel,key)); + else + IRC_AddClientMessage(irc, va("JOIN %s %s", channel,key)); +} + /* @@ -582,7 +599,7 @@ void magic_etghack(char *thestring) //================================================== -void numbered_command(int comm,char *msg,ircclient_t *irc) +void numbered_command(int comm,char *msg,ircclient_t *irc) // move vars up 1 more than debug says { magic_tokenizer(0,msg); @@ -594,7 +611,10 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) case 004: case 005: { + irc_connecting = 0; // ok we are connected + Con_SubPrintf(DEFAULTCONSOLE, COLOURYELLOW "SERVER STATS: %s\n",casevar[3]); + return; break; } case 250: @@ -603,7 +623,11 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) case 253: case 254: case 255: + case 265: + case 266: { + Con_SubPrintf(DEFAULTCONSOLE, COLOURYELLOW "SERVER STATS: %s\n",casevar[3]); + return; break; } case 301: /* #define RPL_AWAY 301 */ @@ -612,6 +636,16 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) char *awaymessage = casevar[4]+1; Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: <%s> (Away Message: %s)\n",username,awaymessage); + return; + break; + } + case 305: /* RPL_UNAWAY */ + case 306: /* RPL_NOWAWAY */ + { + char *away = casevar[3]+1; + + Con_SubPrintf(CURRENTCONSOLE,"%s\n",away); + return; break; } case 311: /* #define RPL_WHOISUSER 311 */ @@ -622,15 +656,27 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) char *realname = casevar[7]+1; Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: <%s> (Ident: %s) (Address: %s) (Realname: %s) \n", username, ident, address, realname); + return; break; } - case 312: /* #define RPL_WHOISSERVER 312 */ + case 312: /* #define RPL_WHOISSERVER 312 */ //seems to be /whowas also { char *username = strtok(casevar[3], " "); char *serverhostname = strtok(casevar[4], " "); char *servername = casevar[5]+1; Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: <%s> (Server: %s) (Server Name: %s) \n", username, serverhostname, servername); + return; + break; + } + case 313: /* RPL_WHOISOPERATOR */ + { + char *username = strtok(casevar[3], " "); + char *isoperator = casevar[4]+1; + + Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: <%s> (%s)\n", username,isoperator); + + return; break; } case 317: /* #define RPL_WHOISIDLE 317 */ @@ -648,6 +694,7 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) strftime (buffer, 100, "%a %b %d %H:%M:%S", tm); Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: <%s> (Idle Time: %s seconds) (Signon Time: %s) \n", username, secondsidle, buffer); + return; break; } case 318: /* #define RPL_ENDOFWHOIS 318 */ @@ -656,6 +703,7 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: %s\n", endofwhois); + return; break; } case 319: /* #define RPL_WHOISCHANNELS 319 */ @@ -663,12 +711,14 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) char *username = strtok(casevar[3], " "); char *channels = casevar[4]+1; - Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: <%s> (Channels: %s)\n",username,channels); + Con_SubPrintf(DEFAULTCONSOLE,"WHOIS: <%s> (Channels: %s)\n",username,channels); // need to remove the space from the end of channels + return; break; } case 322: /* #define RPL_LIST 322 */ { Con_SubPrintf(DEFAULTCONSOLE, "%s\n", msg); + return; break; } case 372: @@ -684,15 +734,38 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) else if (irc_motd.value) Con_SubPrintf(DEFAULTCONSOLE, "%s\n", motdmessage); + if (*irc->autochannels) + IRC_JoinChannel(ircclient,irc->autochannels,""); // note to self... "" needs to be the channel key.. so autochannels needs a recoded + + return; break; } case 378: { Con_SubPrintf(DEFAULTCONSOLE, "%s\n", msg); + return; break; } - case 433: - case 438: /* #define ERR_NICKNAMEINUSE 433 */ + case 401: + case 403: + case 404: + case 405: + { + char *username = strtok(casevar[3], " "); + char *error = casevar[4]+1; + + Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR <%s>: %s\n",username,error); + return; + break; + } + case 432: /* #define ERR_ERRONEUSNICKNAME 432 */ + { + Con_SubPrintf(DEFAULTCONSOLE, "Erroneous/invalid nickname given\n"); + return; + break; + } + case 433: /* #define ERR_NICKNAMEINUSE 433 */ + case 438: case 453: { char *nickname = strtok(casevar[4], " "); @@ -708,11 +781,11 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s> is already in use.\n",nickname); - if (!strcmp(nickname,irc_nick.string)) + if ( !strcmp(nickname,irc_nick.string) && (irc_connecting == 1) ) { IRC_SetNick(irc, irc_altnick.string); } - else if (!strcmp(nickname,irc_altnick.string)) + else if ( !strcmp(nickname,irc_altnick.string) && (irc_connecting == 1) ) { Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s> AND <%s> both in use. Attempting generic nickname.\n",irc_nick.string,irc_altnick.string); seedednick = va("FTE%i",rand()); @@ -722,28 +795,73 @@ void numbered_command(int comm,char *msg,ircclient_t *irc) } else { - seedednick = va("FTE%i",rand()); - - IRC_SetNick(irc, seedednick); + if (irc_connecting == 1) + { + seedednick = va("FTE%i",rand()); + IRC_SetNick(irc, seedednick); + } } - /*if (irc->nickcycle >= 99) //this is just silly. - return IRC_KILL; - if (!irc->nickcycle) //sequentially try the next one up - IRC_SetNick(irc, irc_altnick.string); - else - IRC_SetNick(irc, va("%s%i", irc_nick.string, irc->nickcycle)); - - irc->nickcycle++;*/ + return; break; } - case 432: /* #define ERR_ERRONEUSNICKNAME 432 */ + case 471: /* ERR_CHANNELISFULL */ { - Con_SubPrintf(DEFAULTCONSOLE, "Erroneous/invalid nickname given\n"); + char *channel = strtok(casevar[3], " "); + char *error = casevar[4]+1; + + Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s>: %s (Channel is full and has reached user limit)\n",channel,error); + return; break; } + case 472: /* ERR_UNKNOWNMODE */ + { + char *mode = strtok(casevar[3], " "); + char *error = casevar[4]+1; + Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s>: %s (Unknown mode)\n",mode,error); + return; + break; } + case 473: /* ERR_INVITEONLYCHAN */ + { + char *channel = strtok(casevar[3], " "); + char *error = casevar[4]+1; + + Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s>: %s (Invite only)\n",channel,error); + return; + break; + } + case 474: /* ERR_BANNEDFROMCHAN */ + { + char *channel = strtok(casevar[3], " "); + char *error = casevar[4]+1; + + Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s>: %s (You are banned)\n",channel,error); + return; + break; + } + case 475: /* ERR_BADCHANNELKEY */ + { + char *channel = strtok(casevar[3], " "); + char *error = casevar[4]+1; + + Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s>: %s (Need the correct channel key. Example: /join %s bananas)\n",channel,error,channel); + return; + break; + } + case 482: /* ERR_CHANOPRIVSNEEDED */ + { + char *channel = strtok(casevar[3], " "); + char *error = casevar[4]+1; + + Con_SubPrintf(DEFAULTCONSOLE, COLOURRED "ERROR: <%s>: %s (Need +o or @ status)\n",channel,error,channel); + return; + break; + } + } + + Con_SubPrintf(DEFAULTCONSOLE, "%s\n", msg); // if no raw number exists, print the thing } //================================================== @@ -754,9 +872,9 @@ int IRC_ClientFrame(ircclient_t *irc) int ret; char *nextmsg, *msg; char *raw; - char var[9][1000]; char *temp; char temp2[4096]; + char var[9][1000]; int i = 1; @@ -864,7 +982,7 @@ int IRC_ClientFrame(ircclient_t *irc) char *ctcpreplytype = strtok(var[4]+2, " "); char *ctcpreply = var[5]; - Con_SubPrintf(DEFAULTCONSOLE," %s FROM %s: %s\n",ctcpreplytype,username,ctcpreply); + Con_SubPrintf(DEFAULTCONSOLE," %s FROM %s: %s\n",ctcpreplytype,username,ctcpreply); // need to remove the last char on the end of ctcpreply } else if (exc && col) { @@ -1004,8 +1122,12 @@ int IRC_ClientFrame(ircclient_t *irc) } else if (!strncmp(col+1, "PING ", 5)) { + time_t currentseconds; + + currentseconds = time (NULL); + Con_SubPrintf(to, "Ping from %s\n", prefix); //from client -// IRC_AddClientMessage(irc, va("PRIVMSG %s :\001PING %s\001\r\n", prefix, col+6)); + IRC_AddClientMessage(irc, va("NOTICE %s :\001PING %i\001\r\n", prefix, currentseconds)); } else { @@ -1194,625 +1316,12 @@ int IRC_ClientFrame(ircclient_t *irc) char *rawmessage = var[5]; char *wholerawmessage = var[4]; - //Con_SubPrintf(DEFAULTCONSOLE,"$$$ %s $$$\n",raw); - numbered_command(atoi(raw),msg,ircclient); + + IRC_CvarUpdate(); + + if (irc_debug.value == 1) { Con_SubPrintf(DEFAULTCONSOLE, "%s\n", msg); } } - else if (!strncmp(msg, "422 ", 4) || !strncmp(msg, "376 ", 4)) - { //no motd || end of motd - - //send automagic channel join messages. - if (*irc->autochannels) - IRC_AddClientMessage(irc, va("JOIN %s", irc->autochannels)); - } - /* - else if (!strncmp(msg, "401 ", 4)) - { - dprintf("Nickname/channel does not exist\n", msg); - } - - else if (!strncmp(msg, "402 ", 4)) - { - dprintf("No such server\n", msg); - } - else if (!strncmp(msg, "403 ", 4)) - { - dprintf("No such channel\n", msg); - } - else if (!strncmp(msg, "404 ", 4)) - { - dprintf("Cannot send to that channel\n", msg); - } - else if (!strncmp(msg, "405 ", 4)) - { - dprintf("You may not join annother channel\n", msg); - } - else if (!strncmp(msg, "406 ", 4)) - { - dprintf("Nickname does not exist\n", msg); - } - else if (!strncmp(msg, "407 ", 4)) - { - dprintf("Too many targets. Try to specify a specific nickname.\n", msg); - } - - else if (!strncmp(msg, "409 ", 4)) - { - dprintf("No origin specified\n", msg); - } - else if (!strncmp(msg, "411 ", 4)) - { - dprintf("No recipient given.\n", msg); - } - else if (!strncmp(msg, "412 ", 4)) - { - dprintf("No text given\n", msg); - } - else if (!strncmp(msg, "413 ", 4)) - { - dprintf("No top level domain specified\n", msg); - } - else if (!strncmp(msg, "414 ", 4)) - { - dprintf("Wildcard in toplevel domain\n", msg); - } - else if (!strncmp(msg, "421 ", 4)) - { - dprintf("Unknown command.\n", msg); - } - else if (!strncmp(msg, "422 ", 4)) - { - dprintf("MOTD file is missing (awww)\n", msg); - } - else if (!strncmp(msg, "423 ", 4)) - { - dprintf("No administrative info is available\n", msg); - } - else if (!strncmp(msg, "424 ", 4)) - { - dprintf("Generic file error\n", msg); - } - else if (!strncmp(msg, "441 ", 4)) - { - dprintf("User isn't in that channel\n", msg); - } - else if (!strncmp(msg, "442 ", 4)) - { - dprintf("You are not on that channel\n", msg); - } - else if (!strncmp(msg, "443 ", 4)) - { - dprintf("The user is already on that channel\n", msg); - } - else if (!strncmp(msg, "444 ", 4)) - { - dprintf("User not logged in\n", msg); - } - else if (!strncmp(msg, "445 ", 4)) - { - dprintf("SUMMON has been disabled\n", msg); - } - else if (!strncmp(msg, "446 ", 4)) - { - dprintf("USERS has been disabled\n", msg); - } - else if (!strncmp(msg, "451 ", 4)) - { - dprintf("You have not registered\n", msg); - } - - - 461 ERR_NEEDMOREPARAMS - " :Not enough parameters" - - - Returned by the server by numerous commands to - indicate to the client that it didn't supply enough - parameters. - - 462 ERR_ALREADYREGISTRED - ":You may not reregister" - - - 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). - - 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. - - - --------------------------------------------------------------------------------- -Page 47 - - 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. - - 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. - - 467 ERR_KEYSET - " :Channel key already set" - 471 ERR_CHANNELISFULL - " :Cannot join channel (+l)" - 472 ERR_UNKNOWNMODE - " :is unknown mode char to me" - 473 ERR_INVITEONLYCHAN - " :Cannot join channel (+i)" - 474 ERR_BANNEDFROMCHAN - " :Cannot join channel (+b)" - 475 ERR_BADCHANNELKEY - " :Cannot join channel (+k)" - 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. - - 482 ERR_CHANOPRIVSNEEDED - " :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. - - 483 ERR_CANTKILLSERVER - ":You cant 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. - - - --------------------------------------------------------------------------------- -Page 48 - - 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. - - 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 - ":Cant change mode for other users" - - - Error sent to any user trying to view or change the - user mode for a user other than themselves. - - -6.2 Command responses. - - 300 RPL_NONE - Dummy reply number. Not used. - - 302 RPL_USERHOST - ":[{}]" - - - Reply format used by USERHOST to list replies to - the query list. The reply string is composed as - follows: - - ::= ['*'] '=' <'+'|'-'> - -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 - ":[ {}]" - - - Reply format used by ISON to list replies to the - query list. - - 301 RPL_AWAY - " :" - - - --------------------------------------------------------------------------------- -Page 49 - - 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 - " * :" - 312 RPL_WHOISSERVER - " :" - 313 RPL_WHOISOPERATOR - " :is an IRC operator" - 317 RPL_WHOISIDLE - " :seconds idle" - 318 RPL_ENDOFWHOIS - " :End of /WHOIS list" - 319 RPL_WHOISCHANNELS - " :{[@|+]}" - - - 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 - " * :" - 369 RPL_ENDOFWHOWAS - " :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 - - - --------------------------------------------------------------------------------- -Page 50 -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 - "Channel :Users Name" - 322 RPL_LIST - " <# visible> :" - 323 RPL_LISTEND - ":End of /LIST" - - - Replies RPL_LISTSTART, RPL_LIST, RPL_LISTEND mark - the start, 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 start - and end reply must be sent. - - 324 RPL_CHANNELMODEIS - " " - - 331 RPL_NOTOPIC - " :No topic is set" - 332 RPL_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 - " " - - - Returned by the server to indicate that the - attempted INVITE message was successful and is - being passed onto the end client. - - 342 RPL_SUMMONING - " :Summoning user to IRC" - - - Returned by a server answering a SUMMON message to - indicate that it is summoning that user. - - 351 RPL_VERSION - ". :" - - - Reply by the server showing its version details. - The is the version of the software being - - - --------------------------------------------------------------------------------- -Page 51 -used (including any patchlevel revisions) and the - - 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 - " \ - [*][@|+] : " - 315 RPL_ENDOFWHO - " :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 being - the item. - - 353 RPL_NAMREPLY - " :[[@|+] [[@|+] [...]]]" - 366 RPL_ENDOFNAMES - " :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 - " : " - 365 RPL_ENDOFLINKS - " :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 - " " - 368 RPL_ENDOFBANLIST - - - --------------------------------------------------------------------------------- -Page 52 -" :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 banid. After the - banids have been listed (or if none present) a - RPL_ENDOFBANLIST must be sent. - - 371 RPL_INFO - ":" - 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 - ":- Message of the day - " - 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 should 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 - " :Rehashing" - - - If the REHASH option is used and an operator sends - a REHASH message, an RPL_REHASHING is sent back to - the operator. - - 391 RPL_TIME - - - --------------------------------------------------------------------------------- -Page 53 -" :" - - - - 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 - ":%-8s %-9s %-8s" - 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 \ - " - 201 RPL_TRACECONNECTING - "Try. " - 202 RPL_TRACEHANDSHAKE - "H.S. " - 203 RPL_TRACEUNKNOWN - "???? []" - 204 RPL_TRACEOPERATOR - "Oper " - 205 RPL_TRACEUSER - "User " - 206 RPL_TRACESERVER - "Serv S C \ - @" - 208 RPL_TRACENEWTYPE - " 0 " - 261 RPL_TRACELOG - "File " - - - The RPL_TRACE* are all returned by the server in - response to the TRACE message. How many are - returned is dependent on the the TRACE message and - - - --------------------------------------------------------------------------------- -Page 54 -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. - - - 211 RPL_STATSLINKINFO - " \ - \ -