| | 66 | | static void irc_channels_join(IRC_SERVER_REC *server, const char *data, | | | 67 | | int automatic) | | | 68 | | { | | | 69 | | CHANNEL_SETUP_REC *schannel; | | | 70 | | IRC_CHANNEL_REC *chanrec; | | | 71 | | GString *outchans, *outkeys; | | | 72 | | char *channels, *keys, *key, *space; | | | 73 | | char **chanlist, **keylist, **tmp, **tmpkey, **tmpstr, *channel, *channame; | | | 74 | | void *free_arg; | | | 75 | | int use_keys, cmdlen; | | | 76 | | | | | 77 | | g_return_if_fail(data != NULL);
| | | 78 | | g_return_if_fail(IS_IRC_SERVER(server) && server->connected);
| | | 79 | | if (*data == '\0') return; | | | 80 | | | | | 81 | | if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST,
| | | 82 | | &channels, &keys)) | | | 83 | | return; | | | 84 | | | | | 85 | | | | | 86 | | space = strchr(keys, ' '); | | | 87 | | if (space != NULL) {
| | | 88 | | *space = '\0'; | | | 89 | | } | | | 90 | | | | | 91 | | chanlist = g_strsplit(channels, ",", -1); | | | 92 | | keylist = g_strsplit(keys, ",", -1); | | | 93 | | | | | 94 | | outchans = g_string_new(NULL);
| | | 95 | | outkeys = g_string_new(NULL);
| | | 96 | | | | | 97 | | use_keys = *keys != '\0'; | | | 98 | | tmpkey = keylist; | | | 99 | | tmp = chanlist; | | | 100 | | for (;; tmp++) { | | | 101 | | if (*tmp != NULL) {
| | | 102 | | channel = ischannel(**tmp) ? g_strdup(*tmp) :
| | | 103 | | g_strdup_printf("#%s", *tmp); | | | 104 | | | | | 105 | | chanrec = irc_channel_find(server, channel);
| | | 106 | | if (chanrec == NULL) {
| | | 107 | | schannel = channel_setup_find(channel, server->connrec->chatnet); | | | 108 | | | | | 109 | | g_string_append_printf(outchans, "%s,", channel); | | | 110 | | if (*tmpkey != NULL && **tmpkey != '\0')
| | | 111 | | key = *tmpkey; | | | 112 | | else if (schannel != NULL && schannel->password != NULL) {
| | | 113 | | | | | 114 | | use_keys = TRUE;
| | | 115 | | key = schannel->password; | | | 116 | | } else key = NULL;
| | | 117 | | | | | 118 | | g_string_append_printf(outkeys, "%s,", get_join_key(key));
| | | 119 | | channame = channel + (channel[0] == '!' && | | | 120 | | channel[1] == '!'); | | | 121 | | chanrec = irc_channel_create(server, channame, NULL,
| | | 122 | | automatic); | | | 123 | | if (key != NULL) chanrec->key = g_strdup(key);
| | | 124 | | } | | | 125 | | g_free(channel); | | | 126 | | | | | 127 | | if (*tmpkey != NULL)
| | | 128 | | tmpkey++; | | | 129 | | | | | 130 | | tmpstr = tmp; | | | 131 | | tmpstr++; | | | 132 | | cmdlen = outchans->len-1; | | | 133 | | | | | 134 | | if (use_keys) | | | 135 | | cmdlen += outkeys->len; | | | 136 | | if (*tmpstr != NULL)
| | | 137 | | cmdlen += ischannel(**tmpstr) ? strlen(*tmpstr) :
| | | 138 | | strlen(*tmpstr)+1; | | | 139 | | if (*tmpkey != NULL)
| | | 140 | | cmdlen += strlen(*tmpkey); | | | 141 | | | | | 142 | | | | | 143 | | | | | 144 | | | | | 145 | | if (cmdlen < 505) | | | 146 | | continue; | | | 147 | | } | | | 148 | | if (outchans->len > 0) { | | | 149 | | g_string_truncate(outchans, outchans->len-1); | | | 150 | | g_string_truncate(outkeys, outkeys->len-1); |
|