1 /*
2 fe-events-numeric.c : irssi
3
4 Copyright (C) 1999-2000 Timo Sirainen
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #include "module.h"
22 #include "module-formats.h"
23 #include "signals.h"
24 #include "misc.h"
25 #include "settings.h"
26 #include "levels.h"
27 #include "recode.h"
28
29 #include "irc-servers.h"
30 #include "irc-channels.h"
31 #include "nicklist.h"
32 #include "mode-lists.h"
33
34 #include "../core/module-formats.h"
35 #include "printtext.h"
36 #include "fe-channels.h"
37 #include "fe-irc-server.h"
38
39 static void print_event_received(IRC_SERVER_REC *server, const char *data,
40 const char *nick, int target_param);
41
42 static char *last_away_nick = NULL;
43 static char *last_away_msg = NULL;
44
event_user_mode(IRC_SERVER_REC * server,const char * data)45 static void event_user_mode(IRC_SERVER_REC *server, const char *data)
46 {
47 char *params, *mode;
48
49 g_return_if_fail(data != NULL);
50 g_return_if_fail(server != NULL);
51
52 params = event_get_params(data, 2, NULL, &mode);
53 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_USER_MODE,
54 g_strchomp(mode));
55 g_free(params);
56 }
57
event_ison(IRC_SERVER_REC * server,const char * data)58 static void event_ison(IRC_SERVER_REC *server, const char *data)
59 {
60 char *params, *online;
61
62 g_return_if_fail(data != NULL);
63 g_return_if_fail(server != NULL);
64
65 params = event_get_params(data, 2, NULL, &online);
66 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_ONLINE, online);
67 g_free(params);
68 }
69
event_names_list(IRC_SERVER_REC * server,const char * data)70 static void event_names_list(IRC_SERVER_REC *server, const char *data)
71 {
72 IRC_CHANNEL_REC *chanrec;
73 char *params, *channel, *names;
74
75 g_return_if_fail(data != NULL);
76
77 params = event_get_params(data, 4, NULL, NULL, &channel, &names);
78
79 chanrec = irc_channel_find(server, channel);
80 if (chanrec == NULL || chanrec->names_got) {
81 printformat_module("fe-common/core", server, channel,
82 MSGLEVEL_CRAP, TXT_NAMES,
83 channel, 0, 0, 0, 0, 0);
84 printtext(server, channel, MSGLEVEL_CRAP, "%s", names);
85
86 }
87 g_free(params);
88 }
89
event_end_of_names(IRC_SERVER_REC * server,const char * data,const char * nick)90 static void event_end_of_names(IRC_SERVER_REC *server, const char *data,
91 const char *nick)
92 {
93 IRC_CHANNEL_REC *chanrec;
94 char *params, *channel;
95
96 g_return_if_fail(data != NULL);
97
98 params = event_get_params(data, 2, NULL, &channel);
99
100 chanrec = irc_channel_find(server, channel);
101 if (chanrec == NULL || chanrec->names_got)
102 print_event_received(server, data, nick, FALSE);
103 g_free(params);
104 }
105
event_who(IRC_SERVER_REC * server,const char * data)106 static void event_who(IRC_SERVER_REC *server, const char *data)
107 {
108 char *params, *nick, *channel, *user, *host, *stat, *realname, *hops;
109 char *serv, *recoded;
110
111 g_return_if_fail(data != NULL);
112
113 params = event_get_params(data, 8, NULL, &channel, &user,
114 &host, &serv, &nick, &stat, &realname);
115
116 /* split hops/realname */
117 hops = realname;
118 while (*realname != '\0' && *realname != ' ') realname++;
119 if (*realname == ' ')
120 *realname++ = '\0';
121
122 recoded = recode_in(SERVER(server), realname, nick);
123 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_WHO,
124 channel, nick, stat, hops, user, host, recoded, serv);
125
126 g_free(params);
127 g_free(recoded);
128 }
129
event_end_of_who(IRC_SERVER_REC * server,const char * data)130 static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
131 {
132 char *params, *channel;
133
134 g_return_if_fail(data != NULL);
135
136 params = event_get_params(data, 2, NULL, &channel);
137 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_END_OF_WHO, channel);
138 g_free(params);
139 }
140
event_ban_list(IRC_SERVER_REC * server,const char * data)141 static void event_ban_list(IRC_SERVER_REC *server, const char *data)
142 {
143 IRC_CHANNEL_REC *chanrec;
144 BAN_REC *banrec;
145 const char *channel;
146 char *params, *ban, *setby, *tims;
147 long secs;
148
149 g_return_if_fail(data != NULL);
150
151 params = event_get_params(data, 5, NULL, &channel,
152 &ban, &setby, &tims);
153 secs = *tims == '\0' ? 0 :
154 (long) (time(NULL) - atol(tims));
155
156 chanrec = irc_channel_find(server, channel);
157 banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban);
158
159 channel = get_visible_target(server, channel);
160 printformat(server, channel, MSGLEVEL_CRAP,
161 *setby == '\0' ? IRCTXT_BANLIST : IRCTXT_BANLIST_LONG,
162 banrec == NULL ? 0 : g_slist_index(chanrec->banlist, banrec)+1,
163 channel, ban, setby, secs);
164
165 g_free(params);
166 }
167
event_eban_list(IRC_SERVER_REC * server,const char * data)168 static void event_eban_list(IRC_SERVER_REC *server, const char *data)
169 {
170 const char *channel;
171 char *params, *ban, *setby, *tims;
172 long secs;
173
174 g_return_if_fail(data != NULL);
175
176 params = event_get_params(data, 5, NULL, &channel,
177 &ban, &setby, &tims);
178 secs = *tims == '\0' ? 0 :
179 (long) (time(NULL) - atol(tims));
180
181 channel = get_visible_target(server, channel);
182 printformat(server, channel, MSGLEVEL_CRAP,
183 *setby == '\0' ? IRCTXT_EBANLIST : IRCTXT_EBANLIST_LONG,
184 channel, ban, setby, secs);
185
186 g_free(params);
187 }
188
event_silence_list(IRC_SERVER_REC * server,const char * data)189 static void event_silence_list(IRC_SERVER_REC *server, const char *data)
190 {
191 char *params, *nick, *mask;
192
193 g_return_if_fail(data != NULL);
194
195 params = event_get_params(data, 3, NULL, &nick, &mask);
196 printformat(server, NULL, MSGLEVEL_CRAP,
197 IRCTXT_SILENCE_LINE, nick, mask);
198 g_free(params);
199 }
200
event_accept_list(IRC_SERVER_REC * server,const char * data)201 static void event_accept_list(IRC_SERVER_REC *server, const char *data)
202 {
203 char *params, *accepted;
204
205 g_return_if_fail(data != NULL);
206 g_return_if_fail(server != NULL);
207
208 params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
209 NULL, &accepted);
210 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_ACCEPT_LIST, accepted);
211 g_free(params);
212 }
213
event_invite_list(IRC_SERVER_REC * server,const char * data)214 static void event_invite_list(IRC_SERVER_REC *server, const char *data)
215 {
216 const char *channel;
217 char *params, *invite, *setby, *tims;
218 long secs;
219
220 g_return_if_fail(data != NULL);
221
222 params = event_get_params(data, 5, NULL, &channel, &invite,
223 &setby, &tims);
224 secs = *tims == '\0' ? 0 :
225 (long) (time(NULL) - atol(tims));
226
227 channel = get_visible_target(server, channel);
228 printformat(server, channel, MSGLEVEL_CRAP,
229 *setby == '\0' ? IRCTXT_INVITELIST : IRCTXT_INVITELIST_LONG,
230 channel, invite, setby, secs);
231 g_free(params);
232 }
233
event_nick_in_use(IRC_SERVER_REC * server,const char * data)234 static void event_nick_in_use(IRC_SERVER_REC *server, const char *data)
235 {
236 char *params, *nick;
237
238 g_return_if_fail(data != NULL);
239
240 params = event_get_params(data, 2, NULL, &nick);
241 if (server->connected) {
242 printformat(server, NULL, MSGLEVEL_CRAP,
243 IRCTXT_NICK_IN_USE, nick);
244 }
245
246 g_free(params);
247 }
248
event_topic_get(IRC_SERVER_REC * server,const char * data)249 static void event_topic_get(IRC_SERVER_REC *server, const char *data)
250 {
251 const char *channel;
252 char *params, *topic, *recoded;
253
254 g_return_if_fail(data != NULL);
255
256 params = event_get_params(data, 3, NULL, &channel, &topic);
257 recoded = recode_in(SERVER(server), topic, channel);
258 channel = get_visible_target(server, channel);
259 printformat(server, channel, MSGLEVEL_CRAP,
260 IRCTXT_TOPIC, channel, recoded);
261 g_free(params);
262 g_free(recoded);
263 }
264
event_topic_info(IRC_SERVER_REC * server,const char * data)265 static void event_topic_info(IRC_SERVER_REC *server, const char *data)
266 {
267 const char *channel;
268 char *params, *timestr, *bynick, *byhost, *topictime;
269
270 g_return_if_fail(data != NULL);
271
272 params = event_get_params(data, 4, NULL, &channel,
273 &bynick, &topictime);
274
275 timestr = my_asctime((time_t) atol(topictime));
276
277 byhost = strchr(bynick, '!');
278 if (byhost != NULL)
279 *byhost++ = '\0';
280
281 channel = get_visible_target(server, channel);
282 printformat(server, channel, MSGLEVEL_CRAP, IRCTXT_TOPIC_INFO,
283 bynick, timestr, byhost == NULL ? "" : byhost);
284 g_free(timestr);
285 g_free(params);
286 }
287
event_channel_mode(IRC_SERVER_REC * server,const char * data)288 static void event_channel_mode(IRC_SERVER_REC *server, const char *data)
289 {
290 const char *channel;
291 char *params, *mode;
292
293 g_return_if_fail(data != NULL);
294
295 params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
296 NULL, &channel, &mode);
297 channel = get_visible_target(server, channel);
298 printformat(server, channel, MSGLEVEL_CRAP,
299 IRCTXT_CHANNEL_MODE, channel, g_strchomp(mode));
300 g_free(params);
301 }
302
event_channel_created(IRC_SERVER_REC * server,const char * data)303 static void event_channel_created(IRC_SERVER_REC *server, const char *data)
304 {
305 const char *channel;
306 char *params, *createtime, *timestr;
307
308 g_return_if_fail(data != NULL);
309
310 params = event_get_params(data, 3, NULL, &channel, &createtime);
311
312 timestr = my_asctime((time_t) atol(createtime));
313 channel = get_visible_target(server, channel);
314 printformat(server, channel, MSGLEVEL_CRAP,
315 IRCTXT_CHANNEL_CREATED, channel, timestr);
316 g_free(timestr);
317 g_free(params);
318 }
319
event_nowaway(IRC_SERVER_REC * server,const char * data)320 static void event_nowaway(IRC_SERVER_REC *server, const char *data)
321 {
322 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_AWAY);
323 }
324
event_unaway(IRC_SERVER_REC * server,const char * data)325 static void event_unaway(IRC_SERVER_REC *server, const char *data)
326 {
327 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_UNAWAY);
328 }
329
event_away(IRC_SERVER_REC * server,const char * data)330 static void event_away(IRC_SERVER_REC *server, const char *data)
331 {
332 char *params, *nick, *awaymsg, *recoded;
333
334 g_return_if_fail(data != NULL);
335
336 params = event_get_params(data, 3, NULL, &nick, &awaymsg);
337 recoded = recode_in(SERVER(server), awaymsg, nick);
338 if (!settings_get_bool("show_away_once") ||
339 last_away_nick == NULL ||
340 g_ascii_strcasecmp(last_away_nick, nick) != 0 ||
341 last_away_msg == NULL ||
342 g_ascii_strcasecmp(last_away_msg, awaymsg) != 0) {
343 /* don't show the same away message
344 from the same nick all the time */
345 g_free_not_null(last_away_nick);
346 g_free_not_null(last_away_msg);
347 last_away_nick = g_strdup(nick);
348 last_away_msg = g_strdup(awaymsg);
349
350 printformat(server, nick, MSGLEVEL_CRAP,
351 IRCTXT_NICK_AWAY, nick, recoded);
352 }
353 g_free(params);
354 g_free(recoded);
355 }
356
event_userhost(IRC_SERVER_REC * server,const char * data)357 static void event_userhost(IRC_SERVER_REC *server, const char *data)
358 {
359 char *params, *hosts;
360
361 g_return_if_fail(data != NULL);
362
363 params = event_get_params(data, 2, NULL, &hosts);
364 printtext(server, NULL, MSGLEVEL_CRAP, "%s", hosts);
365 g_free(params);
366 }
367
event_sent_invite(IRC_SERVER_REC * server,const char * data)368 static void event_sent_invite(IRC_SERVER_REC *server, const char *data)
369 {
370 char *params, *nick, *channel;
371
372 g_return_if_fail(data != NULL);
373
374 params = event_get_params(data, 3, NULL, &nick, &channel);
375 printformat(server, nick, MSGLEVEL_CRAP,
376 IRCTXT_INVITING, nick, channel);
377 g_free(params);
378 }
379
event_chanserv_url(IRC_SERVER_REC * server,const char * data)380 static void event_chanserv_url(IRC_SERVER_REC *server, const char *data)
381 {
382 const char *channel;
383 char *params, *url;
384
385 g_return_if_fail(data != NULL);
386
387 params = event_get_params(data, 3, NULL, &channel, &url);
388 channel = get_visible_target(server, channel);
389 printformat(server, channel, MSGLEVEL_CRAP,
390 IRCTXT_CHANNEL_URL, channel, url);
391 g_free(params);
392 }
393
event_target_unavailable(IRC_SERVER_REC * server,const char * data,const char * nick,const char * addr)394 static void event_target_unavailable(IRC_SERVER_REC *server, const char *data,
395 const char *nick, const char *addr)
396 {
397 IRC_CHANNEL_REC *chanrec;
398 char *params, *target;
399
400 g_return_if_fail(data != NULL);
401
402 params = event_get_params(data, 2, NULL, &target);
403 if (!server_ischannel(SERVER(server), target)) {
404 /* nick unavailable */
405 printformat(server, NULL, MSGLEVEL_CRAP,
406 IRCTXT_NICK_UNAVAILABLE, target);
407 } else {
408 chanrec = irc_channel_find(server, target);
409 if (chanrec != NULL && chanrec->joined) {
410 /* dalnet - can't change nick while being banned */
411 print_event_received(server, data, nick, FALSE);
412 } else {
413 /* channel is unavailable. */
414 printformat(server, NULL, MSGLEVEL_CRAP,
415 IRCTXT_JOINERROR_UNAVAIL, target);
416 }
417 }
418
419 g_free(params);
420 }
421
event_no_such_nick(IRC_SERVER_REC * server,const char * data,const char * nick,const char * addr)422 static void event_no_such_nick(IRC_SERVER_REC *server, const char *data,
423 const char *nick, const char *addr)
424 {
425 char *params, *unick;
426
427 g_return_if_fail(data != NULL);
428
429 params = event_get_params(data, 2, NULL, &unick);
430 if (!g_strcmp0(unick, "*"))
431 /* more information will be in the description,
432 * e.g. * :Target left IRC. Failed to deliver: [hi] */
433 print_event_received(server, data, nick, FALSE);
434 else
435 printformat(server, unick, MSGLEVEL_CRAP, IRCTXT_NO_SUCH_NICK, unick);
436 g_free(params);
437 }
438
event_no_such_channel(IRC_SERVER_REC * server,const char * data)439 static void event_no_such_channel(IRC_SERVER_REC *server, const char *data)
440 {
441 char *params, *channel;
442
443 g_return_if_fail(data != NULL);
444
445 params = event_get_params(data, 2, NULL, &channel);
446 printformat(server, channel, MSGLEVEL_CRAP,
447 IRCTXT_NO_SUCH_CHANNEL, channel);
448 g_free(params);
449 }
450
cannot_join(IRC_SERVER_REC * server,const char * data,int format)451 static void cannot_join(IRC_SERVER_REC *server, const char *data, int format)
452 {
453 char *params, *channel;
454
455 g_return_if_fail(data != NULL);
456
457 params = event_get_params(data, 2, NULL, &channel);
458 printformat(server, NULL, MSGLEVEL_CRAP, format, channel);
459 g_free(params);
460 }
461
event_too_many_channels(IRC_SERVER_REC * server,const char * data)462 static void event_too_many_channels(IRC_SERVER_REC *server, const char *data)
463 {
464 cannot_join(server, data, IRCTXT_JOINERROR_TOOMANY);
465 }
466
event_duplicate_channel(IRC_SERVER_REC * server,const char * data,const char * nick)467 static void event_duplicate_channel(IRC_SERVER_REC *server, const char *data,
468 const char *nick)
469 {
470 char *params, *channel, *p;
471
472 g_return_if_fail(data != NULL);
473
474 /* this new addition to ircd breaks completely with older
475 "standards", "nick Duplicate ::!!channel ...." */
476 params = event_get_params(data, 3, NULL, NULL, &channel);
477 p = strchr(channel, ' ');
478 if (p != NULL) *p = '\0';
479
480 if (channel[0] == '!' && channel[1] == '!') {
481 printformat(server, NULL, MSGLEVEL_CRAP,
482 IRCTXT_JOINERROR_DUPLICATE, channel+1);
483 } else
484 print_event_received(server, data, nick, FALSE);
485
486 g_free(params);
487 }
488
event_channel_is_full(IRC_SERVER_REC * server,const char * data)489 static void event_channel_is_full(IRC_SERVER_REC *server, const char *data)
490 {
491 cannot_join(server, data, IRCTXT_JOINERROR_FULL);
492 }
493
event_invite_only(IRC_SERVER_REC * server,const char * data)494 static void event_invite_only(IRC_SERVER_REC *server, const char *data)
495 {
496 cannot_join(server, data, IRCTXT_JOINERROR_INVITE);
497 }
498
event_banned(IRC_SERVER_REC * server,const char * data)499 static void event_banned(IRC_SERVER_REC *server, const char *data)
500 {
501 cannot_join(server, data, IRCTXT_JOINERROR_BANNED);
502 }
503
event_bad_channel_key(IRC_SERVER_REC * server,const char * data)504 static void event_bad_channel_key(IRC_SERVER_REC *server, const char *data)
505 {
506 cannot_join(server, data, IRCTXT_JOINERROR_BAD_KEY);
507 }
508
event_bad_channel_mask(IRC_SERVER_REC * server,const char * data)509 static void event_bad_channel_mask(IRC_SERVER_REC *server, const char *data)
510 {
511 cannot_join(server, data, IRCTXT_JOINERROR_BAD_MASK);
512 }
513
event_477(IRC_SERVER_REC * server,const char * data,const char * nick)514 static void event_477(IRC_SERVER_REC *server, const char *data,
515 const char *nick)
516 {
517 /* Numeric 477 can mean many things:
518 * modeless channel, cannot join/send to channel (+r/+R/+M).
519 * If we tried to join this channel, display the error in the
520 * status window. Otherwise display it in the channel window.
521 */
522 IRC_CHANNEL_REC *chanrec;
523 char *params, *channel;
524
525 g_return_if_fail(data != NULL);
526
527 params = event_get_params(data, 2, NULL, &channel);
528
529 chanrec = irc_channel_find(server, channel);
530 print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
531 g_free(params);
532 }
533
event_target_too_fast(IRC_SERVER_REC * server,const char * data,const char * nick)534 static void event_target_too_fast(IRC_SERVER_REC *server, const char *data,
535 const char *nick)
536 {
537 /* Target change too fast, could be nick or channel.
538 * If we tried to join this channel, display the error in the
539 * status window. Otherwise display it in the channel window.
540 */
541 IRC_CHANNEL_REC *chanrec;
542 char *params, *channel;
543
544 g_return_if_fail(data != NULL);
545
546 params = event_get_params(data, 2, NULL, &channel);
547
548 chanrec = irc_channel_find(server, channel);
549 print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
550 g_free(params);
551 }
552
event_unknown_mode(IRC_SERVER_REC * server,const char * data)553 static void event_unknown_mode(IRC_SERVER_REC *server, const char *data)
554 {
555 char *params, *mode;
556
557 g_return_if_fail(data != NULL);
558
559 params = event_get_params(data, 2, NULL, &mode);
560 printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_UNKNOWN_MODE, mode);
561 g_free(params);
562 }
563
event_numeric(IRC_SERVER_REC * server,const char * data,const char * nick)564 static void event_numeric(IRC_SERVER_REC *server, const char *data,
565 const char *nick)
566 {
567 data = strchr(data, ' ');
568 if (data != NULL)
569 print_event_received(server, data+1, nick, FALSE);
570 }
571
print_event_received(IRC_SERVER_REC * server,const char * data,const char * nick,int target_param)572 static void print_event_received(IRC_SERVER_REC *server, const char *data,
573 const char *nick, int target_param)
574 {
575 char *target, *args, *ptr, *ptr2, *recoded;
576 int format;
577
578 g_return_if_fail(data != NULL);
579
580 /* first param is our nick, "*" or a channel */
581 ptr = strchr(data, ' ');
582 if (ptr == NULL)
583 return;
584 ptr++;
585
586 if (server_ischannel(SERVER(server), data)) /* directed at channel */
587 target = g_strndup(data, (int)(ptr - data - 1));
588 else if (!target_param || *ptr == ':' || (ptr2 = strchr(ptr, ' ')) == NULL)
589 target = NULL;
590 else {
591 /* target parameter expected and present */
592 target = g_strndup(ptr, (int) (ptr2-ptr));
593 }
594
595 /* param1 param2 ... :last parameter */
596 if (*ptr == ':') {
597 /* only one parameter */
598 args = g_strdup(ptr+1);
599 } else {
600 args = g_strdup(ptr);
601 ptr = strstr(args, " :");
602 if (ptr != NULL)
603 g_memmove(ptr+1, ptr+2, strlen(ptr+1));
604 }
605
606 recoded = recode_in(SERVER(server), args, NULL);
607 format = nick == NULL || server->real_address == NULL ||
608 g_strcmp0(nick, server->real_address) == 0 ?
609 IRCTXT_DEFAULT_EVENT : IRCTXT_DEFAULT_EVENT_SERVER;
610 printformat(server, target, MSGLEVEL_CRAP, format,
611 nick, recoded, current_server_event);
612
613 g_free(recoded);
614 g_free(args);
615 g_free(target);
616 }
617
event_received(IRC_SERVER_REC * server,const char * data,const char * nick)618 static void event_received(IRC_SERVER_REC *server, const char *data,
619 const char *nick)
620 {
621 print_event_received(server, data, nick, FALSE);
622 }
623
event_target_received(IRC_SERVER_REC * server,const char * data,const char * nick)624 static void event_target_received(IRC_SERVER_REC *server, const char *data,
625 const char *nick)
626 {
627 print_event_received(server, data, nick, TRUE);
628 }
629
event_motd(IRC_SERVER_REC * server,const char * data,const char * nick,const char * addr)630 static void event_motd(IRC_SERVER_REC *server, const char *data,
631 const char *nick, const char *addr)
632 {
633 /* don't ignore motd anymore after 3 seconds of connection time -
634 we might have called /MOTD */
635 if (settings_get_bool("skip_motd") && !server->motd_got)
636 return;
637
638 print_event_received(server, data, nick, FALSE);
639 }
640
sig_empty(void)641 static void sig_empty(void)
642 {
643 }
644
fe_events_numeric_init(void)645 void fe_events_numeric_init(void)
646 {
647 last_away_nick = NULL;
648 last_away_msg = NULL;
649
650 signal_add("event 221", (SIGNAL_FUNC) event_user_mode);
651 signal_add("event 303", (SIGNAL_FUNC) event_ison);
652 signal_add("event 353", (SIGNAL_FUNC) event_names_list);
653 signal_add_first("event 366", (SIGNAL_FUNC) event_end_of_names);
654 signal_add("event 352", (SIGNAL_FUNC) event_who);
655 signal_add("event 315", (SIGNAL_FUNC) event_end_of_who);
656 signal_add("event 271", (SIGNAL_FUNC) event_silence_list);
657 signal_add("event 272", (SIGNAL_FUNC) sig_empty);
658 signal_add("event 281", (SIGNAL_FUNC) event_accept_list);
659 signal_add("event 367", (SIGNAL_FUNC) event_ban_list);
660 signal_add("event 348", (SIGNAL_FUNC) event_eban_list);
661 signal_add("event 346", (SIGNAL_FUNC) event_invite_list);
662 signal_add("event 433", (SIGNAL_FUNC) event_nick_in_use);
663 signal_add("event 332", (SIGNAL_FUNC) event_topic_get);
664 signal_add("event 333", (SIGNAL_FUNC) event_topic_info);
665 signal_add("event 324", (SIGNAL_FUNC) event_channel_mode);
666 signal_add("event 329", (SIGNAL_FUNC) event_channel_created);
667 signal_add("event 306", (SIGNAL_FUNC) event_nowaway);
668 signal_add("event 305", (SIGNAL_FUNC) event_unaway);
669 signal_add("event 301", (SIGNAL_FUNC) event_away);
670 signal_add("event 328", (SIGNAL_FUNC) event_chanserv_url);
671 signal_add("event 302", (SIGNAL_FUNC) event_userhost);
672 signal_add("event 341", (SIGNAL_FUNC) event_sent_invite);
673
674 signal_add("event 437", (SIGNAL_FUNC) event_target_unavailable);
675 signal_add("event 401", (SIGNAL_FUNC) event_no_such_nick);
676 signal_add("event 403", (SIGNAL_FUNC) event_no_such_channel);
677 signal_add("event 405", (SIGNAL_FUNC) event_too_many_channels);
678 signal_add("event 407", (SIGNAL_FUNC) event_duplicate_channel);
679 signal_add("event 471", (SIGNAL_FUNC) event_channel_is_full);
680 signal_add("event 472", (SIGNAL_FUNC) event_unknown_mode);
681 signal_add("event 473", (SIGNAL_FUNC) event_invite_only);
682 signal_add("event 474", (SIGNAL_FUNC) event_banned);
683 signal_add("event 475", (SIGNAL_FUNC) event_bad_channel_key);
684 signal_add("event 476", (SIGNAL_FUNC) event_bad_channel_mask);
685 signal_add("event 477", (SIGNAL_FUNC) event_477);
686 signal_add("event 375", (SIGNAL_FUNC) event_motd);
687 signal_add("event 376", (SIGNAL_FUNC) event_motd);
688 signal_add("event 372", (SIGNAL_FUNC) event_motd);
689 signal_add("event 422", (SIGNAL_FUNC) event_motd);
690 signal_add("event 439", (SIGNAL_FUNC) event_target_too_fast);
691 signal_add("event 707", (SIGNAL_FUNC) event_target_too_fast);
692
693 signal_add("default event numeric", (SIGNAL_FUNC) event_numeric);
694 /* Because default event numeric only fires if there is no specific
695 * event, add all numerics with a handler elsewhere in irssi that
696 * should not be printed specially here.
697 */
698 signal_add("event 001", (SIGNAL_FUNC) event_received);
699 signal_add("event 004", (SIGNAL_FUNC) event_received);
700 signal_add("event 005", (SIGNAL_FUNC) event_received);
701 signal_add("event 254", (SIGNAL_FUNC) event_received);
702 signal_add("event 364", (SIGNAL_FUNC) event_received);
703 signal_add("event 365", (SIGNAL_FUNC) event_received);
704 signal_add("event 381", (SIGNAL_FUNC) event_received);
705 signal_add("event 396", (SIGNAL_FUNC) event_received);
706 signal_add("event 421", (SIGNAL_FUNC) event_received);
707 signal_add("event 432", (SIGNAL_FUNC) event_received);
708 signal_add("event 436", (SIGNAL_FUNC) event_received);
709 signal_add("event 438", (SIGNAL_FUNC) event_received);
710 signal_add("event 465", (SIGNAL_FUNC) event_received);
711 signal_add("event 470", (SIGNAL_FUNC) event_received);
712 signal_add("event 479", (SIGNAL_FUNC) event_received);
713
714 signal_add("event 344", (SIGNAL_FUNC) event_target_received); /* reop list */
715 signal_add("event 345", (SIGNAL_FUNC) event_target_received); /* end of reop list */
716 signal_add("event 347", (SIGNAL_FUNC) event_target_received); /* end of invite exception list */
717 signal_add("event 349", (SIGNAL_FUNC) event_target_received); /* end of ban exception list */
718 signal_add("event 368", (SIGNAL_FUNC) event_target_received); /* end of ban list */
719 signal_add("event 386", (SIGNAL_FUNC) event_target_received); /* owner list; old rsa challenge (harmless) */
720 signal_add("event 387", (SIGNAL_FUNC) event_target_received); /* end of owner list */
721 signal_add("event 388", (SIGNAL_FUNC) event_target_received); /* protect list */
722 signal_add("event 389", (SIGNAL_FUNC) event_target_received); /* end of protect list */
723 signal_add("event 404", (SIGNAL_FUNC) event_target_received); /* cannot send to channel */
724 signal_add("event 408", (SIGNAL_FUNC) event_target_received); /* cannot send (+c) */
725 signal_add("event 442", (SIGNAL_FUNC) event_target_received); /* you're not on that channel */
726 signal_add("event 478", (SIGNAL_FUNC) event_target_received); /* ban list is full */
727 signal_add("event 482", (SIGNAL_FUNC) event_target_received); /* not chanop */
728 signal_add("event 486", (SIGNAL_FUNC) event_target_received); /* cannot /msg (+R) */
729 signal_add("event 489", (SIGNAL_FUNC) event_target_received); /* not chanop or voice */
730 signal_add("event 494", (SIGNAL_FUNC) event_target_received); /* cannot /msg (own +R) */
731 signal_add("event 506", (SIGNAL_FUNC) event_target_received); /* cannot send (+R) */
732 signal_add("event 716", (SIGNAL_FUNC) event_target_received); /* cannot /msg (+g) */
733 signal_add("event 717", (SIGNAL_FUNC) event_target_received); /* +g notified */
734 signal_add("event 728", (SIGNAL_FUNC) event_target_received); /* quiet (or other) list */
735 signal_add("event 729", (SIGNAL_FUNC) event_target_received); /* end of quiet (or other) list */
736 }
737
fe_events_numeric_deinit(void)738 void fe_events_numeric_deinit(void)
739 {
740 g_free_not_null(last_away_nick);
741 g_free_not_null(last_away_msg);
742
743 signal_remove("event 221", (SIGNAL_FUNC) event_user_mode);
744 signal_remove("event 303", (SIGNAL_FUNC) event_ison);
745 signal_remove("event 353", (SIGNAL_FUNC) event_names_list);
746 signal_remove("event 366", (SIGNAL_FUNC) event_end_of_names);
747 signal_remove("event 352", (SIGNAL_FUNC) event_who);
748 signal_remove("event 315", (SIGNAL_FUNC) event_end_of_who);
749 signal_remove("event 271", (SIGNAL_FUNC) event_silence_list);
750 signal_remove("event 272", (SIGNAL_FUNC) sig_empty);
751 signal_remove("event 281", (SIGNAL_FUNC) event_accept_list);
752 signal_remove("event 367", (SIGNAL_FUNC) event_ban_list);
753 signal_remove("event 348", (SIGNAL_FUNC) event_eban_list);
754 signal_remove("event 346", (SIGNAL_FUNC) event_invite_list);
755 signal_remove("event 433", (SIGNAL_FUNC) event_nick_in_use);
756 signal_remove("event 332", (SIGNAL_FUNC) event_topic_get);
757 signal_remove("event 333", (SIGNAL_FUNC) event_topic_info);
758 signal_remove("event 324", (SIGNAL_FUNC) event_channel_mode);
759 signal_remove("event 329", (SIGNAL_FUNC) event_channel_created);
760 signal_remove("event 306", (SIGNAL_FUNC) event_nowaway);
761 signal_remove("event 305", (SIGNAL_FUNC) event_unaway);
762 signal_remove("event 301", (SIGNAL_FUNC) event_away);
763 signal_remove("event 328", (SIGNAL_FUNC) event_chanserv_url);
764 signal_remove("event 302", (SIGNAL_FUNC) event_userhost);
765 signal_remove("event 341", (SIGNAL_FUNC) event_sent_invite);
766
767 signal_remove("event 437", (SIGNAL_FUNC) event_target_unavailable);
768 signal_remove("event 401", (SIGNAL_FUNC) event_no_such_nick);
769 signal_remove("event 403", (SIGNAL_FUNC) event_no_such_channel);
770 signal_remove("event 405", (SIGNAL_FUNC) event_too_many_channels);
771 signal_remove("event 407", (SIGNAL_FUNC) event_duplicate_channel);
772 signal_remove("event 471", (SIGNAL_FUNC) event_channel_is_full);
773 signal_remove("event 472", (SIGNAL_FUNC) event_unknown_mode);
774 signal_remove("event 473", (SIGNAL_FUNC) event_invite_only);
775 signal_remove("event 474", (SIGNAL_FUNC) event_banned);
776 signal_remove("event 475", (SIGNAL_FUNC) event_bad_channel_key);
777 signal_remove("event 476", (SIGNAL_FUNC) event_bad_channel_mask);
778 signal_remove("event 477", (SIGNAL_FUNC) event_477);
779 signal_remove("event 375", (SIGNAL_FUNC) event_motd);
780 signal_remove("event 376", (SIGNAL_FUNC) event_motd);
781 signal_remove("event 372", (SIGNAL_FUNC) event_motd);
782 signal_remove("event 422", (SIGNAL_FUNC) event_motd);
783 signal_remove("event 439", (SIGNAL_FUNC) event_target_too_fast);
784 signal_remove("event 707", (SIGNAL_FUNC) event_target_too_fast);
785
786 signal_remove("default event numeric", (SIGNAL_FUNC) event_numeric);
787 signal_remove("event 001", (SIGNAL_FUNC) event_received);
788 signal_remove("event 004", (SIGNAL_FUNC) event_received);
789 signal_remove("event 005", (SIGNAL_FUNC) event_received);
790 signal_remove("event 254", (SIGNAL_FUNC) event_received);
791 signal_remove("event 364", (SIGNAL_FUNC) event_received);
792 signal_remove("event 365", (SIGNAL_FUNC) event_received);
793 signal_remove("event 381", (SIGNAL_FUNC) event_received);
794 signal_remove("event 396", (SIGNAL_FUNC) event_received);
795 signal_remove("event 421", (SIGNAL_FUNC) event_received);
796 signal_remove("event 432", (SIGNAL_FUNC) event_received);
797 signal_remove("event 436", (SIGNAL_FUNC) event_received);
798 signal_remove("event 438", (SIGNAL_FUNC) event_received);
799 signal_remove("event 465", (SIGNAL_FUNC) event_received);
800 signal_remove("event 470", (SIGNAL_FUNC) event_received);
801 signal_remove("event 479", (SIGNAL_FUNC) event_received);
802
803 signal_remove("event 344", (SIGNAL_FUNC) event_target_received);
804 signal_remove("event 345", (SIGNAL_FUNC) event_target_received);
805 signal_remove("event 347", (SIGNAL_FUNC) event_target_received);
806 signal_remove("event 349", (SIGNAL_FUNC) event_target_received);
807 signal_remove("event 368", (SIGNAL_FUNC) event_target_received);
808 signal_remove("event 386", (SIGNAL_FUNC) event_target_received);
809 signal_remove("event 387", (SIGNAL_FUNC) event_target_received);
810 signal_remove("event 388", (SIGNAL_FUNC) event_target_received);
811 signal_remove("event 389", (SIGNAL_FUNC) event_target_received);
812 signal_remove("event 404", (SIGNAL_FUNC) event_target_received);
813 signal_remove("event 408", (SIGNAL_FUNC) event_target_received);
814 signal_remove("event 442", (SIGNAL_FUNC) event_target_received);
815 signal_remove("event 478", (SIGNAL_FUNC) event_target_received);
816 signal_remove("event 482", (SIGNAL_FUNC) event_target_received);
817 signal_remove("event 486", (SIGNAL_FUNC) event_target_received);
818 signal_remove("event 489", (SIGNAL_FUNC) event_target_received);
819 signal_remove("event 494", (SIGNAL_FUNC) event_target_received);
820 signal_remove("event 506", (SIGNAL_FUNC) event_target_received);
821 signal_remove("event 716", (SIGNAL_FUNC) event_target_received);
822 signal_remove("event 717", (SIGNAL_FUNC) event_target_received);
823 signal_remove("event 728", (SIGNAL_FUNC) event_target_received);
824 signal_remove("event 729", (SIGNAL_FUNC) event_target_received);
825 }
826