/*
* numbers.c:handles all those strange numeric response dished out by that
* wacky, nutty program we call ircd
*
*
* written by michael sandrof
*
* copyright(c) 1990
*
* see the copyright file, or do a help ircii copyright
*/
#include "irc.h"
static char cvsrevision[] = "$Id: numbers.c,v 1.1.1.3 2003/06/11 07:00:43 root Exp $";
CVS_REVISION(numbers_c)
#include "struct.h"
#include "dcc.h"
#include "input.h"
#include "commands.h"
#include "ircaux.h"
#include "vars.h"
#include "lastlog.h"
#include "list.h"
#include "hook.h"
#include "server.h"
#include "who.h"
#include "numbers.h"
#include "window.h"
#include "screen.h"
#include "output.h"
#include "names.h"
#include "notify.h"
#include "whowas.h"
#include "funny.h"
#include "parse.h"
#include "misc.h"
#include "status.h"
#include "struct.h"
#include "timer.h"
#include "userlist.h"
#include "tcl_bx.h"
#include "gui.h"
#define MAIN_SOURCE
#include "modval.h"
static void channel_topic (char *, char **, int);
static void not_valid_channel (char *, char **);
static void cannot_join_channel (char *, char **);
static int number_of_bans = 0;
static int number_of_exempts = 0;
static char *last_away_msg = NULL;
static char *last_away_nick = NULL;
#define BITCHXINFO "For more information about \002BitchX\002 type \002/about\002"
void parse_364 (char *, char *, char *);
void parse_365 (char *, char *, char *);
void add_to_irc_map (char *, char *);
void show_server_map (void);
int stats_k_grep (char **);
void who_handlekill (char *, char *, char *);
void handle_tracekill (int, char *, char *, char *);
int no_hook_notify;
extern AJoinList *ajoin_list;
void remove_from_server_list (int);
char *thing_ansi = NULL;
/*
* numeric_banner: This returns in a static string of either "xxx" where
* xxx is the current numeric, or "***" if SHOW_NUMBERS is OFF
*/
char *numeric_banner(void)
{
static char thing[4];
if (!get_int_var(SHOW_NUMERICS_VAR))
return (thing_ansi?thing_ansi:empty_string);
sprintf(thing, "%3.3u", -current_numeric);
return (thing);
}
int check_sync(int comm, char *channel, char *nick, char *whom, char *bantime, ChannelList *chan)
{
ChannelList *tmp = NULL;
BanList *new;
int in_join = 0;
if (!chan)
if (!(tmp = lookup_channel(channel, from_server, CHAN_NOUNLINK)))
return -1; /* channel lookup problem */
if (tmp == NULL)
tmp = chan;
in_join = in_join_list(channel, from_server);
if (!in_join)
return -1;
switch (comm)
{
case 367: /* bans on channel */
{
if (tmp)
{
new = (BanList *)new_malloc(sizeof(BanList));
malloc_strcpy(&new->ban, nick);
if (bantime)
new->time = my_atol(bantime);
else
new->time = now;
if (whom)
new->setby = m_strdup(whom);
add_to_list((List **)&tmp->bans,(List *)new);
}
break;
}
case 348: /* exemptbans */
{
if (tmp)
{
new = (BanList *)new_malloc(sizeof(BanList));
malloc_strcpy(&new->ban, nick);
if (bantime)
new->time = my_atol(bantime);
else
new->time = now;
if (whom)
new->setby = m_strdup(whom);
add_to_list((List **)&tmp->exemptbans,(List *)new);
}
break;
}
default:
break;
}
return 0;
}
static int handle_stats(int comm, char *from, char **ArgList)
{
char *format_str = NULL;
char *format2_str = NULL;
char *args;
args = PasteArgs(ArgList, 0);
switch (comm)
{
/*
^on ^raw_irc "% 211 *" {suecho \(L:line\) $[20]sklnick($3) : $4|$5|$6|$7|$8|$strip(: 9)|$strip(: $10);suecho $[8]11 $[30]sklhost($3)}
^on ^raw_irc "% 212 *" {suecho $[9]3: $4 $5}
^on ^raw_irc "% 213 *" {suecho \($3:line\) \($[20]4\)\($[20]6\) \($[5]7\)\($strip(: $[4]8)\)}
^on ^raw_irc "% 214 *" {suecho \($3:line\) \($[20]4\)\($[20]6\) \($[5]7\)\($strip(: $[4]8)\)}
^on ^raw_irc "% 215 *" {suecho \($3:line\) \($[20]4\)\($[20]6\) \($[5]7\)\($strip(: $[4]8)\)}
^on ^raw_irc "% 216 *" {suecho \($3:line\) \($[20]4\) \($[15]6\)}
^on ^raw_irc "% 218 *" {suecho \($3:line\) \($[5]4\) \($[5]5\) \($[5]6\) \($[5]7\) \($strip(: $[8]8)\)}
^on ^raw_irc "% 242 *" {suecho $0 has been up for $5- }
^on ^raw_irc "% 243 *" {suecho \($3:line\) \($[20]4\) \($[9]6\)}
^on ^raw_irc "% 244 *" {suecho \($3:line\) \($[25]4\) \($[25]6\)}
*/
case 211:
format_str = "L:line $[20]left($rindex([ $1) $1) :$[-5]2 $[-5]3 $[-6]4 $[-5]5 $[-6]6 $[-8]strip(: $7) $strip(: $8)";
format2_str = "$[8]9 $[30]mid(${rindex([ $1)+1} ${rindex(] $1) - $rindex([ $1) + 1} $1)";
break;
case 212:
format_str = "$[10]1 $[-10]2 $[-10]3";
break;
case 213:
case 214:
case 215:
format_str = "$1:line $[25]2 $[25]4 $[-5]5 $[-5]6";
break;
case 216:
format_str = "$1:line $[25]2 $[10]4 $5-";
break;
case 218:
format_str = "$1:line $[-5]2 $[-6]3 $[-6]4 $[-6]5 $[-10]6";
break;
case 241:
format_str = "$1:line $2-";
break;
case 242:
format_str = "%G$0%n has been up for %W$3-";
break;
case 243:
format_str = "$1:line $[25]2 $[9]4";
break;
case 244:
format_str = "$1:line $[25]2 $[25]4";
default:
break;
}
if (format_str && args)
put_it("%s", convert_output_format(format_str, "%s %s", from, args));
if (format2_str && args)
put_it("%s", convert_output_format(format2_str, "%s %s", from, args));
return 0;
}
static int trace_oper(char *from, char **ArgList)
{
char *rest = PasteArgs(ArgList, 0);
put_it("%s", convert_output_format(fget_string_var(FORMAT_TRACE_OPER_FSET), "%s %s", from, rest));
return 0;
}
static int trace_server(char *from, char **ArgList)
{
char *rest = PasteArgs(ArgList, 0);
put_it("%s", convert_output_format(fget_string_var(FORMAT_TRACE_SERVER_FSET), "%s %s", from, rest));
return 0;
}
static int trace_user(char *from, char **ArgList)
{
char *rest = PasteArgs(ArgList, 0);
put_it("%s", convert_output_format(fget_string_var(FORMAT_TRACE_USER_FSET), "%s %s", from, rest));
return 0;
}
static int check_server_sync(char *from, char **ArgList)
{
static char *desync = NULL;
if (!desync || (desync && !wild_match(desync, from)))
{
if (!wild_match(from, get_server_name(from_server)))
{
malloc_strcpy(&desync, from);
if (do_hook(DESYNC_MESSAGE_LIST, "%s %s", from, ArgList[0]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_DESYNC_FSET), "%s %s %s", update_clock(GET_TIME), ArgList[0], from));
return 1;
}
}
return 0;
}
/*
* display_msg: handles the displaying of messages from the variety of
* possible formats that the irc server spits out. you'd think someone would
* simplify this
*/
void display_msg(char *from, char **ArgList)
{
char *ptr,
*s,
*rest;
int drem;
rest = PasteArgs(ArgList, 0);
if ((s = find_numeric_fset(-current_numeric)))
{
put_it("%s", convert_output_format(s, "%s %d %s %s", update_clock(GET_TIME), -current_numeric, from, rest));
return;
}
if (from && (my_strnicmp(get_server_itsname(from_server), from,
strlen(get_server_itsname(from_server))) == 0))
from = NULL;
ptr = strchr(rest, ':');
if (ptr && ptr > rest && ptr[-1] == ' ')
*ptr++ = 0;
else
ptr = NULL;
drem = (int)(from) /*&& (!get_int_var(SUPPRESS_FROM_REMOTE_SERVER))*/;
put_it("%s %s%s%s%s%s%s",
numeric_banner(),
strlen(rest) ? rest : empty_string,
strlen(rest) ? space : empty_string,
ptr ? ptr : empty_string,
drem ? "(from " : empty_string,
drem ? from : empty_string,
drem ? ")" : empty_string
);
}
static void channel_topic(char *from, char **ArgList, int what)
{
char *topic, *channel;
ChannelList *chan;
if (ArgList[1] && is_channel(ArgList[0]))
{
channel = ArgList[0];
topic = ArgList[1];
set_display_target(channel, LOG_CRAP);
if (what == 333 && ArgList[2])
put_it("%s", convert_output_format(fget_string_var(FORMAT_TOPIC_SETBY_FSET), "%s %s %s %l", update_clock(GET_TIME), channel, topic, my_atol(ArgList[2])));
else if (what != 333)
{
if ((chan = lookup_channel(channel, from_server, 0)))
malloc_strcpy(&chan->topic, topic);
put_it("%s", convert_output_format(fget_string_var(FORMAT_TOPIC_FSET), "%s %s %s", update_clock(GET_TIME), channel, topic));
}
}
else
{
PasteArgs(ArgList, 0);
set_display_target(NULL, LOG_CURRENT);
put_it("%s", convert_output_format(fget_string_var(FORMAT_TOPIC_FSET), "%s %s", update_clock(GET_TIME), ArgList[0]));
}
}
static void not_valid_channel(char *from, char **ArgList)
{
char *channel;
char *s;
if (!(channel = ArgList[0]) || !ArgList[1])
return;
PasteArgs(ArgList, 1);
s = get_server_name(from_server);
if (!my_strnicmp(s, from, strlen(s)))
{
if (strcmp(channel, "*"))
remove_channel(channel, from_server);
put_it("%s", convert_output_format(fget_string_var(FORMAT_SERVER_MSG2_FSET), "%s %s %s", update_clock(GET_TIME), channel, ArgList[1]));
}
}
/* from ircd .../include/numeric.h */
/*
#define ERR_CHANNELISFULL 471
#define ERR_INVITEONLYCHAN 473
#define ERR_BANNEDFROMCHAN 474
#define ERR_BADCHANNELKEY 475
#define ERR_BADCHANMASK 476
*/
static void cannot_join_channel(char *from, char **ArgList)
{
char buffer[BIG_BUFFER_SIZE + 1];
char *f = NULL;
char *chan;
if (ArgList[0])
chan = ArgList[0];
else
chan = get_chan_from_join_list(from_server);
remove_from_join_list(chan, from_server);
if (!is_on_channel(chan, from_server, get_server_nickname(from_server)))
remove_channel(chan, from_server);
else
return;
set_display_target(chan, LOG_CURRENT);
PasteArgs(ArgList, 0);
strlcpy(buffer, ArgList[0], sizeof buffer);
switch(-current_numeric)
{
case 437:
strlcat(buffer,
" (Channel is temporarily unavailable)",
sizeof buffer);
break;
case 471:
strlcat(buffer, " (Channel is full)", sizeof buffer);
break;
case 473:
strlcat(buffer, " (You must be invited)",
sizeof buffer);
break;
case 474:
strlcat(buffer, " (You are banned)", sizeof buffer);
break;
case 475:
strlcat(buffer, " (Bad channel key)", sizeof buffer);
break;
case 476:
strlcat(buffer, " (Bad channel mask)", sizeof buffer);
break;
default:
return;
}
if ((f = find_numeric_fset(-current_numeric)))
put_it("%s", convert_output_format(f, "%s %s", update_clock(GET_TIME), ArgList[0]));
else
put_it("%s %s", numeric_banner(), buffer);
reset_display_target();
}
int handle_server_stats(char *from, char **ArgList, int comm)
{
static int norm = 0,
invisible = 0,
services = 0,
servers = 0,
ircops = 0,
unknown = 0,
chans = 0,
local_users = 0,
total_users = 0,
services_flag = 0;
char tmp[80];
int ret = 1;
char *line;
line = LOCAL_COPY(ArgList[0]);
switch(comm)
{
case 251: /* number of users */
BreakArgs(line, NULL, ArgList, 1);
if (ArgList[2] && ArgList[5] && ArgList[8])
{
servers = ircops = unknown = chans = 0;
norm = my_atol(ArgList[2]);
if ((services_flag = my_stricmp(ArgList[6], "services")))
invisible = my_atol(ArgList[5]);
else
services = my_atol(ArgList[5]);
servers = my_atol(ArgList[8]);
}
break;
case 252: /* number of ircops */
if (ArgList[0])
ircops = my_atol(ArgList[0]);
break;
case 253: /* number of unknown */
if (ArgList[0])
unknown = my_atol(ArgList[0]);
break;
case 254: /* number of channels */
if (ArgList[0])
chans = my_atol(ArgList[0]);
break;
case 255: /* number of local print it out */
BreakArgs(line, NULL, ArgList, 1);
if (ArgList[2])
local_users = my_atol(ArgList[2]);
total_users = norm + invisible;
if (total_users)
{
sprintf(tmp, "%3.0f", (float)(((float)local_users / (float)total_users) * 100));
put_it("%s", convert_output_format("$G %K[%nlocal users on irc%K(%n\002$0\002%K)]%n $1%%", "%d %s", local_users, tmp));
sprintf(tmp, "%3.0f", (float)(((float)norm / (float)total_users) * 100));
put_it("%s", convert_output_format("$G %K[%nglobal users on irc%K(%n\002$0\002%K)]%n $1%%", "%d %s", norm, tmp));
if (services_flag)
{
sprintf(tmp, "%3.0f", (float)(((float)invisible / (float)total_users) * 100));
put_it("%s", convert_output_format("$G %K[%ninvisible users on irc%K(%n\002$0\002%K)]%n $1%%", "%d %s", invisible, tmp));
}
else
put_it("%s", convert_output_format("$G %K[%nservices on irc%K(%n\002$0\002%K)]%n", "%d", services));
sprintf(tmp, "%3.0f", (float)(((float)ircops / (float)total_users) * 100));
put_it("%s", convert_output_format("$G %K[%nircops on irc%K(%n\002$0\002%K)]%n $1%%", "%d %s", ircops, tmp));
}
put_it("%s", convert_output_format("$G %K[%ntotal users on irc%K(%n\002$0\002%K)]%n", "%d", total_users));
put_it("%s", convert_output_format("$G %K[%nunknown connections%K(%n\002$0\002%K)]%n", "%d", unknown));
put_it("%s", convert_output_format("$G %K[%ntotal servers on irc%K(%n\002$0\002%K)]%n %K(%navg. $1 users per server%K)", "%d %d", servers, (servers) ? (int)(total_users/servers) : 0));
put_it("%s", convert_output_format("$G %K[%ntotal channels created%K(%n\002$0\002%K)]%n %K(%navg. $1 users per channel%K)", "%d %d", chans, (chans) ? (int)(total_users/chans) : 0));
break;
case 250:
{
char *p;
BreakArgs(line, NULL, ArgList, 1);
if (ArgList[3] && ArgList[4])
{
p = ArgList[4]; p++;
put_it("%s", convert_output_format("$G %K[%nHighest client connection count%K(%n\002$0\002%K) %K(%n\002$1\002%K)]%n", "%s %s", ArgList[3], p));
}
break;
}
default:
ret = 0;
break;
}
return ret;
}
void whohas_nick (UserhostItem *stuff, char *nick, char *args)
{
if (!stuff || !stuff->nick || !nick || !strcmp(stuff->user, "<UNKNOWN>"))
return;
put_it("%s", convert_output_format("$G Your nick %R[%n$0%R]%n is owned by %W$1@$2", "%s %s %s", nick, stuff->user, stuff->host));
return;
}
void change_alt_nick(int server, char *nick)
{
char *t = NULL;
nick_command_is_pending(server, 0);
if (nick && (t = get_string_var(ALTNICK_VAR)))
{
if (!my_stricmp(t, nick))
fudge_nickname(server, 0);
else
change_server_nickname(server, t);
} else
#if 0
if (get_int_var(AUTO_NEW_NICK_VAR))
fudge_nickname(from_server);
else
reset_nickname(from_server);
#endif
fudge_nickname(server, 0);
}
/*
* numbered_command: does (hopefully) the right thing with the numbered
* responses from the server. I wasn't real careful to be sure I got them
* all, but the default case should handle any I missed (sorry)
*/
void numbered_command(char *from, int comm, char **ArgList)
{
char *user;
char none_of_these = 0;
int flag;
int old_current_numeric = current_numeric;
AJoinList *tmp = NULL;
if (!ArgList[1] || !from || !*from)
return;
user = (*ArgList[0]) ? ArgList[0] : NULL;
reset_display_target();
ArgList++;
current_numeric = -comm; /* must be negative of numeric! */
switch (comm)
{
case 1: /* #define RPL_WELCOME 001 */
{
char *s = NULL;
bitchsay(BITCHXINFO);
set_server2_8(from_server, 1);
accept_server_nickname(from_server, user);
set_server_motd(from_server, 1);
server_is_connected(from_server, 1);
PasteArgs(ArgList, 0);
userhostbase(NULL, got_my_userhost, 1, NULL);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
if (send_umode && *send_umode == '+')
send_to_server("MODE %s %s", user, send_umode);
if ((s = get_server_cookie(from_server)))
send_to_server("COOKIE %s", s);
break;
}
case 4: /* #define RPL_MYINFO 004 */
{
got_initial_version_28(ArgList);
load_scripts();
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
/* if the server kicks us, then we maybe should reconnect to
* all our previous channels.
*/
if (1/*get_int_var(AUTO_REJOIN_VAR)*/)
{
char *channels = NULL, *keys = NULL;
for (tmp = ajoin_list; tmp; tmp = tmp->next)
{
if(!tmp->group || is_server_valid(tmp->group, from_server))
{
if (!in_join_list(tmp->name, from_server))
{
if ((get_server_version(from_server) > Server2_8hybrid))
send_to_server("JOIN %s%s%s", tmp->name, tmp->key ? space : empty_string, tmp->key ? tmp->key : empty_string);
else
{
m_s3cat(&channels, ",", tmp->name);
m_s3cat(&keys, ",", tmp->key?tmp->key:empty_string);
}
if (get_int_var(JOIN_NEW_WINDOW_VAR))
{
WhowasChanList *bleah = check_whowas_chan_buffer(tmp->name, -1, 0);
if (bleah)
{
if (bleah->channellist)
add_to_join_list(tmp->name, from_server, bleah->channellist->refnum);
}
else
{
if (tmp != ajoin_list)
win_create(JOIN_NEW_WINDOW_VAR, 1);
add_to_join_list(tmp->name, from_server, current_window->refnum);
}
}
}
}
}
if (channels)
send_to_server("JOIN %s %s", channels, keys?keys:empty_string);
new_free(&channels); new_free(&keys);
}
break;
}
case 5:
{
char *p;
PasteArgs(ArgList, 0);
if ((p = strstr(*ArgList, "WATCH=")))
{
p = strchr(p, '=');
if (p && *p && *(p+1))
{
p++;
set_server_watch(from_server, my_atol(p));
send_watch(from_server);
}
}
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
break;
}
case 8:
{
set_server_cookie(from_server, *ArgList);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
break;
}
case 250:
case 251:
case 252:
case 253:
case 254:
case 255:
{
if (do_hook(current_numeric, "%s %s", from, *ArgList))
{
if (!handle_server_stats(from, ArgList, comm))
display_msg(from, ArgList);
}
break;
}
case 301: /* #define RPL_AWAY 301 */
{
PasteArgs(ArgList, 1);
if (get_int_var(SHOW_AWAY_ONCE_VAR))
{
if (!last_away_msg || strcmp(last_away_nick, from) || strcmp(last_away_msg, ArgList[1]))
{
malloc_strcpy(&last_away_nick, from);
malloc_strcpy(&last_away_msg, ArgList[1]);
}
else break;
}
if (do_hook(current_numeric, "%s %s", ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_AWAY_FSET),"%s %s", ArgList[0], ArgList[1]));
break;
}
case 302: /* #define RPL_USERHOST 302 */
{
userhost_returned(from, ArgList);
break;
}
case 303: /* #define RPL_ISON 303 */
{
ison_returned(from, ArgList);
break;
}
case 307: /* WHOIS_REGGED */
{
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_REGISTER_FSET),"%s %s", ArgList[0], " is a registered nick"));
break;
}
case 295:
case 308: /* WHOIS_ADMIN */
{
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_ADMIN_FSET),"%s %s", ArgList[0], " is an IRC Server Administrator"));
break;
}
case 309: /* WHOIS_SERVICES */
{
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_SERVICE_FSET),"%s %s", ArgList[0], " is a Services Administrator"));
break;
}
#ifdef WANT_CHATNET
case 310: /* RPL_WHOISUSER_OPER [or something] 310 on chatnet .. fixed. =] */
{
PasteArgs(ArgList, 7);
reset_display_target();
if(do_hook(current_numeric, "%s %s %s %s %s %s %s", ArgList[0],
ArgList[1], ArgList[2], ArgList[3], ArgList[4], ArgList[5], ArgList[6])) {
char *host = NULL;
char *p;
char *ident = NULL;
char *userhost = NULL;
#ifdef WANT_USERLIST
UserList *tmp = NULL;
ShitList *tmp1 = NULL;
#endif
/* routine for getting ident and host
* by-tor really wrote this little routine,
* something else he did for me, thanks =]
*/
if ((p = (char *)strchr(ArgList[2], '@'))) {
*p++ = '\0';
ident = (char *)alloca(strlen(ArgList[2])+1);
strcpy(ident, ArgList[2]);
for(;*p == ' ';)
p++;
host = p;
if ((p = (char *)strchr(p, '\n')))
*p = '\0';
p = host;
host = (char *)alloca(strlen(p)+1);
strcpy(host, p);
}
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_HEADER_FSET), NULL));
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_NICK_FSET),"%s %s %s %s", ArgList[0], ident, host, country(host)));
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_NAME_FSET),"%s %s", ArgList[4], ArgList[5]));
malloc_sprintf(&userhost, "%s@%s", ident, host);
#ifdef WANT_USERLIST
if((tmp=lookup_userlevelc("*", userhost, "*", NULL)))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_FRIEND_FSET), "%s %s", convert_flags_to_str(tmp->flags), tmp->host));
if((tmp1=nickinshit(ArgList[0], userhost)))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_SHIT_FSET),"%d %s %s %s", tmp1->level, tmp1->channels, tmp1->filter, tmp1->reason));
if(tmp||tmp1)
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_CHANNELS_FSET), "%s %s", tmp?"Allowed:":"Not-Allowed:", tmp?tmp->channels:tmp1->channels));
#endif
new_free(&userhost);
}
break;
}
#else
case 310: /* WHOIS_HELPFUL */
{
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_HELP_FSET),"%s %s", ArgList[0], ArgList[1]?ArgList[1]:" looks very helpful."));
break;
/* the 4 above are dalnet numerics */
}
#endif
case 311: /* #define RPL_WHOISUSER 311 */
{
char *host = ArgList[2];
char *u1 = ArgList[1];
PasteArgs(ArgList, 4);
reset_display_target();
if (do_hook(current_numeric, "%s %s %s %s %s %s", from, ArgList[0],
ArgList[1], host, ArgList[3], ArgList[4])) {
char *userhost = NULL;
#ifdef WANT_USERLIST
UserList *tmp = NULL;
ShitList *tmp1 = NULL;
#endif
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_HEADER_FSET), NULL));
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_NICK_FSET),"%s %s %s %s", ArgList[0], ArgList[1], host, country(host)));
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_NAME_FSET),"%s", ArgList[4]));
malloc_sprintf(&userhost, "%s@%s", u1, host);
#ifdef WANT_USERLIST
if ((tmp = lookup_userlevelc("*", userhost, "*", NULL)))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_FRIEND_FSET), "%s %s", convert_flags_to_str(tmp->flags), tmp->host));
if ((tmp1 = nickinshit(ArgList[0], userhost)))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_SHIT_FSET),"%d %s %s %s", tmp1->level, tmp1->channels, tmp1->filter, tmp1->reason));
if (tmp || tmp1)
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_CHANNELS_FSET),"%s %s", tmp?"Allowed:":"Not-Allowed:", tmp?tmp->channels:tmp1->channels));
#endif
new_free(&userhost);
}
break;
}
case 312: /* #define RPL_WHOISSERVER 312 */
{
if (do_hook(current_numeric, "%s %s %s %s", from, ArgList[0], ArgList[1], ArgList[2]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_SERVER_FSET),"%s %s", ArgList[1], ArgList[2]));
break;
}
case 313: /* #define RPL_WHOISOPERATOR 313 */
{
PasteArgs(ArgList, 1);
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_OPER_FSET),"%s %s", ArgList[0], " (is \002NOT\002 an IRC warrior)"));
break;
}
case 314: /* #define RPL_WHOWASUSER 314 */
{
PasteArgs(ArgList, 4);
reset_display_target();
if (do_hook(current_numeric, "%s %s %s %s %s %s", from, ArgList[0],
ArgList[1], ArgList[2], ArgList[3], ArgList[4]))
{
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOWAS_HEADER_FSET),NULL));
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOWAS_NICK_FSET),"%s %s %s", ArgList[0], ArgList[1], ArgList[2]));
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_NAME_FSET),"%s", ArgList[4]));
}
break;
}
case 315: /* #define RPL_ENDOFWHO 315 */
{
PasteArgs(ArgList, 1);
who_end(from, ArgList);
break;
}
case 316: /* #define RPL_WHOISCHANOP 316 */
break;
case 317: /* #define RPL_WHOISIDLE 317 */
{
char *nick, *idle_str, *startup_str;
time_t startup;
nick = ArgList[0];
idle_str = ArgList[1];
startup_str = ArgList[2];
if (ArgList[3]) /* undernet */
{
PasteArgs(ArgList, 3);
if (nick && idle_str && do_hook(current_numeric, "%s %s %s %s %s",
from, nick, idle_str, startup_str, ArgList[3]))
{
int seconds = 0;
int hours = 0;
int minutes = 0;
int secs = my_atol(idle_str);
hours = secs / 3600;
minutes = (secs - (hours * 3600)) / 60;
seconds = secs % 60;
startup = my_atol(startup_str);
put_it("%s",
convert_output_format(
fget_string_var(FORMAT_WHOIS_IDLE_FSET),
"%d %d %d %s",hours, minutes,
seconds, ArgList[2]?ArgList[2]:empty_string,
startup!=0?my_ctime(startup):empty_string));
}
}
else /* efnet */
{
PasteArgs(ArgList, 2);
if (nick && idle_str &&
do_hook(current_numeric, "%s %s %s %s", from, nick, idle_str, ArgList[2]?ArgList[2]:empty_string))
{
int seconds = 0;
int hours = 0;
int minutes = 0;
int secs = my_atol(idle_str);
hours = secs / 3600;
minutes = (secs - (hours * 3600)) / 60;
seconds = secs % 60;
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_IDLE_FSET),"%d %d %d %s",hours, minutes, seconds, ArgList[2]?ArgList[2]:empty_string));
}
}
break;
}
case 318: /* #define RPL_ENDOFWHOIS 318 */
{
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, ArgList[0]) && fget_string_var(FORMAT_WHOIS_FOOTER_FSET))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_FOOTER_FSET), NULL));
break;
}
case 319: /* #define RPL_WHOISCHANNELS 319 */
{
PasteArgs(ArgList, 1);
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_CHANNELS_FSET),"%s", ArgList[1]));
break;
}
case 321: /* #define RPL_LISTSTART 321 */
{
ArgList[0] = "Channel\0Users\0Topic";
ArgList[1] = ArgList[0] + 8;
ArgList[2] = ArgList[1] + 6;
ArgList[3] = NULL;
funny_list(from, ArgList);
break;
}
case 322: /* #define RPL_LIST 322 */
{
funny_list(from, ArgList);
break;
}
case 324: /* #define RPL_CHANNELMODEIS 324 */
{
funny_mode(from, ArgList);
break;
}
// Seems ircd-ratbox-1.1 has different formatting for this, and parsing it was only displaying
// correctly for non ratbox-1.1 servers. Taking this out and just showing what the server
// gives us for a 338 string until people can standardize.
// case 338: /* #define RPL_WHOISACTUALLY 338 */
// {
// PasteArgs(ArgList, 1);
// if (do_hook(current_numeric, "%s %s", from, ArgList[0]))
// put_it("%s", convert_output_format(fget_string_var(FORMAT_WHOIS_ACTUALLY_FSET),"%s", ArgList[0]));
// break;
// }
case 340: /* #define RPL_INVITING_OTHER 340 */
{
if (ArgList[2])
{
set_display_target(ArgList[0], LOG_CRAP);
if (do_hook(current_numeric, "%s %s %s %s", from, ArgList[0], ArgList[1], ArgList[2]))
put_it("%s %s has invited %s to channel %s", numeric_banner(), ArgList[0], ArgList[1], ArgList[2]);
reset_display_target();
}
break;
}
case 341: /* #define RPL_INVITING 341 */
{
if (ArgList[1])
{
set_display_target(ArgList[1], LOG_CRAP);
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_INVITE_USER_FSET), "%s %s %s", update_clock(GET_TIME), ArgList[0], ArgList[1]));
reset_display_target();
}
break;
}
case 348:
{
number_of_exempts++;
if (check_sync(comm, ArgList[0], ArgList[1], ArgList[2], ArgList[3], NULL) == 0)
break;
if (ArgList[2])
{
time_t tme = (time_t) my_atol(ArgList[3]);
if (do_hook(current_numeric, "%s %s %s %s %s",
from, ArgList[0], ArgList[1], ArgList[2], ArgList[3]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FSET), "%d %s %s %s %l", number_of_exempts, ArgList[0], ArgList[1], ArgList[2], tme));
}
else
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FSET), "%d %s %s %s %l", number_of_exempts, ArgList[0], ArgList[1], "unknown", now));
break;
}
case 349:
{
int flag = 1;
char *tmp = NULL, *chan = NULL;
PasteArgs(ArgList, 1);
set_display_target(ArgList[0], LOG_CURRENT);
flag = do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]);
reset_display_target();
malloc_strcpy(&tmp, ArgList[0]);
if (!(chan = strtok(tmp,space)))
break;
if (!in_join_list(chan, from_server))
{
PasteArgs(ArgList, 0);
if (get_int_var(SHOW_END_OF_MSGS_VAR) && flag)
display_msg(from, ArgList);
} else
got_info(chan, from_server, GOTEXEMPT);
new_free(&tmp);
number_of_exempts = 0;
break;
}
case 352: /* #define RPL_WHOREPLY 352 */
{
whoreply(NULL, ArgList);
break;
}
case 353: /* #define RPL_NAMREPLY 353 */
{
funny_namreply(from, ArgList);
break;
}
case 366: /* #define RPL_ENDOFNAMES 366 */
{
int flag = 1;
char *tmp = NULL,
*chan;
PasteArgs(ArgList, 1);
set_display_target(ArgList[0], LOG_CURRENT);
flag = do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]);
reset_display_target();
malloc_strcpy(&tmp, ArgList[0]);
if (!(chan = strtok(tmp,space)))
break;
if (!in_join_list(chan, from_server))
{
PasteArgs(ArgList, 0);
if (get_int_var(SHOW_END_OF_MSGS_VAR) && flag)
display_msg(from, ArgList);
} else
got_info(chan,from_server, GOTNAMES);
new_free(&tmp);
}
break;
case 381: /* #define RPL_YOUREOPER 381 */
{
PasteArgs(ArgList, 0);
if (!is_server_connected(from_server))
{
say("Odd Server stuff from %s: %s",from, ArgList[0]);
break;
}
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
set_server_ircop_flags(from_server, -1);
set_server_operator(from_server, 1);
if (get_string_var(OPER_MODES_VAR))
send_to_server("MODE %s %s", get_server_nickname(from_server), get_string_var(OPER_MODES_VAR));
break;
}
case 401: /* #define ERR_NOSUCHNICK 401 */
{
int foo;
PasteArgs(ArgList, 1);
if (check_dcc_list(ArgList[0]))
break;
notify_mark(ArgList[0], from, 0, 0);
if ((foo = get_int_var(AUTO_WHOWAS_VAR)))
{
if (foo > -1)
send_to_server("WHOWAS %s %d", ArgList[0], foo);
else
send_to_server("WHOWAS %s", ArgList[0]);
}
else if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_NONICK_FSET), "%s %s %s %s",update_clock(GET_TIME), ArgList[0], from, ArgList[1]));
break;
}
case 421: /* #define ERR_UNKNOWNCOMMAND 421 */
{
if (check_server_redirect(ArgList[0]))
break;
if (check_wait_command(ArgList[0]))
break;
PasteArgs(ArgList, 0);
if ((flag = do_hook(current_numeric, "%s %s", from, *ArgList)))
display_msg(from, ArgList);
break;
}
case 432: /* #define ERR_ERRONEUSNICKNAME 432 */
{
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
if (!is_server_connected(from_server))
change_alt_nick(from_server, NULL);
break;
}
case 437:
{
/*
* Since 437 is being used for channel collisions (channel
* creation delay), we have to make sure that this numeric
* is for us and not for the channel we just joined.
*/
if ((*ArgList[0] == '#') || (*ArgList[0] == '&'))
{
if (get_server_nickname(from_server))
{
cannot_join_channel(from, ArgList);
break;
}
}
}
case 433:
case 438: /* #define ERR_NICKNAMEINUSE 433 */
case 453:
{
if (get_server_orignick(from_server))
check_orig_nick(NULL);
/* for orignick */
clean_server_queues(from_server);
if (is_server_connected(from_server))
userhostbase(ArgList[0], whohas_nick, 1, "%s", ArgList[0]);
else
{
change_alt_nick(from_server, ArgList[0]);
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", never_connected ? "-1" : from, *ArgList))
display_msg(from, ArgList);
}
break;
}
case 451: /* #define ERR_NOTREGISTERED 451 */
{
/*
* Sometimes the server doesn't catch the USER line, so
* here we send a simplified version again -lynx
*/
/* fudge_nickname(from_server, 1);*/
register_server(from_server, NULL);
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
break;
}
case 462: /* #define ERR_ALREADYREGISTRED 462 */
{
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
break;
}
case 463: /* CDE added for ERR_NOPERMFORHOST */
{
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
close_server(from_server, empty_string);
window_check_servers(from_server);
if (from_server == primary_server)
get_connected(from_server + 1, from_server);
break;
}
case 464: /* #define ERR_PASSWDMISMATCH 464 */
{
PasteArgs(ArgList, 0);
if (!is_server_open(from_server))
break;
flag = do_hook(current_numeric, "%s %s", from, ArgList[0]);
if (oper_command)
{
if (flag)
display_msg(from, ArgList);
oper_command = 0;
}
else
{
char server_num[8];
say("Password required for connection to server %s",
get_server_name(from_server));
close_server(from_server, empty_string);
if (!dumb_mode)
{
strcpy(server_num, ltoa(from_server));
add_wait_prompt("Server Password:",
password_sendline, server_num,
WAIT_PROMPT_LINE, 0);
}
}
break;
}
case 465: /* #define ERR_YOUREBANNEDCREEP 465 */
{
int klined = from_server;
PasteArgs(ArgList, 0);
if (!is_server_open(from_server))
break;
if (do_hook(current_numeric, "%s %s", from, ArgList[0]))
display_msg(from, ArgList);
close_server(from_server, empty_string);
window_check_servers(from_server);
if (server_list_size() > 1)
remove_from_server_list(klined);
if (klined == primary_server && (server_list_size() > 0))
get_connected(klined, from_server);
break;
}
case 484:
{
if (do_hook(current_numeric, "%s %s", from, ArgList[0]))
display_msg(from, ArgList);
set_server_flag(from_server, USER_MODE_R, 1);
break;
}
case 367:
{
number_of_bans++;
if (check_sync(comm, ArgList[0], ArgList[1], ArgList[2], ArgList[3], NULL) == 0)
break;
if (ArgList[2])
{
time_t tme = (time_t) my_atol(ArgList[3]);
if (do_hook(current_numeric, "%s %s %s %s %s",
from, ArgList[0], ArgList[1], ArgList[2], ArgList[3]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FSET), "%d %s %s %s %l", number_of_bans, ArgList[0], ArgList[1], ArgList[2], tme));
}
else
if (do_hook(current_numeric, "%s %s %s", from, ArgList[0], ArgList[1]))
put_it("%s", convert_output_format(fget_string_var(FORMAT_BANS_FSET), "%d %s %s %s %l", number_of_bans, ArgList[0], ArgList[1], "unknown", now));
break;
}
case 368: /* #define RPL_ENDOFBANLIST 368 */
{
if (!got_info(ArgList[0], from_server, GOTBANS))
break;
if (get_int_var(SHOW_END_OF_MSGS_VAR))
{
if (do_hook(current_numeric, "%s %d %s", from, number_of_bans, *ArgList))
{
put_it("%s Total Number of Bans on %s [%d]",
numeric_banner(), ArgList[0],
number_of_bans);
}
}
number_of_bans = 0;
break;
}
case 364:
{
if (get_int_var(LLOOK_VAR) && (get_server_linklook(from_server) == 1))
parse_364(ArgList[0], ArgList[1], ArgList[2] ? ArgList[2] : zero);
else if (get_server_linklook(from_server) == 2)
add_to_irc_map(ArgList[0], ArgList[2]);
else if ((do_hook(current_numeric, "%s %s %s", ArgList[0], ArgList[1], ArgList[2] ? ArgList[2] : zero)))
{
if (fget_string_var(FORMAT_LINKS_FSET))
put_it("%s", convert_output_format(fget_string_var(FORMAT_LINKS_FSET), "%s %s %s", ArgList[0], ArgList[1], ArgList[2] ? ArgList[2] : zero));
}
break;
}
case 471: /* #define ERR_CHANNELISFULL 471 */
case 473: /* #define ERR_INVITEONLYCHAN 473 */
case 474: /* #define ERR_BANNEDFROMCHAN 474 */
case 475: /* #define ERR_BADCHANNELKEY 475 */
case 476: /* #define ERR_BADCHANMASK 476 */
cannot_join_channel(from, ArgList);
break;
case 600: /* watch logon */
case 601: /* watch logoff */
show_watch_notify(from, comm == 600 ? 1 : 0, ArgList);
break;
case 602: /* watchoff */
case 603: /* watchstat */
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
break;
case 604: /* user online */
case 605: /* user offline */
show_watch_notify(from, comm == 604 ? 1 : 0, ArgList);
break;
case 606: /* watchlist */
PasteArgs(ArgList, 0);
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
break;
case 607: /* end of watchlist */
PasteArgs(ArgList, 0);
if (get_int_var(SHOW_END_OF_MSGS_VAR))
{
if (do_hook(current_numeric, "%s %s", from, *ArgList))
display_msg(from, ArgList);
}
break;
case 365: /* #define RPL_ENDOFLINKS 365 */
{
if (get_int_var(LLOOK_VAR) && (get_server_linklook(from_server) == 1))
{
parse_365(ArgList[0], ArgList[1],NULL);
set_server_linklook(from_server, 0);
break;
}
else if (get_server_linklook(from_server) == 2)
{
show_server_map();
set_server_linklook(from_server, 0);
break;
}
}
case 404:
case 442:
case 482:
{
if (comm == 404 || comm == 482 || comm == 442)
{
if (check_server_sync(from, ArgList))
{
send_to_server("WHO -server %s %s", from, ArgList[0]);
break;
}
}
}
case 204:
{
if (comm == 204)
{
if (get_server_trace_flag(from_server) & TRACE_OPER)
{
trace_oper(from, ArgList);
break;
} else if (get_server_trace_flag(from_server))
break;
}
}
case 203:
case 205:
{
if (comm == 203 || comm == 205)
{
if (get_server_trace_flag(from_server) & TRACE_USER)
{
trace_user(from, ArgList);
break;
} else if (get_server_trace_flag(from_server))
break;
}
}
case 206:
{
if (comm == 206)
{
if (get_server_trace_flag(from_server) & TRACE_SERVER)
{
trace_server(from, ArgList);
break;
} else if (get_server_trace_flag(from_server))
break;
}
}
case 200:
case 207:
case 209:
if ((comm == 200) || (comm == 207) || (comm == 209))
{
if (get_server_trace_flag(from_server))
break;
}
case 262:
case 402:
{
if (comm == 402)
clear_server_sping(from_server, ArgList[0]);
if ((comm == 262 || comm == 402) && get_server_trace_flag(from_server))
{
set_server_trace_flag(from_server, 0);
break;
}
if (get_server_trace_kill(from_server))
{
if (comm == 200 || comm == 204 || comm == 206 || comm == 207)
break;
if (comm == 205 || comm == 203)
{
handle_tracekill(comm, ArgList[2], NULL, NULL);
break;
}
if (comm == 209 || comm == 262 || comm == 402)
{
handle_tracekill(comm, NULL, NULL, NULL);
break;
}
}
}
case 305:
{
if (comm == 305 && get_server_away(from_server))
{
set_server_away(from_server, NULL, 0);
set_server_awaytime(from_server, 0);
update_all_status(current_window, NULL, 0);
}
}
case 461:
{
if ((comm == 461) && oper_command)
oper_command--;
}
/*
* The following accumulates the remaining arguments
* in ArgSpace for hook detection. We can't use
* PasteArgs here because we still need the arguments
* separated for use elsewhere.
*/
default:
{
char *ArgSpace = NULL;
int i,
len;
for (i = len = 0; ArgList[i]; len += strlen(ArgList[i++]))
;
len += (i - 1);
ArgSpace = alloca(len + 1);
ArgSpace[0] = '\0';
/* this is cheating */
if (ArgList[0] && is_channel(ArgList[0]))
set_display_target(ArgList[0], LOG_CRAP);
for (i = 0; ArgList[i]; i++)
{
if (i)
strcat(ArgSpace, space);
strcat(ArgSpace, ArgList[i]);
}
if (!do_hook(current_numeric, "%s %s", from, ArgSpace))
{
reset_display_target();
break;
}
none_of_these = 1;
} /* default */
} /* switch */
/* the following do not hurt the ircII if intercepted by a hook */
if (none_of_these)
{
switch (comm)
{
case 211:
case 212:
case 213:
case 214:
case 215:
case 216:
case 218:
case 241:
case 242:
case 243:
case 244:
if (get_server_stat_flag(from_server) && ((comm > 210 && comm < 219) || (comm > 240 && comm < 245)))
{
handle_stats(comm, from, ArgList);
break;
}
else if (!get_server_stat_flag(from_server) && comm == 242)
{
/* case 242: #define RPL_STATSUPTIME 242 */
PasteArgs(ArgList, 0);
if (from && !my_strnicmp(get_server_itsname(from_server),
from, strlen(get_server_itsname(from_server))))
from = NULL;
if (from)
put_it("%s %s from (%s)", numeric_banner(),
*ArgList, from);
else
put_it("%s %s", numeric_banner(), *ArgList);
break;
}
else
{
PasteArgs(ArgList, 0);
put_it("%s %s %s", numeric_banner(), from, *ArgList);
}
break;
case 219: /* #define RPL_ENDOFSTATS 219 */
if (get_server_stat_flag(from_server) && comm == 219)
set_server_stat_flag(from_server, 0);
break;
case 221: /* #define RPL_UMODEIS 221 */
put_it("%s Your user mode is [%s]", numeric_banner(), ArgList?ArgList[0]:space);
break;
case 329: /* #define CREATION_TIME 329 */
{
unsigned long ts;
time_t tme;
char this_sucks[80];
ChannelList *chan = NULL;
if (!ArgList[1] || !*ArgList[1])
break;
sscanf(ArgList[1], "%lu", &ts);
tme = ts;
strcpy(this_sucks, ctime(&tme));
this_sucks[strlen(this_sucks)-1] = '\0';
set_display_target(ArgList[0], LOG_CRAP);
if (!ArgList[2])
put_it("%s Channel %s was created at %s",numeric_banner(),
ArgList[0], this_sucks);
else
{
char cts[80], pts[80], ots[80];
sscanf(ArgList[2], "%lu", &ts);
tme = ts;
strcpy(cts, ctime(&tme));
cts[strlen(cts)-1] = '\0';
sscanf(ArgList[2], "%lu", &ts);
tme = ts;
strcpy(pts, ctime(&tme));
pts[strlen(pts)-1] = '\0';
ots[0] = 0;
if (ArgList[3])
{
sscanf(ArgList[3], "%lu", &ts);
tme = ts;
strcpy(ots, ctime(&tme));
}
ots[strlen(ots)-1] = '\0';
put_it("%s Channel %s was created at %s",numeric_banner(),
ArgList[0], this_sucks);
put_it("%s Channel %s TS %s Password TS %s opless TS %s",numeric_banner(),
ArgList[0], cts, pts, ots);
}
if ((chan = lookup_channel(ArgList[0], from_server, 0)))
chan->channel_create.tv_sec = tme;
reset_display_target();
break;
}
case 332: /* #define RPL_TOPIC 332 */
set_display_target(ArgList[0], LOG_CRAP);
channel_topic(from, ArgList, 332);
reset_display_target();
break;
case 333:
set_display_target(ArgList[0], LOG_CRAP);
channel_topic(from, ArgList, 333);
reset_display_target();
break;
case 351: /* #define RPL_VERSION 351 */
PasteArgs(ArgList, 2);
put_it("%s", convert_output_format(fget_string_var(FORMAT_SERVER_FSET), "Server %s %s %s", ArgList[0], ArgList[1], ArgList[2]));
break;
case 364: /* #define RPL_LINKS 364 */
{
if (ArgList[2])
{
PasteArgs(ArgList, 2);
put_it("%s %-20s %-20s %s", numeric_banner(),
ArgList[0], ArgList[1], ArgList[2]);
}
else
{
PasteArgs(ArgList, 1);
put_it("%s %-20s %s", numeric_banner(),
ArgList[0], ArgList[1]);
}
break;
}
case 377:
case 372: /* #define RPL_MOTD 372 */
if (!get_int_var(SUPPRESS_SERVER_MOTD_VAR) ||
!get_server_motd(from_server))
{
PasteArgs(ArgList, 0);
put_it("%s %s", numeric_banner(), ArgList[0]);
}
break;
case 375: /* #define RPL_MOTDSTART 375 */
if (!get_int_var(SUPPRESS_SERVER_MOTD_VAR) ||
!get_server_motd(from_server))
{
PasteArgs(ArgList, 0);
put_it("%s %s", numeric_banner(), ArgList[0]);
}
break;
case 376: /* #define RPL_ENDOFMOTD 376 */
if (get_int_var(SHOW_END_OF_MSGS_VAR) &&
(!get_int_var(SUPPRESS_SERVER_MOTD_VAR) ||
!get_server_motd(from_server)))
{
PasteArgs(ArgList, 0);
put_it("%s %s", numeric_banner(), ArgList[0]);
}
set_server_motd(from_server, 0);
break;
case 384: /* #define RPL_MYPORTIS 384 */
PasteArgs(ArgList, 0);
put_it("%s %s %s", numeric_banner(), ArgList[0], user);
break;
case 385: /* #define RPL_NOTOPERANYMORE 385 */
set_server_operator(from_server, 0);
display_msg(from, ArgList);
update_all_status(current_window, NULL, 0);
break;
case 403: /* #define ERR_NOSUCHCHANNEL 403 */
not_valid_channel(from, ArgList);
break;
case 432: /* #define ERR_ERRONEUSNICKNAME 432 */
display_msg(from, ArgList);
reset_nickname(from_server);
break;
#define RPL_CLOSEEND 363
#define RPL_SERVLISTEND 235
case 323: /* #define RPL_LISTEND 323 */
funny_print_widelist();
case 232: /* #define RPL_ENDOFSERVICES 232 */
case 365: /* #define RPL_ENDOFLINKS 365 */
if (comm == 365 && get_int_var(LLOOK_VAR) && get_server_linklook(from_server))
{
parse_365(ArgList[0], ArgList[1],NULL);
set_server_linklook(from_server, 0);
break;
}
case 369: /* #define RPL_ENDOFWHOWAS 369 */
case 374: /* #define RPL_ENDOFINFO 374 */
case 394: /* #define RPL_ENDOFUSERS 394 */
{
int hook;
PasteArgs(ArgList, 0);
hook = do_hook(current_numeric, "%s %s", from, *ArgList);
if (hook && get_int_var(SHOW_END_OF_MSGS_VAR))
display_msg(from, ArgList);
break;
}
default:
display_msg(from, ArgList);
}
}
current_numeric = old_current_numeric;
reset_display_target();
}
syntax highlighted by Code2HTML, v. 0.9.1