94
94
target = channel->name;
97
str = g_strdup_printf("PRIVMSG %s :%s", target, msg);
97
recoded = recode_out(SERVER(server), msg, target);
98
str = g_strdup_printf("PRIVMSG %s :%s", target, recoded);
98
99
irc_send_cmd_split(ircserver, str, 2, ircserver->max_msgs_in_cmd);
102
104
static void server_init(IRC_SERVER_REC *server)
259
261
redirect = tmp->next->data;
261
263
if ((target == NULL || command_has_target(cmd, target)) &&
262
g_strncasecmp(cmd, "PONG ", 5) != 0) {
264
g_ascii_strncasecmp(cmd, "PONG ", 5) != 0) {
263
265
/* remove the redirection */
264
266
link = tmp->next;
265
267
server->cmdqueue =
334
336
static void sig_server_quit(IRC_SERVER_REC *server, const char *msg)
338
if (!IS_IRC_SERVER(server) || server->handle == NULL ||
339
server->buffer == NULL)
341
if (!IS_IRC_SERVER(server) || !server->connected)
342
str = g_strdup_printf("QUIT :%s", msg);
344
recoded = recode_out(SERVER(server), msg, NULL);
345
str = g_strdup_printf("QUIT :%s", recoded);
343
346
irc_send_cmd_now(server, str);
351
void irc_server_send_action(IRC_SERVER_REC *server, const char *target, const char *data)
355
recoded = recode_out(SERVER(server), data, target);
356
irc_send_cmdv(server, "PRIVMSG %s :\001ACTION %s\001", target, recoded);
360
void irc_server_send_away(IRC_SERVER_REC *server, const char *reason)
362
char *recoded = NULL;
364
if (!IS_IRC_SERVER(server))
367
if (*reason != '\0' || server->usermode_away) {
368
g_free_and_null(server->away_reason);
369
if (*reason != '\0') {
370
server->away_reason = g_strdup(reason);
371
reason = recoded = recode_out(SERVER(server), reason, NULL);
374
irc_send_cmdv(server, "AWAY :%s", reason);
347
379
void irc_server_send_data(IRC_SERVER_REC *server, const char *data, int len)
377
409
if (!IS_IRC_SERVER(server))
380
412
if (server->cmdcount == 0 && server->cmdqueue == NULL)
383
415
if (g_timeval_cmp(now, &server->wait_cmd) == -1)
386
418
usecs = get_timeval_diff(now, &server->last_cmd);
387
419
if (usecs < server->cmd_queue_speed)
390
422
server->cmdcount--;
391
if (server->cmdqueue == NULL) return;
423
if (server->cmdqueue == NULL) return 1;
393
425
/* get command */
394
426
cmd = server->cmdqueue->data;
398
430
len = strlen(cmd);
399
431
irc_server_send_data(server, cmd, len);
401
/* add to rawlog without [CR+]LF (/RAWQUOTE might not have
433
/* add to rawlog without [CR+]LF */
403
434
if (len > 2 && cmd[len-2] == '\r')
404
435
cmd[len-2] = '\0';
405
436
else if (cmd[len-1] == '\n')
414
445
link = server->cmdqueue;
415
446
server->cmdqueue = g_slist_remove_link(server->cmdqueue, link);
416
447
g_slist_free_1(link);
419
451
/* check every now and then if there's data to be sent in command buffer */
420
452
static int servers_cmd_timeout(void)
424
458
g_get_current_time(&now);
425
g_slist_foreach(servers, (GFunc) server_cmd_timeout, &now);
459
for (tmp = servers; tmp != NULL; tmp = tmp->next) {
460
keep |= server_cmd_timeout(tmp->data, &now);
470
/* Start the timeout for sending data later and decreasing cmdcount again */
471
void irc_servers_start_cmd_timeout(void)
474
cmd_tag = g_timeout_add(500, (GSourceFunc) servers_cmd_timeout, NULL);
429
477
/* Return a string of all channels (and keys, if any have them) in server,
445
493
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
446
494
CHANNEL_REC *channel = tmp->data;
448
g_string_sprintfa(chans, "%s,", channel->name);
449
g_string_sprintfa(keys, "%s,", channel->key == NULL ? "x" :
496
g_string_append_printf(chans, "%s,", channel->name);
497
g_string_append_printf(keys, "%s,", channel->key == NULL ? "x" :
451
499
if (channel->key != NULL)
456
504
for (tmp = server->rejoin_channels; tmp != NULL; tmp = tmp->next) {
457
505
REJOIN_REC *rec = tmp->data;
459
g_string_sprintfa(chans, "%s,", rec->channel);
460
g_string_sprintfa(keys, "%s,", rec->key == NULL ? "x" :
507
g_string_append_printf(chans, "%s,", rec->channel);
508
g_string_append_printf(keys, "%s,", rec->key == NULL ? "x" :
462
510
if (rec->key != NULL) use_keys = TRUE;
465
513
if (chans->len > 0) {
466
514
g_string_truncate(chans, chans->len-1);
467
515
g_string_truncate(keys, keys->len-1);
468
if (use_keys) g_string_sprintfa(chans, " %s", keys->str);
516
if (use_keys) g_string_append_printf(chans, " %s", keys->str);
471
519
ret = chans->str;
478
static int sig_set_user_mode(IRC_SERVER_REC *server)
481
char *newmode, *args;
483
if (!IS_IRC_SERVER(server) || g_slist_find(servers, server) == NULL)
484
return 0; /* not an irc server or got disconnected */
486
mode = server->connrec->usermode;
487
newmode = server->usermode == NULL ? NULL :
488
modes_join(NULL, server->usermode, mode, FALSE);
490
if (newmode == NULL || strcmp(newmode, server->usermode) != 0) {
491
/* change the user mode. we used to do some trickery to
492
get rid of unwanted modes at reconnect time, but that's
493
more trouble than worth. (eg. we don't want to remove
494
some good default server modes, but we don't want to
495
set back +r, etc..) */
496
args = g_strdup_printf((*mode == '+' || *mode == '-') ? "%s %s" :
497
"%s +%s", server->nick, mode);
498
signal_emit("command mode", 3, args, server, NULL);
502
g_free_not_null(newmode);
506
526
static void event_connected(IRC_SERVER_REC *server, const char *data, const char *from)
508
528
char *params, *nick;
533
553
memcpy(&server->wait_cmd, &now, sizeof(GTimeVal));
535
555
if (server->connrec->usermode != NULL) {
536
/* wait a second and then send the user mode */
537
g_timeout_add(1000, (GSourceFunc) sig_set_user_mode, server);
556
/* Send the user mode, before the autosendcmd.
557
* Do not pass this through cmd_mode because it
558
* is not known whether the resulting MODE message
559
* (if any) is the initial umode or a reply to this.
561
irc_send_cmdv(server, "MODE %s %s", server->nick,
562
server->connrec->usermode);
563
g_free_not_null(server->wanted_usermode);
564
server->wanted_usermode = g_strdup(server->connrec->usermode);
540
567
signal_emit("event connected", 1, server);
808
835
server->nick_comp_func = irc_nickcmp_ascii;
838
if ((sptr = g_hash_table_lookup(server->isupport, "TARGMAX"))) {
840
server->max_kicks_in_cmd = 1;
841
server->max_msgs_in_cmd = 1;
842
/* Not doing WHOIS here until it is clear what it means. */
844
if (!g_ascii_strncasecmp(p, "KICK:", 5)) {
845
server->max_kicks_in_cmd = atoi(p + 5);
846
if (server->max_kicks_in_cmd <= 0)
847
server->max_kicks_in_cmd = 30;
848
} else if (!g_ascii_strncasecmp(p, "PRIVMSG:", 8)) {
849
server->max_msgs_in_cmd = atoi(p + 8);
850
if (server->max_msgs_in_cmd <= 0)
851
server->max_msgs_in_cmd = 30;
858
} else if ((sptr = g_hash_table_lookup(server->isupport, "MAXTARGETS"))) {
859
server->max_msgs_in_cmd = atoi(sptr);
860
if (server->max_msgs_in_cmd <= 0)
861
server->max_msgs_in_cmd = 1;
812
865
void irc_servers_init(void)
815
868
settings_add_time("flood", "cmd_queue_speed", DEFAULT_CMD_QUEUE_SPEED);
816
869
settings_add_int("flood", "cmds_max_at_once", DEFAULT_CMDS_MAX_AT_ONCE);
818
cmd_tag = g_timeout_add(500, (GSourceFunc) servers_cmd_timeout, NULL);
820
873
signal_add_first("server connected", (SIGNAL_FUNC) sig_connected);
821
874
signal_add_last("server disconnected", (SIGNAL_FUNC) sig_disconnected);
842
895
void irc_servers_deinit(void)
844
g_source_remove(cmd_tag);
898
g_source_remove(cmd_tag);
846
900
signal_remove("server connected", (SIGNAL_FUNC) sig_connected);
847
901
signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);