libgaim/protocols/irc/parse.c

Sat, 28 Oct 2006 20:04:03 +0000

author
Mark Doliner <markdoliner@pidgin.im>
date
Sat, 28 Oct 2006 20:04:03 +0000
changeset 14899
c65f0b4fb351
parent 14683
55a2140b4471
child 14984
aa56a88dc792
permissions
-rw-r--r--

[gaim-migrate @ 17606]
Add a "handle" parameter to gaim_proxy_connect(). It seemed like
people thought this was a good idea. You can still cancel
each gaim_proxy_connect() individually, if needed. I passed in
NULL for the handle in most places. It might be better to pass
in the gc in more places, but these changes do no harm, and they
should help some Yahoo! things, and I wanted to get the API change in.

6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
1 /**
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
2 * @file parse.c
8351
216d9836e839 [gaim-migrate @ 9075]
Tim Ringenbach <marv@pidgin.im>
parents: 8114
diff changeset
3 *
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
4 * gaim
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
5 *
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
6 * Copyright (C) 2003, Ethan Blanton <eblanton@cs.purdue.edu>
8351
216d9836e839 [gaim-migrate @ 9075]
Tim Ringenbach <marv@pidgin.im>
parents: 8114
diff changeset
7 *
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
11 * (at your option) any later version.
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
12 *
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
16 * GNU General Public License for more details.
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
17 *
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
21 */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
22
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
23 #include "internal.h"
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
24
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
25 #include "accountopt.h"
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
26 #include "conversation.h"
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
27 #include "notify.h"
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
28 #include "debug.h"
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
29 #include "util.h"
9130
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
30 #include "cmds.h"
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
31 #include "irc.h"
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
32
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
33 #include <stdio.h>
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
34 #include <stdlib.h>
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
35 #include <ctype.h>
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
36
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
37 static char *irc_send_convert(struct irc_conn *irc, const char *string);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
38 static char *irc_recv_convert(struct irc_conn *irc, const char *string);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
39
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
40 static void irc_parse_error_cb(struct irc_conn *irc, char *input);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
41
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
42 static char *irc_mirc_colors[16] = {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
43 "white", "black", "blue", "dark green", "red", "brown", "purple",
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
44 "orange", "yellow", "green", "teal", "cyan", "light blue",
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
45 "pink", "grey", "light grey" };
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
46
14683
55a2140b4471 [gaim-migrate @ 17350]
Sean Egan <seanegan@pidgin.im>
parents: 14544
diff changeset
47 extern GaimPlugin *_irc_plugin;
55a2140b4471 [gaim-migrate @ 17350]
Sean Egan <seanegan@pidgin.im>
parents: 14544
diff changeset
48
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
49 /*typedef void (*IRCMsgCallback)(struct irc_conn *irc, char *from, char *name, char **args);*/
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
50 static struct _irc_msg {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
51 char *name;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
52 char *format;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
53 void (*cb)(struct irc_conn *irc, const char *name, const char *from, char **args);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
54 } _irc_msgs[] = {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
55 { "301", "nn:", irc_msg_away }, /* User is away */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
56 { "303", "n:", irc_msg_ison }, /* ISON reply */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
57 { "311", "nnvvv:", irc_msg_whois }, /* Whois user */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
58 { "312", "nnv:", irc_msg_whois }, /* Whois server */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
59 { "313", "nn:", irc_msg_whois }, /* Whois ircop */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
60 { "317", "nnvv", irc_msg_whois }, /* Whois idle */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
61 { "318", "nt:", irc_msg_endwhois }, /* End of WHOIS */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
62 { "319", "nn:", irc_msg_whois }, /* Whois channels */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
63 { "320", "nn:", irc_msg_whois }, /* Whois (fn ident) */
8114
201c03cf6c5f [gaim-migrate @ 8818]
Tim Ringenbach <marv@pidgin.im>
parents: 7981
diff changeset
64 { "321", "*", irc_msg_list }, /* Start of list */
201c03cf6c5f [gaim-migrate @ 8818]
Tim Ringenbach <marv@pidgin.im>
parents: 7981
diff changeset
65 { "322", "ncv:", irc_msg_list }, /* List. */
201c03cf6c5f [gaim-migrate @ 8818]
Tim Ringenbach <marv@pidgin.im>
parents: 7981
diff changeset
66 { "323", ":", irc_msg_list }, /* End of list. */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
67 { "324", "ncv:", irc_msg_chanmode }, /* Channel modes */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
68 { "331", "nc:", irc_msg_topic }, /* No channel topic */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
69 { "332", "nc:", irc_msg_topic }, /* Channel topic */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
70 { "333", "*", irc_msg_ignore }, /* Topic setter stuff */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
71 { "353", "nvc:", irc_msg_names }, /* Names list */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
72 { "366", "nc:", irc_msg_names }, /* End of names */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
73 { "372", "n:", irc_msg_motd }, /* MOTD */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
74 { "375", "n:", irc_msg_motd }, /* Start MOTD */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
75 { "376", "n:", irc_msg_endmotd }, /* End of MOTD */
10564
1ee5ae99711d [gaim-migrate @ 11946]
Don Seiler <rizzo@gentoo.org>
parents: 10504
diff changeset
76 { "391", "nv:", irc_msg_time }, /* Time reply */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
77 { "401", "nt:", irc_msg_nonick }, /* No such nick/chan */
7877
e523a7081aaf [gaim-migrate @ 8531]
Ethan Blanton <elb@pidgin.im>
parents: 7631
diff changeset
78 { "403", "nc:", irc_msg_nochan }, /* No such channel */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
79 { "404", "nt:", irc_msg_nosend }, /* Cannot send to chan */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
80 { "421", "nv:", irc_msg_unknown }, /* Unknown command */
6350
22dfc953f2fb [gaim-migrate @ 6849]
Ethan Blanton <elb@pidgin.im>
parents: 6333
diff changeset
81 { "422", "nv:", irc_msg_endmotd }, /* No MOTD available */
10633
ac455de21138 [gaim-migrate @ 12113]
Ethan Blanton <elb@pidgin.im>
parents: 10609
diff changeset
82 { "432", "vn:", irc_msg_badnick }, /* Erroneous nickname */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
83 { "433", "vn:", irc_msg_nickused }, /* Nickname already in use */
10712
2aded9e9abd4 [gaim-migrate @ 12306]
Richard Laager <rlaager@pidgin.im>
parents: 10659
diff changeset
84 { "437", "nc:", irc_msg_unavailable }, /* Nick/channel is unavailable */
6718
c535c7b09353 [gaim-migrate @ 7245]
Ethan Blanton <elb@pidgin.im>
parents: 6714
diff changeset
85 { "438", "nn:", irc_msg_nochangenick }, /* Nick may not change */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
86 { "442", "nc:", irc_msg_notinchan }, /* Not in channel */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
87 { "473", "nc:", irc_msg_inviteonly }, /* Tried to join invite-only */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
88 { "474", "nc:", irc_msg_banned }, /* Banned from channel */
10659
caf16376fba0 [gaim-migrate @ 12192]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10633
diff changeset
89 { "478", "nct:", irc_msg_banfull }, /* Banlist is full */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
90 { "482", "nc:", irc_msg_notop }, /* Need to be op to do that */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
91 { "501", "n:", irc_msg_badmode }, /* Unknown mode flag */
8404
2b915285a294 [gaim-migrate @ 9134]
Tim Ringenbach <marv@pidgin.im>
parents: 8351
diff changeset
92 { "506", "nc:", irc_msg_nosend }, /* Must identify to send */
6714
414a52265486 [gaim-migrate @ 7240]
Ethan Blanton <elb@pidgin.im>
parents: 6415
diff changeset
93 { "515", "nc:", irc_msg_regonly }, /* Registration required */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
94 { "invite", "n:", irc_msg_invite }, /* Invited */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
95 { "join", ":", irc_msg_join }, /* Joined a channel */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
96 { "kick", "cn:", irc_msg_kick }, /* KICK */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
97 { "mode", "tv:", irc_msg_mode }, /* MODE for channel */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
98 { "nick", ":", irc_msg_nick }, /* Nick change */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
99 { "notice", "t:", irc_msg_notice }, /* NOTICE recv */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
100 { "part", "c:", irc_msg_part }, /* Parted a channel */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
101 { "ping", ":", irc_msg_ping }, /* Received PING from server */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
102 { "pong", "v:", irc_msg_pong }, /* Received PONG from server */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
103 { "privmsg", "t:", irc_msg_privmsg }, /* Received private message */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
104 { "topic", "c:", irc_msg_topic }, /* TOPIC command */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
105 { "quit", ":", irc_msg_quit }, /* QUIT notice */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
106 { "wallops", ":", irc_msg_wallops }, /* WALLOPS command */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
107 { NULL, NULL, NULL }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
108 };
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
109
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
110 static struct _irc_user_cmd {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
111 char *name;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
112 char *format;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
113 IRCCmdCallback cb;
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
114 char *help;
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
115 } _irc_cmds[] = {
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
116 { "action", ":", irc_cmd_ctcp_action, N_("action &lt;action to perform&gt;: Perform an action.") },
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
117 { "away", ":", irc_cmd_away, N_("away [message]: Set an away message, or use no message to return from being away.") },
12013
1d736fce4bba [gaim-migrate @ 14306]
Joao Luís Marques Pinto
parents: 11972
diff changeset
118 { "chanserv", ":", irc_cmd_service, N_("chanserv: Send a command to chanserv") },
9258
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
119 { "deop", ":", irc_cmd_op, N_("deop &lt;nick1&gt; [nick2] ...: Remove channel operator status from someone. You must be a channel operator to do this.") },
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
120 { "devoice", ":", irc_cmd_op, N_("devoice &lt;nick1&gt; [nick2] ...: Remove channel voice status from someone, preventing them from speaking if the channel is moderated (+m). You must be a channel operator to do this.") },
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
121 { "invite", ":", irc_cmd_invite, N_("invite &lt;nick&gt; [room]: Invite someone to join you in the specified channel, or the current channel.") },
9266
7faef3a8a890 [gaim-migrate @ 10065]
Tim Ringenbach <marv@pidgin.im>
parents: 9258
diff changeset
122 { "j", "cv", irc_cmd_join, N_("j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]: Enter one or more channels, optionally providing a channel key for each if needed.") },
7faef3a8a890 [gaim-migrate @ 10065]
Tim Ringenbach <marv@pidgin.im>
parents: 9258
diff changeset
123 { "join", "cv", irc_cmd_join, N_("join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]: Enter one or more channels, optionally providing a channel key for each if needed.") },
9258
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
124 { "kick", "n:", irc_cmd_kick, N_("kick &lt;nick&gt; [message]: Remove someone from a channel. You must be a channel operator to do this.") },
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
125 { "list", ":", irc_cmd_list, N_("list: Display a list of chat rooms on the network. <i>Warning, some servers may disconnect you upon doing this.</i>") },
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
126 { "me", ":", irc_cmd_ctcp_action, N_("me &lt;action to perform&gt;: Perform an action.") },
12013
1d736fce4bba [gaim-migrate @ 14306]
Joao Luís Marques Pinto
parents: 11972
diff changeset
127 { "memoserv", ":", irc_cmd_service, N_("memoserv: Send a command to memoserv") },
10609
170a5af61448 [gaim-migrate @ 12055]
Richard Laager <rlaager@pidgin.im>
parents: 10564
diff changeset
128 { "mode", ":", irc_cmd_mode, N_("mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;: Set or unset a channel or user mode.") },
9258
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
129 { "msg", "t:", irc_cmd_privmsg, N_("msg &lt;nick&gt; &lt;message&gt;: Send a private message to a user (as opposed to a channel).") },
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
130 { "names", "c", irc_cmd_names, N_("names [channel]: List the users currently in a channel.") },
9274
25119ad142d9 [gaim-migrate @ 10077]
Luke Schierer <lschiere@pidgin.im>
parents: 9266
diff changeset
131 { "nick", "n", irc_cmd_nick, N_("nick &lt;new nickname&gt;: Change your nickname.") },
12013
1d736fce4bba [gaim-migrate @ 14306]
Joao Luís Marques Pinto
parents: 11972
diff changeset
132 { "nickserv", ":", irc_cmd_service, N_("nickserv: Send a command to nickserv") },
9258
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
133 { "op", ":", irc_cmd_op, N_("op &lt;nick1&gt; [nick2] ...: Grant channel operator status to someone. You must be a channel operator to do this.") },
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
134 { "operwall", ":", irc_cmd_wallops, N_("operwall &lt;message&gt;: If you don't know what this is, you probably can't use it.") },
12013
1d736fce4bba [gaim-migrate @ 14306]
Joao Luís Marques Pinto
parents: 11972
diff changeset
135 { "operserv", ":", irc_cmd_service, N_("operserv: Send a command to operserv") },
9258
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
136 { "part", "c:", irc_cmd_part, N_("part [room] [message]: Leave the current channel, or a specified channel, with an optional message.") },
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
137 { "ping", "n", irc_cmd_ping, N_("ping [nick]: Asks how much lag a user (or the server if no user specified) has.") },
9258
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
138 { "query", "n:", irc_cmd_query, N_("query &lt;nick&gt; &lt;message&gt;: Send a private message to a user (as opposed to a channel).") },
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
139 { "quit", ":", irc_cmd_quit, N_("quit [message]: Disconnect from the server, with an optional message.") },
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
140 { "quote", "*", irc_cmd_quote, N_("quote [...]: Send a raw command to the server.") },
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
141 { "remove", "n:", irc_cmd_remove, N_("remove &lt;nick&gt; [message]: Remove someone from a room. You must be a channel operator to do this.") },
10564
1ee5ae99711d [gaim-migrate @ 11946]
Don Seiler <rizzo@gentoo.org>
parents: 10504
diff changeset
142 { "time", "", irc_cmd_time, N_("time: Displays the current local time at the IRC server.") },
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
143 { "topic", ":", irc_cmd_topic, N_("topic [new topic]: View or change the channel topic.") },
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
144 { "umode", ":", irc_cmd_mode, N_("umode &lt;+|-&gt;&lt;A-Za-z&gt;: Set or unset a user mode.") },
13943
79a311d7a211 [gaim-migrate @ 16361]
Ethan Blanton <elb@pidgin.im>
parents: 13005
diff changeset
145 { "version", ":", irc_cmd_ctcp_version, N_("version [nick]: send CTCP VERSION request to a user") },
9258
b1ec4d2ce369 [gaim-migrate @ 10057]
Tim Ringenbach <marv@pidgin.im>
parents: 9255
diff changeset
146 { "voice", ":", irc_cmd_op, N_("voice &lt;nick1&gt; [nick2] ...: Grant channel voice status to someone. You must be a channel operator to do this.") },
9255
2e003551403e [gaim-migrate @ 10054]
Tim Ringenbach <marv@pidgin.im>
parents: 9248
diff changeset
147 { "wallops", ":", irc_cmd_wallops, N_("wallops &lt;message&gt;: If you don't know what this is, you probably can't use it.") },
10609
170a5af61448 [gaim-migrate @ 12055]
Richard Laager <rlaager@pidgin.im>
parents: 10564
diff changeset
148 { "whois", "tt", irc_cmd_whois, N_("whois [server] &lt;nick&gt;: Get information on a user.") },
11318
13fa1d5134f3 [gaim-migrate @ 13521]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11136
diff changeset
149 { NULL, NULL, NULL, NULL }
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
150 };
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
151
9130
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
152 static GaimCmdRet irc_parse_gaim_cmd(GaimConversation *conv, const gchar *cmd,
9597
c6f672b593cb [gaim-migrate @ 10440]
Tim Ringenbach <marv@pidgin.im>
parents: 9442
diff changeset
153 gchar **args, gchar **error, void *data)
9130
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
154 {
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
155 GaimConnection *gc;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
156 struct irc_conn *irc;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
157 struct _irc_user_cmd *cmdent;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
158
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
159 gc = gaim_conversation_get_gc(conv);
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
160 if (!gc)
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
161 return GAIM_CMD_RET_FAILED;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
162
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
163 irc = gc->proto_data;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
164
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
165 if ((cmdent = g_hash_table_lookup(irc->cmds, cmd)) == NULL)
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
166 return GAIM_CMD_RET_FAILED;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
167
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
168 (cmdent->cb)(irc, cmd, gaim_conversation_get_name(conv), (const char **)args);
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
169
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
170 return GAIM_CMD_RET_OK;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
171 }
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
172
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
173 static void irc_register_command(struct _irc_user_cmd *c)
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
174 {
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
175 GaimCmdFlag f;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
176 char args[10];
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
177 char *format;
12316
b4e5d5ea15fd [gaim-migrate @ 14620]
Richard Laager <rlaager@pidgin.im>
parents: 12282
diff changeset
178 size_t i;
9130
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
179
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
180 f = GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_PRPL_ONLY
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
181 | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
182
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
183 format = c->format;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
184
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
185 for (i = 0; (i < (sizeof(args) - 1)) && *format; i++, format++)
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
186 switch (*format) {
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
187 case 'v':
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
188 case 'n':
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
189 case 'c':
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
190 case 't':
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
191 args[i] = 'w';
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
192 break;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
193 case ':':
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
194 case '*':
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
195 args[i] = 's';
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
196 break;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
197 }
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
198
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
199 args[i] = '\0';
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
200
9597
c6f672b593cb [gaim-migrate @ 10440]
Tim Ringenbach <marv@pidgin.im>
parents: 9442
diff changeset
201 gaim_cmd_register(c->name, args, GAIM_CMD_P_PRPL, f, "prpl-irc",
c6f672b593cb [gaim-migrate @ 10440]
Tim Ringenbach <marv@pidgin.im>
parents: 9442
diff changeset
202 irc_parse_gaim_cmd, _(c->help), NULL);
9130
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
203 }
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
204
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
205 void irc_register_commands(void)
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
206 {
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
207 struct _irc_user_cmd *c;
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
208
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
209 for (c = _irc_cmds; c && c->name; c++)
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
210 irc_register_command(c);
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
211 }
2e67295dd047 [gaim-migrate @ 9908]
Nathan Walp <nwalp@pidgin.im>
parents: 8954
diff changeset
212
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
213 static char *irc_send_convert(struct irc_conn *irc, const char *string)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
214 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
215 char *utf8;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
216 GError *err = NULL;
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
217 gchar **encodings;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
218 const gchar *enclist;
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
219
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
220 enclist = gaim_account_get_string(irc->account, "encoding", IRC_DEFAULT_CHARSET);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
221 encodings = g_strsplit(enclist, ",", 2);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
222
10278
8b2f32c72daf [gaim-migrate @ 11433]
Ethan Blanton <elb@pidgin.im>
parents: 10258
diff changeset
223 if (encodings[0] == NULL || !strcasecmp("UTF-8", encodings[0])) {
8b2f32c72daf [gaim-migrate @ 11433]
Ethan Blanton <elb@pidgin.im>
parents: 10258
diff changeset
224 g_strfreev(encodings);
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
225 return g_strdup(string);
10278
8b2f32c72daf [gaim-migrate @ 11433]
Ethan Blanton <elb@pidgin.im>
parents: 10258
diff changeset
226 }
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
227
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
228 utf8 = g_convert(string, strlen(string), encodings[0], "UTF-8", NULL, NULL, &err);
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
229 if (err) {
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
230 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Send conversion error: %s\n", err->message);
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
231 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Sending as UTF-8 instead of %s\n", encodings[0]);
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
232 utf8 = g_strdup(string);
8954
105094d38e3b [gaim-migrate @ 9727]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8627
diff changeset
233 g_error_free(err);
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
234 }
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
235 g_strfreev(encodings);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
236
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
237 return utf8;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
238 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
239
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
240 static char *irc_recv_convert(struct irc_conn *irc, const char *string)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
241 {
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
242 char *utf8 = NULL;
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
243 const gchar *charset, *enclist;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
244 gchar **encodings;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
245 int i;
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
246
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
247 enclist = gaim_account_get_string(irc->account, "encoding", IRC_DEFAULT_CHARSET);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
248 encodings = g_strsplit(enclist, ",", -1);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
249
10504
eae130eefbfe [gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10278
diff changeset
250 if (encodings[0] == NULL) {
eae130eefbfe [gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10278
diff changeset
251 g_strfreev(encodings);
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
252 return gaim_utf8_salvage(string);
10504
eae130eefbfe [gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10278
diff changeset
253 }
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
254
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
255 for (i = 0; encodings[i] != NULL; i++) {
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
256 charset = encodings[i];
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
257 while (*charset == ' ')
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
258 charset++;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
259
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
260 if (!strcasecmp("UTF-8", charset)) {
11726
6f319ff4cea5 [gaim-migrate @ 14017]
Richard Laager <rlaager@pidgin.im>
parents: 11318
diff changeset
261 if (g_utf8_validate(string, -1, NULL))
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
262 utf8 = g_strdup(string);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
263 } else {
11726
6f319ff4cea5 [gaim-migrate @ 14017]
Richard Laager <rlaager@pidgin.im>
parents: 11318
diff changeset
264 utf8 = g_convert(string, -1, "UTF-8", charset, NULL, NULL, NULL);
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
265 }
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
266
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
267 if (utf8) {
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
268 g_strfreev(encodings);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
269 return utf8;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
270 }
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
271 }
10504
eae130eefbfe [gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10278
diff changeset
272 g_strfreev(encodings);
9644
a9a0dedb52c7 [gaim-migrate @ 10492]
Mark Doliner <markdoliner@pidgin.im>
parents: 9597
diff changeset
273
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10208
diff changeset
274 return gaim_utf8_salvage(string);
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
275 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
276
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
277 /* XXX tag closings are not necessarily correctly nested here! If we
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
278 * get a ^O or reach the end of the string and there are open
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
279 * tags, they are closed in a fixed order ... this means, for
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
280 * example, you might see <FONT COLOR="blue">some text <B>with
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
281 * various attributes</FONT></B> (notice that B and FONT overlap
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
282 * and are not cleanly nested). This is imminently fixable but
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
283 * I am not fixing it right now.
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
284 */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
285 char *irc_mirc2html(const char *string)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
286 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
287 const char *cur, *end;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
288 char fg[3] = "\0\0", bg[3] = "\0\0";
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
289 int fgnum, bgnum;
12158
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
290 int font = 0, bold = 0, underline = 0, italic = 0;
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
291 GString *decoded = g_string_sized_new(strlen(string));
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
292
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
293 cur = string;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
294 do {
6754
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
295 end = strpbrk(cur, "\002\003\007\017\026\037");
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
296
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
297 decoded = g_string_append_len(decoded, cur, end ? end - cur : strlen(cur));
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
298 cur = end ? end : cur + strlen(cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
299
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
300 switch (*cur) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
301 case '\002':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
302 cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
303 if (!bold) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
304 decoded = g_string_append(decoded, "<B>");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
305 bold = TRUE;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
306 } else {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
307 decoded = g_string_append(decoded, "</B>");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
308 bold = FALSE;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
309 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
310 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
311 case '\003':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
312 cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
313 fg[0] = fg[1] = bg[0] = bg[1] = '\0';
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
314 if (isdigit(*cur))
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
315 fg[0] = *cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
316 if (isdigit(*cur))
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
317 fg[1] = *cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
318 if (*cur == ',') {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
319 cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
320 if (isdigit(*cur))
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
321 bg[0] = *cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
322 if (isdigit(*cur))
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
323 bg[1] = *cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
324 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
325 if (font) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
326 decoded = g_string_append(decoded, "</FONT>");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
327 font = FALSE;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
328 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
329
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
330 if (fg[0]) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
331 fgnum = atoi(fg);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
332 if (fgnum < 0 || fgnum > 15)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
333 continue;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
334 font = TRUE;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
335 g_string_append_printf(decoded, "<FONT COLOR=\"%s\"", irc_mirc_colors[fgnum]);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
336 if (bg[0]) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
337 bgnum = atoi(bg);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
338 if (bgnum >= 0 && bgnum < 16)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
339 g_string_append_printf(decoded, " BACK=\"%s\"", irc_mirc_colors[bgnum]);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
340 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
341 decoded = g_string_append_c(decoded, '>');
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
342 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
343 break;
12158
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
344 case '\011':
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
345 cur++;
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
346 if (!italic) {
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
347 decoded = g_string_append(decoded, "<I>");
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
348 italic = TRUE;
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
349 } else {
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
350 decoded = g_string_append(decoded, "</I>");
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
351 italic = FALSE;
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
352 }
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
353 break;
6754
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
354 case '\037':
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
355 cur++;
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
356 if (!underline) {
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
357 decoded = g_string_append(decoded, "<U>");
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
358 underline = TRUE;
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
359 } else {
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
360 decoded = g_string_append(decoded, "</U>");
12282
6ea716514a28 [gaim-migrate @ 14586]
Etan Reisner <deryni@pidgin.im>
parents: 12158
diff changeset
361 underline = FALSE;
6754
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
362 }
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
363 break;
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
364 case '\007':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
365 case '\026':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
366 cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
367 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
368 case '\017':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
369 cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
370 /* fallthrough */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
371 case '\000':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
372 if (bold)
6754
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
373 decoded = g_string_append(decoded, "</B>");
12158
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
374 if (italic)
02fcec741f07 [gaim-migrate @ 14459]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 12013
diff changeset
375 decoded = g_string_append(decoded, "</I>");
6754
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
376 if (underline)
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
377 decoded = g_string_append(decoded, "</U>");
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
378 if (font)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
379 decoded = g_string_append(decoded, "</FONT>");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
380 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
381 default:
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
382 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Unexpected mIRC formatting character %d\n", *cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
383 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
384 } while (*cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
385
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
386 return g_string_free(decoded, FALSE);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
387 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
388
8529
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
389 char *irc_mirc2txt (const char *string)
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
390 {
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
391 char *result = g_strdup (string);
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
392 int i, j;
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
393
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
394 for (i = 0, j = 0; result[i]; i++) {
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
395 switch (result[i]) {
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
396 case '\002':
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
397 case '\003':
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
398 case '\007':
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
399 case '\017':
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
400 case '\026':
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
401 case '\037':
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
402 continue;
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
403 default:
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
404 result[j++] = result[i];
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
405 }
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
406 }
11136
2a293cd4ffa7 [gaim-migrate @ 13200]
Ethan Blanton <elb@pidgin.im>
parents: 10712
diff changeset
407 result[j] = '\0';
8529
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
408 return result;
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
409 }
a598c585c575 [gaim-migrate @ 9268]
Ethan Blanton <elb@pidgin.im>
parents: 8404
diff changeset
410
10208
b6cafee18b0d [gaim-migrate @ 11330]
Ethan Blanton <elb@pidgin.im>
parents: 10154
diff changeset
411 gboolean irc_ischannel(const char *string)
b6cafee18b0d [gaim-migrate @ 11330]
Ethan Blanton <elb@pidgin.im>
parents: 10154
diff changeset
412 {
b6cafee18b0d [gaim-migrate @ 11330]
Ethan Blanton <elb@pidgin.im>
parents: 10154
diff changeset
413 return (string[0] == '#' || string[0] == '&');
b6cafee18b0d [gaim-migrate @ 11330]
Ethan Blanton <elb@pidgin.im>
parents: 10154
diff changeset
414 }
b6cafee18b0d [gaim-migrate @ 11330]
Ethan Blanton <elb@pidgin.im>
parents: 10154
diff changeset
415
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
416 char *irc_parse_ctcp(struct irc_conn *irc, const char *from, const char *to, const char *msg, int notice)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
417 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
418 GaimConnection *gc;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
419 const char *cur = msg + 1;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
420 char *buf, *ctcp;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
421 time_t timestamp;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
422
6754
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
423 /* Note that this is NOT correct w.r.t. multiple CTCPs in one
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
424 * message and low-level quoting ... but if you want that crap,
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
425 * use a real IRC client. */
f4aef15e9a8d [gaim-migrate @ 7286]
Ethan Blanton <elb@pidgin.im>
parents: 6718
diff changeset
426
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
427 if (msg[0] != '\001' || msg[strlen(msg) - 1] != '\001')
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
428 return g_strdup(msg);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
429
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
430 if (!strncmp(cur, "ACTION ", 7)) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
431 cur += 7;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
432 buf = g_strdup_printf("/me %s", cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
433 buf[strlen(buf) - 1] = '\0';
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
434 return buf;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
435 } else if (!strncmp(cur, "PING ", 5)) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
436 if (notice) { /* reply */
11972
23ac6d9de1fa [gaim-migrate @ 14265]
Mark Doliner <markdoliner@pidgin.im>
parents: 11726
diff changeset
437 /* TODO: Should this read in the timestamp as a double? */
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
438 sscanf(cur, "PING %lu", &timestamp);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
439 gc = gaim_account_get_connection(irc->account);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
440 if (!gc)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
441 return NULL;
6350
22dfc953f2fb [gaim-migrate @ 6849]
Ethan Blanton <elb@pidgin.im>
parents: 6333
diff changeset
442 buf = g_strdup_printf(_("Reply time from %s: %lu seconds"), from, time(NULL) - timestamp);
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
443 gaim_notify_info(gc, _("PONG"), _("CTCP PING reply"), buf);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
444 g_free(buf);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
445 return NULL;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
446 } else {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
447 buf = irc_format(irc, "vt:", "NOTICE", from, msg);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
448 irc_send(irc, buf);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
449 g_free(buf);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
450 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
451 } else if (!strncmp(cur, "VERSION", 7) && !notice) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
452 buf = irc_format(irc, "vt:", "NOTICE", from, "\001VERSION Gaim IRC\001");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
453 irc_send(irc, buf);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
454 g_free(buf);
8351
216d9836e839 [gaim-migrate @ 9075]
Tim Ringenbach <marv@pidgin.im>
parents: 8114
diff changeset
455 } else if (!strncmp(cur, "DCC SEND ", 9)) {
216d9836e839 [gaim-migrate @ 9075]
Tim Ringenbach <marv@pidgin.im>
parents: 8114
diff changeset
456 irc_dccsend_recv(irc, from, msg + 10);
216d9836e839 [gaim-migrate @ 9075]
Tim Ringenbach <marv@pidgin.im>
parents: 8114
diff changeset
457 return NULL;
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
458 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
459
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
460 ctcp = g_strdup(msg + 1);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
461 ctcp[strlen(ctcp) - 1] = '\0';
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
462 buf = g_strdup_printf("Received CTCP '%s' (to %s) from %s", ctcp, to, from);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
463 g_free(ctcp);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
464 return buf;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
465 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
466
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
467 void irc_msg_table_build(struct irc_conn *irc)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
468 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
469 int i;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
470
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
471 if (!irc || !irc->msgs) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
472 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Attempt to build a message table on a bogus structure\n");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
473 return;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
474 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
475
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
476 for (i = 0; _irc_msgs[i].name; i++) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
477 g_hash_table_insert(irc->msgs, (gpointer)_irc_msgs[i].name, (gpointer)&_irc_msgs[i]);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
478 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
479 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
480
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
481 void irc_cmd_table_build(struct irc_conn *irc)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
482 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
483 int i;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
484
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
485 if (!irc || !irc->cmds) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
486 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Attempt to build a command table on a bogus structure\n");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
487 return;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
488 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
489
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
490 for (i = 0; _irc_cmds[i].name ; i++) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
491 g_hash_table_insert(irc->cmds, (gpointer)_irc_cmds[i].name, (gpointer)&_irc_cmds[i]);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
492 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
493 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
494
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
495 char *irc_format(struct irc_conn *irc, const char *format, ...)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
496 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
497 GString *string = g_string_new("");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
498 char *tok, *tmp;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
499 const char *cur;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
500 va_list ap;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
501
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
502 va_start(ap, format);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
503 for (cur = format; *cur; cur++) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
504 if (cur != format)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
505 g_string_append_c(string, ' ');
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
506
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
507 tok = va_arg(ap, char *);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
508 switch (*cur) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
509 case 'v':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
510 g_string_append(string, tok);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
511 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
512 case ':':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
513 g_string_append_c(string, ':');
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
514 /* no break! */
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
515 case 't':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
516 case 'n':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
517 case 'c':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
518 tmp = irc_send_convert(irc, tok);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
519 g_string_append(string, tmp);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
520 g_free(tmp);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
521 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
522 default:
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
523 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Invalid format character '%c'\n", *cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
524 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
525 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
526 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
527 va_end(ap);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
528 g_string_append(string, "\r\n");
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
529 return (g_string_free(string, FALSE));
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
530 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
531
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
532 void irc_parse_msg(struct irc_conn *irc, char *input)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
533 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
534 struct _irc_msg *msgent;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
535 char *cur, *end, *tmp, *from, *msgname, *fmt, **args, *msg;
7631
0e9e516bb6c3 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 6970
diff changeset
536 guint i;
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
537
14544
847944da3ca0 [gaim-migrate @ 17201]
Daniel Atallah <datallah@pidgin.im>
parents: 14254
diff changeset
538 irc->recv_time = time(NULL);
14683
55a2140b4471 [gaim-migrate @ 17350]
Sean Egan <seanegan@pidgin.im>
parents: 14544
diff changeset
539 gaim_signal_emit(_irc_plugin, "irc-receiving-text", gaim_account_get_connection(irc->account), &input);
55a2140b4471 [gaim-migrate @ 17350]
Sean Egan <seanegan@pidgin.im>
parents: 14544
diff changeset
540
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
541 if (!strncmp(input, "PING ", 5)) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
542 msg = irc_format(irc, "vv", "PONG", input + 5);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
543 irc_send(irc, msg);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
544 g_free(msg);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
545 return;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
546 } else if (!strncmp(input, "ERROR ", 6)) {
10154
b415e4433117 [gaim-migrate @ 11233]
Tim Ringenbach <marv@pidgin.im>
parents: 9644
diff changeset
547 if (g_utf8_validate(input, -1, NULL)) {
b415e4433117 [gaim-migrate @ 11233]
Tim Ringenbach <marv@pidgin.im>
parents: 9644
diff changeset
548 char *tmp = g_strdup_printf("%s\n%s", _("Disconnected."), input);
b415e4433117 [gaim-migrate @ 11233]
Tim Ringenbach <marv@pidgin.im>
parents: 9644
diff changeset
549 gaim_connection_error(gaim_account_get_connection(irc->account), tmp);
b415e4433117 [gaim-migrate @ 11233]
Tim Ringenbach <marv@pidgin.im>
parents: 9644
diff changeset
550 g_free(tmp);
b415e4433117 [gaim-migrate @ 11233]
Tim Ringenbach <marv@pidgin.im>
parents: 9644
diff changeset
551 } else
b415e4433117 [gaim-migrate @ 11233]
Tim Ringenbach <marv@pidgin.im>
parents: 9644
diff changeset
552 gaim_connection_error(gaim_account_get_connection(irc->account), _("Disconnected."));
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
553 return;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
554 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
555
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
556 if (input[0] != ':' || (cur = strchr(input, ' ')) == NULL) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
557 irc_parse_error_cb(irc, input);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
558 return;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
559 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
560
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
561 from = g_strndup(&input[1], cur - &input[1]);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
562 cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
563 end = strchr(cur, ' ');
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
564 if (!end)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
565 end = cur + strlen(cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
566
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
567 tmp = g_strndup(cur, end - cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
568 msgname = g_ascii_strdown(tmp, -1);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
569 g_free(tmp);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
570
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
571 if ((msgent = g_hash_table_lookup(irc->msgs, msgname)) == NULL) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
572 irc_msg_default(irc, "", from, &input);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
573 g_free(msgname);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
574 g_free(from);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
575 return;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
576 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
577 g_free(msgname);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
578
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
579 args = g_new0(char *, strlen(msgent->format));
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
580 for (cur = end, fmt = msgent->format, i = 0; fmt[i] && *cur++; i++) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
581 switch (fmt[i]) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
582 case 'v':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
583 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
584 args[i] = g_strndup(cur, end - cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
585 cur += end - cur;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
586 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
587 case 't':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
588 case 'n':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
589 case 'c':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
590 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
591 tmp = g_strndup(cur, end - cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
592 args[i] = irc_recv_convert(irc, tmp);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
593 g_free(tmp);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
594 cur += end - cur;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
595 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
596 case ':':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
597 if (*cur == ':') cur++;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
598 args[i] = irc_recv_convert(irc, cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
599 cur = cur + strlen(cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
600 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
601 case '*':
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
602 args[i] = g_strdup(cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
603 cur = cur + strlen(cur);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
604 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
605 default:
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
606 gaim_debug(GAIM_DEBUG_ERROR, "irc", "invalid message format character '%c'\n", fmt[i]);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
607 break;
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
608 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
609 }
6970
3a1c6fb673f7 [gaim-migrate @ 7517]
Ethan Blanton <elb@pidgin.im>
parents: 6754
diff changeset
610 tmp = irc_recv_convert(irc, from);
3a1c6fb673f7 [gaim-migrate @ 7517]
Ethan Blanton <elb@pidgin.im>
parents: 6754
diff changeset
611 (msgent->cb)(irc, msgent->name, tmp, args);
3a1c6fb673f7 [gaim-migrate @ 7517]
Ethan Blanton <elb@pidgin.im>
parents: 6754
diff changeset
612 g_free(tmp);
6333
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
613 for (i = 0; i < strlen(msgent->format); i++) {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
614 g_free(args[i]);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
615 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
616 g_free(args);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
617 g_free(from);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
618 }
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
619
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
620 static void irc_parse_error_cb(struct irc_conn *irc, char *input)
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
621 {
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
622 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unrecognized string: %s\n", input);
551f4a5b3c33 [gaim-migrate @ 6832]
Robert McQueen <robot101@debian.org>
parents:
diff changeset
623 }

mercurial