static void irc_channels_join(IRC_SERVER_REC *server, const char *data, int automatic) { CHANNEL_SETUP_REC *schannel; IRC_CHANNEL_REC *chanrec; GString *outchans, *outkeys; char *channels, *keys, *key, *space; char **chanlist, **keylist, **tmp, **tmpkey, **tmpstr, *channel, *channame; void *free_arg; int use_keys, cmdlen; g_return_if_fail(data != NULL); g_return_if_fail(IS_IRC_SERVER(server) && server->connected); if (*data == '\0') return; if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &channels, &keys)) return; /* keys shouldn't contain space */ space = strchr(keys, ' '); if (space != NULL) { *space = '\0'; } chanlist = g_strsplit(channels, ",", -1); keylist = g_strsplit(keys, ",", -1); outchans = g_string_new(NULL); outkeys = g_string_new(NULL); use_keys = *keys != '\0'; tmpkey = keylist; tmp = chanlist; for (;; tmp++) { if (*tmp != NULL) { channel = ischannel(**tmp) ? g_strdup(*tmp) : g_strdup_printf("#%s", *tmp); chanrec = irc_channel_find(server, channel); if (chanrec == NULL) { schannel = channel_setup_find(channel, server->connrec->chatnet); g_string_sprintfa(outchans, "%s,", channel); if (*tmpkey != NULL && **tmpkey != '\0') key = *tmpkey; else if (schannel != NULL && schannel->password != NULL) { /* get password from setup record */ use_keys = TRUE; key = schannel->password; } else key = NULL; g_string_sprintfa(outkeys, "%s,", get_join_key(key)); channame = channel + (channel[0] == '!' && channel[1] == '!'); chanrec = irc_channel_create(server, channame, NULL, automatic); if (key != NULL) chanrec->key = g_strdup(key); } g_free(channel); if (*tmpkey != NULL) tmpkey++; tmpstr = tmp; tmpstr++; cmdlen = outchans->len-1; if (use_keys) cmdlen += outkeys->len; if (*tmpstr != NULL) cmdlen += ischannel(**tmpstr) ? strlen(*tmpstr) : strlen(*tmpstr)+1; if (*tmpkey != NULL) cmdlen += strlen(*tmpkey); /* don't try to send too long lines make sure it's not longer than 510 so 510 - strlen("JOIN ") = 505 */ if (cmdlen < 505) continue; } if (outchans->len > 0) { g_string_truncate(outchans, outchans->len-1); g_string_truncate(outkeys, outkeys->len-1); irc_send_cmdv(IRC_SERVER(server), use_keys ? "JOIN %s %s" : "JOIN %s", outchans->str, outkeys->str); } cmdlen = 0; g_string_truncate(outchans,0); g_string_truncate(outkeys,0); if (*tmp == NULL || tmp[1] == NULL) break; } g_string_free(outchans, TRUE); g_string_free(outkeys, TRUE); g_strfreev(chanlist); g_strfreev(keylist); cmd_params_free(free_arg); }
static void irc_channels_join(IRC_SERVER_REC *server, const char *data, int automatic) { CHANNEL_SETUP_REC *schannel; IRC_CHANNEL_REC *chanrec; GString *outchans, *outkeys; char *channels, *keys, *key; char **chanlist, **keylist, **tmp, **tmpkey, *channel, *channame; void *free_arg; int use_keys; g_return_if_fail(data != NULL); g_return_if_fail(IS_IRC_SERVER(server) && server->connected); if (*data == '\0') return; if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &channels, &keys)) return; chanlist = g_strsplit(channels, ",", -1); keylist = g_strsplit(keys, ",", -1); outchans = g_string_new(NULL); outkeys = g_string_new(NULL); use_keys = *keys != '\0'; tmpkey = keylist; for (tmp = chanlist; *tmp != NULL; tmp++) { channel = ischannel(**tmp) ? g_strdup(*tmp) : g_strdup_printf("#%s", *tmp); chanrec = irc_channel_find(server, channel); if (chanrec == NULL) { schannel = channel_setup_find(channel, server->connrec->chatnet); g_string_sprintfa(outchans, "%s,", channel); if (*tmpkey != NULL && **tmpkey != '\0') key = *tmpkey; else if (schannel != NULL && schannel->password != NULL) { /* get password from setup record */ use_keys = TRUE; key = schannel->password; } else key = NULL; g_string_sprintfa(outkeys, "%s,", get_join_key(key)); channame = channel + (channel[0] == '!' && channel[1] == '!'); chanrec = irc_channel_create(server, channame, automatic); if (key != NULL) chanrec->key = g_strdup(key); } g_free(channel); if (*tmpkey != NULL) tmpkey++; } if (outchans->len > 0) { g_string_truncate(outchans, outchans->len-1); g_string_truncate(outkeys, outkeys->len-1); irc_send_cmdv(IRC_SERVER(server), use_keys ? "JOIN %s %s" : "JOIN %s", outchans->str, outkeys->str); } g_string_free(outchans, TRUE); g_string_free(outkeys, TRUE); g_strfreev(chanlist); g_strfreev(keylist); cmd_params_free(free_arg); }
static void event_join(IRC_SERVER_REC *server, const char *data, const char *nick, const char *address) { char *params, *channel, *tmp, *shortchan; IRC_CHANNEL_REC *chanrec; g_return_if_fail(data != NULL); if (g_ascii_strcasecmp(nick, server->nick) != 0) { /* someone else joined channel, no need to do anything */ return; } if (server->userhost == NULL) server->userhost = g_strdup(address); params = event_get_params(data, 1, &channel); tmp = strchr(channel, 7); /* ^G does something weird.. */ if (tmp != NULL) *tmp = '\0'; if (*channel != '!' || strlen(channel) < 7) shortchan = NULL; else { /* !channels have 5 chars long identification string before it's name, it's not known when /join is called so rename !channel here to !ABCDEchannel */ shortchan = g_strdup_printf("!%s", channel+6); chanrec = channel_find_unjoined(server, shortchan); if (chanrec != NULL) { channel_change_name(CHANNEL(chanrec), channel); g_free(chanrec->name); chanrec->name = g_strdup(channel); } else { /* well, did we join it with full name? if so, and if this was the first short one, change it's name. */ chanrec = channel_find_unjoined(server, channel); if (chanrec != NULL && irc_channel_find(server, shortchan) == NULL) { channel_change_visible_name(CHANNEL(chanrec), shortchan); } } } chanrec = irc_channel_find(server, channel); if (chanrec != NULL && chanrec->joined) { /* already joined this channel - probably a broken proxy that forgot to send PART between */ chanrec->left = TRUE; channel_destroy(CHANNEL(chanrec)); chanrec = NULL; } if (chanrec == NULL) { /* look again, because of the channel name cut issues. */ chanrec = channel_find_unjoined(server, channel); } if (chanrec == NULL) { /* didn't get here with /join command.. */ chanrec = irc_channel_create(server, channel, shortchan, TRUE); } chanrec->joined = TRUE; if (g_strcmp0(chanrec->name, channel) != 0) { g_free(chanrec->name); chanrec->name = g_strdup(channel); } g_free(shortchan); g_free(params); }