Mercurial > pidgin.yaz
annotate src/protocols/irc/cmds.c @ 6621:42fdf16f1dad
[gaim-migrate @ 7145]
Individual accounts remember the "No Proxy" setting instead of reverting
back to "Use Global Proxy Settings"
Proxy settings for individual accounts do not revert to "No Proxy" if
you open an account, don't change the proxy drop down, then save the
account.
Those two sound like the same thing, but they're different. I think.
Added the "use environmental variables" setting in a way that isn't
horrible.
We're not using that thing that splits the proxy variable into
host:port yet. I'll do that later. I would have done that
earlier, but I had to go buy a bike.
Also, I'd like to show what the environmental variables are set to
somewhere. That'll come later.
Also a patch from Robot101:
(22:10:25) Bzubhipheron: I have a patch that replaces #define WFLAG_* with
GaimMessageFlags GAIM_MESSAGE_*
(22:10:30) Bzubhipheron: (an enum in disguise)
(22:14:18) Bzubhipheron: GaimMessageFlags protrays much better typing
information than "int". most of the other #defines are gone, and glib
standardises on enums for its flags too.
(22:14:27) Bzubhipheron: (gone or going)
(22:14:45) Bzubhipheron: and it makes the prototype of my message queueing stuff prettier.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 25 Aug 2003 02:49:42 +0000 |
parents | e3be6b9744b7 |
children | 083d1e4a9c78 |
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" | |
26 #include "notify.h" | |
27 #include "debug.h" | |
28 #include "irc.h" | |
29 | |
30 | |
31 static void irc_do_mode(struct irc_conn *irc, const char *target, const char *sign, char **ops); | |
32 | |
33 int irc_cmd_default(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
34 { | |
35 GaimConversation *convo = gaim_find_conversation_with_account(target, irc->account); | |
36 char *buf; | |
37 | |
38 if (!convo) | |
6350 | 39 return 1; |
6333 | 40 |
41 buf = g_strdup_printf(_("Unknown command: %s"), cmd); | |
42 if (gaim_conversation_get_type(convo) == GAIM_CONV_IM) | |
6621 | 43 gaim_im_write(GAIM_IM(convo), "", buf, -1, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 44 else |
6621 | 45 gaim_chat_write(GAIM_CHAT(convo), "", buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 46 g_free(buf); |
47 | |
48 return 1; | |
49 } | |
50 | |
51 int irc_cmd_away(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
52 { | |
53 char *buf, *message, *cur; | |
54 | |
55 if (args[0] && strcmp(cmd, "back")) { | |
56 message = strdup(args[0]); | |
57 for (cur = message; *cur; cur++) { | |
58 if (*cur == '\n') | |
59 *cur = ' '; | |
60 } | |
61 buf = irc_format(irc, "v:", "AWAY", message); | |
62 g_free(message); | |
63 } else { | |
64 buf = irc_format(irc, "v", "AWAY"); | |
65 } | |
66 irc_send(irc, buf); | |
67 g_free(buf); | |
68 | |
69 return 0; | |
70 } | |
71 | |
72 int irc_cmd_ctcp_action(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
73 { | |
74 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
75 char *action, *dst, **newargs; | |
76 const char *src; | |
77 GaimConversation *convo; | |
78 | |
79 if (!args || !args[0] || !gc) | |
80 return 0; | |
81 | |
6376 | 82 action = g_malloc(strlen(args[0]) + 10); |
6333 | 83 |
84 sprintf(action, "\001ACTION "); | |
85 | |
86 src = args[0]; | |
87 dst = action + 8; | |
88 while (*src) { | |
89 if (*src == '\n') { | |
90 if (*(src + 1) == '\0') { | |
91 break; | |
92 } else { | |
93 *dst++ = ' '; | |
94 src++; | |
95 continue; | |
96 } | |
97 } | |
98 *dst++ = *src++; | |
99 } | |
100 *dst++ = '\001'; | |
101 *dst = '\0'; | |
102 | |
103 newargs = g_new0(char *, 2); | |
104 newargs[0] = g_strdup(target); | |
105 newargs[1] = action; | |
106 irc_cmd_privmsg(irc, cmd, target, (const char **)newargs); | |
107 g_free(newargs[0]); | |
108 g_free(newargs[1]); | |
109 g_free(newargs); | |
110 | |
111 convo = gaim_find_conversation_with_account(target, irc->account); | |
112 if (convo && gaim_conversation_get_type(convo) == GAIM_CONV_CHAT) { | |
113 action = g_strdup_printf("/me %s", args[0]); | |
114 if (action[strlen(action) - 1] == '\n') | |
115 action[strlen(action) - 1] = '\0'; | |
116 serv_got_chat_in(gc, gaim_chat_get_id(GAIM_CHAT(convo)), | |
117 gaim_connection_get_display_name(gc), | |
118 0, action, time(NULL)); | |
119 g_free(action); | |
120 } | |
121 | |
122 return 1; | |
123 } | |
124 | |
6415
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
125 int irc_cmd_help(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
126 { |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
127 GaimConversation *convo = gaim_find_conversation_with_account(target, irc->account); |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
128 |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
129 /* XXX we should eventually have per-command help */ |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
130 |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
131 if (!convo) |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
132 return 0; |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
133 |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
134 if (gaim_conversation_get_type(convo) == GAIM_CONV_CHAT) { |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
135 gaim_chat_write(GAIM_CHAT(convo), "", _("<B>Supported IRC Commands:</B><BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
136 "AWAY INVITE JOIN KICK<BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
137 "ME MODE MSG NAMES<BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
138 "NICK OP DEOP OPERWALL<BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
139 "PART PING QUERY QUIT<BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
140 "QUOTE REMOVE TOPIC UMODE<BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
141 "VOICE DEVOICE WALLOPS WHOIS<BR>"), |
6621 | 142 GAIM_MESSAGE_NO_LOG, time(NULL)); |
6415
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
143 } else { |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
144 gaim_im_write(GAIM_IM(convo), "", _("<B>Supported IRC Commands:</B><BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
145 "AWAY JOIN ME MODE<BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
146 "MSG NICK OPERWALL PING<BR>" |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
147 "QUERY QUIT QUOTE UMODE<BR>" |
6621 | 148 "WALLOPS WHOIS"), -1, GAIM_MESSAGE_NO_LOG, time(NULL)); |
6415
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
149 } |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
150 |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
151 return 0; |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
152 } |
e3be6b9744b7
[gaim-migrate @ 6922]
Christian Hammond <chipx86@chipx86.com>
parents:
6376
diff
changeset
|
153 |
6333 | 154 int irc_cmd_invite(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
155 { | |
156 char *buf; | |
157 | |
158 if (!args || !args[0] || !(args[1] || target)) | |
159 return 0; | |
160 | |
161 buf = irc_format(irc, "vnc", "INVITE", args[0], args[1] ? args[1] : target); | |
162 irc_send(irc, buf); | |
163 g_free(buf); | |
164 | |
165 return 0; | |
166 } | |
167 | |
168 int irc_cmd_join(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
169 { | |
170 char *buf; | |
171 | |
172 if (!args || !args[0]) | |
173 return 0; | |
174 | |
175 if (args[1]) | |
176 buf = irc_format(irc, "vcv", "JOIN", args[0], args[1]); | |
177 else | |
178 buf = irc_format(irc, "vc", "JOIN", args[0]); | |
179 irc_send(irc, buf); | |
180 g_free(buf); | |
181 | |
182 return 0; | |
183 } | |
184 | |
185 int irc_cmd_kick(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
186 { | |
187 char *buf; | |
188 GaimConversation *convo; | |
189 | |
190 if (!args || !args[0]) | |
191 return 0; | |
192 | |
193 convo = gaim_find_conversation_with_account(target, irc->account); | |
194 if (!convo || gaim_conversation_get_type(convo) != GAIM_CONV_CHAT) | |
6350 | 195 return 0; |
6333 | 196 |
197 if (args[1]) | |
198 buf = irc_format(irc, "vcn:", "KICK", target, args[0], args[1]); | |
199 else | |
200 buf = irc_format(irc, "vcn", "KICK", target, args[0]); | |
201 irc_send(irc, buf); | |
202 g_free(buf); | |
203 | |
204 return 0; | |
205 } | |
206 | |
207 int irc_cmd_mode(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
208 { | |
209 GaimConnection *gc; | |
210 char *buf; | |
211 | |
212 if (!args) | |
213 return 0; | |
214 | |
215 if (!strcmp(cmd, "mode")) { | |
216 if (!args[0] && (*target == '#' || *target == '&')) | |
217 buf = irc_format(irc, "vc", "MODE", target); | |
218 else if (args[0] && (*args[0] == '+' || *args[0] == '-')) | |
219 buf = irc_format(irc, "vcv", "MODE", target, args[0]); | |
220 else if (args[0]) | |
221 buf = irc_format(irc, "vv", "MODE", args[0]); | |
222 else | |
6350 | 223 return 0; |
6333 | 224 } else if (!strcmp(cmd, "umode")) { |
225 if (!args[0]) | |
6350 | 226 return 0; |
6333 | 227 gc = gaim_account_get_connection(irc->account); |
228 buf = irc_format(irc, "vnv", "MODE", gaim_connection_get_display_name(gc), args[0]); | |
6365 | 229 } else { |
230 return 0; | |
6333 | 231 } |
6365 | 232 |
6333 | 233 irc_send(irc, buf); |
234 g_free(buf); | |
235 | |
236 return 0; | |
237 } | |
238 | |
239 int irc_cmd_names(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
240 { | |
241 char *buf; | |
242 | |
243 if (!args) | |
244 return 0; | |
245 | |
246 buf = irc_format(irc, "vc", "NAMES", args[0] ? args[0] : target); | |
247 irc_send(irc, buf); | |
248 g_free(buf); | |
249 | |
250 irc->nameconv = g_strdup(target); | |
251 | |
252 return 0; | |
253 } | |
254 | |
255 int irc_cmd_nick(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
256 { | |
257 char *buf; | |
258 | |
259 if (!args || !args[0]) | |
260 return 0; | |
261 | |
262 buf = irc_format(irc, "v:", "NICK", args[0]); | |
263 irc_send(irc, buf); | |
264 g_free(buf); | |
265 | |
266 return 0; | |
267 } | |
268 | |
269 int irc_cmd_op(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
270 { | |
271 char **nicks, **ops, *sign, *mode; | |
272 int i = 0, used = 0; | |
273 | |
274 if (!args || !args[0] || !*args[0]) | |
275 return 0; | |
276 | |
277 if (!strcmp(cmd, "op")) { | |
278 sign = "+"; | |
279 mode = "o"; | |
280 } else if (!strcmp(cmd, "deop")) { | |
281 sign = "-"; | |
282 mode = "o"; | |
283 } else if (!strcmp(cmd, "voice")) { | |
284 sign = "+"; | |
285 mode = "v"; | |
286 } else if (!strcmp(cmd, "devoice")) { | |
287 sign = "-"; | |
288 mode = "v"; | |
289 } else { | |
290 gaim_debug(GAIM_DEBUG_ERROR, "irc", "invalid 'op' command '%s'\n", cmd); | |
291 return 0; | |
292 } | |
293 | |
294 nicks = g_strsplit(args[0], " ", -1); | |
295 | |
296 for (i = 0; nicks[i]; i++) | |
297 /* nothing */; | |
298 ops = g_new0(char *, i * 2 + 1); | |
299 | |
300 for (i = 0; nicks[i]; i++) { | |
301 if (!*nicks[i]) | |
302 continue; | |
303 ops[used++] = mode; | |
304 ops[used++] = nicks[i]; | |
305 } | |
306 | |
307 irc_do_mode(irc, target, sign, ops); | |
308 g_free(ops); | |
309 | |
6350 | 310 return 0; |
6333 | 311 } |
312 | |
313 int irc_cmd_part(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
314 { | |
315 char *buf; | |
316 | |
317 if (!args) | |
318 return 0; | |
319 | |
320 if (args[1]) | |
321 buf = irc_format(irc, "vc:", "PART", args[0] ? args[0] : target, args[1]); | |
322 else | |
323 buf = irc_format(irc, "vc", "PART", args[0] ? args[0] : target); | |
324 irc_send(irc, buf); | |
325 g_free(buf); | |
326 | |
327 return 0; | |
328 } | |
329 | |
330 int irc_cmd_ping(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
331 { | |
332 char *stamp; | |
333 char *buf; | |
334 | |
335 if (args && args[0]) { | |
336 if (*args[0] == '#' || *args[0] == '&') | |
337 return 0; | |
338 stamp = g_strdup_printf("\001PING %lu\001", time(NULL)); | |
339 buf = irc_format(irc, "vn:", "PRIVMSG", args[0], stamp); | |
340 g_free(stamp); | |
341 } else { | |
6350 | 342 stamp = g_strdup_printf("%s %lu", target, time(NULL)); |
6333 | 343 buf = irc_format(irc, "v:", "PING", stamp); |
344 g_free(stamp); | |
345 } | |
346 irc_send(irc, buf); | |
347 g_free(buf); | |
348 | |
349 return 0; | |
350 } | |
351 | |
352 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
353 { | |
354 const char *cur, *end; | |
355 char *msg, *buf; | |
356 | |
357 if (!args || !args[0] || !args[1]) | |
358 return 0; | |
359 | |
360 cur = args[1]; | |
361 end = args[1]; | |
362 while (*end && *cur) { | |
363 end = strchr(cur, '\n'); | |
364 if (!end) | |
365 end = cur + strlen(cur); | |
366 msg = g_strndup(cur, end - cur); | |
367 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); | |
368 irc_send(irc, buf); | |
369 g_free(msg); | |
370 g_free(buf); | |
371 cur = end + 1; | |
372 } | |
373 | |
374 return 0; | |
375 } | |
376 | |
377 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
378 { | |
379 char *buf; | |
380 | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6365
diff
changeset
|
381 buf = irc_format(irc, "v:", "QUIT", (args && args[0]) ? args[0] : "Download Gaim: " GAIM_WEBSITE); |
6333 | 382 irc_send(irc, buf); |
383 g_free(buf); | |
384 | |
385 return 0; | |
386 } | |
387 | |
388 int irc_cmd_quote(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
389 { | |
390 char *buf; | |
391 | |
392 if (!args || !args[0]) | |
393 return 0; | |
394 | |
395 buf = irc_format(irc, "v", args[0]); | |
396 irc_send(irc, buf); | |
397 g_free(buf); | |
398 | |
399 return 0; | |
400 } | |
401 | |
402 int irc_cmd_query(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
403 { | |
404 GaimConversation *convo; | |
405 GaimConnection *gc; | |
406 | |
407 if (!args || !args[0]) | |
408 return 0; | |
409 | |
410 convo = gaim_conversation_new(GAIM_CONV_IM, irc->account, args[0]); | |
411 | |
412 if (args[1]) { | |
413 gc = gaim_account_get_connection(irc->account); | |
414 irc_cmd_privmsg(irc, cmd, target, args); | |
415 gaim_im_write(GAIM_IM(convo), gaim_connection_get_display_name(gc), | |
6621 | 416 args[1], -1, GAIM_MESSAGE_SEND, time(NULL)); |
6333 | 417 } |
418 | |
419 return 0; | |
420 } | |
421 | |
422 int irc_cmd_remove(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
423 { | |
424 char *buf; | |
425 | |
426 if (!args || !args[0]) | |
427 return 0; | |
428 | |
429 if (*target != '#' && *target != '&') /* not a channel, punt */ | |
430 return 0; | |
431 | |
432 if (args[1]) | |
433 buf = irc_format(irc, "vcn:", "REMOVE", target, args[0], args[1]); | |
434 else | |
435 buf = irc_format(irc, "vcn", "REMOVE", target, args[0]); | |
436 irc_send(irc, buf); | |
437 g_free(buf); | |
438 | |
439 return 0; | |
440 } | |
441 | |
442 int irc_cmd_topic(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
443 { | |
444 char *buf; | |
445 const char *topic; | |
446 GaimConversation *convo; | |
447 | |
448 if (!args) | |
449 return 0; | |
450 | |
451 convo = gaim_find_conversation_with_account(target, irc->account); | |
452 if (!convo || gaim_conversation_get_type(convo) != GAIM_CONV_CHAT) | |
6350 | 453 return 0; |
6333 | 454 |
455 if (!args[0]) { | |
456 topic = gaim_chat_get_topic (GAIM_CHAT(convo)); | |
457 | |
458 if (topic) | |
6350 | 459 buf = g_strdup_printf(_("current topic is: %s"), topic); |
6333 | 460 else |
461 buf = g_strdup(_("No topic is set")); | |
6621 | 462 gaim_chat_write(GAIM_CHAT(convo), target, buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 463 g_free(buf); |
464 | |
465 return 0; | |
466 } | |
467 | |
468 buf = irc_format(irc, "vt:", "TOPIC", target, args[0]); | |
469 irc_send(irc, buf); | |
470 g_free(buf); | |
471 | |
472 return 0; | |
473 } | |
474 | |
475 int irc_cmd_wallops(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
476 { | |
477 char *buf; | |
478 | |
479 if (!args || !args[0]) | |
6350 | 480 return 0; |
6333 | 481 |
482 if (!strcmp(cmd, "wallops")) | |
483 buf = irc_format(irc, "v:", "WALLOPS", args[0]); | |
484 else if (!strcmp(cmd, "operwall")) | |
485 buf = irc_format(irc, "v:", "OPERWALL", args[0]); | |
6365 | 486 else |
487 return 0; | |
6333 | 488 |
489 irc_send(irc, buf); | |
490 g_free(buf); | |
491 | |
492 return 0; | |
493 } | |
494 | |
495 int irc_cmd_whois(struct irc_conn *irc, const char *cmd, const char *target, const char **args) | |
496 { | |
497 char *buf; | |
498 | |
499 if (!args || !args[0]) | |
500 return 0; | |
501 | |
502 buf = irc_format(irc, "vn", "WHOIS", args[0]); | |
503 irc_send(irc, buf); | |
504 g_free(buf); | |
505 irc->whois.nick = g_strdup(args[0]); | |
506 | |
507 return 0; | |
508 } | |
509 | |
510 static void irc_do_mode(struct irc_conn *irc, const char *target, const char *sign, char **ops) | |
511 { | |
512 char *buf, mode[5]; | |
513 int i = 0; | |
514 | |
515 if (!sign) | |
516 return; | |
517 | |
518 while (ops[i]) { | |
519 if (ops[i + 2] && ops[i + 4]) { | |
520 g_snprintf(mode, sizeof(mode), "%s%s%s%s", sign, | |
521 ops[i], ops[i + 2], ops[i + 4]); | |
522 buf = irc_format(irc, "vcvnnn", "MODE", target, mode, | |
523 ops[i + 1], ops[i + 3], ops[i + 5]); | |
524 i += 6; | |
525 } else if (ops[i + 2]) { | |
526 g_snprintf(mode, sizeof(mode), "%s%s%s", | |
527 sign, ops[i], ops[i + 2]); | |
528 buf = irc_format(irc, "vcvnn", "MODE", target, mode, | |
529 ops[i + 1], ops[i + 3]); | |
530 i += 4; | |
531 } else { | |
532 g_snprintf(mode, sizeof(mode), "%s%s", sign, ops[i]); | |
533 buf = irc_format(irc, "vcvn", "MODE", target, mode, ops[i + 1]); | |
534 i += 2; | |
535 } | |
536 irc_send(irc, buf); | |
537 g_free(buf); | |
538 } | |
6350 | 539 |
540 return; | |
6333 | 541 } |