Mercurial > pidgin
annotate src/protocols/irc/cmds.c @ 13967:99b9b58b19dd
[gaim-migrate @ 16523]
Fix a crazy MSN crash. Basically it's possible to have more than one
slplink associated with a given switchboard, but our code did not
allow for that. I think it happens when you're in a multi-user
chat and you do stuff with multiple users that involves slplinks.
Like maybe file transfer and buddy icon related stuff.
Tracking this down took an ungodly amount of time, but thanks to
Meebo for letting me do it :-)
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 20 Jul 2006 07:31:15 +0000 |
parents | 3d1cee0d360d |
children |
rev | line source |
---|---|
6333 | 1 /** |
2 * @file cmds.c | |
3 * | |
4 * gaim | |
5 * | |
6 * Copyright (C) 2003, Ethan Blanton <eblanton@cs.purdue.edu> | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 */ | |
22 | |
23 #include "internal.h" | |
24 | |
25 #include "conversation.h" | |
8504 | 26 #include "debug.h" |
6333 | 27 #include "notify.h" |
8624 | 28 #include "util.h" |
8504 | 29 |
6333 | 30 #include "irc.h" |
31 | |
32 | |
33 static void irc_do_mode(struct irc_conn *irc, const char *target, const char *sign, char **ops); | |
34 | |
35 int irc_cmd_default(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
36 { | |
11338 | 37 GaimConversation *convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, target, irc->account); |
6333 | 38 char *buf; |
39 | |
40 if (!convo) | |
6350 | 41 return 1; |
6333 | 42 |
43 buf = g_strdup_printf(_("Unknown command: %s"), cmd); | |
11338 | 44 if (gaim_conversation_get_type(convo) == GAIM_CONV_TYPE_IM) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
45 gaim_conv_im_write(GAIM_CONV_IM(convo), "", buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 46 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
47 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 48 g_free(buf); |
49 | |
50 return 1; | |
51 } | |
52 | |
53 int irc_cmd_away(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
54 { | |
12669
879f90dbd21f
[gaim-migrate @ 15012]
Richard Laager <rlaager@wiktel.com>
parents:
12013
diff
changeset
|
55 char *buf, *message; |
6333 | 56 |
57 if (args[0] && strcmp(cmd, "back")) { | |
12669
879f90dbd21f
[gaim-migrate @ 15012]
Richard Laager <rlaager@wiktel.com>
parents:
12013
diff
changeset
|
58 message = gaim_markup_strip_html(args[0]); |
879f90dbd21f
[gaim-migrate @ 15012]
Richard Laager <rlaager@wiktel.com>
parents:
12013
diff
changeset
|
59 gaim_util_chrreplace(message, '\n', ' '); |
6333 | 60 buf = irc_format(irc, "v:", "AWAY", message); |
61 g_free(message); | |
62 } else { | |
63 buf = irc_format(irc, "v", "AWAY"); | |
64 } | |
65 irc_send(irc, buf); | |
66 g_free(buf); | |
67 | |
68 return 0; | |
69 } | |
70 | |
71 int irc_cmd_ctcp_action(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
72 { | |
73 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
10933 | 74 char *action, *escaped, *dst, **newargs; |
6333 | 75 const char *src; |
76 GaimConversation *convo; | |
77 | |
78 if (!args || !args[0] || !gc) | |
79 return 0; | |
80 | |
6376 | 81 action = g_malloc(strlen(args[0]) + 10); |
6333 | 82 |
83 sprintf(action, "\001ACTION "); | |
84 | |
85 src = args[0]; | |
86 dst = action + 8; | |
87 while (*src) { | |
88 if (*src == '\n') { | |
89 if (*(src + 1) == '\0') { | |
90 break; | |
91 } else { | |
92 *dst++ = ' '; | |
93 src++; | |
94 continue; | |
95 } | |
96 } | |
97 *dst++ = *src++; | |
98 } | |
99 *dst++ = '\001'; | |
100 *dst = '\0'; | |
101 | |
102 newargs = g_new0(char *, 2); | |
103 newargs[0] = g_strdup(target); | |
104 newargs[1] = action; | |
105 irc_cmd_privmsg(irc, cmd, target, (const char **)newargs); | |
106 g_free(newargs[0]); | |
107 g_free(newargs[1]); | |
108 g_free(newargs); | |
109 | |
11338 | 110 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, target, irc->account); |
9130 | 111 if (convo) { |
10933 | 112 escaped = g_markup_escape_text(args[0], -1); |
113 action = g_strdup_printf("/me %s", escaped); | |
114 g_free(escaped); | |
6333 | 115 if (action[strlen(action) - 1] == '\n') |
116 action[strlen(action) - 1] = '\0'; | |
11338 | 117 if (gaim_conversation_get_type(convo) == GAIM_CONV_TYPE_CHAT) |
9130 | 118 serv_got_chat_in(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo)), |
119 gaim_connection_get_display_name(gc), | |
120 0, action, time(NULL)); | |
121 else | |
122 gaim_conv_im_write(GAIM_CONV_IM(convo), gaim_connection_get_display_name(gc), | |
123 action, 0, time(NULL)); | |
6333 | 124 g_free(action); |
125 } | |
126 | |
127 return 1; | |
128 } | |
129 | |
13881 | 130 int irc_cmd_ctcp_version(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
131 { | |
132 char *buf; | |
133 | |
134 | |
135 if (!args || !args[0]) | |
136 return 0; | |
137 | |
138 buf = irc_format(irc, "vn:", "PRIVMSG", args[0], "\001VERSION\001"); | |
139 irc_send(irc, buf); | |
140 g_free(buf); | |
141 | |
142 return 0; | |
143 } | |
144 | |
6333 | 145 int irc_cmd_invite(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
146 { | |
147 char *buf; | |
148 | |
149 if (!args || !args[0] || !(args[1] || target)) | |
150 return 0; | |
151 | |
152 buf = irc_format(irc, "vnc", "INVITE", args[0], args[1] ? args[1] : target); | |
153 irc_send(irc, buf); | |
154 g_free(buf); | |
155 | |
156 return 0; | |
157 } | |
158 | |
159 int irc_cmd_join(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
160 { | |
161 char *buf; | |
162 | |
163 if (!args || !args[0]) | |
164 return 0; | |
165 | |
166 if (args[1]) | |
167 buf = irc_format(irc, "vcv", "JOIN", args[0], args[1]); | |
168 else | |
169 buf = irc_format(irc, "vc", "JOIN", args[0]); | |
170 irc_send(irc, buf); | |
171 g_free(buf); | |
172 | |
173 return 0; | |
174 } | |
175 | |
176 int irc_cmd_kick(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
177 { | |
178 char *buf; | |
179 GaimConversation *convo; | |
180 | |
181 if (!args || !args[0]) | |
182 return 0; | |
183 | |
11338 | 184 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, target, irc->account); |
10246 | 185 if (!convo) |
6350 | 186 return 0; |
6333 | 187 |
188 if (args[1]) | |
189 buf = irc_format(irc, "vcn:", "KICK", target, args[0], args[1]); | |
190 else | |
191 buf = irc_format(irc, "vcn", "KICK", target, args[0]); | |
192 irc_send(irc, buf); | |
193 g_free(buf); | |
194 | |
195 return 0; | |
196 } | |
197 | |
8114 | 198 int irc_cmd_list(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
199 { | |
8352 | 200 gaim_roomlist_show_with_account(irc->account); |
8114 | 201 |
202 return 0; | |
203 } | |
204 | |
6333 | 205 int irc_cmd_mode(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
206 { | |
207 GaimConnection *gc; | |
208 char *buf; | |
209 | |
210 if (!args) | |
211 return 0; | |
212 | |
213 if (!strcmp(cmd, "mode")) { | |
10208 | 214 if (!args[0] && irc_ischannel(target)) |
6333 | 215 buf = irc_format(irc, "vc", "MODE", target); |
216 else if (args[0] && (*args[0] == '+' || *args[0] == '-')) | |
217 buf = irc_format(irc, "vcv", "MODE", target, args[0]); | |
218 else if (args[0]) | |
219 buf = irc_format(irc, "vv", "MODE", args[0]); | |
220 else | |
6350 | 221 return 0; |
6333 | 222 } else if (!strcmp(cmd, "umode")) { |
223 if (!args[0]) | |
6350 | 224 return 0; |
6333 | 225 gc = gaim_account_get_connection(irc->account); |
226 buf = irc_format(irc, "vnv", "MODE", gaim_connection_get_display_name(gc), args[0]); | |
6365 | 227 } else { |
228 return 0; | |
6333 | 229 } |
6365 | 230 |
6333 | 231 irc_send(irc, buf); |
232 g_free(buf); | |
233 | |
234 return 0; | |
235 } | |
236 | |
237 int irc_cmd_names(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
238 { | |
239 char *buf; | |
240 | |
10208 | 241 if (!args || (!args[0] && !irc_ischannel(target))) |
6333 | 242 return 0; |
243 | |
244 buf = irc_format(irc, "vc", "NAMES", args[0] ? args[0] : target); | |
245 irc_send(irc, buf); | |
246 g_free(buf); | |
247 | |
248 irc->nameconv = g_strdup(target); | |
249 | |
250 return 0; | |
251 } | |
252 | |
253 int irc_cmd_nick(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
254 { | |
255 char *buf; | |
256 | |
257 if (!args || !args[0]) | |
258 return 0; | |
259 | |
260 buf = irc_format(irc, "v:", "NICK", args[0]); | |
261 irc_send(irc, buf); | |
262 g_free(buf); | |
263 | |
264 return 0; | |
265 } | |
266 | |
267 int irc_cmd_op(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
268 { | |
269 char **nicks, **ops, *sign, *mode; | |
270 int i = 0, used = 0; | |
271 | |
272 if (!args || !args[0] || !*args[0]) | |
273 return 0; | |
274 | |
275 if (!strcmp(cmd, "op")) { | |
276 sign = "+"; | |
277 mode = "o"; | |
278 } else if (!strcmp(cmd, "deop")) { | |
279 sign = "-"; | |
280 mode = "o"; | |
281 } else if (!strcmp(cmd, "voice")) { | |
282 sign = "+"; | |
283 mode = "v"; | |
284 } else if (!strcmp(cmd, "devoice")) { | |
285 sign = "-"; | |
286 mode = "v"; | |
287 } else { | |
288 gaim_debug(GAIM_DEBUG_ERROR, "irc", "invalid 'op' command '%s'\n", cmd); | |
289 return 0; | |
290 } | |
291 | |
292 nicks = g_strsplit(args[0], " ", -1); | |
293 | |
294 for (i = 0; nicks[i]; i++) | |
295 /* nothing */; | |
296 ops = g_new0(char *, i * 2 + 1); | |
297 | |
298 for (i = 0; nicks[i]; i++) { | |
299 if (!*nicks[i]) | |
300 continue; | |
301 ops[used++] = mode; | |
302 ops[used++] = nicks[i]; | |
303 } | |
304 | |
305 irc_do_mode(irc, target, sign, ops); | |
306 g_free(ops); | |
307 | |
6350 | 308 return 0; |
6333 | 309 } |
310 | |
311 int irc_cmd_part(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
312 { | |
313 char *buf; | |
314 | |
315 if (!args) | |
316 return 0; | |
317 | |
318 if (args[1]) | |
319 buf = irc_format(irc, "vc:", "PART", args[0] ? args[0] : target, args[1]); | |
320 else | |
321 buf = irc_format(irc, "vc", "PART", args[0] ? args[0] : target); | |
322 irc_send(irc, buf); | |
323 g_free(buf); | |
324 | |
325 return 0; | |
326 } | |
327 | |
328 int irc_cmd_ping(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
329 { | |
330 char *stamp; | |
331 char *buf; | |
332 | |
333 if (args && args[0]) { | |
10208 | 334 if (irc_ischannel(args[0])) |
6333 | 335 return 0; |
336 stamp = g_strdup_printf("\001PING %lu\001", time(NULL)); | |
337 buf = irc_format(irc, "vn:", "PRIVMSG", args[0], stamp); | |
338 g_free(stamp); | |
339 } else { | |
6350 | 340 stamp = g_strdup_printf("%s %lu", target, time(NULL)); |
6333 | 341 buf = irc_format(irc, "v:", "PING", stamp); |
342 g_free(stamp); | |
343 } | |
344 irc_send(irc, buf); | |
345 g_free(buf); | |
346 | |
347 return 0; | |
348 } | |
349 | |
350 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
351 { | |
352 const char *cur, *end; | |
353 char *msg, *buf; | |
354 | |
355 if (!args || !args[0] || !args[1]) | |
356 return 0; | |
357 | |
358 cur = args[1]; | |
359 end = args[1]; | |
360 while (*end && *cur) { | |
361 end = strchr(cur, '\n'); | |
362 if (!end) | |
363 end = cur + strlen(cur); | |
364 msg = g_strndup(cur, end - cur); | |
365 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); | |
366 irc_send(irc, buf); | |
367 g_free(msg); | |
368 g_free(buf); | |
369 cur = end + 1; | |
370 } | |
371 | |
372 return 0; | |
373 } | |
374 | |
375 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
376 { | |
377 char *buf; | |
378 | |
9440 | 379 if (!irc->quitting) { |
11763 | 380 /* |
381 * Use gaim_account_get_string(irc->account, "quitmsg", IRC_DEFAULT_QUIT) | |
382 * and uncomment the appropriate account preference in irc.c if we | |
383 * decide we want custom quit messages. | |
384 */ | |
385 buf = irc_format(irc, "v:", "QUIT", (args && args[0]) ? args[0] : IRC_DEFAULT_QUIT); | |
9440 | 386 irc_send(irc, buf); |
387 g_free(buf); | |
388 | |
389 irc->quitting = TRUE; | |
13837 | 390 |
13912 | 391 if (!irc->account->disconnecting) |
392 gaim_account_set_status(irc->account, "offline", TRUE, NULL); | |
9440 | 393 } |
6333 | 394 |
395 return 0; | |
396 } | |
397 | |
398 int irc_cmd_quote(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
399 { | |
400 char *buf; | |
401 | |
402 if (!args || !args[0]) | |
403 return 0; | |
404 | |
405 buf = irc_format(irc, "v", args[0]); | |
406 irc_send(irc, buf); | |
407 g_free(buf); | |
408 | |
409 return 0; | |
410 } | |
411 | |
412 int irc_cmd_query(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
413 { | |
414 GaimConversation *convo; | |
415 GaimConnection *gc; | |
416 | |
417 if (!args || !args[0]) | |
418 return 0; | |
419 | |
11338 | 420 convo = gaim_conversation_new(GAIM_CONV_TYPE_IM, irc->account, args[0]); |
13876 | 421 gaim_conversation_present(convo); |
6333 | 422 |
423 if (args[1]) { | |
424 gc = gaim_account_get_connection(irc->account); | |
425 irc_cmd_privmsg(irc, cmd, target, args); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
426 gaim_conv_im_write(GAIM_CONV_IM(convo), gaim_connection_get_display_name(gc), |
6982 | 427 args[1], GAIM_MESSAGE_SEND, time(NULL)); |
6333 | 428 } |
429 | |
430 return 0; | |
431 } | |
432 | |
433 int irc_cmd_remove(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
434 { | |
435 char *buf; | |
436 | |
437 if (!args || !args[0]) | |
438 return 0; | |
439 | |
10208 | 440 if (!irc_ischannel(target)) /* not a channel, punt */ |
6333 | 441 return 0; |
442 | |
443 if (args[1]) | |
444 buf = irc_format(irc, "vcn:", "REMOVE", target, args[0], args[1]); | |
445 else | |
446 buf = irc_format(irc, "vcn", "REMOVE", target, args[0]); | |
447 irc_send(irc, buf); | |
448 g_free(buf); | |
449 | |
450 return 0; | |
451 } | |
452 | |
12013 | 453 int irc_cmd_service(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
454 { | |
455 char *capital_cmd, *buf; | |
456 | |
457 if (!args || !args[0]) | |
458 return 0; | |
459 | |
460 /* cmd will be one of nickserv, chanserv, memoserv or operserv */ | |
461 capital_cmd = g_ascii_strup(cmd, -1); | |
462 buf = irc_format(irc, "v:", capital_cmd, args[0]); | |
463 irc_send(irc, buf); | |
464 g_free(capital_cmd); | |
465 g_free(buf); | |
466 | |
467 return 0; | |
468 } | |
469 | |
10564 | 470 int irc_cmd_time(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
471 { | |
472 char *buf; | |
473 | |
474 buf = irc_format(irc, "v", "TIME"); | |
475 irc_send(irc, buf); | |
476 g_free(buf); | |
477 | |
478 return 0; | |
479 } | |
480 | |
6333 | 481 int irc_cmd_topic(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
482 { | |
483 char *buf; | |
484 const char *topic; | |
485 GaimConversation *convo; | |
486 | |
487 if (!args) | |
488 return 0; | |
489 | |
11338 | 490 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, target, irc->account); |
10246 | 491 if (!convo) |
6350 | 492 return 0; |
6333 | 493 |
494 if (!args[0]) { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
495 topic = gaim_conv_chat_get_topic (GAIM_CONV_CHAT(convo)); |
6333 | 496 |
8504 | 497 if (topic) { |
9762 | 498 char *tmp, *tmp2; |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10609
diff
changeset
|
499 tmp = g_markup_escape_text(topic, -1); |
9762 | 500 tmp2 = gaim_markup_linkify(tmp); |
501 buf = g_strdup_printf(_("current topic is: %s"), tmp2); | |
8504 | 502 g_free(tmp); |
9762 | 503 g_free(tmp2); |
8504 | 504 } else |
6333 | 505 buf = g_strdup(_("No topic is set")); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
506 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), target, buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 507 g_free(buf); |
508 | |
509 return 0; | |
510 } | |
511 | |
512 buf = irc_format(irc, "vt:", "TOPIC", target, args[0]); | |
513 irc_send(irc, buf); | |
514 g_free(buf); | |
515 | |
516 return 0; | |
517 } | |
518 | |
519 int irc_cmd_wallops(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
520 { | |
521 char *buf; | |
522 | |
523 if (!args || !args[0]) | |
6350 | 524 return 0; |
6333 | 525 |
526 if (!strcmp(cmd, "wallops")) | |
527 buf = irc_format(irc, "v:", "WALLOPS", args[0]); | |
528 else if (!strcmp(cmd, "operwall")) | |
529 buf = irc_format(irc, "v:", "OPERWALL", args[0]); | |
6365 | 530 else |
531 return 0; | |
6333 | 532 |
533 irc_send(irc, buf); | |
534 g_free(buf); | |
535 | |
536 return 0; | |
537 } | |
538 | |
539 int irc_cmd_whois(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
540 { | |
541 char *buf; | |
542 | |
543 if (!args || !args[0]) | |
544 return 0; | |
545 | |
10609 | 546 if (args[1]) { |
547 buf = irc_format(irc, "vvn", "WHOIS", args[0], args[1]); | |
548 irc->whois.nick = g_strdup(args[1]); | |
549 } else { | |
550 buf = irc_format(irc, "vn", "WHOIS", args[0]); | |
551 irc->whois.nick = g_strdup(args[0]); | |
552 } | |
553 | |
6333 | 554 irc_send(irc, buf); |
555 g_free(buf); | |
556 | |
557 return 0; | |
558 } | |
559 | |
560 static void irc_do_mode(struct irc_conn *irc, const char *target, const char *sign, char **ops) | |
561 { | |
562 char *buf, mode[5]; | |
563 int i = 0; | |
564 | |
565 if (!sign) | |
566 return; | |
567 | |
568 while (ops[i]) { | |
569 if (ops[i + 2] && ops[i + 4]) { | |
570 g_snprintf(mode, sizeof(mode), "%s%s%s%s", sign, | |
571 ops[i], ops[i + 2], ops[i + 4]); | |
572 buf = irc_format(irc, "vcvnnn", "MODE", target, mode, | |
573 ops[i + 1], ops[i + 3], ops[i + 5]); | |
574 i += 6; | |
575 } else if (ops[i + 2]) { | |
576 g_snprintf(mode, sizeof(mode), "%s%s%s", | |
577 sign, ops[i], ops[i + 2]); | |
578 buf = irc_format(irc, "vcvnn", "MODE", target, mode, | |
579 ops[i + 1], ops[i + 3]); | |
580 i += 4; | |
581 } else { | |
582 g_snprintf(mode, sizeof(mode), "%s%s", sign, ops[i]); | |
583 buf = irc_format(irc, "vcvn", "MODE", target, mode, ops[i + 1]); | |
584 i += 2; | |
585 } | |
586 irc_send(irc, buf); | |
587 g_free(buf); | |
588 } | |
6350 | 589 |
590 return; | |
6333 | 591 } |