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