Mercurial > pidgin
annotate src/protocols/irc/msgs.c @ 13545:cfc2f7fcb3dd
[gaim-migrate @ 15922]
Way more changes that I initially thought I was going to make. I apologize
for the commit message spam. These changes bring a lot of consistency to
our capitalization and punctuation, especially of words like "e-mail".
For reference, I've used these rules (after discussing in #gaim):
e-mail, a case of two words joined:
"e-mail" - in the middle of a sentence caps context
"E-mail" - start of text in a sentence caps context
"E-Mail" - in a header (title) caps context
re-enable, a single word, would be:
"re-enable", "Re-enable", and "Re-enable" (respectively)
The reason this changeset exploded is that, as I went through and verified
these changes, I realized we were using improper capitalization (e.g. header
instead of sentence) in a number of dialogs. I fixed a number of these
cases before, and this corrects another pile.
This looks like I've made a LOT of work for the translators, but the impact
is significantly mitigated by three factors: 1) Many of these changes use
strings that already exist, or change one string in many places. 2) I've
used sed to correct the .po files where possible. 3) The actual changes
are extremely trivial.
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Tue, 21 Mar 2006 04:32:45 +0000 |
| parents | 95f4372e63aa |
| children | 83ec59aefbe5 |
| 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 | |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
39 static void irc_msg_handle_privmsg(struct irc_conn *irc, const char *name, |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
40 const char *from, const char *to, |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
41 const char *rawmsg, gboolean notice); |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
42 |
| 6333 | 43 static char *irc_mask_nick(const char *mask) |
| 44 { | |
| 45 char *end, *buf; | |
| 46 | |
| 47 end = strchr(mask, '!'); | |
| 48 if (!end) | |
| 49 buf = g_strdup(mask); | |
| 50 else | |
| 51 buf = g_strndup(mask, end - mask); | |
| 52 | |
| 53 return buf; | |
| 54 } | |
| 55 | |
| 56 static char *irc_mask_userhost(const char *mask) | |
| 57 { | |
| 58 return g_strdup(strchr(mask, '!') + 1); | |
| 59 } | |
| 60 | |
| 61 static void irc_chat_remove_buddy(GaimConversation *convo, char *data[2]) | |
| 62 { | |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
63 char *message; |
| 10730 | 64 |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
65 message = g_strdup_printf("quit: %s", data[1]); |
| 6333 | 66 |
| 9554 | 67 if (gaim_conv_chat_find_user(GAIM_CONV_CHAT(convo), data[0])) |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
68 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), data[0], message); |
| 6333 | 69 |
| 70 g_free(message); | |
| 71 } | |
| 72 | |
| 73 void irc_msg_default(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 74 { | |
| 75 gaim_debug(GAIM_DEBUG_INFO, "irc", "Unrecognized message: %s\n", args[0]); | |
| 76 } | |
| 77 | |
| 78 void irc_msg_away(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 79 { | |
| 80 GaimConnection *gc; | |
| 10774 | 81 char *msg; |
| 6333 | 82 |
| 83 if (!args || !args[1]) | |
| 84 return; | |
| 85 | |
| 86 if (irc->whois.nick && !gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
| 87 /* We're doing a whois, show this in the whois dialog */ | |
| 88 irc_msg_whois(irc, name, from, args); | |
| 89 return; | |
| 90 } | |
| 91 | |
| 92 gc = gaim_account_get_connection(irc->account); | |
| 10774 | 93 if (gc) { |
| 94 msg = g_markup_escape_text(args[2], -1); | |
| 12216 | 95 serv_got_im(gc, args[1], msg, GAIM_MESSAGE_AUTO_RESP, time(NULL)); |
| 10774 | 96 g_free(msg); |
| 97 } | |
| 6333 | 98 } |
| 99 | |
| 100 void irc_msg_badmode(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 101 { | |
| 102 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 103 | |
| 104 if (!args || !args[1] || !gc) | |
| 105 return; | |
| 106 | |
| 107 gaim_notify_error(gc, NULL, _("Bad mode"), args[1]); | |
| 108 } | |
| 109 | |
| 110 void irc_msg_banned(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 111 { | |
| 112 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 113 char *buf; | |
| 114 | |
| 115 if (!args || !args[1] || !gc) | |
| 116 return; | |
| 117 | |
| 118 buf = g_strdup_printf(_("You are banned from %s."), args[1]); | |
| 119 gaim_notify_error(gc, _("Banned"), _("Banned"), buf); | |
| 120 g_free(buf); | |
| 121 } | |
| 122 | |
| 10659 | 123 void irc_msg_banfull(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 124 { | |
| 125 GaimConversation *convo; | |
| 126 char *buf, *nick; | |
| 127 | |
| 128 if (!args || !args[0] || !args[1] || !args[2]) | |
| 129 return; | |
| 130 | |
| 11338 | 131 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[1], irc->account); |
| 10659 | 132 if (!convo) |
| 133 return; | |
| 134 | |
| 135 nick = g_markup_escape_text(args[2], -1); | |
| 136 buf = g_strdup_printf(_("Cannot ban %s: banlist is full"), nick); | |
| 137 g_free(nick); | |
| 138 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", buf, | |
| 139 GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, | |
| 140 time(NULL)); | |
| 141 g_free(buf); | |
| 142 } | |
| 143 | |
| 6333 | 144 void irc_msg_chanmode(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 145 { | |
| 146 GaimConversation *convo; | |
| 10774 | 147 char *buf, *escaped; |
| 6333 | 148 |
| 149 if (!args || !args[1] || !args[2]) | |
| 150 return; | |
| 151 | |
| 11338 | 152 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[1], irc->account); |
| 6333 | 153 if (!convo) /* XXX punt on channels we are not in for now */ |
| 154 return; | |
| 155 | |
| 10774 | 156 escaped = (args[3] != NULL) ? g_markup_escape_text(args[3], -1) : NULL; |
| 157 buf = g_strdup_printf("mode for %s: %s %s", args[1], args[2], escaped ? escaped : ""); | |
|
12069
1019f1d510d6
[gaim-migrate @ 14364]
Richard Laager <rlaager@wiktel.com>
parents:
12001
diff
changeset
|
158 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 10774 | 159 g_free(escaped); |
| 6333 | 160 g_free(buf); |
| 161 | |
| 162 return; | |
| 163 } | |
| 164 | |
| 165 void irc_msg_whois(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 166 { | |
| 167 if (!irc->whois.nick) { | |
| 168 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unexpected WHOIS reply for %s\n", args[1]); | |
| 169 return; | |
| 170 } | |
| 171 | |
| 172 if (gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
| 173 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Got WHOIS reply for %s while waiting for %s\n", args[1], irc->whois.nick); | |
| 174 return; | |
| 175 } | |
| 176 | |
| 177 if (!strcmp(name, "301")) { | |
| 178 irc->whois.away = g_strdup(args[2]); | |
| 179 } else if (!strcmp(name, "311")) { | |
| 180 irc->whois.userhost = g_strdup_printf("%s@%s", args[2], args[3]); | |
| 181 irc->whois.name = g_strdup(args[5]); | |
| 182 } else if (!strcmp(name, "312")) { | |
| 183 irc->whois.server = g_strdup(args[2]); | |
| 184 irc->whois.serverinfo = g_strdup(args[3]); | |
| 185 } else if (!strcmp(name, "313")) { | |
| 186 irc->whois.ircop = 1; | |
| 187 } else if (!strcmp(name, "317")) { | |
| 188 irc->whois.idle = atoi(args[2]); | |
| 189 if (args[3]) | |
| 190 irc->whois.signon = (time_t)atoi(args[3]); | |
| 191 } else if (!strcmp(name, "319")) { | |
| 192 irc->whois.channels = g_strdup(args[2]); | |
| 193 } else if (!strcmp(name, "320")) { | |
| 194 irc->whois.identified = 1; | |
| 195 } | |
| 196 } | |
| 197 | |
| 198 void irc_msg_endwhois(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 199 { | |
| 200 GaimConnection *gc; | |
| 201 GString *info; | |
| 10634 | 202 char *str, *tmp; |
| 6333 | 203 |
| 204 if (!irc->whois.nick) { | |
| 205 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unexpected End of WHOIS for %s\n", args[1]); | |
| 206 return; | |
| 207 } | |
| 208 if (gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
| 209 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Received end of WHOIS for %s, expecting %s\n", args[1], irc->whois.nick); | |
| 210 return; | |
| 211 } | |
| 212 | |
| 213 info = g_string_new(""); | |
| 10634 | 214 tmp = g_markup_escape_text(args[1], -1); |
| 215 g_string_append_printf(info, _("<b>%s:</b> %s"), _("Nick"), tmp); | |
| 216 g_free(tmp); | |
| 9558 | 217 g_string_append_printf(info, "%s%s<br>", |
| 6333 | 218 irc->whois.ircop ? _(" <i>(ircop)</i>") : "", |
| 219 irc->whois.identified ? _(" <i>(identified)</i>") : ""); | |
| 220 if (irc->whois.away) { | |
| 10634 | 221 tmp = g_markup_escape_text(irc->whois.away, strlen(irc->whois.away)); |
| 6333 | 222 g_free(irc->whois.away); |
| 9589 | 223 g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Away"), tmp); |
| 224 g_free(tmp); | |
| 6333 | 225 } |
| 226 if (irc->whois.userhost) { | |
| 10634 | 227 tmp = g_markup_escape_text(irc->whois.name, strlen(irc->whois.name)); |
| 9589 | 228 g_free(irc->whois.name); |
| 9558 | 229 g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Username"), irc->whois.userhost); |
|
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13533
diff
changeset
|
230 g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Real name"), tmp); |
| 6333 | 231 g_free(irc->whois.userhost); |
| 9589 | 232 g_free(tmp); |
| 6333 | 233 } |
| 234 if (irc->whois.server) { | |
| 9558 | 235 g_string_append_printf(info, _("<b>%s:</b> %s"), _("Server"), irc->whois.server); |
| 236 g_string_append_printf(info, " (%s)<br>", irc->whois.serverinfo); | |
| 6333 | 237 g_free(irc->whois.server); |
| 238 g_free(irc->whois.serverinfo); | |
| 239 } | |
| 240 if (irc->whois.channels) { | |
| 9558 | 241 g_string_append_printf(info, _("<b>%s:</b> %s<br>"), _("Currently on"), irc->whois.channels); |
| 6333 | 242 g_free(irc->whois.channels); |
| 243 } | |
| 244 if (irc->whois.idle) { | |
|
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
245 gchar *timex = gaim_str_seconds_to_string(irc->whois.idle); |
| 6357 | 246 g_string_append_printf(info, _("<b>Idle for:</b> %s<br>"), timex); |
| 247 g_free(timex); | |
|
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
248 g_string_append_printf(info, _("<b>%s:</b> %s"), _("Online since"), |
|
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
249 gaim_date_format_full(localtime(&irc->whois.signon))); |
| 6333 | 250 } |
| 251 if (!strcmp(irc->whois.nick, "Paco-Paco")) { | |
| 252 g_string_append_printf(info, _("<br><b>Defining adjective:</b> Glorious<br>")); | |
| 253 } | |
| 254 | |
| 255 gc = gaim_account_get_connection(irc->account); | |
| 256 str = g_string_free(info, FALSE); | |
|
7062
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
257 |
|
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11531
diff
changeset
|
258 gaim_notify_userinfo(gc, irc->whois.nick, str, NULL, NULL); |
|
7062
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
259 |
| 10504 | 260 g_free(irc->whois.nick); |
| 6333 | 261 g_free(str); |
| 262 memset(&irc->whois, 0, sizeof(irc->whois)); | |
| 263 } | |
| 264 | |
| 8114 | 265 void irc_msg_list(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 266 { | |
| 267 if (!irc->roomlist) | |
| 268 return; | |
| 269 | |
| 270 if (!strcmp(name, "321")) { | |
| 271 gaim_roomlist_set_in_progress(irc->roomlist, TRUE); | |
| 272 return; | |
| 273 } | |
| 274 | |
| 275 if (!strcmp(name, "323")) { | |
| 276 gaim_roomlist_set_in_progress(irc->roomlist, FALSE); | |
| 277 gaim_roomlist_unref(irc->roomlist); | |
| 278 irc->roomlist = NULL; | |
| 279 } | |
| 280 | |
| 281 if (!strcmp(name, "322")) { | |
| 282 GaimRoomlistRoom *room; | |
| 283 | |
| 284 if (!args[0] || !args[1] || !args[2] || !args[3]) | |
| 285 return; | |
| 286 | |
| 287 room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, args[1], NULL); | |
| 288 gaim_roomlist_room_add_field(irc->roomlist, room, args[1]); | |
| 289 gaim_roomlist_room_add_field(irc->roomlist, room, GINT_TO_POINTER(strtol(args[2], NULL, 10))); | |
| 290 gaim_roomlist_room_add_field(irc->roomlist, room, args[3]); | |
| 291 gaim_roomlist_room_add(irc->roomlist, room); | |
| 292 } | |
| 293 } | |
| 294 | |
| 6333 | 295 void irc_msg_topic(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 296 { | |
| 9762 | 297 char *chan, *topic, *msg, *nick, *tmp, *tmp2; |
| 6333 | 298 GaimConversation *convo; |
| 299 | |
| 300 if (!strcmp(name, "topic")) { | |
| 301 chan = args[0]; | |
| 8529 | 302 topic = irc_mirc2txt (args[1]); |
| 6333 | 303 } else { |
| 304 chan = args[1]; | |
| 8529 | 305 topic = irc_mirc2txt (args[2]); |
| 6333 | 306 } |
| 307 | |
| 11338 | 308 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, chan, irc->account); |
| 6333 | 309 if (!convo) { |
| 310 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a topic for %s, which doesn't exist\n", chan); | |
| 311 } | |
| 9518 | 312 |
| 6333 | 313 /* If this is an interactive update, print it out */ |
|
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10730
diff
changeset
|
314 tmp = g_markup_escape_text(topic, -1); |
| 9762 | 315 tmp2 = gaim_markup_linkify(tmp); |
| 316 g_free(tmp); | |
| 6333 | 317 if (!strcmp(name, "topic")) { |
|
13533
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
318 const char *current_topic = gaim_conv_chat_get_topic(GAIM_CONV_CHAT(convo)); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
319 if (!(current_topic != NULL && strcmp(tmp2, current_topic) == 0)) |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
320 { |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
321 char *nick_esc; |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
322 nick = irc_mask_nick(from); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
323 nick_esc = g_markup_escape_text(nick, -1); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
324 gaim_conv_chat_set_topic(GAIM_CONV_CHAT(convo), nick, topic); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
325 if (*tmp2) |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
326 msg = g_strdup_printf(_("%s has changed the topic to: %s"), nick_esc, tmp2); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
327 else |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
328 msg = g_strdup_printf(_("%s has cleared the topic."), nick_esc); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
329 g_free(nick_esc); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
330 g_free(nick); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
331 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), from, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
332 g_free(msg); |
|
95f4372e63aa
[gaim-migrate @ 15910]
Richard Laager <rlaager@wiktel.com>
parents:
13524
diff
changeset
|
333 } |
| 6333 | 334 } else { |
|
13394
eb0ce960ff60
[gaim-migrate @ 15767]
Richard Laager <rlaager@wiktel.com>
parents:
13119
diff
changeset
|
335 char *chan_esc = g_markup_escape_text(chan, -1); |
|
eb0ce960ff60
[gaim-migrate @ 15767]
Richard Laager <rlaager@wiktel.com>
parents:
13119
diff
changeset
|
336 msg = g_strdup_printf(_("The topic for %s is: %s"), chan_esc, tmp2); |
|
eb0ce960ff60
[gaim-migrate @ 15767]
Richard Laager <rlaager@wiktel.com>
parents:
13119
diff
changeset
|
337 g_free(chan_esc); |
| 9518 | 338 gaim_conv_chat_set_topic(GAIM_CONV_CHAT(convo), NULL, topic); |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
339 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", msg, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 6333 | 340 g_free(msg); |
| 341 } | |
| 9762 | 342 g_free(tmp2); |
| 8529 | 343 g_free(topic); |
| 6333 | 344 } |
| 345 | |
| 346 void irc_msg_unknown(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 347 { | |
| 348 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 349 char *buf; | |
| 350 | |
| 351 if (!args || !args[1] || !gc) | |
| 352 return; | |
| 353 | |
| 354 buf = g_strdup_printf(_("Unknown message '%s'"), args[1]); | |
| 355 gaim_notify_error(gc, _("Unknown message"), buf, _("Gaim has sent a message the IRC server did not understand.")); | |
| 356 g_free(buf); | |
| 357 } | |
| 358 | |
| 359 void irc_msg_names(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 360 { | |
| 361 char *names, *cur, *end, *tmp, *msg; | |
| 362 GaimConversation *convo; | |
| 363 | |
| 364 if (!strcmp(name, "366")) { | |
| 11338 | 365 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, irc->nameconv ? irc->nameconv : args[1], irc->account); |
| 6333 | 366 if (!convo) { |
| 367 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a NAMES list for %s, which doesn't exist\n", args[2]); | |
| 368 g_string_free(irc->names, TRUE); | |
| 369 irc->names = NULL; | |
| 370 g_free(irc->nameconv); | |
| 371 irc->nameconv = NULL; | |
| 372 return; | |
| 373 } | |
| 374 | |
| 375 names = cur = g_string_free(irc->names, FALSE); | |
| 376 irc->names = NULL; | |
| 377 if (irc->nameconv) { | |
|
11026
a659e6bac294
[gaim-migrate @ 12901]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10816
diff
changeset
|
378 msg = g_strdup_printf(_("Users on %s: %s"), args[1], names ? names : ""); |
| 11338 | 379 if (gaim_conversation_get_type(convo) == GAIM_CONV_TYPE_CHAT) |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
380 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 381 else |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
382 gaim_conv_im_write(GAIM_CONV_IM(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 383 g_free(msg); |
| 384 g_free(irc->nameconv); | |
| 385 irc->nameconv = NULL; | |
| 386 } else { | |
|
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
387 GList *users = NULL; |
| 9554 | 388 GList *flags = NULL; |
|
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
389 |
| 6333 | 390 while (*cur) { |
| 9554 | 391 GaimConvChatBuddyFlags f = GAIM_CBFLAGS_NONE; |
| 6333 | 392 end = strchr(cur, ' '); |
| 393 if (!end) | |
| 394 end = cur + strlen(cur); | |
| 9554 | 395 if (*cur == '@') { |
| 396 f = GAIM_CBFLAGS_OP; | |
| 6333 | 397 cur++; |
| 9554 | 398 } else if (*cur == '%') { |
| 399 f = GAIM_CBFLAGS_HALFOP; | |
| 400 cur++; | |
| 401 } else if(*cur == '+') { | |
| 402 f = GAIM_CBFLAGS_VOICE; | |
| 403 cur++; | |
| 404 } | |
| 6333 | 405 tmp = g_strndup(cur, end - cur); |
| 11869 | 406 users = g_list_prepend(users, tmp); |
| 407 flags = g_list_prepend(flags, GINT_TO_POINTER(f)); | |
| 6333 | 408 cur = end; |
| 409 if (*cur) | |
| 410 cur++; | |
| 411 } | |
|
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
412 |
|
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
413 if (users != NULL) { |
|
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
414 GList *l; |
|
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
415 |
|
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11386
diff
changeset
|
416 gaim_conv_chat_add_users(GAIM_CONV_CHAT(convo), users, NULL, flags, FALSE); |
|
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
417 |
|
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
418 for (l = users; l != NULL; l = l->next) |
|
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
419 g_free(l->data); |
|
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
420 |
|
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
421 g_list_free(users); |
| 9554 | 422 g_list_free(flags); |
|
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6357
diff
changeset
|
423 } |
| 6333 | 424 } |
| 425 g_free(names); | |
| 426 } else { | |
| 427 if (!irc->names) | |
| 428 irc->names = g_string_new(""); | |
| 429 | |
| 430 irc->names = g_string_append(irc->names, args[3]); | |
| 431 } | |
| 432 } | |
| 433 | |
| 434 void irc_msg_motd(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 435 { | |
| 436 GaimConnection *gc; | |
| 10774 | 437 char *escaped; |
| 6333 | 438 if (!strcmp(name, "375")) { |
| 439 gc = gaim_account_get_connection(irc->account); | |
| 440 if (gc) | |
| 441 gaim_connection_set_display_name(gc, args[0]); | |
| 442 } | |
| 443 | |
| 444 if (!irc->motd) | |
| 445 irc->motd = g_string_new(""); | |
| 446 | |
| 10774 | 447 escaped = g_markup_escape_text(args[1], -1); |
| 448 g_string_append_printf(irc->motd, "%s<br>", escaped); | |
| 449 g_free(escaped); | |
| 6333 | 450 } |
| 451 | |
| 452 void irc_msg_endmotd(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 453 { | |
| 454 GaimConnection *gc; | |
| 12001 | 455 GaimStatus *status; |
| 11489 | 456 GaimBlistNode *gnode, *cnode, *bnode; |
| 6333 | 457 |
| 458 gc = gaim_account_get_connection(irc->account); | |
| 459 if (!gc) | |
| 460 return; | |
| 461 | |
| 462 gaim_connection_set_state(gc, GAIM_CONNECTED); | |
| 463 | |
| 12001 | 464 /* If we're away then set our away message */ |
| 465 status = gaim_account_get_active_status(irc->account); | |
| 466 if (!gaim_status_get_type(status) != GAIM_STATUS_AVAILABLE) | |
| 467 { | |
| 468 GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
| 469 prpl_info->set_status(irc->account, status); | |
| 470 } | |
| 471 | |
| 11489 | 472 /* this used to be in the core, but it's not now */ |
| 473 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { | |
| 474 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 475 continue; | |
| 476 for(cnode = gnode->child; cnode; cnode = cnode->next) { | |
| 477 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
| 478 continue; | |
| 479 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 480 GaimBuddy *b; | |
| 481 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 482 continue; | |
| 483 b = (GaimBuddy *)bnode; | |
| 484 if(b->account == gc->account) { | |
| 485 struct irc_buddy *ib = g_new0(struct irc_buddy, 1); | |
| 486 ib->name = g_strdup(b->name); | |
| 487 g_hash_table_insert(irc->buddies, ib->name, ib); | |
| 488 } | |
| 489 } | |
| 490 } | |
| 491 } | |
| 492 | |
| 6333 | 493 irc_blist_timeout(irc); |
| 8872 | 494 if (!irc->timer) |
| 495 irc->timer = gaim_timeout_add(45000, (GSourceFunc)irc_blist_timeout, (gpointer)irc); | |
| 6333 | 496 } |
| 497 | |
| 10564 | 498 void irc_msg_time(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 499 { | |
| 500 GaimConnection *gc; | |
| 501 | |
| 502 gc = gaim_account_get_connection(irc->account); | |
| 503 if (gc == NULL || args == NULL || args[2] == NULL) | |
| 504 return; | |
| 505 | |
| 506 gaim_notify_message(gc, GAIM_NOTIFY_MSG_INFO, _("Time Response"), | |
| 507 _("The IRC server's local time is:"), | |
| 508 args[2], NULL, NULL); | |
| 509 } | |
| 510 | |
| 7877 | 511 void irc_msg_nochan(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 512 { | |
| 513 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 514 | |
| 515 if (gc == NULL || args == NULL || args[1] == NULL) | |
| 516 return; | |
| 517 | |
| 518 gaim_notify_error(gc, NULL, _("No such channel"), args[1]); | |
| 519 } | |
| 520 | |
| 6333 | 521 void irc_msg_nonick(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 522 { | |
| 523 GaimConnection *gc; | |
| 524 GaimConversation *convo; | |
| 525 | |
| 11338 | 526 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, args[1], irc->account); |
| 6333 | 527 if (convo) { |
| 11338 | 528 if (gaim_conversation_get_type(convo) == GAIM_CONV_TYPE_CHAT) /* does this happen? */ |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
529 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], _("no such channel"), |
| 6621 | 530 GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 531 else |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
532 gaim_conv_im_write(GAIM_CONV_IM(convo), args[1], _("User is not logged in"), |
| 6621 | 533 GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 534 } else { |
| 535 if ((gc = gaim_account_get_connection(irc->account)) == NULL) | |
| 536 return; | |
| 10774 | 537 gaim_notify_error(gc, NULL, _("No such nick or channel"), args[1]); |
| 6333 | 538 } |
| 539 | |
| 540 if (irc->whois.nick && !gaim_utf8_strcasecmp(irc->whois.nick, args[1])) { | |
| 541 g_free(irc->whois.nick); | |
| 542 irc->whois.nick = NULL; | |
| 543 } | |
| 544 } | |
| 545 | |
| 546 void irc_msg_nosend(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 547 { | |
| 548 GaimConnection *gc; | |
| 549 GaimConversation *convo; | |
| 550 | |
| 11338 | 551 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[1], irc->account); |
| 6333 | 552 if (convo) { |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
553 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], args[2], GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 554 } else { |
| 555 if ((gc = gaim_account_get_connection(irc->account)) == NULL) | |
| 556 return; | |
| 557 gaim_notify_error(gc, NULL, _("Could not send"), args[2]); | |
| 558 } | |
| 559 } | |
| 560 | |
| 561 void irc_msg_notinchan(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 562 { | |
| 11338 | 563 GaimConversation *convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[1], irc->account); |
| 6333 | 564 |
| 565 gaim_debug(GAIM_DEBUG_INFO, "irc", "We're apparently not in %s, but tried to use it\n", args[1]); | |
| 566 if (convo) { | |
| 567 /*g_slist_remove(irc->gc->buddy_chats, convo); | |
| 568 gaim_conversation_set_account(convo, NULL);*/ | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
569 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[1], args[2], GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 570 } |
| 571 } | |
| 572 | |
| 573 void irc_msg_notop(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 574 { | |
| 575 GaimConversation *convo; | |
| 576 | |
| 577 if (!args || !args[1] || !args[2]) | |
| 578 return; | |
| 579 | |
| 11338 | 580 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[1], irc->account); |
| 6333 | 581 if (!convo) |
| 582 return; | |
| 583 | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
584 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", args[2], GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 6333 | 585 } |
| 586 | |
| 587 void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 588 { | |
| 589 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 590 GHashTable *components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
| 591 char *nick = irc_mask_nick(from); | |
| 592 | |
| 593 if (!args || !args[1] || !gc) { | |
| 594 g_free(nick); | |
| 595 g_hash_table_destroy(components); | |
| 596 return; | |
| 597 } | |
| 598 | |
| 599 g_hash_table_insert(components, strdup("channel"), strdup(args[1])); | |
| 600 | |
| 601 serv_got_chat_invite(gc, args[1], nick, NULL, components); | |
| 602 g_free(nick); | |
| 603 } | |
| 604 | |
| 605 void irc_msg_inviteonly(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 606 { | |
| 607 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 608 char *buf; | |
| 609 | |
| 610 if (!args || !args[1] || !gc) | |
| 611 return; | |
| 612 | |
| 613 buf = g_strdup_printf(_("Joining %s requires an invitation."), args[1]); | |
| 614 gaim_notify_error(gc, _("Invitation only"), _("Invitation only"), buf); | |
| 615 g_free(buf); | |
| 616 } | |
| 617 | |
| 618 void irc_msg_ison(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 619 { | |
| 620 char **nicks; | |
| 621 struct irc_buddy *ib; | |
| 622 int i; | |
| 623 | |
| 624 if (!args || !args[1]) | |
| 625 return; | |
| 626 | |
| 627 nicks = g_strsplit(args[1], " ", -1); | |
| 628 | |
| 629 for (i = 0; nicks[i]; i++) { | |
| 630 if ((ib = g_hash_table_lookup(irc->buddies, (gconstpointer)nicks[i])) == NULL) { | |
| 631 continue; | |
| 632 } | |
| 633 ib->flag = TRUE; | |
| 634 } | |
| 635 | |
| 6350 | 636 g_strfreev(nicks); |
| 637 | |
| 6333 | 638 g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_status, (gpointer)irc); |
| 639 } | |
| 640 | |
| 641 static void irc_buddy_status(char *name, struct irc_buddy *ib, struct irc_conn *irc) | |
| 642 { | |
| 643 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 6695 | 644 GaimBuddy *buddy = gaim_find_buddy(irc->account, name); |
| 6333 | 645 |
| 646 if (!gc || !buddy) | |
| 647 return; | |
| 648 | |
| 649 if (ib->online && !ib->flag) { | |
| 10242 | 650 gaim_prpl_got_user_status(irc->account, name, "offline", NULL); |
| 6333 | 651 ib->online = FALSE; |
| 10242 | 652 } else if (!ib->online && ib->flag) { |
| 11535 | 653 gaim_prpl_got_user_status(irc->account, name, "available", NULL); |
| 6333 | 654 ib->online = TRUE; |
| 655 } | |
| 656 } | |
| 657 | |
| 658 void irc_msg_join(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 659 { | |
| 660 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 661 GaimConversation *convo; | |
| 662 char *nick = irc_mask_nick(from), *userhost; | |
| 9238 | 663 struct irc_buddy *ib; |
| 6333 | 664 static int id = 1; |
| 665 | |
| 666 if (!gc) { | |
| 667 g_free(nick); | |
| 668 return; | |
| 669 } | |
| 670 | |
| 671 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
| 672 /* We are joining a channel for the first time */ | |
| 673 serv_got_joined_chat(gc, id++, args[0]); | |
| 674 g_free(nick); | |
| 675 return; | |
| 676 } | |
| 677 | |
| 11338 | 678 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[0], irc->account); |
| 6333 | 679 if (convo == NULL) { |
| 680 gaim_debug(GAIM_DEBUG_ERROR, "irc", "JOIN for %s failed\n", args[0]); | |
| 681 g_free(nick); | |
| 682 return; | |
| 683 } | |
| 684 | |
| 685 userhost = irc_mask_userhost(from); | |
| 9846 | 686 gaim_conv_chat_add_user(GAIM_CONV_CHAT(convo), nick, userhost, GAIM_CBFLAGS_NONE, TRUE); |
| 9238 | 687 |
| 688 if ((ib = g_hash_table_lookup(irc->buddies, nick)) != NULL) { | |
| 689 ib->flag = TRUE; | |
| 690 irc_buddy_status(nick, ib, irc); | |
| 691 } | |
| 692 | |
| 6333 | 693 g_free(userhost); |
| 694 g_free(nick); | |
| 695 } | |
| 696 | |
| 697 void irc_msg_kick(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 698 { | |
| 699 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 11338 | 700 GaimConversation *convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[0], irc->account); |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
701 char *nick = irc_mask_nick(from), *buf; |
| 6333 | 702 |
| 703 if (!gc) { | |
| 704 g_free(nick); | |
| 705 return; | |
| 706 } | |
| 707 | |
| 708 if (!convo) { | |
| 709 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Recieved a KICK for unknown channel %s\n", args[0]); | |
| 710 g_free(nick); | |
| 711 return; | |
| 712 } | |
| 713 | |
| 714 if (!gaim_utf8_strcasecmp(gaim_connection_get_display_name(gc), args[1])) { | |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
715 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
|
716 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 6333 | 717 g_free(buf); |
|
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8186
diff
changeset
|
718 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo))); |
| 6333 | 719 } else { |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
720 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
|
721 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), args[1], buf); |
| 6333 | 722 g_free(buf); |
| 723 } | |
| 724 | |
| 725 g_free(nick); | |
| 726 return; | |
| 727 } | |
| 728 | |
| 729 void irc_msg_mode(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 730 { | |
| 731 GaimConversation *convo; | |
| 732 char *nick = irc_mask_nick(from), *buf; | |
| 733 | |
| 734 if (*args[0] == '#' || *args[0] == '&') { /* Channel */ | |
| 10774 | 735 char *escaped; |
| 11338 | 736 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[0], irc->account); |
| 6333 | 737 if (!convo) { |
| 738 gaim_debug(GAIM_DEBUG_ERROR, "irc", "MODE received for %s, which we are not in\n", args[0]); | |
| 739 g_free(nick); | |
| 740 return; | |
| 741 } | |
| 10774 | 742 escaped = (args[2] != NULL) ? g_markup_escape_text(args[2], -1) : NULL; |
| 743 buf = g_strdup_printf(_("mode (%s %s) by %s"), args[1], escaped ? escaped : "", nick); | |
|
12069
1019f1d510d6
[gaim-migrate @ 14364]
Richard Laager <rlaager@wiktel.com>
parents:
12001
diff
changeset
|
744 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 10774 | 745 g_free(escaped); |
| 6333 | 746 g_free(buf); |
| 9554 | 747 if(args[2]) { |
| 748 GaimConvChatBuddyFlags newflag, flags; | |
| 749 char *mcur, *cur, *end, *user; | |
| 750 gboolean add = FALSE; | |
| 751 mcur = args[1]; | |
| 752 cur = args[2]; | |
| 753 while (*cur && *mcur) { | |
| 754 if ((*mcur == '+') || (*mcur == '-')) { | |
| 755 add = (*mcur == '+') ? TRUE : FALSE; | |
| 756 mcur++; | |
| 757 continue; | |
| 758 } | |
| 759 end = strchr(cur, ' '); | |
| 760 if (!end) | |
| 761 end = cur + strlen(cur); | |
| 762 user = g_strndup(cur, end - cur); | |
| 763 flags = gaim_conv_chat_user_get_flags(GAIM_CONV_CHAT(convo), user); | |
| 764 newflag = GAIM_CBFLAGS_NONE; | |
| 765 if (*mcur == 'o') | |
| 766 newflag = GAIM_CBFLAGS_OP; | |
| 767 else if (*mcur =='h') | |
| 768 newflag = GAIM_CBFLAGS_HALFOP; | |
| 769 else if (*mcur == 'v') | |
| 770 newflag = GAIM_CBFLAGS_VOICE; | |
| 771 if (newflag) { | |
| 772 if (add) | |
| 773 flags |= newflag; | |
| 774 else | |
| 775 flags &= ~newflag; | |
| 776 gaim_conv_chat_user_set_flags(GAIM_CONV_CHAT(convo), user, flags); | |
| 777 } | |
| 778 g_free(user); | |
| 779 cur = end; | |
| 780 if (*cur) | |
| 781 cur++; | |
| 782 if (*mcur) | |
| 783 mcur++; | |
| 784 } | |
| 785 } | |
| 6333 | 786 } else { /* User */ |
| 787 } | |
| 788 g_free(nick); | |
| 789 } | |
| 790 | |
| 791 void irc_msg_nick(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 792 { | |
| 793 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 10617 | 794 GaimConversation *conv; |
| 6333 | 795 GSList *chats; |
| 796 char *nick = irc_mask_nick(from); | |
| 797 | |
| 798 if (!gc) { | |
| 799 g_free(nick); | |
| 800 return; | |
| 801 } | |
| 802 chats = gc->buddy_chats; | |
| 803 | |
| 804 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
| 805 gaim_connection_set_display_name(gc, args[0]); | |
| 806 } | |
| 807 | |
| 808 while (chats) { | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
809 GaimConvChat *chat = GAIM_CONV_CHAT(chats->data); |
| 9593 | 810 /* This is ugly ... */ |
| 811 if (gaim_conv_chat_find_user(chat, nick)) | |
| 812 gaim_conv_chat_rename_user(chat, nick, args[0]); | |
| 6333 | 813 chats = chats->next; |
| 814 } | |
| 10617 | 815 |
| 11338 | 816 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, nick, |
| 10617 | 817 irc->account); |
| 818 if (conv != NULL) | |
| 819 gaim_conversation_set_name(conv, args[0]); | |
| 820 | |
| 6333 | 821 g_free(nick); |
| 822 } | |
| 823 | |
| 10633 | 824 void irc_msg_badnick(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 825 { | |
| 13057 | 826 GaimConnection *gc = gaim_account_get_connection(irc->account); |
| 827 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) { | |
| 828 gaim_notify_error(gc, _("Invalid nickname"), | |
| 829 _("Invalid nickname"), | |
| 830 _("Your selected nickname was rejected by the server. It probably contains invalid characters.")); | |
| 831 | |
| 832 } else { | |
| 833 gaim_connection_error(gaim_account_get_connection(irc->account), | |
| 834 _("Your selected account name was rejected by the server. It probably contains invalid characters.")); | |
| 835 } | |
| 10633 | 836 } |
| 837 | |
| 6333 | 838 void irc_msg_nickused(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 839 { | |
| 840 char *newnick, *buf, *end; | |
| 841 | |
| 842 if (!args || !args[1]) | |
| 843 return; | |
| 844 | |
| 845 newnick = strdup(args[1]); | |
| 846 end = newnick + strlen(newnick) - 1; | |
| 11386 | 847 /* try fallbacks */ |
| 848 if((*end < '9') && (*end >= '1')) { | |
| 849 *end = *end + 1; | |
| 850 } else *end = '1'; | |
| 6333 | 851 |
| 852 buf = irc_format(irc, "vn", "NICK", newnick); | |
| 853 irc_send(irc, buf); | |
| 854 g_free(buf); | |
| 10504 | 855 g_free(newnick); |
| 6333 | 856 } |
| 857 | |
| 858 void irc_msg_notice(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 859 { | |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
860 if (!args || !args[0] || !args[1]) |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
861 return; |
| 6333 | 862 |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
863 irc_msg_handle_privmsg(irc, name, from, args[0], args[1], TRUE); |
| 6333 | 864 } |
| 865 | |
| 6718 | 866 void irc_msg_nochangenick(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 867 { | |
| 868 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 869 | |
| 6753 | 870 if (!args || !args[2] || !gc) |
| 6718 | 871 return; |
| 872 | |
| 10774 | 873 gaim_notify_error(gc, _("Cannot change nick"), _("Could not change nick"), args[2]); |
| 6718 | 874 } |
| 875 | |
| 6333 | 876 void irc_msg_part(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 877 { | |
| 878 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 879 GaimConversation *convo; | |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
880 char *nick, *msg; |
| 6333 | 881 |
| 8186 | 882 if (!args || !args[0] || !gc) |
| 6333 | 883 return; |
| 884 | |
| 11338 | 885 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, args[0], irc->account); |
| 6333 | 886 if (!convo) { |
| 887 gaim_debug(GAIM_DEBUG_INFO, "irc", "Got a PART on %s, which doesn't exist -- probably closed\n", args[0]); | |
| 888 return; | |
| 889 } | |
| 890 | |
| 891 nick = irc_mask_nick(from); | |
| 892 if (!gaim_utf8_strcasecmp(nick, gaim_connection_get_display_name(gc))) { | |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
893 char *escaped = g_markup_escape_text(args[1], -1); |
| 8186 | 894 msg = g_strdup_printf(_("You have parted the channel%s%s"), |
|
10551
6ef7be688140
[gaim-migrate @ 11926]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
895 (args[1] && *args[1]) ? ": " : "", |
| 10730 | 896 (escaped && *escaped) ? escaped : ""); |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
897 g_free(escaped); |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
898 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), args[0], msg, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 6333 | 899 g_free(msg); |
|
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8186
diff
changeset
|
900 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo))); |
| 6333 | 901 } else { |
|
12855
f9401180115a
[gaim-migrate @ 15206]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
902 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(convo), nick, args[1]); |
| 6333 | 903 } |
| 904 g_free(nick); | |
| 905 } | |
| 906 | |
| 907 void irc_msg_ping(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 908 { | |
| 909 char *buf; | |
| 910 if (!args || !args[0]) | |
| 911 return; | |
| 912 | |
| 913 buf = irc_format(irc, "v:", "PONG", args[0]); | |
| 914 irc_send(irc, buf); | |
| 915 g_free(buf); | |
| 916 } | |
| 917 | |
| 918 void irc_msg_pong(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 919 { | |
| 920 GaimConversation *convo; | |
| 921 GaimConnection *gc; | |
| 922 char **parts, *msg; | |
| 923 time_t oldstamp; | |
| 924 | |
| 925 if (!args || !args[1]) | |
| 926 return; | |
| 927 | |
| 928 parts = g_strsplit(args[1], " ", 2); | |
| 929 | |
| 930 if (!parts[0] || !parts[1]) { | |
| 931 g_strfreev(parts); | |
| 932 return; | |
| 933 } | |
| 934 | |
| 935 if (sscanf(parts[1], "%lu", &oldstamp) != 1) { | |
| 936 msg = g_strdup(_("Error: invalid PONG from server")); | |
| 937 } else { | |
| 6350 | 938 msg = g_strdup_printf(_("PING reply -- Lag: %lu seconds"), time(NULL) - oldstamp); |
| 6333 | 939 } |
| 940 | |
| 11338 | 941 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, parts[0], irc->account); |
| 6333 | 942 g_strfreev(parts); |
| 943 if (convo) { | |
| 11338 | 944 if (gaim_conversation_get_type (convo) == GAIM_CONV_TYPE_CHAT) |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
945 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "PONG", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 946 else |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
947 gaim_conv_im_write(GAIM_CONV_IM(convo), "PONG", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); |
| 6333 | 948 } else { |
| 949 gc = gaim_account_get_connection(irc->account); | |
| 950 if (!gc) { | |
| 951 g_free(msg); | |
| 952 return; | |
| 953 } | |
| 954 gaim_notify_info(gc, NULL, "PONG", msg); | |
| 955 } | |
| 956 g_free(msg); | |
| 957 } | |
| 958 | |
| 959 void irc_msg_privmsg(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 960 { | |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
961 if (!args || !args[0] || !args[1]) |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
962 return; |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
963 |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
964 irc_msg_handle_privmsg(irc, name, from, args[0], args[1], FALSE); |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
965 } |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
966 |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
967 static void irc_msg_handle_privmsg(struct irc_conn *irc, const char *name, const char *from, const char *to, const char *rawmsg, gboolean notice) |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
968 { |
| 6333 | 969 GaimConnection *gc = gaim_account_get_connection(irc->account); |
| 970 GaimConversation *convo; | |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
971 char *tmp; |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
972 char *msg; |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
973 char *nick; |
| 6333 | 974 |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
975 if (!gc) |
| 6333 | 976 return; |
| 977 | |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
978 nick = irc_mask_nick(from); |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
979 tmp = irc_parse_ctcp(irc, nick, to, rawmsg, notice); |
| 6333 | 980 if (!tmp) { |
| 981 g_free(nick); | |
| 982 return; | |
| 983 } | |
| 8163 | 984 |
|
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10730
diff
changeset
|
985 msg = g_markup_escape_text(tmp, -1); |
| 6333 | 986 g_free(tmp); |
| 8163 | 987 |
| 988 tmp = irc_mirc2html(msg); | |
| 989 g_free(msg); | |
| 990 msg = tmp; | |
| 6333 | 991 if (notice) { |
| 992 tmp = g_strdup_printf("(notice) %s", msg); | |
| 993 g_free(msg); | |
| 994 msg = tmp; | |
| 995 } | |
| 996 | |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
997 if (!gaim_utf8_strcasecmp(to, gaim_connection_get_display_name(gc))) { |
| 6982 | 998 serv_got_im(gc, nick, msg, 0, time(NULL)); |
| 6333 | 999 } else { |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
1000 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, to, irc->account); |
| 6333 | 1001 if (convo) |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1002 serv_got_chat_in(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo)), nick, 0, msg, time(NULL)); |
| 6333 | 1003 else |
|
13524
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
1004 gaim_debug_error("irc", "Got a %s on %s, which does not exist\n", |
|
57bde2deabcb
[gaim-migrate @ 15900]
Richard Laager <rlaager@wiktel.com>
parents:
13522
diff
changeset
|
1005 notice ? "NOTICE" : "PRIVMSG", to); |
| 6333 | 1006 } |
| 1007 g_free(msg); | |
| 1008 g_free(nick); | |
| 1009 } | |
| 1010 | |
| 6714 | 1011 void irc_msg_regonly(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 1012 { | |
| 1013 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 1014 char *msg; | |
| 1015 | |
| 1016 if (!args || !args[1] || !args[2] || !gc) | |
| 1017 return; | |
| 1018 | |
| 1019 msg = g_strdup_printf(_("Cannot join %s:"), args[1]); | |
| 1020 gaim_notify_error(gc, _("Cannot join channel"), msg, args[2]); | |
| 1021 g_free(msg); | |
| 1022 } | |
| 1023 | |
| 6333 | 1024 void irc_msg_quit(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 1025 { | |
| 1026 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 9238 | 1027 struct irc_buddy *ib; |
| 6333 | 1028 char *data[2]; |
| 1029 | |
| 1030 if (!args || !args[0] || !gc) | |
| 1031 return; | |
| 1032 | |
| 1033 data[0] = irc_mask_nick(from); | |
| 1034 data[1] = args[0]; | |
| 1035 /* XXX this should have an API, I shouldn't grab this directly */ | |
| 1036 g_slist_foreach(gc->buddy_chats, (GFunc)irc_chat_remove_buddy, data); | |
| 9238 | 1037 |
| 1038 if ((ib = g_hash_table_lookup(irc->buddies, data[0])) != NULL) { | |
| 1039 ib->flag = FALSE; | |
| 1040 irc_buddy_status(data[0], ib, irc); | |
| 1041 } | |
| 6333 | 1042 g_free(data[0]); |
| 1043 | |
| 1044 return; | |
| 1045 } | |
| 1046 | |
| 10712 | 1047 void irc_msg_unavailable(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 1048 { | |
| 1049 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 1050 | |
| 1051 if (!args || !args[1]) | |
| 1052 return; | |
| 1053 | |
| 1054 gaim_notify_error(gc, NULL, _("Nick or channel is temporarily unavailable."), args[1]); | |
| 1055 } | |
| 1056 | |
| 6333 | 1057 void irc_msg_wallops(struct irc_conn *irc, const char *name, const char *from, char **args) |
| 1058 { | |
| 1059 GaimConnection *gc = gaim_account_get_connection(irc->account); | |
| 10774 | 1060 char *nick, *msg; |
| 6333 | 1061 |
| 1062 if (!args || !args[0] || !gc) | |
| 1063 return; | |
| 1064 | |
| 1065 nick = irc_mask_nick(from); | |
| 1066 msg = g_strdup_printf (_("Wallops from %s"), nick); | |
| 1067 g_free(nick); | |
| 10774 | 1068 gaim_notify_info(gc, NULL, msg, args[0]); |
| 6333 | 1069 g_free(msg); |
| 1070 } | |
| 1071 | |
| 1072 void irc_msg_ignore(struct irc_conn *irc, const char *name, const char *from, char **args) | |
| 1073 { | |
| 1074 return; | |
| 1075 } |
