Mercurial > pidgin
annotate src/protocols/irc/msgs.c @ 9251:45d2ad4ac1c1
[gaim-migrate @ 10050]
Stu Tomlinson has provided a nice patch to move the separation of IM
and Chat windows back into the core from the extplacement plugin.
It's awesome to have crazy patch writers, and even better to have
crazy patch writers who write what I want to write before I do it,
thus saving me the effort.
committer: Tailor Script <tailor@pidgin.im>
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Wed, 09 Jun 2004 20:47:07 +0000 |
parents | f4f210e47b60 |
children | f5c08be60098 |
rev | line source |
---|---|
6333 | 1 /** |
2 * @file msgs.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 "blist.h" | |
27 #include "notify.h" | |
28 #include "util.h" | |
29 #include "debug.h" | |
30 #include "irc.h" | |
31 | |
32 #include <stdio.h> | |
33 | |
34 static char *irc_mask_nick(const char *mask); | |
35 static char *irc_mask_userhost(const char *mask); | |
36 static void irc_chat_remove_buddy(GaimConversation *convo, char *data[2]); | |
37 static void irc_buddy_status(char *name, struct irc_buddy *ib, struct irc_conn *irc); | |
38 | |
39 static char *irc_mask_nick(const char *mask) | |
40 { | |
41 char *end, *buf; | |
42 | |
43 end = strchr(mask, '!'); | |
44 if (!end) | |
45 buf = g_strdup(mask); | |
46 else | |
47 buf = g_strndup(mask, end - mask); | |
48 | |
49 return buf; | |
50 } | |
51 | |
52 static char *irc_mask_userhost(const char *mask) | |
53 { | |
54 return g_strdup(strchr(mask, '!') + 1); | |
55 } | |
56 | |
57 static void irc_chat_remove_buddy(GaimConversation *convo, char *data[2]) | |
58 { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
59 GList *users = gaim_conv_chat_get_users(GAIM_CONV_CHAT(convo)); |
6333 | 60 char *message = g_strdup_printf("quit: %s", data[1]); |
61 | |
62 if (g_list_find_custom(users, data[0], (GCompareFunc)(strcmp))) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
63 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), data[0], message); |
6333 | 64 |
65 g_free(message); | |
66 } | |
67 | |
68 void irc_msg_default(struct irc_conn *irc, const char *name, const char *from, char **args) | |
69 { | |
70 gaim_debug(GAIM_DEBUG_INFO, "irc", "Unrecognized message: %s\n", args[0]); | |
71 } | |
72 | |
73 void irc_msg_away(struct irc_conn *irc, const char *name, const char *from, char **args) | |
74 { | |
75 GaimConnection *gc; | |
76 | |
77 if (!args || !args[1]) | |
78 return; | |
79 | |
80 if (irc->whois.nick && !gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
81 /* We're doing a whois, show this in the whois dialog */ | |
82 irc_msg_whois(irc, name, from, args); | |
83 return; | |
84 } | |
85 | |
86 gc = gaim_account_get_connection(irc->account); | |
87 if (gc) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
88 serv_got_im(gc, args[1], args[2], GAIM_CONV_IM_AUTO_RESP, time(NULL)); |
6333 | 89 } |
90 | |
91 void irc_msg_badmode(struct irc_conn *irc, const char *name, const char *from, char **args) | |
92 { | |
93 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
94 | |
95 if (!args || !args[1] || !gc) | |
96 return; | |
97 | |
98 gaim_notify_error(gc, NULL, _("Bad mode"), args[1]); | |
99 } | |
100 | |
101 void irc_msg_banned(struct irc_conn *irc, const char *name, const char *from, char **args) | |
102 { | |
103 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
104 char *buf; | |
105 | |
106 if (!args || !args[1] || !gc) | |
107 return; | |
108 | |
109 buf = g_strdup_printf(_("You are banned from %s."), args[1]); | |
110 gaim_notify_error(gc, _("Banned"), _("Banned"), buf); | |
111 g_free(buf); | |
112 } | |
113 | |
114 void irc_msg_chanmode(struct irc_conn *irc, const char *name, const char *from, char **args) | |
115 { | |
116 GaimConversation *convo; | |
117 char *buf; | |
118 | |
119 if (!args || !args[1] || !args[2]) | |
120 return; | |
121 | |
122 convo = gaim_find_conversation_with_account(args[1], irc->account); | |
123 if (!convo) /* XXX punt on channels we are not in for now */ | |
124 return; | |
125 | |
126 buf = g_strdup_printf("mode for %s: %s %s", args[1], args[2], args[3] ? args[3] : ""); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
127 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 128 g_free(buf); |
129 | |
130 return; | |
131 } | |
132 | |
133 void irc_msg_whois(struct irc_conn *irc, const char *name, const char *from, char **args) | |
134 { | |
135 if (!irc->whois.nick) { | |
136 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unexpected WHOIS reply for %s\n", args[1]); | |
137 return; | |
138 } | |
139 | |
140 if (gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
141 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Got WHOIS reply for %s while waiting for %s\n", args[1], irc->whois.nick); | |
142 return; | |
143 } | |
144 | |
145 if (!strcmp(name, "301")) { | |
146 irc->whois.away = g_strdup(args[2]); | |
147 } else if (!strcmp(name, "311")) { | |
148 irc->whois.userhost = g_strdup_printf("%s@%s", args[2], args[3]); | |
149 irc->whois.name = g_strdup(args[5]); | |
150 } else if (!strcmp(name, "312")) { | |
151 irc->whois.server = g_strdup(args[2]); | |
152 irc->whois.serverinfo = g_strdup(args[3]); | |
153 } else if (!strcmp(name, "313")) { | |
154 irc->whois.ircop = 1; | |
155 } else if (!strcmp(name, "317")) { | |
156 irc->whois.idle = atoi(args[2]); | |
157 if (args[3]) | |
158 irc->whois.signon = (time_t)atoi(args[3]); | |
159 } else if (!strcmp(name, "319")) { | |
160 irc->whois.channels = g_strdup(args[2]); | |
161 } else if (!strcmp(name, "320")) { | |
162 irc->whois.identified = 1; | |
163 } | |
164 } | |
165 | |
166 void irc_msg_endwhois(struct irc_conn *irc, const char *name, const char *from, char **args) | |
167 { | |
168 GaimConnection *gc; | |
169 GString *info; | |
7062
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
170 char buffer[256]; |
6333 | 171 char *str; |
172 | |
173 if (!irc->whois.nick) { | |
174 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unexpected End of WHOIS for %s\n", args[1]); | |
175 return; | |
176 } | |
177 if (gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
178 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Received end of WHOIS for %s, expecting %s\n", args[1], irc->whois.nick); | |
179 return; | |
180 } | |
181 | |
182 info = g_string_new(""); | |
183 g_string_append_printf(info, "<b>%s:</b> %s%s%s<br>", _("Nick"), args[1], | |
184 irc->whois.ircop ? _(" <i>(ircop)</i>") : "", | |
185 irc->whois.identified ? _(" <i>(identified)</i>") : ""); | |
186 if (irc->whois.away) { | |
187 g_string_append_printf(info, "<b>%s:</b> %s<br>", _("Away"), irc->whois.away); | |
188 g_free(irc->whois.away); | |
189 } | |
190 if (irc->whois.userhost) { | |
191 g_string_append_printf(info, "<b>%s:</b> %s<br>", _("Username"), irc->whois.userhost); | |
192 g_string_append_printf(info, "<b>%s:</b> %s<br>", _("Realname"), irc->whois.name); | |
193 g_free(irc->whois.userhost); | |
194 g_free(irc->whois.name); | |
195 } | |
196 if (irc->whois.server) { | |
197 g_string_append_printf(info, "<b>%s:</b> %s (%s)<br>", _("Server"), irc->whois.server, irc->whois.serverinfo); | |
198 g_free(irc->whois.server); | |
199 g_free(irc->whois.serverinfo); | |
200 } | |
201 if (irc->whois.channels) { | |
202 g_string_append_printf(info, "<b>%s:</b> %s<br>", _("Currently on"), irc->whois.channels); | |
203 g_free(irc->whois.channels); | |
204 } | |
205 if (irc->whois.idle) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
206 gchar *timex = gaim_str_seconds_to_string(irc->whois.idle); |
6357 | 207 g_string_append_printf(info, _("<b>Idle for:</b> %s<br>"), timex); |
208 g_free(timex); | |
6333 | 209 g_string_append_printf(info, "<b>%s:</b> %s", _("Online since"), ctime(&irc->whois.signon)); |
210 } | |
211 if (!strcmp(irc->whois.nick, "Paco-Paco")) { | |
212 g_string_append_printf(info, _("<br><b>Defining adjective:</b> Glorious<br>")); | |
213 } | |
214 | |
215 gc = gaim_account_get_connection(irc->account); | |
216 str = g_string_free(info, FALSE); | |
7062
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
217 |
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
218 g_snprintf(buffer, sizeof(buffer), |
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
219 _("Buddy Information for %s"), irc->whois.nick); |
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
220 gaim_notify_formatted(gc, NULL, buffer, NULL, str, NULL, NULL); |
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
221 |
6333 | 222 g_free(str); |
223 memset(&irc->whois, 0, sizeof(irc->whois)); | |
224 } | |
225 | |
8114 | 226 void irc_msg_list(struct irc_conn *irc, const char *name, const char *from, char **args) |
227 { | |
228 if (!irc->roomlist) | |
229 return; | |
230 | |
231 if (!strcmp(name, "321")) { | |
232 gaim_roomlist_set_in_progress(irc->roomlist, TRUE); | |
233 return; | |
234 } | |
235 | |
236 if (!strcmp(name, "323")) { | |
237 gaim_roomlist_set_in_progress(irc->roomlist, FALSE); | |
238 gaim_roomlist_unref(irc->roomlist); | |
239 irc->roomlist = NULL; | |
240 } | |
241 | |
242 if (!strcmp(name, "322")) { | |
243 GaimRoomlistRoom *room; | |
244 | |
245 if (!args[0] || !args[1] || !args[2] || !args[3]) | |
246 return; | |
247 | |
248 room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, args[1], NULL); | |
249 gaim_roomlist_room_add_field(irc->roomlist, room, args[1]); | |
250 gaim_roomlist_room_add_field(irc->roomlist, room, GINT_TO_POINTER(strtol(args[2], NULL, 10))); | |
251 gaim_roomlist_room_add_field(irc->roomlist, room, args[3]); | |
252 gaim_roomlist_room_add(irc->roomlist, room); | |
253 } | |
254 } | |
255 | |
6333 | 256 void irc_msg_topic(struct irc_conn *irc, const char *name, const char *from, char **args) |
257 { | |
8504 | 258 char *chan, *topic, *msg, *nick, *tmp; |
6333 | 259 GaimConversation *convo; |
260 | |
261 if (!strcmp(name, "topic")) { | |
262 chan = args[0]; | |
8529 | 263 topic = irc_mirc2txt (args[1]); |
6333 | 264 } else { |
265 chan = args[1]; | |
8529 | 266 topic = irc_mirc2txt (args[2]); |
6333 | 267 } |
268 | |
269 convo = gaim_find_conversation_with_account(chan, irc->account); | |
270 if (!convo) { | |
271 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a topic for %s, which doesn't exist\n", chan); | |
272 } | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
273 gaim_conv_chat_set_topic(GAIM_CONV_CHAT(convo), NULL, topic); |
6333 | 274 /* If this is an interactive update, print it out */ |
8504 | 275 tmp = gaim_escape_html(topic); |
6333 | 276 if (!strcmp(name, "topic")) { |
277 nick = irc_mask_nick(from); | |
8504 | 278 msg = g_strdup_printf(_("%s has changed the topic to: %s"), nick, tmp); |
6333 | 279 g_free(nick); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
280 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), from, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); |
6333 | 281 g_free(msg); |
282 } else { | |
8504 | 283 msg = g_strdup_printf(_("The topic for %s is: %s"), chan, tmp); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
284 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", msg, GAIM_MESSAGE_SYSTEM, time(NULL)); |
6333 | 285 g_free(msg); |
286 } | |
8504 | 287 g_free(tmp); |
8529 | 288 g_free(topic); |
6333 | 289 } |
290 | |
291 void irc_msg_unknown(struct irc_conn *irc, const char *name, const char *from, char **args) | |
292 { | |
293 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
294 char *buf; | |
295 | |
296 if (!args || !args[1] || !gc) | |
297 return; | |
298 | |
299 buf = g_strdup_printf(_("Unknown message '%s'"), args[1]); | |
300 gaim_notify_error(gc, _("Unknown message"), buf, _("Gaim has sent a message the IRC server did not understand.")); | |
301 g_free(buf); | |
302 } | |
303 | |
304 void irc_msg_names(struct irc_conn *irc, const char *name, const char *from, char **args) | |
305 { | |
306 char *names, *cur, *end, *tmp, *msg; | |
307 GaimConversation *convo; | |
308 | |
309 if (!strcmp(name, "366")) { | |
310 convo = gaim_find_conversation_with_account(irc->nameconv ? irc->nameconv : args[1], irc->account); | |
311 if (!convo) { | |
312 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a NAMES list for %s, which doesn't exist\n", args[2]); | |
313 g_string_free(irc->names, TRUE); | |
314 irc->names = NULL; | |
315 g_free(irc->nameconv); | |
316 irc->nameconv = NULL; | |
317 return; | |
318 } | |
319 | |
320 names = cur = g_string_free(irc->names, FALSE); | |
321 irc->names = NULL; | |
322 if (irc->nameconv) { | |
323 msg = g_strdup_printf("Users on %s: %s", args[1], names); | |
324 if (gaim_conversation_get_type(convo) == GAIM_CONV_CHAT) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
325 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 326 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
327 gaim_conv_im_write(GAIM_CONV_IM(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 328 g_free(msg); |
329 g_free(irc->nameconv); | |
330 irc->nameconv = NULL; | |
331 } else { | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
332 GList *users = NULL; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
333 |
6333 | 334 while (*cur) { |
335 end = strchr(cur, ' '); | |
336 if (!end) | |
337 end = cur + strlen(cur); | |
338 if (*cur == '@' || *cur == '%' || *cur == '+') | |
339 cur++; | |
340 tmp = g_strndup(cur, end - cur); | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
341 users = g_list_append(users, tmp); |
6333 | 342 cur = end; |
343 if (*cur) | |
344 cur++; | |
345 } | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
346 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
347 if (users != NULL) { |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
348 GList *l; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
349 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
350 gaim_conv_chat_add_users(GAIM_CONV_CHAT(convo), users); |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
351 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
352 for (l = users; l != NULL; l = l->next) |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
353 g_free(l->data); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
354 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
355 g_list_free(users); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
356 } |
6333 | 357 } |
358 g_free(names); | |
359 } else { | |
360 if (!irc->names) | |
361 irc->names = g_string_new(""); | |
362 | |
363 irc->names = g_string_append(irc->names, args[3]); | |
364 } | |
365 } | |
366 | |
367 void irc_msg_motd(struct irc_conn *irc, const char *name, const char *from, char **args) | |
368 { | |
369 GaimConnection *gc; | |
370 if (!strcmp(name, "375")) { | |
371 gc = gaim_account_get_connection(irc->account); | |
372 if (gc) | |
373 gaim_connection_set_display_name(gc, args[0]); | |
374 } | |
375 | |
376 if (!irc->motd) | |
377 irc->motd = g_string_new(""); | |
378 | |
379 g_string_append_printf(irc->motd, "%s<br>", args[1]); | |
380 } | |
381 | |
382 void irc_msg_endmotd(struct irc_conn *irc, const char *name, const char *from, char **args) | |
383 { | |
384 GaimConnection *gc; | |
385 | |
386 gc = gaim_account_get_connection(irc->account); | |
387 if (!gc) | |
388 return; | |
389 | |
390 gaim_connection_set_state(gc, GAIM_CONNECTED); | |
9057 | 391 serv_finish_login (gc); |
6333 | 392 |
393 irc_blist_timeout(irc); | |
8872 | 394 if (!irc->timer) |
395 irc->timer = gaim_timeout_add(45000, (GSourceFunc)irc_blist_timeout, (gpointer)irc); | |
6333 | 396 } |
397 | |
7877 | 398 void irc_msg_nochan(struct irc_conn *irc, const char *name, const char *from, char **args) |
399 { | |
400 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
401 | |
402 if (gc == NULL || args == NULL || args[1] == NULL) | |
403 return; | |
404 | |
405 gaim_notify_error(gc, NULL, _("No such channel"), args[1]); | |
406 } | |
407 | |
6333 | 408 void irc_msg_nonick(struct irc_conn *irc, const char *name, const char *from, char **args) |
409 { | |
410 GaimConnection *gc; | |
411 GaimConversation *convo; | |
412 | |
413 convo = gaim_find_conversation_with_account(args[1], irc->account); | |
414 if (convo) { | |
415 if (gaim_conversation_get_type(convo) == GAIM_CONV_CHAT) /* does this happen? */ | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
416 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], _("no such channel"), |
6621 | 417 GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 418 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
419 gaim_conv_im_write(GAIM_CONV_IM(convo), args[1], _("User is not logged in"), |
6621 | 420 GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 421 } else { |
422 if ((gc = gaim_account_get_connection(irc->account)) == NULL) | |
423 return; | |
424 gaim_notify_error(gc, NULL, _("No such nick or channel"), args[1]); | |
425 } | |
426 | |
427 if (irc->whois.nick && !gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
428 g_free(irc->whois.nick); | |
429 irc->whois.nick = NULL; | |
430 } | |
431 } | |
432 | |
433 void irc_msg_nosend(struct irc_conn *irc, const char *name, const char *from, char **args) | |
434 { | |
435 GaimConnection *gc; | |
436 GaimConversation *convo; | |
437 | |
438 convo = gaim_find_conversation_with_account(args[1], irc->account); | |
439 if (convo) { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
440 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], args[2], GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 441 } else { |
442 if ((gc = gaim_account_get_connection(irc->account)) == NULL) | |
443 return; | |
444 gaim_notify_error(gc, NULL, _("Could not send"), args[2]); | |
445 } | |
446 } | |
447 | |
448 void irc_msg_notinchan(struct irc_conn *irc, const char *name, const char *from, char **args) | |
449 { | |
450 GaimConversation *convo = gaim_find_conversation_with_account(args[1], irc->account); | |
451 | |
452 gaim_debug(GAIM_DEBUG_INFO, "irc", "We're apparently not in %s, but tried to use it\n", args[1]); | |
453 if (convo) { | |
454 /*g_slist_remove(irc->gc->buddy_chats, convo); | |
455 gaim_conversation_set_account(convo, NULL);*/ | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
456 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], args[2], GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 457 } |
458 } | |
459 | |
460 void irc_msg_notop(struct irc_conn *irc, const char *name, const char *from, char **args) | |
461 { | |
462 GaimConversation *convo; | |
463 | |
464 if (!args || !args[1] || !args[2]) | |
465 return; | |
466 | |
467 convo = gaim_find_conversation_with_account(args[1], irc->account); | |
468 if (!convo) | |
469 return; | |
470 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
471 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", args[2], GAIM_MESSAGE_SYSTEM, time(NULL)); |
6333 | 472 } |
473 | |
474 void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args) | |
475 { | |
476 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
477 GHashTable *components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
478 char *nick = irc_mask_nick(from); | |
479 | |
480 if (!args || !args[1] || !gc) { | |
481 g_free(nick); | |
482 g_hash_table_destroy(components); | |
483 return; | |
484 } | |
485 | |
486 g_hash_table_insert(components, strdup("channel"), strdup(args[1])); | |
487 | |
488 serv_got_chat_invite(gc, args[1], nick, NULL, components); | |
489 g_free(nick); | |
490 } | |
491 | |
492 void irc_msg_inviteonly(struct irc_conn *irc, const char *name, const char *from, char **args) | |
493 { | |
494 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
495 char *buf; | |
496 | |
497 if (!args || !args[1] || !gc) | |
498 return; | |
499 | |
500 buf = g_strdup_printf(_("Joining %s requires an invitation."), args[1]); | |
501 gaim_notify_error(gc, _("Invitation only"), _("Invitation only"), buf); | |
502 g_free(buf); | |
503 } | |
504 | |
505 void irc_msg_ison(struct irc_conn *irc, const char *name, const char *from, char **args) | |
506 { | |
507 char **nicks; | |
508 struct irc_buddy *ib; | |
509 int i; | |
510 | |
511 if (!args || !args[1]) | |
512 return; | |
513 | |
514 nicks = g_strsplit(args[1], " ", -1); | |
515 | |
516 for (i = 0; nicks[i]; i++) { | |
517 if ((ib = g_hash_table_lookup(irc->buddies, (gconstpointer)nicks[i])) == NULL) { | |
518 continue; | |
519 } | |
520 ib->flag = TRUE; | |
521 } | |
522 | |
6350 | 523 g_strfreev(nicks); |
524 | |
6333 | 525 g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_status, (gpointer)irc); |
526 } | |
527 | |
528 static void irc_buddy_status(char *name, struct irc_buddy *ib, struct irc_conn *irc) | |
529 { | |
530 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
6695 | 531 GaimBuddy *buddy = gaim_find_buddy(irc->account, name); |
6333 | 532 |
533 if (!gc || !buddy) | |
534 return; | |
535 | |
536 if (ib->online && !ib->flag) { | |
537 serv_got_update(gc, buddy->name, 0, 0, 0, 0, 0); | |
538 ib->online = FALSE; | |
539 } | |
540 | |
541 if (!ib->online && ib->flag) { | |
542 serv_got_update(gc, buddy->name, 1, 0, 0, 0, 0); | |
543 ib->online = TRUE; | |
544 } | |
545 } | |
546 | |
547 void irc_msg_join(struct irc_conn *irc, const char *name, const char *from, char **args) | |
548 { | |
549 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
550 GaimConversation *convo; | |
551 char *nick = irc_mask_nick(from), *userhost; | |
9238 | 552 struct irc_buddy *ib; |
6333 | 553 static int id = 1; |
554 | |
555 if (!gc) { | |
556 g_free(nick); | |
557 return; | |
558 } | |
559 | |
560 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
561 /* We are joining a channel for the first time */ | |
562 serv_got_joined_chat(gc, id++, args[0]); | |
563 g_free(nick); | |
564 return; | |
565 } | |
566 | |
567 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
568 if (convo == NULL) { | |
569 gaim_debug(GAIM_DEBUG_ERROR, "irc", "JOIN for %s failed\n", args[0]); | |
570 g_free(nick); | |
571 return; | |
572 } | |
573 | |
574 userhost = irc_mask_userhost(from); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
575 gaim_conv_chat_add_user(GAIM_CONV_CHAT(convo), nick, userhost); |
9238 | 576 |
577 if ((ib = g_hash_table_lookup(irc->buddies, nick)) != NULL) { | |
578 ib->flag = TRUE; | |
579 irc_buddy_status(nick, ib, irc); | |
580 } | |
581 | |
6333 | 582 g_free(userhost); |
583 g_free(nick); | |
584 } | |
585 | |
586 void irc_msg_kick(struct irc_conn *irc, const char *name, const char *from, char **args) | |
587 { | |
588 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
589 GaimConversation *convo = gaim_find_conversation_with_account(args[0], irc->account); | |
590 char *nick = irc_mask_nick(from), *buf; | |
591 | |
592 if (!gc) { | |
593 g_free(nick); | |
594 return; | |
595 } | |
596 | |
597 if (!convo) { | |
598 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Recieved a KICK for unknown channel %s\n", args[0]); | |
599 g_free(nick); | |
600 return; | |
601 } | |
602 | |
603 if (!gaim_utf8_strcasecmp(gaim_connection_get_display_name(gc), args[1])) { | |
604 buf = g_strdup_printf(_("You have been kicked by %s: (%s)"), nick, args[2]); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
605 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
6333 | 606 g_free(buf); |
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8186
diff
changeset
|
607 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo))); |
6333 | 608 } else { |
609 buf = g_strdup_printf(_("Kicked by %s (%s)"), nick, args[2]); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
610 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), args[1], buf); |
6333 | 611 g_free(buf); |
612 } | |
613 | |
614 g_free(nick); | |
615 return; | |
616 } | |
617 | |
618 void irc_msg_mode(struct irc_conn *irc, const char *name, const char *from, char **args) | |
619 { | |
620 GaimConversation *convo; | |
621 char *nick = irc_mask_nick(from), *buf; | |
622 | |
623 if (*args[0] == '#' || *args[0] == '&') { /* Channel */ | |
624 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
625 if (!convo) { | |
626 gaim_debug(GAIM_DEBUG_ERROR, "irc", "MODE received for %s, which we are not in\n", args[0]); | |
627 g_free(nick); | |
628 return; | |
629 } | |
630 buf = g_strdup_printf(_("mode (%s %s) by %s"), args[1], args[2] ? args[2] : "", nick); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
631 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 632 g_free(buf); |
633 } else { /* User */ | |
634 } | |
635 g_free(nick); | |
636 } | |
637 | |
638 void irc_msg_nick(struct irc_conn *irc, const char *name, const char *from, char **args) | |
639 { | |
640 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
641 GSList *chats; | |
642 char *nick = irc_mask_nick(from); | |
643 | |
644 if (!gc) { | |
645 g_free(nick); | |
646 return; | |
647 } | |
648 chats = gc->buddy_chats; | |
649 | |
650 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
651 gaim_connection_set_display_name(gc, args[0]); | |
652 } | |
653 | |
654 while (chats) { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
655 GaimConvChat *chat = GAIM_CONV_CHAT(chats->data); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
656 GList *users = gaim_conv_chat_get_users(chat); |
6333 | 657 |
658 while (users) { | |
659 char *user = users->data; | |
660 | |
661 if (!strcmp(nick, user)) { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
662 gaim_conv_chat_rename_user(chat, user, args[0]); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
663 users = gaim_conv_chat_get_users(chat); |
6333 | 664 break; |
665 } | |
666 users = users->next; | |
667 } | |
668 chats = chats->next; | |
669 } | |
670 g_free(nick); | |
671 } | |
672 | |
673 void irc_msg_nickused(struct irc_conn *irc, const char *name, const char *from, char **args) | |
674 { | |
675 char *newnick, *buf, *end; | |
676 | |
677 if (!args || !args[1]) | |
678 return; | |
679 | |
680 newnick = strdup(args[1]); | |
681 end = newnick + strlen(newnick) - 1; | |
682 /* try three fallbacks */ | |
683 if (*end == 2) *end = '3'; | |
684 else if (*end == 1) *end = '2'; | |
685 else *end = '1'; | |
686 | |
687 buf = irc_format(irc, "vn", "NICK", newnick); | |
688 irc_send(irc, buf); | |
689 g_free(buf); | |
690 } | |
691 | |
692 void irc_msg_notice(struct irc_conn *irc, const char *name, const char *from, char **args) | |
693 { | |
694 char *newargs[2]; | |
695 | |
696 newargs[0] = " notice "; /* The spaces are magic, leave 'em in! */ | |
697 newargs[1] = args[1]; | |
698 irc_msg_privmsg(irc, name, from, newargs); | |
699 } | |
700 | |
6718 | 701 void irc_msg_nochangenick(struct irc_conn *irc, const char *name, const char *from, char **args) |
702 { | |
703 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
704 char *msg; | |
705 | |
6753 | 706 if (!args || !args[2] || !gc) |
6718 | 707 return; |
708 | |
6753 | 709 msg = g_strdup_printf(_("Could not change nick")); |
6718 | 710 gaim_notify_error(gc, _("Cannot change nick"), msg, args[2]); |
711 g_free(msg); | |
712 } | |
713 | |
6333 | 714 void irc_msg_part(struct irc_conn *irc, const char *name, const char *from, char **args) |
715 { | |
716 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
717 GaimConversation *convo; | |
718 char *nick, *msg; | |
719 | |
8186 | 720 if (!args || !args[0] || !gc) |
6333 | 721 return; |
722 | |
723 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
724 if (!convo) { | |
725 gaim_debug(GAIM_DEBUG_INFO, "irc", "Got a PART on %s, which doesn't exist -- probably closed\n", args[0]); | |
726 return; | |
727 } | |
728 | |
729 nick = irc_mask_nick(from); | |
730 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
8186 | 731 msg = g_strdup_printf(_("You have parted the channel%s%s"), |
732 (args[1] && *args[1]) ? ": " : "", args[1]); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
733 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], msg, GAIM_MESSAGE_SYSTEM, time(NULL)); |
6333 | 734 g_free(msg); |
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8186
diff
changeset
|
735 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo))); |
6333 | 736 } else { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
737 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), nick, args[1]); |
6333 | 738 } |
739 g_free(nick); | |
740 } | |
741 | |
742 void irc_msg_ping(struct irc_conn *irc, const char *name, const char *from, char **args) | |
743 { | |
744 char *buf; | |
745 if (!args || !args[0]) | |
746 return; | |
747 | |
748 buf = irc_format(irc, "v:", "PONG", args[0]); | |
749 irc_send(irc, buf); | |
750 g_free(buf); | |
751 } | |
752 | |
753 void irc_msg_pong(struct irc_conn *irc, const char *name, const char *from, char **args) | |
754 { | |
755 GaimConversation *convo; | |
756 GaimConnection *gc; | |
757 char **parts, *msg; | |
758 time_t oldstamp; | |
759 | |
760 if (!args || !args[1]) | |
761 return; | |
762 | |
763 parts = g_strsplit(args[1], " ", 2); | |
764 | |
765 if (!parts[0] || !parts[1]) { | |
766 g_strfreev(parts); | |
767 return; | |
768 } | |
769 | |
770 if (sscanf(parts[1], "%lu", &oldstamp) != 1) { | |
771 msg = g_strdup(_("Error: invalid PONG from server")); | |
772 } else { | |
6350 | 773 msg = g_strdup_printf(_("PING reply -- Lag: %lu seconds"), time(NULL) - oldstamp); |
6333 | 774 } |
775 | |
776 convo = gaim_find_conversation_with_account(parts[0], irc->account); | |
777 g_strfreev(parts); | |
778 if (convo) { | |
779 if (gaim_conversation_get_type (convo) == GAIM_CONV_CHAT) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
780 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "PONG", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 781 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
782 gaim_conv_im_write(GAIM_CONV_IM(convo), "PONG", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
6333 | 783 } else { |
784 gc = gaim_account_get_connection(irc->account); | |
785 if (!gc) { | |
786 g_free(msg); | |
787 return; | |
788 } | |
789 gaim_notify_info(gc, NULL, "PONG", msg); | |
790 } | |
791 g_free(msg); | |
792 } | |
793 | |
794 void irc_msg_privmsg(struct irc_conn *irc, const char *name, const char *from, char **args) | |
795 { | |
796 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
797 GaimConversation *convo; | |
798 char *nick = irc_mask_nick(from), *tmp, *msg; | |
799 int notice = 0; | |
800 | |
801 if (!args || !args[0] || !args[1] || !gc) { | |
802 g_free(nick); | |
803 return; | |
804 } | |
805 | |
806 notice = !strcmp(args[0], " notice "); | |
807 tmp = irc_parse_ctcp(irc, nick, args[0], args[1], notice); | |
808 if (!tmp) { | |
809 g_free(nick); | |
810 return; | |
811 } | |
8163 | 812 |
813 msg = gaim_escape_html(tmp); | |
6333 | 814 g_free(tmp); |
8163 | 815 |
816 tmp = irc_mirc2html(msg); | |
817 g_free(msg); | |
818 msg = tmp; | |
6333 | 819 if (notice) { |
820 tmp = g_strdup_printf("(notice) %s", msg); | |
821 g_free(msg); | |
822 msg = tmp; | |
823 } | |
824 | |
825 if (!gaim_utf8_strcasecmp(args[0], gaim_connection_get_display_name(gc))) { | |
6982 | 826 serv_got_im(gc, nick, msg, 0, time(NULL)); |
6333 | 827 } else if (notice) { |
6982 | 828 serv_got_im(gc, nick, msg, 0, time(NULL)); |
6333 | 829 } else { |
830 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
831 if (convo) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
832 serv_got_chat_in(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo)), nick, 0, msg, time(NULL)); |
6333 | 833 else |
834 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a PRIVMSG on %s, which does not exist\n", args[0]); | |
835 } | |
836 g_free(msg); | |
837 g_free(nick); | |
838 } | |
839 | |
6714 | 840 void irc_msg_regonly(struct irc_conn *irc, const char *name, const char *from, char **args) |
841 { | |
842 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
843 char *msg; | |
844 | |
845 if (!args || !args[1] || !args[2] || !gc) | |
846 return; | |
847 | |
848 msg = g_strdup_printf(_("Cannot join %s:"), args[1]); | |
849 gaim_notify_error(gc, _("Cannot join channel"), msg, args[2]); | |
850 g_free(msg); | |
851 } | |
852 | |
6333 | 853 void irc_msg_quit(struct irc_conn *irc, const char *name, const char *from, char **args) |
854 { | |
855 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
9238 | 856 struct irc_buddy *ib; |
6333 | 857 char *data[2]; |
858 | |
859 if (!args || !args[0] || !gc) | |
860 return; | |
861 | |
862 data[0] = irc_mask_nick(from); | |
863 data[1] = args[0]; | |
864 /* XXX this should have an API, I shouldn't grab this directly */ | |
865 g_slist_foreach(gc->buddy_chats, (GFunc)irc_chat_remove_buddy, data); | |
9238 | 866 |
867 if ((ib = g_hash_table_lookup(irc->buddies, data[0])) != NULL) { | |
868 ib->flag = FALSE; | |
869 irc_buddy_status(data[0], ib, irc); | |
870 } | |
6333 | 871 g_free(data[0]); |
872 | |
873 return; | |
874 } | |
875 | |
876 void irc_msg_wallops(struct irc_conn *irc, const char *name, const char *from, char **args) | |
877 { | |
878 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
8965 | 879 char *nick, *msg, *wallop; |
6333 | 880 |
881 if (!args || !args[0] || !gc) | |
882 return; | |
883 | |
884 nick = irc_mask_nick(from); | |
885 msg = g_strdup_printf (_("Wallops from %s"), nick); | |
886 g_free(nick); | |
8965 | 887 wallop = g_markup_escape_text(args[0], strlen(args[0])); |
888 gaim_notify_info(gc, NULL, msg, wallop); | |
6333 | 889 g_free(msg); |
8965 | 890 g_free(wallop); |
6333 | 891 } |
892 | |
893 void irc_msg_ignore(struct irc_conn *irc, const char *name, const char *from, char **args) | |
894 { | |
895 return; | |
896 } |