Mercurial > pidgin
annotate src/protocols/irc/msgs.c @ 8815:ada0cf2f49fe
[gaim-migrate @ 9577]
" This patch creates the subsystem like most of the core
to connect to signals and emit them. It also adds a
"gtkblist-created" signal so plugins that want to add
something to the gtkblist know when it's created.
Using the same subsytem setup as the rest of gaim helps
plugin authors avoid connecting to the buddy signon
even to know when they can connect to the
"drawing-menu" signal." --Gary Kramlich
committer: Tailor Script <tailor@pidgin.im>
| author | Luke Schierer <lschiere@pidgin.im> |
|---|---|
| date | Mon, 26 Apr 2004 16:10:16 +0000 |
| parents | 2f505651ac03 |
| children | 07404dc25af8 |
| 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); | |
| 391 | |
| 392 irc_blist_timeout(irc); | |
|
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8256
diff
changeset
|
393 irc->timer = gaim_timeout_add(45000, (GSourceFunc)irc_blist_timeout, (gpointer)irc); |
| 6333 | 394 } |
| 395 | |
| 7877 | 396 void irc_msg_nochan(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 397 { | |
| 398 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 399 | |
| 400 if (gc == NULL || args == NULL || args[1] == NULL) | |
| 401 return; | |
| 402 | |
| 403 gaim_notify_error(gc, NULL, _("No such channel"), args[1]); | |
| 404 } | |
| 405 | |
| 6333 | 406 void irc_msg_nonick(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 407 { | |
| 408 GaimConnection *gc; | |
| 409 GaimConversation *convo; | |
| 410 | |
| 411 convo = gaim_find_conversation_with_account(args[1], irc->account); | |
| 412 if (convo) { | |
| 413 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
|
414 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], _("no such channel"), |
| 6621 | 415 GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 416 else |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
417 gaim_conv_im_write(GAIM_CONV_IM(convo), args[1], _("User is not logged in"), |
| 6621 | 418 GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 419 } else { |
| 420 if ((gc = gaim_account_get_connection(irc->account)) == NULL) | |
| 421 return; | |
| 422 gaim_notify_error(gc, NULL, _("No such nick or channel"), args[1]); | |
| 423 } | |
| 424 | |
| 425 if (irc->whois.nick && !gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
| 426 g_free(irc->whois.nick); | |
| 427 irc->whois.nick = NULL; | |
| 428 } | |
| 429 } | |
| 430 | |
| 431 void irc_msg_nosend(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 432 { | |
| 433 GaimConnection *gc; | |
| 434 GaimConversation *convo; | |
| 435 | |
| 436 convo = gaim_find_conversation_with_account(args[1], irc->account); | |
| 437 if (convo) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
438 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], args[2], GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 439 } else { |
| 440 if ((gc = gaim_account_get_connection(irc->account)) == NULL) | |
| 441 return; | |
| 442 gaim_notify_error(gc, NULL, _("Could not send"), args[2]); | |
| 443 } | |
| 444 } | |
| 445 | |
| 446 void irc_msg_notinchan(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 447 { | |
| 448 GaimConversation *convo = gaim_find_conversation_with_account(args[1], irc->account); | |
| 449 | |
| 450 gaim_debug(GAIM_DEBUG_INFO, "irc", "We're apparently not in %s, but tried to use it\n", args[1]); | |
| 451 if (convo) { | |
| 452 /*g_slist_remove(irc->gc->buddy_chats, convo); | |
| 453 gaim_conversation_set_account(convo, NULL);*/ | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
454 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], args[2], GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 455 } |
| 456 } | |
| 457 | |
| 458 void irc_msg_notop(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 459 { | |
| 460 GaimConversation *convo; | |
| 461 | |
| 462 if (!args || !args[1] || !args[2]) | |
| 463 return; | |
| 464 | |
| 465 convo = gaim_find_conversation_with_account(args[1], irc->account); | |
| 466 if (!convo) | |
| 467 return; | |
| 468 | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
469 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", args[2], GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 6333 | 470 } |
| 471 | |
| 472 void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 473 { | |
| 474 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 475 GHashTable *components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
| 476 char *nick = irc_mask_nick(from); | |
| 477 | |
| 478 if (!args || !args[1] || !gc) { | |
| 479 g_free(nick); | |
| 480 g_hash_table_destroy(components); | |
| 481 return; | |
| 482 } | |
| 483 | |
| 484 g_hash_table_insert(components, strdup("channel"), strdup(args[1])); | |
| 485 | |
| 486 serv_got_chat_invite(gc, args[1], nick, NULL, components); | |
| 487 g_free(nick); | |
| 488 } | |
| 489 | |
| 490 void irc_msg_inviteonly(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 491 { | |
| 492 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 493 char *buf; | |
| 494 | |
| 495 if (!args || !args[1] || !gc) | |
| 496 return; | |
| 497 | |
| 498 buf = g_strdup_printf(_("Joining %s requires an invitation."), args[1]); | |
| 499 gaim_notify_error(gc, _("Invitation only"), _("Invitation only"), buf); | |
| 500 g_free(buf); | |
| 501 } | |
| 502 | |
| 503 void irc_msg_ison(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 504 { | |
| 505 char **nicks; | |
| 506 struct irc_buddy *ib; | |
| 507 int i; | |
| 508 | |
| 509 if (!args || !args[1]) | |
| 510 return; | |
| 511 | |
| 512 nicks = g_strsplit(args[1], " ", -1); | |
| 513 | |
| 514 for (i = 0; nicks[i]; i++) { | |
| 515 if ((ib = g_hash_table_lookup(irc->buddies, (gconstpointer)nicks[i])) == NULL) { | |
| 516 continue; | |
| 517 } | |
| 518 ib->flag = TRUE; | |
| 519 } | |
| 520 | |
| 6350 | 521 g_strfreev(nicks); |
| 522 | |
| 6333 | 523 g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_status, (gpointer)irc); |
| 524 } | |
| 525 | |
| 526 static void irc_buddy_status(char *name, struct irc_buddy *ib, struct irc_conn *irc) | |
| 527 { | |
| 528 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 6695 | 529 GaimBuddy *buddy = gaim_find_buddy(irc->account, name); |
| 6333 | 530 |
| 531 if (!gc || !buddy) | |
| 532 return; | |
| 533 | |
| 534 if (ib->online && !ib->flag) { | |
| 535 serv_got_update(gc, buddy->name, 0, 0, 0, 0, 0); | |
| 536 ib->online = FALSE; | |
| 537 } | |
| 538 | |
| 539 if (!ib->online && ib->flag) { | |
| 540 serv_got_update(gc, buddy->name, 1, 0, 0, 0, 0); | |
| 541 ib->online = TRUE; | |
| 542 } | |
| 543 } | |
| 544 | |
| 545 void irc_msg_join(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 546 { | |
| 547 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 548 GaimConversation *convo; | |
| 549 char *nick = irc_mask_nick(from), *userhost; | |
| 550 static int id = 1; | |
| 551 | |
| 552 if (!gc) { | |
| 553 g_free(nick); | |
| 554 return; | |
| 555 } | |
| 556 | |
| 557 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
| 558 /* We are joining a channel for the first time */ | |
| 559 serv_got_joined_chat(gc, id++, args[0]); | |
| 560 g_free(nick); | |
| 561 return; | |
| 562 } | |
| 563 | |
| 564 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
| 565 if (convo == NULL) { | |
| 566 gaim_debug(GAIM_DEBUG_ERROR, "irc", "JOIN for %s failed\n", args[0]); | |
| 567 g_free(nick); | |
| 568 return; | |
| 569 } | |
| 570 | |
| 571 userhost = irc_mask_userhost(from); | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
572 gaim_conv_chat_add_user(GAIM_CONV_CHAT(convo), nick, userhost); |
| 6333 | 573 g_free(userhost); |
| 574 g_free(nick); | |
| 575 } | |
| 576 | |
| 577 void irc_msg_kick(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 578 { | |
| 579 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 580 GaimConversation *convo = gaim_find_conversation_with_account(args[0], irc->account); | |
| 581 char *nick = irc_mask_nick(from), *buf; | |
| 582 | |
| 583 if (!gc) { | |
| 584 g_free(nick); | |
| 585 return; | |
| 586 } | |
| 587 | |
| 588 if (!convo) { | |
| 589 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Recieved a KICK for unknown channel %s\n", args[0]); | |
| 590 g_free(nick); | |
| 591 return; | |
| 592 } | |
| 593 | |
| 594 if (!gaim_utf8_strcasecmp(gaim_connection_get_display_name(gc), args[1])) { | |
| 595 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
|
596 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 6333 | 597 g_free(buf); |
|
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8186
diff
changeset
|
598 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo))); |
| 6333 | 599 } else { |
| 600 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
|
601 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), args[1], buf); |
| 6333 | 602 g_free(buf); |
| 603 } | |
| 604 | |
| 605 g_free(nick); | |
| 606 return; | |
| 607 } | |
| 608 | |
| 609 void irc_msg_mode(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 610 { | |
| 611 GaimConversation *convo; | |
| 612 char *nick = irc_mask_nick(from), *buf; | |
| 613 | |
| 614 if (*args[0] == '#' || *args[0] == '&') { /* Channel */ | |
| 615 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
| 616 if (!convo) { | |
| 617 gaim_debug(GAIM_DEBUG_ERROR, "irc", "MODE received for %s, which we are not in\n", args[0]); | |
| 618 g_free(nick); | |
| 619 return; | |
| 620 } | |
| 621 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
|
622 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 623 g_free(buf); |
| 624 } else { /* User */ | |
| 625 } | |
| 626 g_free(nick); | |
| 627 } | |
| 628 | |
| 629 void irc_msg_nick(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 630 { | |
| 631 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 632 GSList *chats; | |
| 633 char *nick = irc_mask_nick(from); | |
| 634 | |
| 635 if (!gc) { | |
| 636 g_free(nick); | |
| 637 return; | |
| 638 } | |
| 639 chats = gc->buddy_chats; | |
| 640 | |
| 641 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
| 642 gaim_connection_set_display_name(gc, args[0]); | |
| 643 } | |
| 644 | |
| 645 while (chats) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
646 GaimConvChat *chat = GAIM_CONV_CHAT(chats->data); |
|
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
647 GList *users = gaim_conv_chat_get_users(chat); |
| 6333 | 648 |
| 649 while (users) { | |
| 650 char *user = users->data; | |
| 651 | |
| 652 if (!strcmp(nick, user)) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
653 gaim_conv_chat_rename_user(chat, user, args[0]); |
|
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
654 users = gaim_conv_chat_get_users(chat); |
| 6333 | 655 break; |
| 656 } | |
| 657 users = users->next; | |
| 658 } | |
| 659 chats = chats->next; | |
| 660 } | |
| 661 g_free(nick); | |
| 662 } | |
| 663 | |
| 664 void irc_msg_nickused(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 665 { | |
| 666 char *newnick, *buf, *end; | |
| 667 | |
| 668 if (!args || !args[1]) | |
| 669 return; | |
| 670 | |
| 671 newnick = strdup(args[1]); | |
| 672 end = newnick + strlen(newnick) - 1; | |
| 673 /* try three fallbacks */ | |
| 674 if (*end == 2) *end = '3'; | |
| 675 else if (*end == 1) *end = '2'; | |
| 676 else *end = '1'; | |
| 677 | |
| 678 buf = irc_format(irc, "vn", "NICK", newnick); | |
| 679 irc_send(irc, buf); | |
| 680 g_free(buf); | |
| 681 } | |
| 682 | |
| 683 void irc_msg_notice(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 684 { | |
| 685 char *newargs[2]; | |
| 686 | |
| 687 newargs[0] = " notice "; /* The spaces are magic, leave 'em in! */ | |
| 688 newargs[1] = args[1]; | |
| 689 irc_msg_privmsg(irc, name, from, newargs); | |
| 690 } | |
| 691 | |
| 6718 | 692 void irc_msg_nochangenick(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 693 { | |
| 694 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 695 char *msg; | |
| 696 | |
| 6753 | 697 if (!args || !args[2] || !gc) |
| 6718 | 698 return; |
| 699 | |
| 6753 | 700 msg = g_strdup_printf(_("Could not change nick")); |
| 6718 | 701 gaim_notify_error(gc, _("Cannot change nick"), msg, args[2]); |
| 702 g_free(msg); | |
| 703 } | |
| 704 | |
| 6333 | 705 void irc_msg_part(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 706 { | |
| 707 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 708 GaimConversation *convo; | |
| 709 char *nick, *msg; | |
| 710 | |
| 8186 | 711 if (!args || !args[0] || !gc) |
| 6333 | 712 return; |
| 713 | |
| 714 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
| 715 if (!convo) { | |
| 716 gaim_debug(GAIM_DEBUG_INFO, "irc", "Got a PART on %s, which doesn't exist -- probably closed\n", args[0]); | |
| 717 return; | |
| 718 } | |
| 719 | |
| 720 nick = irc_mask_nick(from); | |
| 721 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
| 8186 | 722 msg = g_strdup_printf(_("You have parted the channel%s%s"), |
| 723 (args[1] && *args[1]) ? ": " : "", args[1]); | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
724 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], msg, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 6333 | 725 g_free(msg); |
|
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8186
diff
changeset
|
726 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo))); |
| 6333 | 727 } else { |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
728 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), nick, args[1]); |
| 6333 | 729 } |
| 730 g_free(nick); | |
| 731 } | |
| 732 | |
| 733 void irc_msg_ping(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 734 { | |
| 735 char *buf; | |
| 736 if (!args || !args[0]) | |
| 737 return; | |
| 738 | |
| 739 buf = irc_format(irc, "v:", "PONG", args[0]); | |
| 740 irc_send(irc, buf); | |
| 741 g_free(buf); | |
| 742 } | |
| 743 | |
| 744 void irc_msg_pong(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 745 { | |
| 746 GaimConversation *convo; | |
| 747 GaimConnection *gc; | |
| 748 char **parts, *msg; | |
| 749 time_t oldstamp; | |
| 750 | |
| 751 if (!args || !args[1]) | |
| 752 return; | |
| 753 | |
| 754 parts = g_strsplit(args[1], " ", 2); | |
| 755 | |
| 756 if (!parts[0] || !parts[1]) { | |
| 757 g_strfreev(parts); | |
| 758 return; | |
| 759 } | |
| 760 | |
| 761 if (sscanf(parts[1], "%lu", &oldstamp) != 1) { | |
| 762 msg = g_strdup(_("Error: invalid PONG from server")); | |
| 763 } else { | |
| 6350 | 764 msg = g_strdup_printf(_("PING reply -- Lag: %lu seconds"), time(NULL) - oldstamp); |
| 6333 | 765 } |
| 766 | |
| 767 convo = gaim_find_conversation_with_account(parts[0], irc->account); | |
| 768 g_strfreev(parts); | |
| 769 if (convo) { | |
| 770 if (gaim_conversation_get_type (convo) == GAIM_CONV_CHAT) | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
771 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "PONG", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 772 else |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
773 gaim_conv_im_write(GAIM_CONV_IM(convo), "PONG", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 774 } else { |
| 775 gc = gaim_account_get_connection(irc->account); | |
| 776 if (!gc) { | |
| 777 g_free(msg); | |
| 778 return; | |
| 779 } | |
| 780 gaim_notify_info(gc, NULL, "PONG", msg); | |
| 781 } | |
| 782 g_free(msg); | |
| 783 } | |
| 784 | |
| 785 void irc_msg_privmsg(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 786 { | |
| 787 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 788 GaimConversation *convo; | |
| 789 char *nick = irc_mask_nick(from), *tmp, *msg; | |
| 790 int notice = 0; | |
| 791 | |
| 792 if (!args || !args[0] || !args[1] || !gc) { | |
| 793 g_free(nick); | |
| 794 return; | |
| 795 } | |
| 796 | |
| 797 notice = !strcmp(args[0], " notice "); | |
| 798 tmp = irc_parse_ctcp(irc, nick, args[0], args[1], notice); | |
| 799 if (!tmp) { | |
| 800 g_free(nick); | |
| 801 return; | |
| 802 } | |
| 8163 | 803 |
| 804 msg = gaim_escape_html(tmp); | |
| 6333 | 805 g_free(tmp); |
| 8163 | 806 |
| 807 tmp = irc_mirc2html(msg); | |
| 808 g_free(msg); | |
| 809 msg = tmp; | |
| 6333 | 810 if (notice) { |
| 811 tmp = g_strdup_printf("(notice) %s", msg); | |
| 812 g_free(msg); | |
| 813 msg = tmp; | |
| 814 } | |
| 815 | |
| 816 if (!gaim_utf8_strcasecmp(args[0], gaim_connection_get_display_name(gc))) { | |
| 6982 | 817 serv_got_im(gc, nick, msg, 0, time(NULL)); |
| 6333 | 818 } else if (notice) { |
| 6982 | 819 serv_got_im(gc, nick, msg, 0, time(NULL)); |
| 6333 | 820 } else { |
| 821 convo = gaim_find_conversation_with_account(args[0], irc->account); | |
| 822 if (convo) | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
823 serv_got_chat_in(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo)), nick, 0, msg, time(NULL)); |
| 6333 | 824 else |
| 825 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a PRIVMSG on %s, which does not exist\n", args[0]); | |
| 826 } | |
| 827 g_free(msg); | |
| 828 g_free(nick); | |
| 829 } | |
| 830 | |
| 6714 | 831 void irc_msg_regonly(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 832 { | |
| 833 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 834 char *msg; | |
| 835 | |
| 836 if (!args || !args[1] || !args[2] || !gc) | |
| 837 return; | |
| 838 | |
| 839 msg = g_strdup_printf(_("Cannot join %s:"), args[1]); | |
| 840 gaim_notify_error(gc, _("Cannot join channel"), msg, args[2]); | |
| 841 g_free(msg); | |
| 842 } | |
| 843 | |
| 6333 | 844 void irc_msg_quit(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 845 { | |
| 846 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 847 char *data[2]; | |
| 848 | |
| 849 if (!args || !args[0] || !gc) | |
| 850 return; | |
| 851 | |
| 852 data[0] = irc_mask_nick(from); | |
| 853 data[1] = args[0]; | |
| 854 /* XXX this should have an API, I shouldn't grab this directly */ | |
| 855 g_slist_foreach(gc->buddy_chats, (GFunc)irc_chat_remove_buddy, data); | |
| 856 g_free(data[0]); | |
| 857 | |
| 858 return; | |
| 859 } | |
| 860 | |
| 861 void irc_msg_wallops(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 862 { | |
| 863 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 864 char *nick, *msg; | |
| 865 | |
| 866 if (!args || !args[0] || !gc) | |
| 867 return; | |
| 868 | |
| 869 nick = irc_mask_nick(from); | |
| 870 msg = g_strdup_printf (_("Wallops from %s"), nick); | |
| 871 g_free(nick); | |
| 872 gaim_notify_info(gc, NULL, msg, args[0]); | |
| 873 g_free(msg); | |
| 874 } | |
| 875 | |
| 876 void irc_msg_ignore(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 877 { | |
| 878 return; | |
| 879 } |
