mega fixes, recoding, nick stuff more compatible etc
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1928 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
bcea75ae31
commit
c0c7db487b
1 changed files with 166 additions and 647 deletions
|
@ -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: <channel>{,<channel>} [<key>{,<key>}]
|
||||
{
|
||||
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());
|
||||
|
@ -721,29 +794,74 @@ void numbered_command(int comm,char *msg,ircclient_t *irc)
|
|||
|
||||
}
|
||||
else
|
||||
{
|
||||
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,"<CTCP Reply> %s FROM %s: %s\n",ctcpreplytype,username,ctcpreply);
|
||||
Con_SubPrintf(DEFAULTCONSOLE,"<CTCP Reply> %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
|
||||
"<command> :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> :Channel key already set"
|
||||
471 ERR_CHANNELISFULL
|
||||
"<channel> :Cannot join channel (+l)"
|
||||
472 ERR_UNKNOWNMODE
|
||||
"<char> :is unknown mode char to me"
|
||||
473 ERR_INVITEONLYCHAN
|
||||
"<channel> :Cannot join channel (+i)"
|
||||
474 ERR_BANNEDFROMCHAN
|
||||
"<channel> :Cannot join channel (+b)"
|
||||
475 ERR_BADCHANNELKEY
|
||||
"<channel> :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
|
||||
"<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.
|
||||
|
||||
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>{<space><reply>}]"
|
||||
|
||||
- Reply format used by USERHOST to list replies to
|
||||
the query list. The reply string is composed as
|
||||
follows:
|
||||
|
||||
<reply> ::= <nick>['*'] '=' <'+'|'-'><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
|
||||
":[<nick> {<space><nick>}]"
|
||||
|
||||
- Reply format used by ISON to list replies to the
|
||||
query list.
|
||||
|
||||
301 RPL_AWAY
|
||||
"<nick> :<away message>"
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
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
|
||||
"<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><space>}"
|
||||
|
||||
- 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
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
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
|
||||
"<channel> <# visible> :<topic>"
|
||||
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
|
||||
"<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.
|
||||
|
||||
351 RPL_VERSION
|
||||
"<version>.<debuglevel> <server> :<comments>"
|
||||
|
||||
- Reply by the server showing its version details.
|
||||
The <version> is the version of the software being
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Page 51
|
||||
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> [...]]]"
|
||||
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> <banid>"
|
||||
368 RPL_ENDOFBANLIST
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Page 52
|
||||
"<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 banid. After the
|
||||
banids 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 - "
|
||||
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
|
||||
"<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.
|
||||
|
||||
391 RPL_TIME
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Page 53
|
||||
"<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
|
||||
":%-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 <version & debug level> <destination> \
|
||||
<next server>"
|
||||
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>"
|
||||
208 RPL_TRACENEWTYPE
|
||||
"<newtype> 0 <client name>"
|
||||
261 RPL_TRACELOG
|
||||
"File <logfile> <debug level>"
|
||||
|
||||
- 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
|
||||
"<linkname> <sendq> <sent messages> \
|
||||
<sent bytes> <received messages> \
|
||||
<received bytes> <time open>"
|
||||
212 RPL_STATSCOMMANDS
|
||||
"<command> <count>"
|
||||
213 RPL_STATSCLINE
|
||||
"C <host> * <name> <port> <class>"
|
||||
214 RPL_STATSNLINE
|
||||
"N <host> * <name> <port> <class>"
|
||||
215 RPL_STATSILINE
|
||||
"I <host> * <host> <port> <class>"
|
||||
216 RPL_STATSKLINE
|
||||
"K <host> * <username> <port> <class>"
|
||||
218 RPL_STATSYLINE
|
||||
"Y <class> <ping frequency> <connect \
|
||||
frequency> <max sendq>"
|
||||
219 RPL_ENDOFSTATS
|
||||
"<stats letter> :End of /STATS report"
|
||||
241 RPL_STATSLLINE
|
||||
"L <hostmask> * <servername> <maxdepth>"
|
||||
242 RPL_STATSUPTIME
|
||||
":Server Up %d days %d:%02d:%02d"
|
||||
243 RPL_STATSOLINE
|
||||
"O <hostmask> * <name>"
|
||||
244 RPL_STATSHLINE
|
||||
"H <hostmask> * <servername>"
|
||||
|
||||
221 RPL_UMODEIS
|
||||
"<user mode string>"
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Page 55
|
||||
|
||||
- To answer a query about a client's own mode,
|
||||
RPL_UMODEIS is sent back.
|
||||
|
||||
251 RPL_LUSERCLIENT
|
||||
":There are <integer> users and <integer> \
|
||||
invisible 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 RLP_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 university and department
|
||||
(RPL_ADMINLOC2) and finally the administrative
|
||||
contact for the server (an email address here
|
||||
is required) in RPL_ADMINEMAIL.
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Page 56
|
||||
|
||||
6.3 Reserved numerics.
|
||||
These numerics are not described above since they fall into one of the following categories:
|
||||
|
||||
|
||||
1 no longer in use;
|
||||
|
||||
2 reserved for future planned use;
|
||||
|
||||
3 in current use but are part of a non-generic 'feature' of
|
||||
the current IRC server.
|
||||
|
||||
209 RPL_TRACECLASS 217 RPL_STATSQLINE
|
||||
231 RPL_SERVICEINFO 232 RPL_ENDOFSERVICES
|
||||
233 RPL_SERVICE 234 RPL_SERVLIST
|
||||
235 RPL_SERVLISTEND
|
||||
316 RPL_WHOISCHANOP 361 RPL_KILLDONE
|
||||
362 RPL_CLOSING 363 RPL_CLOSEEND
|
||||
373 RPL_INFOSTART 384 RPL_MYPORTIS
|
||||
466 ERR_YOUWILLBEBANNED 476 ERR_BADCHANMASK
|
||||
492 ERR_NOSERVICEHOST
|
||||
|
||||
|
||||
*/
|
||||
else
|
||||
Con_SubPrintf(DEFAULTCONSOLE, "%s\n", msg);
|
||||
|
||||
|
@ -1905,17 +1414,25 @@ void IRC_Command(char *dest)
|
|||
{
|
||||
IRC_AddClientMessage(ircclient, "LIST");
|
||||
}
|
||||
else if (!strcmp(com_token+1, "join"))
|
||||
else if ( !strcmp(com_token+1, "join") || !strcmp(com_token+1, "j") )
|
||||
{
|
||||
char *channelkey;
|
||||
|
||||
msg = COM_Parse(msg);
|
||||
|
||||
if ( *com_token != '#' )
|
||||
IRC_AddClientMessage(ircclient, va("JOIN #%s", com_token));
|
||||
channelkey = strtok(imsg," ");
|
||||
channelkey = strtok(NULL," ");
|
||||
channelkey = strtok(NULL," ");
|
||||
|
||||
/*if ( *com_token != '#' )
|
||||
IRC_AddClientMessage(ircclient, va("JOIN #%s %s", com_token,channelkey));
|
||||
else
|
||||
IRC_AddClientMessage(ircclient, va("JOIN %s", com_token));
|
||||
IRC_AddClientMessage(ircclient, va("JOIN %s %s", com_token,channelkey));*/
|
||||
|
||||
IRC_JoinChannel(ircclient,com_token,channelkey);
|
||||
|
||||
}
|
||||
else if (!strcmp(com_token+1, "part") || !strcmp(com_token+1, "leave"))
|
||||
else if (!strcmp(com_token+1, "part") || !strcmp(com_token+1, "leave")) // need to implement leave reason
|
||||
{
|
||||
msg = COM_Parse(msg);
|
||||
if (!*com_token)
|
||||
|
@ -1950,8 +1467,10 @@ void IRC_Command(char *dest)
|
|||
}
|
||||
else if (!strcmp(com_token+1, "away"))
|
||||
{
|
||||
IRC_AddClientMessage(ircclient, va("AWAY :%s",msg,0));
|
||||
//IRC_AddClientMessage(ircclient, va("AWAY :%s",msg+1));
|
||||
if ( strlen(msg) > 1 )
|
||||
IRC_AddClientMessage(ircclient, va("AWAY :%s",msg+1));
|
||||
else
|
||||
IRC_AddClientMessage(ircclient, va("AWAY :"));
|
||||
}
|
||||
else if (!strcmp(com_token+1, "motd"))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue