Mercurial > pidgin
annotate src/protocols/irc/irc.c @ 4349:0c68d402f59f
[gaim-migrate @ 4614]
XML Blist
Gaim stores all the buddy lists in one big happy file now. You can order
the buddies however you want, and they'll stay ordered that way.
We can also store some per-buddy information now, which will be cool.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sun, 19 Jan 2003 22:16:52 +0000 |
parents | 9c7fcb211886 |
children | 5fb47ec9bfe4 |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim - IRC Protocol Plugin | |
3 * | |
4 * Copyright (C) 2000-2001, Rob Flynn <rob@tgflinux.com> | |
5 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
2290
23c06449ae8e
[gaim-migrate @ 2300]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2289
diff
changeset
|
6 * |
23c06449ae8e
[gaim-migrate @ 2300]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2289
diff
changeset
|
7 * A large portion of this was copied more or less directly from X-Chat, |
23c06449ae8e
[gaim-migrate @ 2300]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2289
diff
changeset
|
8 * the world's most rocking IRC client. http://www.xchat.org/ |
2086 | 9 * |
10 * This program is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
23 * | |
24 */ | |
25 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
26 #include <config.h> |
2086 | 27 |
3630 | 28 #ifndef _WIN32 |
29 #include <unistd.h> | |
30 #else | |
31 #include <winsock.h> | |
32 #endif | |
33 | |
3029 | 34 #include <fcntl.h> |
2086 | 35 #include <errno.h> |
36 #include <string.h> | |
37 #include <stdlib.h> | |
38 #include <stdio.h> | |
3867 | 39 #include <sys/time.h> |
2086 | 40 #include <time.h> |
41 #include <sys/stat.h> | |
42 #include <ctype.h> | |
43 #include "multi.h" | |
44 #include "prpl.h" | |
45 #include "gaim.h" | |
46 #include "proxy.h" | |
47 | |
3630 | 48 #ifdef _WIN32 |
49 #include "win32dep.h" | |
50 #endif | |
51 | |
3580 | 52 #include "pixmaps/protocols/irc/irc_icon.xpm" |
2086 | 53 |
54 #define IRC_BUF_LEN 4096 | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
55 #define PDIWORDS 32 |
2086 | 56 |
57 #define USEROPT_SERV 0 | |
58 #define USEROPT_PORT 1 | |
3751 | 59 #define USEROPT_CHARSET 2 |
2086 | 60 |
4249 | 61 static struct prpl *my_protocol = NULL; |
62 | |
3630 | 63 /* for win32 compatability */ |
64 G_MODULE_IMPORT GSList *connections; | |
65 | |
66 | |
3751 | 67 /* Datastructs */ |
3029 | 68 struct dcc_chat |
69 { | |
70 struct gaim_connection *gc; | |
71 char ip_address[12]; | |
72 int port; | |
73 int fd; | |
74 int inpa; | |
75 char nick[80]; | |
76 }; | |
77 | |
3616 | 78 struct irc_file_transfer { |
3708 | 79 enum { IFT_SENDFILE_IN, IFT_SENDFILE_OUT } type; |
80 struct file_transfer *xfer; | |
81 char *sn; | |
82 char *name; | |
83 int len; | |
84 int watcher; | |
85 int awatcher; | |
86 char ip[12]; | |
87 int port; | |
88 int fd; | |
89 int cur; | |
90 struct gaim_connection *gc; | |
3616 | 91 }; |
92 | |
2086 | 93 struct irc_data { |
94 int fd; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
95 gboolean online; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
96 guint32 timer; |
2086 | 97 |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
98 char *rxqueue; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
99 int rxlen; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
100 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
101 GString *str; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
102 int bc; |
2086 | 103 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
104 char *chantypes; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
105 char *chanmodes; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
106 char *nickmodes; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
107 gboolean six_modes; |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
108 |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
109 gboolean in_whois; |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
110 gboolean in_list; |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
111 GString *liststr; |
3616 | 112 GSList *file_transfers; |
2086 | 113 }; |
114 | |
3751 | 115 /* Prototypes */ |
116 static void irc_start_chat(struct gaim_connection *gc, char *who); | |
117 static void irc_ctcp_clientinfo(struct gaim_connection *gc, char *who); | |
118 static void irc_ctcp_userinfo(struct gaim_connection *gc, char *who); | |
119 static void irc_ctcp_version(struct gaim_connection *gc, char *who); | |
120 static void irc_ctcp_ping(struct gaim_connection *gc, char *who); | |
121 | |
122 static void irc_send_privmsg(struct gaim_connection *gc, char *who, char *what, gboolean fragment); | |
123 static void irc_send_notice(struct gaim_connection *gc, char *who, char *what); | |
124 | |
125 static char *irc_send_convert(struct gaim_connection *gc, char *string, int maxlen, int *done); | |
126 static char *irc_recv_convert(struct gaim_connection *gc, char *string); | |
127 static void irc_parse_notice(struct gaim_connection *gc, char *nick, char *ex, | |
128 char *word[], char *word_eol[]); | |
129 static void irc_parse_join(struct gaim_connection *gc, char *nick, | |
130 char *word[], char *word_eol[]); | |
131 static gboolean irc_parse_part(struct gaim_connection *gc, char *nick, char *cmd, | |
132 char *word[], char *word_eol[]); | |
133 static void irc_parse_topic(struct gaim_connection *gc, char *nick, | |
134 char *word[], char *word_eol[]); | |
135 | |
136 static void dcc_chat_cancel(struct dcc_chat *); | |
137 | |
138 /* Global variables */ | |
139 GSList *dcc_chat_list = NULL; | |
140 | |
3029 | 141 struct dcc_chat * |
142 find_dcc_chat (struct gaim_connection *gc, char *nick) | |
143 { | |
144 GSList *tmp; | |
145 struct dcc_chat *data; | |
146 tmp = dcc_chat_list; | |
147 while (tmp != NULL) | |
148 { | |
149 data = (struct dcc_chat *) (tmp)->data; | |
150 if (data | |
151 && data->nick | |
152 && strcmp (nick, data->nick) == 0 | |
153 && gc == data->gc) | |
154 { | |
155 return data; | |
156 } | |
157 tmp = tmp->next; | |
158 } | |
159 return NULL; | |
160 } | |
161 | |
3751 | 162 static int |
163 irc_write(int fd, char *data, int len) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
164 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
165 debug_printf("IRC C: %s", data); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
166 return write(fd, data, len); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
167 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
168 |
3751 | 169 static char * |
170 irc_send_convert(struct gaim_connection *gc, char *string, int maxlen, int *done) | |
171 { | |
172 char *converted = g_malloc(maxlen + 1); | |
173 gchar *inptr = string, *outptr = converted; | |
174 int inleft = strlen(string), outleft = maxlen; | |
175 GIConv conv; | |
176 | |
177 conv = g_iconv_open(gc->user->proto_opt[USEROPT_CHARSET], "UTF-8"); | |
178 if (g_iconv(conv, &inptr, &inleft, &outptr, &outleft) == -1) { | |
179 debug_printf("IRC charset conversion error\n"); | |
180 debug_printf("Sending as UTF-8 (this is a hack!)\n"); | |
181 g_free(converted); | |
182 *done = maxlen; | |
183 return(g_strndup(string, maxlen)); | |
184 } | |
185 | |
186 *done = strlen(string) - inleft; | |
187 *outptr = '\0'; | |
188 return(converted); | |
189 } | |
190 | |
191 static char * | |
192 irc_recv_convert(struct gaim_connection *gc, char *string) | |
193 { | |
194 char *utf8; | |
195 GError *err = NULL; | |
196 | |
197 utf8 = g_convert(string, strlen(string), "UTF-8", | |
198 gc->user->proto_opt[USEROPT_CHARSET], NULL, NULL, &err); | |
199 if (err) { | |
200 debug_printf("IRC recv conversion error: %s\n", err->message); | |
201 utf8 = g_strdup(_("(There was an error converting this message. Check the 'Encoding' option in the Account Editor)")); | |
202 } | |
203 | |
204 return (utf8); | |
205 } | |
206 | |
207 static struct conversation * | |
208 irc_find_chat(struct gaim_connection *gc, char *name) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
209 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
210 GSList *bcs = gc->buddy_chats; |
2086 | 211 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
212 while (bcs) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
213 struct conversation *b = bcs->data; |
2331
1ea2792b6004
[gaim-migrate @ 2343]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2328
diff
changeset
|
214 if (!g_strcasecmp(b->name, name)) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
215 return b; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
216 bcs = bcs->next; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
217 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
218 return NULL; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
219 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
220 |
3751 | 221 static struct conversation * |
222 irc_find_chat_by_id(struct gaim_connection *gc, int id) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
223 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
224 GSList *bcs = gc->buddy_chats; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
225 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
226 while (bcs) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
227 struct conversation *b = bcs->data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
228 if (b->id == id) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
229 return b; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
230 bcs = bcs->next; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
231 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
232 return NULL; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
233 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
234 |
3751 | 235 static void |
236 process_data_init(char *buf, char *cmd, char *word[], char *eol[], gboolean quotes) | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
237 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
238 int wordcount = 2; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
239 gboolean space = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
240 gboolean quote = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
241 int j = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
242 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
243 word[1] = cmd; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
244 eol[1] = buf; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
245 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
246 while (TRUE) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
247 switch (*cmd) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
248 case 0: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
249 buf[j] = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
250 for (j = wordcount; j < PDIWORDS; j++) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
251 word[j] = "\000\000"; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
252 eol[j] = "\000\000"; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
253 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
254 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
255 case '"': |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
256 if (!quotes) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
257 space = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
258 buf[j++] = *cmd; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
259 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
260 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
261 quote = !quote; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
262 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
263 case ' ': |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
264 if (quote) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
265 space = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
266 buf[j++] = *cmd; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
267 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
268 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
269 if (space) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
270 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
271 buf[j++] = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
272 word[wordcount] = &buf[j]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
273 eol[wordcount++] = cmd + 1; |
2294
b6c6603a8915
[gaim-migrate @ 2304]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2293
diff
changeset
|
274 if (wordcount == PDIWORDS - 1) { |
b6c6603a8915
[gaim-migrate @ 2304]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2293
diff
changeset
|
275 buf[j] = 0; |
b6c6603a8915
[gaim-migrate @ 2304]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2293
diff
changeset
|
276 return; |
b6c6603a8915
[gaim-migrate @ 2304]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2293
diff
changeset
|
277 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
278 space = TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
279 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
280 default: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
281 space = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
282 buf[j++] = *cmd; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
283 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
284 cmd++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
285 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
286 } |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
287 |
3751 | 288 static void |
289 handle_005(struct gaim_connection *gc, char *word[], char *word_eol[]) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
290 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
291 int w = 4; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
292 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
293 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
294 while (w < PDIWORDS && *word[w]) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
295 if (!strncmp(word[w], "MODES=", 5)) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
296 if (atoi(word[w] + 6) >= 6) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
297 id->six_modes = TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
298 } else if (!strncmp(word[w], "CHANTYPES=", 10)) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
299 g_free(id->chantypes); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
300 id->chantypes = g_strdup(word[w] + 10); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
301 } else if (!strncmp(word[w], "CHANMODES=", 10)) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
302 g_free(id->chanmodes); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
303 id->chanmodes = g_strdup(word[w] + 10); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
304 } else if (!strncmp(word[w], "PREFIX=", 7)) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
305 char *pre = strchr(word[w] + 7, ')'); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
306 if (pre) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
307 *pre = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
308 g_free(id->nickmodes); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
309 id->nickmodes = g_strdup(word[w] + 8); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
310 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
311 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
312 w++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
313 } |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
314 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
315 |
4221 | 316 static const char *irc_colors[] = { |
317 "#000000", "#ffffff", "#000066", "#006600", | |
318 "#ff0000", "#660000", "#660066", "#666600", | |
319 "#cccc00", "#33cc33", "#00acac", "#00ccac", | |
320 "#0000ff", "#cc00cc", "#666666", "#00ccac" | |
321 }; | |
322 | |
323 #define int_to_col(c) (irc_colors[(((c)<0 || (c)> 15)?0:c)]) | |
2086 | 324 |
3751 | 325 static GString * |
326 encode_html(char *msg) | |
3029 | 327 { |
328 GString *str = g_string_new(""); | |
329 char *cur = msg, *end = msg; | |
330 gboolean bold = FALSE, underline = FALSE, italics = FALSE; | |
331 | |
332 while ((end = strchr(cur, '<'))) { | |
333 *end = 0; | |
334 str = g_string_append(str, cur); | |
335 cur = ++end; | |
336 if (!g_strncasecmp(cur, "B>", 2)) { | |
3063 | 337 if (!bold) { |
338 bold = TRUE; | |
339 str = g_string_append_c(str, '\2'); | |
340 } | |
3029 | 341 cur = cur + 2; |
342 } else if (!g_strncasecmp(cur, "I>", 2)) { /* use bold for italics too */ | |
3063 | 343 if (!italics) { |
344 italics = TRUE; | |
345 str = g_string_append_c(str, '\2'); | |
346 } | |
3029 | 347 cur = cur + 2; |
348 } else if (!g_strncasecmp(cur, "U>", 2)) { | |
3063 | 349 if (!underline) { |
350 underline = TRUE; | |
351 str = g_string_append_c(str, '\37'); | |
352 } | |
3029 | 353 cur = cur + 2; |
3063 | 354 } else if (!g_strncasecmp(cur, "/B>", 3)) { |
355 if (bold) { | |
356 bold = FALSE; | |
357 str = g_string_append_c(str, '\2'); | |
358 } | |
3029 | 359 cur = cur + 3; |
3063 | 360 } else if (!g_strncasecmp(cur, "/I>", 3)) { |
361 if (italics) { | |
362 italics = FALSE; | |
363 str = g_string_append_c(str, '\2'); | |
364 } | |
3029 | 365 cur = cur + 3; |
3063 | 366 } else if (!g_strncasecmp(cur, "/U>", 3)) { |
367 if (underline) { | |
368 underline = FALSE; | |
369 str = g_string_append_c(str, '\37'); | |
370 } | |
3029 | 371 cur = cur + 3; |
3063 | 372 } else { |
373 str = g_string_append_c(str, '<'); | |
3029 | 374 } |
3063 | 375 |
3029 | 376 } |
377 str = g_string_append(str, cur); | |
378 return str; | |
379 } | |
380 | |
3751 | 381 static GString * |
382 decode_html(char *msg) | |
2086 | 383 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
384 GString /* oo la la */ *str = g_string_new(""); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
385 char *cur = msg, *end = msg; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
386 gboolean bold = FALSE, underline = FALSE, fg = FALSE, bg = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
387 int fore, back; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
388 while (*end) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
389 switch (*end) { |
3708 | 390 case 02: /* ^B */ |
391 *end = 0; | |
392 str = g_string_append(str, cur); | |
393 if (bold) | |
394 str = g_string_append(str, "</B>"); | |
395 else | |
396 str = g_string_append(str, "<B>"); | |
397 bold = !bold; | |
398 cur = end + 1; | |
399 break; | |
400 case 03: /* ^C */ | |
401 *end++ = 0; | |
402 str = g_string_append(str, cur); | |
403 fore = back = -1; | |
404 if (isdigit(*end)) { | |
405 fore = *end++ - '0'; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
406 if (isdigit(*end)) { |
3708 | 407 fore *= 10; |
408 fore += *end++ - '0'; | |
409 } | |
410 if (*end == ',' && isdigit(end[1])) { | |
411 end++; | |
412 back = *end++ - '0'; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
413 if (isdigit(*end)) { |
3708 | 414 back *= 10; |
415 back += *end++ - '0'; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
416 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
417 } |
3708 | 418 } |
419 if (fore == -1) { | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
420 if (fg) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
421 str = g_string_append(str, "</FONT>"); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
422 if (bg) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
423 str = g_string_append(str, "</FONT>"); |
3708 | 424 fg = bg = FALSE; |
425 } else { | |
426 fore %= 16; | |
427 if (fg) | |
428 str = g_string_append(str, "</FONT>"); | |
429 if (back != -1) { | |
430 if (bg) | |
431 str = g_string_append(str, "</FONT>"); | |
432 back %= 16; | |
433 str = g_string_append(str, "<FONT BACK="); | |
434 str = g_string_append(str, int_to_col(back)); | |
435 str = g_string_append_c(str, '>'); | |
436 bg = TRUE; | |
437 } | |
438 str = g_string_append(str, "<FONT COLOR="); | |
439 str = g_string_append(str, int_to_col(fore)); | |
440 str = g_string_append_c(str, '>'); | |
441 fg = TRUE; | |
442 } | |
443 cur = end--; | |
444 break; | |
445 case 017: /* ^O */ | |
446 if (!bold && !underline && !fg && !bg) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
447 break; |
3708 | 448 *end = 0; |
449 str = g_string_append(str, cur); | |
450 if (bold) | |
451 str = g_string_append(str, "</B>"); | |
452 if (underline) | |
453 str = g_string_append(str, "</U>"); | |
454 if (fg) | |
455 str = g_string_append(str, "</FONT>"); | |
456 if (bg) | |
457 str = g_string_append(str, "</FONT>"); | |
458 bold = underline = fg = bg = FALSE; | |
459 cur = end + 1; | |
460 break; | |
461 case 037: /* ^_ */ | |
462 *end = 0; | |
463 str = g_string_append(str, cur); | |
464 if (underline) | |
465 str = g_string_append(str, "</U>"); | |
466 else | |
467 str = g_string_append(str, "<U>"); | |
468 underline = !underline; | |
469 cur = end + 1; | |
470 break; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
471 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
472 end++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
473 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
474 if (*cur) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
475 str = g_string_append(str, cur); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
476 return str; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
477 } |
2086 | 478 |
3751 | 479 static void |
480 irc_got_im(struct gaim_connection *gc, char *who, char *what, int flags, time_t t) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
481 { |
3751 | 482 char *utf8 = irc_recv_convert(gc, what); |
483 GString *str = decode_html(utf8); | |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2847
diff
changeset
|
484 serv_got_im(gc, who, str->str, flags, t, -1); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
485 g_string_free(str, TRUE); |
3751 | 486 g_free(utf8); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
487 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
488 |
3751 | 489 static void |
490 dcc_chat_cancel(struct dcc_chat *); | |
3029 | 491 |
492 void | |
493 dcc_chat_in (gpointer data, gint source, GaimInputCondition condition) | |
494 { | |
495 struct dcc_chat *chat = data; | |
496 gchar buffer[IRC_BUF_LEN]; | |
497 gchar buf[128]; | |
3793 | 498 int n = 0; |
3029 | 499 struct conversation *convo; |
500 debug_printf("THIS IS TOO MUCH EFFORT\n"); | |
501 n = read (chat->fd, buffer, IRC_BUF_LEN); | |
3707 | 502 if (n > 0) { |
503 | |
504 buffer[n] = 0; | |
505 g_strstrip(buffer); | |
506 | |
507 /* Convert to HTML */ | |
508 if (strlen(buffer)) { | |
509 debug_printf ("DCC Message from: %s\n", chat->nick); | |
510 irc_got_im(chat->gc, chat->nick, buffer, 0, | |
511 time(NULL)); | |
512 } | |
513 } | |
3029 | 514 else { |
515 g_snprintf (buf, sizeof buf, _("DCC Chat with %s closed"), | |
516 chat->nick); | |
517 convo = new_conversation (chat->nick); | |
518 write_to_conv (convo, buf, WFLAG_SYSTEM, NULL, | |
519 time ((time_t) NULL), -1); | |
3730 | 520 dcc_chat_cancel (chat); |
3029 | 521 } |
522 } | |
523 | |
3751 | 524 static void |
525 irc_file_transfer_do(struct gaim_connection *gc, struct irc_file_transfer *ift) { | |
3616 | 526 /* Ok, we better be receiving some crap here boyeee */ |
527 if (transfer_in_do(ift->xfer, ift->fd, ift->name, ift->len)) { | |
3708 | 528 gaim_input_remove(ift->watcher); |
529 ift->watcher = 0; | |
3616 | 530 } |
531 } | |
532 | |
533 | |
3751 | 534 void |
535 irc_read_dcc_ack (gpointer data, gint source, GaimInputCondition condition) { | |
3708 | 536 /* Read ACK Here */ |
3633 | 537 |
3630 | 538 } |
539 | |
3751 | 540 void |
541 dcc_send_callback (gpointer data, gint source, GaimInputCondition condition) { | |
3708 | 542 struct irc_file_transfer *ift = data; |
543 struct sockaddr_in addr; | |
544 int len = sizeof(addr); | |
3622 | 545 |
3708 | 546 addr.sin_family = AF_INET; |
547 addr.sin_port = htons(ift->port); | |
548 addr.sin_addr.s_addr = INADDR_ANY; | |
3622 | 549 |
3708 | 550 ift->fd = accept(ift->fd, (struct sockaddr *)&addr, &len); |
551 if (!ift->fd) { | |
552 /* FIXME: Handle this gracefully XXX */ | |
553 printf("Something bad happened here, bubba!\n"); | |
554 return; | |
555 } | |
3622 | 556 |
3633 | 557 /* ift->awatcher = gaim_input_add(ift->fd, GAIM_INPUT_READ, irc_read_dcc_ack, ift); */ |
3630 | 558 |
3708 | 559 if (transfer_out_do(ift->xfer, ift->fd, 0)) { |
560 gaim_input_remove(ift->watcher); | |
561 ift->watcher = 0; | |
562 } | |
3622 | 563 } |
564 | |
3751 | 565 void |
566 dcc_recv_callback (gpointer data, gint source, GaimInputCondition condition) { | |
3708 | 567 struct irc_file_transfer *ift = data; |
568 | |
569 ift->fd = source; | |
570 irc_file_transfer_do(ift->gc, ift); | |
3616 | 571 } |
572 | |
3751 | 573 void |
574 dcc_chat_callback (gpointer data, gint source, GaimInputCondition condition) { | |
3029 | 575 struct dcc_chat *chat = data; |
576 struct conversation *convo = new_conversation (chat->nick); | |
577 char buf[IRC_BUF_LEN]; | |
578 chat->fd = source; | |
579 g_snprintf (buf, sizeof buf, | |
4221 | 580 _("DCC Chat with %s established"), |
3029 | 581 chat->nick); |
582 write_to_conv (convo, buf, WFLAG_SYSTEM, NULL, | |
583 time ((time_t) NULL), -1); | |
584 debug_printf ("Chat with %s established\n", chat->nick); | |
585 dcc_chat_list = g_slist_append (dcc_chat_list, chat); | |
586 gaim_input_remove(chat->inpa); | |
587 chat->inpa = gaim_input_add(source, GAIM_INPUT_READ, dcc_chat_in, chat); | |
588 } | |
589 | |
3751 | 590 static void |
591 irc_got_chat_in(struct gaim_connection *gc, int id, char *who, int whisper, char *msg, time_t t) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
592 { |
3751 | 593 char *utf8 = irc_recv_convert(gc, msg); |
594 GString *str = decode_html(utf8); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
595 serv_got_chat_in(gc, id, who, whisper, str->str, t); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
596 g_string_free(str, TRUE); |
3751 | 597 g_free(utf8); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
598 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
599 |
3751 | 600 static void |
601 handle_list(struct gaim_connection *gc, char *list) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
602 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
603 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
604 GSList *gr; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
605 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
606 id->str = g_string_append_c(id->str, ' '); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
607 id->str = g_string_append(id->str, list); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
608 id->bc--; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
609 if (id->bc) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
610 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
611 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
612 g_strdown(id->str->str); |
4349 | 613 gr = groups; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
614 while (gr) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
615 GSList *m = ((struct group *)gr->data)->members; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
616 while (m) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
617 struct buddy *b = m->data; |
4349 | 618 if(b->user->gc == gc) { |
619 char *tmp = g_strdup(b->name); | |
620 char *x, *l; | |
621 g_strdown(tmp); | |
622 x = strstr(id->str->str, tmp); | |
623 l = x + strlen(b->name); | |
624 if (x && (*l != ' ' && *l != 0)) | |
625 x = 0; | |
626 if (!b->present && x) | |
627 serv_got_update(gc, b->name, 1, 0, 0, 0, 0, 0); | |
628 else if (b->present && !x) | |
629 serv_got_update(gc, b->name, 0, 0, 0, 0, 0, 0); | |
630 g_free(tmp); | |
631 } | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
632 m = m->next; |
2086 | 633 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
634 gr = gr->next; |
2086 | 635 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
636 g_string_free(id->str, TRUE); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
637 id->str = g_string_new(""); |
2086 | 638 } |
639 | |
3751 | 640 static gboolean |
641 irc_request_buddy_update(gpointer data) | |
2086 | 642 { |
2137
18722ae5b882
[gaim-migrate @ 2147]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2131
diff
changeset
|
643 struct gaim_connection *gc = data; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
644 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
645 char buf[500]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
646 int n = g_snprintf(buf, sizeof(buf), "ISON"); |
2086 | 647 |
4349 | 648 GSList *gr = groups; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
649 if (!gr || id->bc) |
2137
18722ae5b882
[gaim-migrate @ 2147]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2131
diff
changeset
|
650 return TRUE; |
2086 | 651 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
652 while (gr) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
653 struct group *g = gr->data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
654 GSList *m = g->members; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
655 while (m) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
656 struct buddy *b = m->data; |
4349 | 657 if(b->user->gc == gc) { |
658 if (n + strlen(b->name) + 2 > sizeof(buf)) { | |
659 g_snprintf(buf + n, sizeof(buf) - n, "\r\n"); | |
660 irc_write(id->fd, buf, n); | |
661 id->bc++; | |
662 n = g_snprintf(buf, sizeof(buf), "ISON"); | |
663 } | |
664 n += g_snprintf(buf + n, sizeof(buf) - n, " %s", b->name); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
665 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
666 m = m->next; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
667 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
668 gr = gr->next; |
2086 | 669 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
670 g_snprintf(buf + n, sizeof(buf) - n, "\r\n"); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
671 irc_write(id->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
672 id->bc++; |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
673 return TRUE; |
2086 | 674 } |
675 | |
3751 | 676 static void |
677 handle_names(struct gaim_connection *gc, char *chan, char *names) | |
2086 | 678 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
679 struct conversation *c = irc_find_chat(gc, chan); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
680 char **buf, **tmp; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
681 if (!c) return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
682 if (*names == ':') names++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
683 buf = g_strsplit(names, " ", -1); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
684 for (tmp = buf; *tmp; tmp++) |
3708 | 685 add_chat_buddy(c, *tmp, NULL); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
686 g_strfreev(buf); |
2086 | 687 } |
688 | |
3751 | 689 static void |
690 handle_notopic(struct gaim_connection *gc, char *text) | |
3707 | 691 { |
692 struct conversation *c; | |
693 if ((c = irc_find_chat(gc, text))) { | |
694 char buf[IRC_BUF_LEN]; | |
695 g_snprintf(buf, sizeof(buf), _("No topic is set")); | |
696 chat_set_topic(c, NULL, buf); | |
697 } | |
698 } | |
699 | |
3751 | 700 static void |
701 handle_topic(struct gaim_connection *gc, char *text) | |
2086 | 702 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
703 struct conversation *c; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
704 char *po = strchr(text, ' '); |
2086 | 705 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
706 if (!po) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
707 return; |
2086 | 708 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
709 *po = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
710 po += 2; |
2086 | 711 |
2328
14c8df9cc75f
[gaim-migrate @ 2338]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2312
diff
changeset
|
712 if ((c = irc_find_chat(gc, text))) { |
14c8df9cc75f
[gaim-migrate @ 2338]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2312
diff
changeset
|
713 char buf[IRC_BUF_LEN]; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
714 chat_set_topic(c, NULL, po); |
2328
14c8df9cc75f
[gaim-migrate @ 2338]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2312
diff
changeset
|
715 g_snprintf(buf, sizeof(buf), _("<B>%s has changed the topic to: %s</B>"), |
3708 | 716 text, po); |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2847
diff
changeset
|
717 write_to_conv(c, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); |
2328
14c8df9cc75f
[gaim-migrate @ 2338]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2312
diff
changeset
|
718 } |
2086 | 719 } |
720 | |
3751 | 721 static gboolean |
722 mode_has_arg(struct gaim_connection *gc, char sign, char mode) | |
2086 | 723 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
724 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
725 char *cm = id->chanmodes; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
726 int type = 0; |
2086 | 727 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
728 if (strchr(id->nickmodes, mode)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
729 return TRUE; |
2086 | 730 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
731 while (*cm) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
732 if (*cm == ',') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
733 type++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
734 else if (*cm == mode) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
735 switch (type) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
736 case 0: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
737 case 1: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
738 return TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
739 case 2: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
740 if (sign == '+') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
741 return TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
742 case 3: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
743 return FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
744 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
745 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
746 cm++; |
2086 | 747 } |
748 | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
749 return FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
750 } |
2086 | 751 |
3751 | 752 static void |
753 irc_chan_mode(struct gaim_connection *gc, char *room, char sign, char mode, char *argstr, char *who) | |
3452 | 754 { |
755 struct conversation *c = irc_find_chat(gc, room); | |
756 char buf[IRC_BUF_LEN]; | |
757 char *nick = g_strndup(who, strchr(who, '!') - who); | |
758 | |
4221 | 759 g_snprintf(buf, sizeof(buf), _("-:- mode/%s [%c%c %s] by %s"), |
3707 | 760 room, sign, mode, strlen(argstr) ? argstr : "", |
761 nick); | |
3452 | 762 g_free(nick); |
763 write_to_conv(c, buf, WFLAG_SYSTEM, NULL, time((time_t)NULL), -1); | |
764 } | |
765 | |
3751 | 766 static void |
767 irc_user_mode(struct gaim_connection *gc, char *room, char sign, char mode, char *nick) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
768 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
769 struct conversation *c = irc_find_chat(gc, room); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
770 GList *r; |
2086 | 771 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
772 if (mode != 'o' && mode != 'v') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
773 return; |
2086 | 774 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
775 if (!c) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
776 return; |
2086 | 777 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
778 r = c->in_room; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
779 while (r) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
780 gboolean op = FALSE, voice = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
781 char *who = r->data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
782 if (*who == '@') { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
783 op = TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
784 who++; |
2086 | 785 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
786 if (*who == '+') { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
787 voice = TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
788 who++; |
2086 | 789 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
790 if (!strcmp(who, nick)) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
791 char *tmp, buf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
792 if (mode == 'o') { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
793 if (sign == '-') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
794 op = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
795 else |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
796 op = TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
797 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
798 if (mode == 'v') { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
799 if (sign == '-') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
800 voice = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
801 else |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
802 voice = TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
803 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
804 tmp = g_strdup(r->data); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
805 g_snprintf(buf, sizeof(buf), "%s%s%s", op ? "@" : "", |
3708 | 806 voice ? "+" : "", nick); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
807 rename_chat_buddy(c, tmp, buf); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
808 g_free(tmp); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
809 return; |
2086 | 810 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
811 r = r->next; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
812 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
813 } |
2086 | 814 |
3751 | 815 static void |
816 handle_mode(struct gaim_connection *gc, char *word[], char *word_eol[], gboolean n324) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
817 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
818 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
819 int offset = n324 ? 4 : 3; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
820 char *chan = word[offset]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
821 struct conversation *c = irc_find_chat(gc, chan); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
822 char *modes = word[offset + 1]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
823 int len = strlen(word_eol[offset]) - 1; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
824 char sign = *modes++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
825 int arg = 1; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
826 char *argstr; |
3452 | 827 char *who = word[1]; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
828 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
829 if (!c) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
830 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
831 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
832 if (word_eol[offset][len] == ' ') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
833 word_eol[offset][len] = 0; |
2086 | 834 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
835 while (TRUE) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
836 switch (*modes) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
837 case 0: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
838 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
839 case '+': |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
840 case '-': |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
841 sign = *modes; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
842 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
843 default: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
844 if (mode_has_arg(gc, sign, *modes)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
845 argstr = word[++arg + offset]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
846 else |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
847 argstr = ""; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
848 if (strchr(id->nickmodes, *modes)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
849 irc_user_mode(gc, chan, sign, *modes, argstr); |
3452 | 850 else if (strchr(who, '!')) |
851 irc_chan_mode(gc, chan, sign, *modes, argstr, who); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
852 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
853 modes++; |
2086 | 854 } |
855 } | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
856 |
3751 | 857 static void |
858 handle_version(struct gaim_connection *gc, char *word[], char *word_eol[], int num) | |
3452 | 859 { |
860 struct irc_data *id = gc->proto_data; | |
861 GString *str; | |
862 | |
863 id->liststr = g_string_new(""); | |
864 | |
865 id->liststr = g_string_append(id->liststr, "<b>Version: </b>"); | |
866 id->liststr = g_string_append(id->liststr, word_eol[4]); | |
867 | |
868 str = decode_html(id->liststr->str); | |
869 g_show_info_text(gc, NULL, 2, str->str, NULL); | |
870 g_string_free(str, TRUE); | |
871 g_string_free(id->liststr, TRUE); | |
872 id->liststr = NULL; | |
873 } | |
874 | |
3751 | 875 static void |
876 handle_who(struct gaim_connection *gc, char *word[], char *word_eol[], int num) | |
3452 | 877 { |
878 struct irc_data *id = gc->proto_data; | |
879 char buf[IRC_BUF_LEN]; | |
880 | |
881 if (!id->in_whois) { | |
882 id->in_whois = TRUE; | |
883 id->liststr = g_string_new(""); | |
884 } | |
885 | |
886 switch (num) { | |
887 case 352: | |
888 g_snprintf(buf, sizeof(buf), "<b>%s</b> (%s@%s): %s<br>", | |
889 word[8], word[5], word[6], word_eol[11]); | |
890 id->liststr = g_string_append(id->liststr, buf); | |
891 break; | |
892 } | |
893 } | |
894 | |
2648 | 895 /* Handle our whois stuff here. You know what, I have a sore throat. You know |
896 * what I think about that? I'm not too pleased with it. Perhaps I should take | |
897 * some medicine, or perhaps I should go to bed? Blah!! */ | |
898 | |
3751 | 899 static void |
900 handle_whois(struct gaim_connection *gc, char *word[], char *word_eol[], int num) | |
2648 | 901 { |
902 struct irc_data *id = gc->proto_data; | |
903 char tmp[1024]; | |
904 | |
905 if (!id->in_whois) { | |
906 id->in_whois = TRUE; | |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
907 id->liststr = g_string_new(""); |
2648 | 908 } else { |
909 /* I can't decide if we should have one break or two */ | |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
910 id->liststr = g_string_append(id->liststr, "<BR>"); |
2648 | 911 id->in_whois = TRUE; |
912 } | |
913 | |
914 switch (num) { | |
3707 | 915 case 311: |
916 id->liststr = g_string_append(id->liststr, "<b>User: </b>"); | |
917 break; | |
918 case 312: | |
919 id->liststr = g_string_append(id->liststr, "<b>Server: </b>"); | |
920 break; | |
921 case 313: | |
922 g_snprintf(tmp, sizeof(tmp), "<b>IRC Operator:</b> %s ", word[4]); | |
923 id->liststr = g_string_append(id->liststr, tmp); | |
924 break; | |
925 case 314: | |
926 id->liststr = g_string_append(id->liststr, "<b>User: </b>"); | |
927 g_snprintf(tmp, sizeof(tmp), "<b>%s</b> (%s@%s) %s", | |
928 word[4], word[5], word[6], word_eol[8]); | |
929 id->liststr = g_string_append(id->liststr, tmp); | |
930 return; | |
931 case 317: | |
932 id->liststr = g_string_append(id->liststr, "<b>Idle Time: </b>"); | |
933 break; | |
934 case 319: | |
935 id->liststr = g_string_append(id->liststr, "<b>Channels: </b>"); | |
936 break; | |
937 default: | |
938 break; | |
2648 | 939 } |
3452 | 940 |
2651
f84dcbcfba4b
[gaim-migrate @ 2664]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2650
diff
changeset
|
941 if (word_eol[5][0] == ':') |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
942 id->liststr = g_string_append(id->liststr, word_eol[5] + 1); |
3452 | 943 /* Nicer idle time output, by jonas@birme.se */ |
944 else if (isdigit(word_eol[5][0])) { | |
945 time_t idle = atol(word_eol[5]); | |
946 time_t signon = atol(strchr(word_eol[5], ' ')); | |
947 | |
948 g_snprintf(tmp, sizeof(tmp), | |
949 "%ld seconds [signon: %s]", (idle / 1000), ctime(&signon)); | |
950 id->liststr = g_string_append(id->liststr, tmp); | |
951 } | |
2651
f84dcbcfba4b
[gaim-migrate @ 2664]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2650
diff
changeset
|
952 else |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
953 id->liststr = g_string_append(id->liststr, word_eol[5]); |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
954 } |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
955 |
3751 | 956 static void |
957 handle_roomlist(struct gaim_connection *gc, char *word[], char *word_eol[]) | |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
958 { |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
959 struct irc_data *id = gc->proto_data; |
2648 | 960 |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
961 if (!id->in_list) { |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
962 id->in_list = TRUE; |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
963 id->liststr = g_string_new(""); |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
964 } else { |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
965 id->liststr = g_string_append(id->liststr, "<BR>"); |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
966 id->in_list = TRUE; |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
967 } |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
968 |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
969 id->liststr = g_string_append(id->liststr, word_eol[4]); |
2648 | 970 } |
971 | |
3751 | 972 static void |
973 irc_change_nick(void *a, char *b) { | |
3511 | 974 struct gaim_connection *gc = a; |
975 struct irc_data *id = gc->proto_data; | |
976 char buf[IRC_BUF_LEN]; | |
977 g_snprintf(buf, sizeof(buf), "NICK %s\r\n", b); | |
978 irc_write(id->fd, buf, strlen(buf)); | |
979 } | |
980 | |
3751 | 981 static void |
982 process_numeric(struct gaim_connection *gc, char *word[], char *word_eol[]) | |
2086 | 983 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
984 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
985 char *text = word_eol[3]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
986 int n = atoi(word[2]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
987 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
988 if (!g_strncasecmp(gc->displayname, text, strlen(gc->displayname))) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
989 text += strlen(gc->displayname) + 1; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
990 if (*text == ':') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
991 text++; |
2086 | 992 |
3707 | 993 /* RPL_ and ERR_ */ |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
994 switch (n) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
995 case 4: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
996 if (!strncmp(word[5], "u2.10", 5)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
997 id->six_modes = TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
998 else |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
999 id->six_modes = FALSE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1000 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1001 case 5: |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1002 handle_005(gc, word, word_eol); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1003 break; |
3707 | 1004 case 301: /* RPL_AWAY */ |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1005 if (id->in_whois) { |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1006 id->liststr = g_string_append(id->liststr, "<BR><b>Away: </b>"); |
2651
f84dcbcfba4b
[gaim-migrate @ 2664]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2650
diff
changeset
|
1007 |
f84dcbcfba4b
[gaim-migrate @ 2664]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2650
diff
changeset
|
1008 if (word_eol[5][0] == ':') |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1009 id->liststr = g_string_append(id->liststr, word_eol[5] + 1); |
2651
f84dcbcfba4b
[gaim-migrate @ 2664]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2650
diff
changeset
|
1010 else |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1011 id->liststr = g_string_append(id->liststr, word_eol[5]); |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1012 } else |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1013 irc_got_im(gc, word[4], word_eol[5], IM_FLAG_AWAY, time(NULL)); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1014 break; |
3707 | 1015 case 303: /* RPL_ISON */ |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1016 handle_list(gc, &word_eol[4][1]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1017 break; |
3707 | 1018 case 311: /* RPL_WHOISUSER */ |
1019 case 312: /* RPL_WHOISSERVER */ | |
1020 case 313: /* RPL_WHOISOPERATOR */ | |
1021 case 314: /* RPL_WHOWASUSER */ | |
1022 case 317: /* RPL_WHOISIDLE */ | |
1023 case 319: /* RPL_WHOISCHANNELS */ | |
2648 | 1024 handle_whois(gc, word, word_eol, n); |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1025 break; |
3707 | 1026 case 322: /* RPL_LIST */ |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1027 handle_roomlist(gc, word, word_eol); |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1028 break; |
3707 | 1029 case 315: /* RPL_ENDOFWHO */ |
1030 case 318: /* RPL_ENDOFWHOIS */ | |
1031 case 323: /* RPL_LISTEND */ | |
1032 case 369: /* RPL_ENDOFWHOWAS */ | |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1033 if ((id->in_whois || id->in_list) && id->liststr) { |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1034 GString *str = decode_html(id->liststr->str); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2782
diff
changeset
|
1035 g_show_info_text(gc, NULL, 2, str->str, NULL); |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1036 g_string_free(str, TRUE); |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1037 g_string_free(id->liststr, TRUE); |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1038 id->liststr = NULL; |
2652
65a602693286
[gaim-migrate @ 2665]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2651
diff
changeset
|
1039 id->in_whois = FALSE; |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1040 id->in_list = FALSE; |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1041 } |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1042 break; |
3707 | 1043 case 324: /* RPL_CHANNELMODEIS */ |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1044 handle_mode(gc, word, word_eol, TRUE); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1045 break; |
3707 | 1046 case 331: /* RPL_NOTOPIC */ |
1047 handle_notopic(gc, text); | |
1048 break; | |
1049 case 332: /* RPL_TOPIC */ | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1050 handle_topic(gc, text); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1051 break; |
3707 | 1052 case 351: /* RPL_VERSION */ |
3452 | 1053 handle_version(gc, word, word_eol, n); |
1054 break; | |
3707 | 1055 case 352: /* RPL_WHOREPLY */ |
3708 | 1056 handle_who(gc, word, word_eol, n); |
1057 break; | |
3707 | 1058 case 353: /* RPL_NAMREPLY */ |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1059 handle_names(gc, word[5], word_eol[6]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1060 break; |
3707 | 1061 case 376: /* RPL_ENDOFMOTD */ |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1062 irc_request_buddy_update(gc); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1063 break; |
3707 | 1064 case 382: /* RPL_REHASHING */ |
1065 do_error_dialog(_("Rehashing server"), _("IRC Operator"), GAIM_ERROR); | |
1066 break; | |
1067 case 401: /* ERR_NOSUCHNICK */ | |
1068 do_error_dialog(_("No such nick/channel"), _("IRC Error"), GAIM_ERROR); | |
2652
65a602693286
[gaim-migrate @ 2665]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2651
diff
changeset
|
1069 break; |
3707 | 1070 case 402: /* ERR_NOSUCHSERVER */ |
1071 do_error_dialog(_("No such server"), _("IRC Error"), GAIM_ERROR); | |
1072 case 431: /* ERR_NONICKNAMEGIVEN */ | |
1073 do_error_dialog(_("No nickname given"), _("IRC Error"), GAIM_ERROR); | |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
1074 break; |
3707 | 1075 case 481: /* ERR_NOPRIVILEGES */ |
1076 do_error_dialog(_("You're not an IRC operator!"), _("IRC Error"), GAIM_ERROR); | |
1077 break; | |
3511 | 1078 case 433: |
1079 do_prompt_dialog(_("That nick is already in use. Please enter a new nick"), gc->displayname, gc, irc_change_nick, NULL); | |
3605 | 1080 break; |
3452 | 1081 default: |
3707 | 1082 /* Other error messages */ |
3452 | 1083 if (n > 400 && n < 502) { |
1084 char errmsg[IRC_BUF_LEN]; | |
1085 char *errmsg1 = strrchr(text, ':'); | |
1086 g_snprintf(errmsg, sizeof(errmsg), "IRC Error %d", n); | |
1087 if (errmsg) | |
3536 | 1088 do_error_dialog(errmsg, errmsg1 ? errmsg1+1 : NULL, GAIM_ERROR); |
3452 | 1089 } |
1090 break; | |
2086 | 1091 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1092 } |
2086 | 1093 |
3751 | 1094 static gboolean |
1095 is_channel(struct gaim_connection *gc, char *name) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1096 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1097 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1098 if (strchr(id->chantypes, *name)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1099 return TRUE; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1100 return FALSE; |
2086 | 1101 } |
1102 | |
3751 | 1103 static void |
4065 | 1104 irc_rem_chat_bud(struct gaim_connection *gc, char *nick, struct conversation *b, char *reason) |
2086 | 1105 { |
1106 | |
4067 | 1107 if (b) { |
1108 GList *r = b->in_room; | |
1109 while (r) { | |
1110 char *who = r->data; | |
1111 if (*who == '@') | |
1112 who++; | |
1113 if (*who == '+') | |
1114 who++; | |
1115 if (!g_strcasecmp(who, nick)) { | |
1116 char *tmp = g_strdup(r->data); | |
1117 remove_chat_buddy(b, tmp, reason); | |
1118 g_free(tmp); | |
1119 break; | |
1120 } | |
1121 r = r->next; | |
4065 | 1122 } |
4067 | 1123 } else { |
1124 GSList *bcs = gc->buddy_chats; | |
1125 while (bcs) { | |
1126 struct conversation *bc = bcs->data; | |
1127 irc_rem_chat_bud(gc, nick, bc, reason); | |
1128 bcs = bcs->next; | |
1129 } | |
2086 | 1130 } |
1131 } | |
1132 | |
3751 | 1133 static void |
1134 irc_change_name(struct gaim_connection *gc, char *old, char *new) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1135 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1136 GSList *bcs = gc->buddy_chats; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1137 char buf[IRC_BUF_LEN]; |
2086 | 1138 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1139 while (bcs) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1140 struct conversation *b = bcs->data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1141 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1142 GList *r = b->in_room; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1143 while (r) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1144 char *who = r->data; |
2292
6625d0755c51
[gaim-migrate @ 2302]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2291
diff
changeset
|
1145 int n = 0; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1146 if (*who == '@') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1147 buf[n++] = *who++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1148 if (*who == '+') |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1149 buf[n++] = *who++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1150 g_snprintf(buf + n, sizeof(buf) - n, "%s", new); |
2312
766603034af8
[gaim-migrate @ 2322]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2310
diff
changeset
|
1151 if (!strcmp(who, old)) { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1152 char *tmp = g_strdup(r->data); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1153 rename_chat_buddy(b, tmp, buf); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1154 r = b->in_room; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1155 g_free(tmp); |
2725
f3c094e78609
[gaim-migrate @ 2738]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2687
diff
changeset
|
1156 break; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1157 } else |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1158 r = r->next; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1159 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1160 bcs = bcs->next; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1161 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1162 } |
2086 | 1163 |
3751 | 1164 static void |
1165 handle_privmsg(struct gaim_connection *gc, char *to, char *nick, char *msg) | |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1166 { |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1167 if (is_channel(gc, to)) { |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1168 struct conversation *c = irc_find_chat(gc, to); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1169 if (!c) |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1170 return; |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1171 irc_got_chat_in(gc, c->id, nick, 0, msg, time(NULL)); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1172 } else { |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1173 char *tmp = g_malloc(strlen(nick) + 2); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1174 g_snprintf(tmp, strlen(nick) + 2, "@%s", nick); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1175 if (find_conversation(tmp)) |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1176 irc_got_im(gc, tmp, msg, 0, time(NULL)); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1177 else { |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1178 *tmp = '+'; |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1179 if (find_conversation(tmp)) |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1180 irc_got_im(gc, tmp, msg, 0, time(NULL)); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1181 else |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1182 irc_got_im(gc, nick, msg, 0, time(NULL)); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1183 } |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1184 g_free(tmp); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1185 } |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1186 } |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1187 |
3751 | 1188 static void |
1189 dcc_chat_init(struct dcc_chat *data) { | |
4249 | 1190 if (g_slist_find(connections, data->gc)) { |
1191 proxy_connect(data->ip_address, data->port, dcc_chat_callback, data); | |
1192 } else { | |
1193 g_free(data); | |
1194 } | |
3029 | 1195 } |
1196 | |
3751 | 1197 static void |
1198 dcc_chat_cancel(struct dcc_chat *data){ | |
4249 | 1199 if (g_slist_find(connections, data->gc) && find_dcc_chat(data->gc, data->nick)) { |
3029 | 1200 dcc_chat_list = g_slist_remove(dcc_chat_list, data); |
1201 gaim_input_remove (data->inpa); | |
1202 close (data->fd); | |
1203 } | |
1204 g_free(data); | |
1205 } | |
1206 | |
3751 | 1207 static void |
1208 irc_convo_closed(struct gaim_connection *gc, char *who) | |
3029 | 1209 { |
1210 struct dcc_chat *dchat = find_dcc_chat(gc, who); | |
1211 if (!dchat) | |
1212 return; | |
1213 | |
3730 | 1214 dcc_chat_cancel(dchat); |
3029 | 1215 } |
1216 | |
3751 | 1217 static void |
1218 handle_ctcp(struct gaim_connection *gc, char *to, char *nick, | |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1219 char *msg, char *word[], char *word_eol[]) |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1220 { |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1221 struct irc_data *id = gc->proto_data; |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1222 char buf[IRC_BUF_LEN]; |
3735 | 1223 char out[IRC_BUF_LEN]; |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1224 |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1225 if (!g_strncasecmp(msg, "VERSION", 7)) { |
3735 | 1226 g_snprintf(buf, sizeof(buf), "\001VERSION Gaim " VERSION ": The Penguin Pimpin' " |
1227 "Multi-protocol Messaging Client: " WEBSITE "\001"); | |
1228 irc_send_notice (gc, nick, buf); | |
1229 g_snprintf(out, sizeof(out), ">> CTCP VERSION requested from %s", nick); | |
1230 do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); | |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1231 } |
3707 | 1232 if (!g_strncasecmp(msg, "CLIENTINFO", 10)) { |
3735 | 1233 g_snprintf(buf, sizeof(buf), "\001CLIENTINFO USERINFO CLIENTINFO VERSION\001"); |
1234 irc_send_notice (gc, nick, buf); | |
1235 g_snprintf(out, sizeof(out), ">> CTCP CLIENTINFO requested from %s", nick); | |
1236 do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); | |
3707 | 1237 } |
1238 if (!g_strncasecmp(msg, "USERINFO", 8)) { | |
3735 | 1239 g_snprintf(buf, sizeof(buf), "\001USERINFO Alias: %s\001", gc->user->alias); |
1240 irc_send_notice (gc, nick, buf); | |
1241 g_snprintf(out, sizeof(out), ">> CTCP USERINFO requested from %s", nick); | |
1242 do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); | |
3707 | 1243 } |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1244 if (!g_strncasecmp(msg, "ACTION", 6)) { |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1245 char *po = strchr(msg + 6, 1); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1246 char *tmp; |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1247 if (po) *po = 0; |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1248 tmp = g_strconcat("/me", msg + 6, NULL); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1249 handle_privmsg(gc, to, nick, tmp); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1250 g_free(tmp); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1251 } |
3735 | 1252 if (!g_strncasecmp(msg, "PING", 4)) { |
1253 g_snprintf(buf, sizeof(buf), "\001%s\001", msg); | |
1254 irc_send_notice (gc, nick, buf); | |
1255 g_snprintf(out, sizeof(out), ">> CTCP PING requested from %s", nick); | |
1256 do_error_dialog(out, _("IRC CTCP info"), GAIM_INFO); | |
1257 } | |
3029 | 1258 if (!g_strncasecmp(msg, "DCC CHAT", 8)) { |
1259 char **chat_args = g_strsplit(msg, " ", 5); | |
1260 char ask[1024]; | |
3707 | 1261 struct dcc_chat *dccchat = g_new0(struct dcc_chat, 1); |
3029 | 1262 dccchat->gc = gc; |
1263 g_snprintf(dccchat->ip_address, sizeof(dccchat->ip_address), chat_args[3]); | |
3616 | 1264 printf("DCC CHAT DEBUG CRAP: %s\n", dccchat->ip_address); |
3029 | 1265 dccchat->port=atoi(chat_args[4]); |
1266 g_snprintf(dccchat->nick, sizeof(dccchat->nick), nick); | |
3730 | 1267 g_snprintf(ask, sizeof(ask), _("%s would like to establish a DCC chat"), nick); |
4249 | 1268 do_ask_dialog(ask, _("This requires a direct connection to be established between the two computers. Messages sent will not pass through the IRC server"), dccchat, _("Connect"), dcc_chat_init, _("Cancel"), dcc_chat_cancel, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
3029 | 1269 } |
3616 | 1270 |
1271 | |
1272 if (!g_strncasecmp(msg, "DCC SEND", 8)) { | |
3708 | 1273 struct irc_file_transfer *ift = g_new0(struct irc_file_transfer, 1); |
1274 char **send_args = g_strsplit(msg, " ", 6); | |
1275 send_args[5][strlen(send_args[5])-1] = 0; | |
3616 | 1276 |
3708 | 1277 ift->type = IFT_SENDFILE_IN; |
1278 ift->sn = g_strdup(nick); | |
1279 ift->gc = gc; | |
1280 g_snprintf(ift->ip, sizeof(ift->ip), send_args[3]); | |
1281 ift->port = atoi(send_args[4]); | |
1282 ift->len = atoi(send_args[5]); | |
1283 ift->name = g_strdup(send_args[2]); | |
1284 ift->cur = 0; | |
3616 | 1285 |
3708 | 1286 id->file_transfers = g_slist_append(id->file_transfers, ift); |
3616 | 1287 |
3708 | 1288 ift->xfer = transfer_in_add(gc, nick, ift->name, ift->len, 1, NULL); |
3616 | 1289 } |
3735 | 1290 |
1291 /*write_to_conv(c, out, WFLAG_SYSTEM, NULL, time(NULL), -1);*/ | |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1292 } |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1293 |
3751 | 1294 static gboolean |
1295 irc_parse(struct gaim_connection *gc, char *buf) | |
2086 | 1296 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1297 struct irc_data *idata = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1298 gchar outbuf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1299 char *word[PDIWORDS], *word_eol[PDIWORDS]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1300 char pdibuf[522]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1301 char *ex, ip[128], nick[128]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1302 char *cmd; |
2086 | 1303 |
1304 /* Check for errors */ | |
3452 | 1305 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1306 if (*buf != ':') { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1307 if (!strncmp(buf, "NOTICE ", 7)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1308 buf += 7; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1309 if (!strncmp(buf, "PING ", 5)) { |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1310 int r = FALSE; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1311 g_snprintf(outbuf, sizeof(outbuf), "PONG %s\r\n", buf + 5); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1312 if (irc_write(idata->fd, outbuf, strlen(outbuf)) < 0) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1313 hide_login_progress(gc, _("Unable to write")); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1314 signoff(gc); |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1315 r = TRUE; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1316 } |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1317 return r; |
2086 | 1318 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1319 /* XXX doesn't handle ERROR */ |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1320 return FALSE; |
2086 | 1321 } |
1322 | |
2782
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1323 if (!idata->online) { |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1324 /* Now lets sign ourselves on */ |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1325 account_online(gc); |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1326 serv_finish_login(gc); |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1327 |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1328 /* we don't call this now because otherwise some IRC servers might not like us */ |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1329 idata->timer = g_timeout_add(20000, irc_request_buddy_update, gc); |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1330 idata->online = TRUE; |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1331 } |
428bd24c18c6
[gaim-migrate @ 2795]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
1332 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1333 buf++; |
2086 | 1334 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1335 process_data_init(pdibuf, buf, word, word_eol, FALSE); |
2086 | 1336 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1337 if (atoi(word[2])) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1338 if (*word_eol[3]) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1339 process_numeric(gc, word, word_eol); |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1340 return FALSE; |
2086 | 1341 } |
1342 | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1343 cmd = word[2]; |
2086 | 1344 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1345 ex = strchr(pdibuf, '!'); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1346 if (!ex) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1347 strncpy(ip, pdibuf, sizeof(ip)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1348 ip[sizeof(ip)-1] = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1349 strncpy(nick, pdibuf, sizeof(nick)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1350 nick[sizeof(nick)-1] = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1351 } else { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1352 strncpy(ip, ex + 1, sizeof(ip)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1353 ip[sizeof(ip)-1] = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1354 strncpy(nick, pdibuf, sizeof(nick)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1355 nick[sizeof(nick)-1] = 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1356 if ((ex - pdibuf) < sizeof (nick)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1357 nick[ex - pdibuf] = 0; /* cut the buffer at the '!' */ |
2086 | 1358 } |
1359 | |
2847
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
1360 if (!strcmp(cmd, "INVITE")) { |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
1361 char *chan = g_strdup(word[4]); |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
1362 serv_got_chat_invite(gc, chan + 1, nick, NULL, g_list_append(NULL, chan)); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1363 } else if (!strcmp(cmd, "JOIN")) { |
3751 | 1364 irc_parse_join(gc, nick, word, word_eol); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1365 } else if (!strcmp(cmd, "KICK")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1366 if (!strcmp(gc->displayname, word[4])) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1367 struct conversation *c = irc_find_chat(gc, word[3]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1368 if (!c) |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1369 return FALSE; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1370 gc->buddy_chats = g_slist_remove(gc->buddy_chats, c); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1371 c->gc = NULL; |
3707 | 1372 g_snprintf(outbuf, sizeof(outbuf), _("You have been kicked from %s: %s"), |
1373 word[3], *word_eol[5] == ':' ? word_eol[5] + 1 : word_eol[5]); | |
1374 do_error_dialog(outbuf, _("IRC Error"), GAIM_ERROR); | |
2820
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2801
diff
changeset
|
1375 } else { |
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2801
diff
changeset
|
1376 char *reason = *word_eol[5] == ':' ? word_eol[5] + 1 : word_eol[5]; |
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2801
diff
changeset
|
1377 char *msg = g_strdup_printf(_("Kicked by %s: %s"), nick, reason); |
4065 | 1378 struct conversation *c = irc_find_chat(gc, word[3]); |
1379 irc_rem_chat_bud(gc, word[4], c, msg); | |
2820
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2801
diff
changeset
|
1380 g_free(msg); |
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2801
diff
changeset
|
1381 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1382 } else if (!strcmp(cmd, "KILL")) { /* */ |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1383 } else if (!strcmp(cmd, "MODE")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1384 handle_mode(gc, word, word_eol, FALSE); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1385 } else if (!strcmp(cmd, "NICK")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1386 char *new = *word_eol[3] == ':' ? word_eol[3] + 1 : word_eol[3]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1387 if (!strcmp(gc->displayname, nick)) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1388 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", new); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1389 irc_change_name(gc, nick, new); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1390 } else if (!strcmp(cmd, "NOTICE")) { |
3751 | 1391 irc_parse_notice(gc, nick, ex, word, word_eol); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1392 } else if (!strcmp(cmd, "PART")) { |
3751 | 1393 if (!irc_parse_part(gc, nick, cmd, word, word_eol)) |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1394 return FALSE; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1395 } else if (!strcmp(cmd, "PRIVMSG")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1396 char *to, *msg; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1397 if (!*word[3]) |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1398 return FALSE; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1399 to = word[3]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1400 msg = *word_eol[4] == ':' ? word_eol[4] + 1 : word_eol[4]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1401 if (msg[0] == 1 && msg[strlen (msg) - 1] == 1) { /* ctcp */ |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1402 if (!g_strncasecmp(msg + 1, "DCC ", 4)) |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1403 process_data_init(pdibuf, buf, word, word_eol, TRUE); |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1404 handle_ctcp(gc, to, nick, msg + 1, word, word_eol); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1405 } else { |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
1406 handle_privmsg(gc, to, nick, msg); |
2086 | 1407 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1408 } else if (!strcmp(cmd, "PONG")) { /* */ |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1409 } else if (!strcmp(cmd, "QUIT")) { |
4065 | 1410 irc_rem_chat_bud(gc, nick, irc_find_chat(gc, word[3]), *word_eol[3] == ':' ? word_eol[3] + 1 : word_eol[3]); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1411 } else if (!strcmp(cmd, "TOPIC")) { |
3751 | 1412 irc_parse_topic(gc, nick, word, word_eol); |
3707 | 1413 } else if (!strcmp(cmd, "WALLOPS")) { /* Don't know if a dialog box is the right way? */ |
1414 char *msg = strrchr(word_eol[0], ':'); | |
1415 if (msg) | |
1416 do_error_dialog(msg+1, _("IRC Operator"), GAIM_ERROR); | |
2086 | 1417 } |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1418 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1419 return FALSE; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1420 } |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1421 |
3751 | 1422 /* CTCP by jonas@birme.se */ |
1423 static void | |
1424 irc_parse_notice(struct gaim_connection *gc, char *nick, char *ex, | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1425 char *word[], char *word_eol[]) |
3751 | 1426 { |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1427 char buf[IRC_BUF_LEN]; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1428 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1429 if (!g_strcasecmp(word[4], ":\001CLIENTINFO")) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1430 char *p = g_strrstr(word_eol[5], "\001"); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1431 *p = 0; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1432 g_snprintf(buf, sizeof(buf), "CTCP Answer: %s", word_eol[5]); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1433 do_error_dialog(buf, _("CTCP ClientInfo"), GAIM_INFO); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1434 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1435 } else if (!g_strcasecmp(word[4], ":\001USERINFO")) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1436 char *p = g_strrstr(word_eol[5], "\001"); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1437 *p = 0; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1438 g_snprintf(buf, sizeof(buf), "CTCP Answer: %s", word_eol[5]); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1439 do_error_dialog(buf, _("CTCP UserInfo"), GAIM_INFO); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1440 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1441 } else if (!g_strcasecmp(word[4], ":\001VERSION")) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1442 char *p = g_strrstr(word_eol[5], "\001"); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1443 *p = 0; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1444 g_snprintf(buf, sizeof(buf), "CTCP Answer: %s", word_eol[5]); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1445 do_error_dialog(buf, _("CTCP Version"), GAIM_INFO); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1446 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1447 } else if (!g_strcasecmp(word[4], ":\001PING")) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1448 char *p = g_strrstr(word_eol[5], "\001"); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1449 struct timeval ping_time; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1450 struct timeval now; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1451 gchar **vector; |
3751 | 1452 |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1453 if (p) |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1454 *p = 0; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1455 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1456 vector = g_strsplit(word_eol[5], " ", 2); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1457 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1458 if (gettimeofday(&now, NULL) == 0 && vector != NULL) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1459 if (now.tv_usec - atol(vector[1]) < 0) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1460 ping_time.tv_sec = now.tv_sec - atol(vector[0]) - 1; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1461 ping_time.tv_usec = now.tv_usec - atol(vector[1]) + 1000000; |
3751 | 1462 |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1463 } else { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1464 ping_time.tv_sec = now.tv_sec - atol(vector[0]); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1465 ping_time.tv_usec = now.tv_usec - atol(vector[1]); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1466 } |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1467 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1468 g_snprintf(buf, sizeof(buf), |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1469 "CTCP Ping reply from %s: %lu.%.03lu seconds", |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1470 nick, ping_time.tv_sec, (ping_time.tv_usec/1000)); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1471 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1472 do_error_dialog(buf, _("CTCP Ping"), GAIM_INFO); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1473 g_strfreev(vector); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1474 } |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1475 } else { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1476 if (*word_eol[4] == ':') word_eol[4]++; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1477 if (ex) |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1478 irc_got_im(gc, nick, word_eol[4], 0, time(NULL)); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1479 } |
3751 | 1480 } |
1481 | |
1482 static void | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1483 irc_parse_join(struct gaim_connection *gc, char *nick, |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1484 char *word[], char *word_eol[]) |
3751 | 1485 { |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1486 char *chan = *word[3] == ':' ? word[3] + 1 : word[3]; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1487 static int id = 1; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1488 struct conversation *c; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1489 char *hostmask, *p; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1490 |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1491 if (!g_strcasecmp(gc->displayname, nick)) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1492 serv_got_joined_chat(gc, id++, chan); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1493 } else { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1494 c = irc_find_chat(gc, chan); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1495 if (c) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1496 hostmask = g_strdup(word[1]); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1497 p = strchr(hostmask, '!'); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1498 if (p) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1499 char *pend = strchr(p, ' '); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1500 if (pend) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1501 *pend = 0; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1502 } |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1503 add_chat_buddy(c, nick, p+1); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1504 g_free(hostmask); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1505 } |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1506 } |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1507 } |
3751 | 1508 } |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1509 |
3751 | 1510 static void |
1511 irc_parse_topic(struct gaim_connection *gc, char *nick, | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1512 char *word[], char *word_eol[]) |
3751 | 1513 { |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1514 struct conversation *c = irc_find_chat(gc, word[3]); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1515 char *topic = *word_eol[4] == ':' ? word_eol[4] + 1 : word_eol[4]; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1516 char buf[IRC_BUF_LEN]; |
3751 | 1517 |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1518 if (c) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1519 chat_set_topic(c, nick, topic); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1520 g_snprintf(buf, sizeof(buf), |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1521 _("<B>%s has changed the topic to: %s</B>"), nick, topic); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1522 write_to_conv(c, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1523 } |
3751 | 1524 } |
1525 | |
1526 static gboolean | |
1527 irc_parse_part(struct gaim_connection *gc, char *nick, char *cmd, | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1528 char *word[], char *word_eol[]) |
3751 | 1529 { |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1530 char *chan = cmd + 5; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1531 struct conversation *c; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1532 char *reason = word_eol[4]; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1533 GList *r; |
3751 | 1534 |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1535 if (*chan == ':') |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1536 chan++; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1537 if (*reason == ':') |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1538 reason++; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1539 if (!(c = irc_find_chat(gc, chan))) |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1540 return FALSE; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1541 if (!strcmp(nick, gc->displayname)) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1542 serv_got_chat_left(gc, c->id); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1543 return FALSE; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1544 } |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1545 r = c->in_room; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1546 while (r) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1547 char *who = r->data; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1548 if (*who == '@') |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1549 who++; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1550 if (*who == '+') |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1551 who++; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1552 if (!g_strcasecmp(who, nick)) { |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1553 char *tmp = g_strdup(r->data); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1554 remove_chat_buddy(c, tmp, reason); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1555 g_free(tmp); |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1556 break; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1557 } |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1558 r = r->next; |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1559 } |
3867 | 1560 return TRUE; |
3751 | 1561 } |
1562 | |
1563 static void | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1564 irc_callback(gpointer data, gint source, GaimInputCondition condition) |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1565 { |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1566 struct gaim_connection *gc = data; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1567 struct irc_data *idata = gc->proto_data; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1568 int i = 0; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1569 gchar buf[1024]; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1570 gboolean off; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1571 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1572 i = read(idata->fd, buf, 1024); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1573 if (i <= 0) { |
3074 | 1574 hide_login_progress_error(gc, "Read error"); |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1575 signoff(gc); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1576 return; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1577 } |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1578 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1579 idata->rxqueue = g_realloc(idata->rxqueue, i + idata->rxlen + 1); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1580 memcpy(idata->rxqueue + idata->rxlen, buf, i); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1581 idata->rxlen += i; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1582 idata->rxqueue[idata->rxlen] = 0; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1583 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1584 while (1) { |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1585 char *d, *e; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1586 int len; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1587 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1588 if (!idata->rxqueue || ((e = strchr(idata->rxqueue, '\n')) == NULL)) |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1589 return; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1590 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1591 len = e - idata->rxqueue + 1; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1592 d = g_strndup(idata->rxqueue, len); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1593 g_strchomp(d); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1594 debug_printf("IRC S: %s\n", d); |
3707 | 1595 |
3708 | 1596 /* REMOVE ME BEFORE SUBMIT! */ |
3751 | 1597 /*fprintf(stderr, "IRC S: %s\n", d);*/ |
3708 | 1598 |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1599 idata->rxlen -= len; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1600 if (idata->rxlen) { |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1601 char *tmp = g_strdup(e + 1); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1602 g_free(idata->rxqueue); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1603 idata->rxqueue = tmp; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1604 } else { |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1605 g_free(idata->rxqueue); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1606 idata->rxqueue = NULL; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1607 } |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1608 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1609 off = irc_parse(gc, d); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1610 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1611 g_free(d); |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1612 |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1613 if (off) |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1614 return; |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1615 } |
2086 | 1616 } |
1617 | |
3751 | 1618 static void |
1619 irc_login_callback(gpointer data, gint source, GaimInputCondition condition) | |
2086 | 1620 { |
1621 struct gaim_connection *gc = data; | |
1622 struct irc_data *idata; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1623 char hostname[256]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1624 char buf[IRC_BUF_LEN]; |
3751 | 1625 char *test; |
1626 GError *err = NULL; | |
1627 | |
2086 | 1628 if (!g_slist_find(connections, gc)) { |
1629 close(source); | |
1630 return; | |
1631 } | |
1632 | |
1633 idata = gc->proto_data; | |
1634 | |
1635 if (source == -1) { | |
1636 hide_login_progress(gc, "Write error"); | |
1637 signoff(gc); | |
1638 return; | |
1639 } | |
1640 | |
3751 | 1641 |
1642 /* Try a quick conversion to see if the specified encoding is OK */ | |
1643 test = g_convert("test", strlen("test"), gc->user->proto_opt[USEROPT_CHARSET], | |
1644 "UTF-8", NULL, NULL, &err); | |
1645 if (err) { | |
1646 debug_printf("Couldn't initialize %s for IRC charset conversion, using ISO-8859-1\n", | |
1647 gc->user->proto_opt[USEROPT_CHARSET]); | |
1648 strcpy(gc->user->proto_opt[USEROPT_CHARSET], "ISO-8859-1"); | |
1649 } | |
1650 | |
4223 | 1651 g_free(test); |
1652 | |
2086 | 1653 if (idata->fd != source) |
1654 idata->fd = source; | |
1655 | |
2574
3526c5581f92
[gaim-migrate @ 2587]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
1656 gethostname(hostname, sizeof(hostname) - 1); |
3526c5581f92
[gaim-migrate @ 2587]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
1657 hostname[sizeof(hostname) - 1] = 0; |
3526c5581f92
[gaim-migrate @ 2587]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
1658 if (!*hostname) |
3526c5581f92
[gaim-migrate @ 2587]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
1659 g_snprintf(hostname, sizeof(hostname), "localhost"); |
3789 | 1660 |
1661 if (*gc->user->password) { | |
1662 g_snprintf(buf, sizeof(buf), "PASS %s\r\n", gc->user->password); | |
1663 | |
1664 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { | |
1665 hide_login_progress(gc, "Write error"); | |
1666 signoff(gc); | |
1667 return; | |
1668 } | |
1669 } | |
1670 | |
3562 | 1671 g_snprintf(buf, sizeof(buf), "USER %s %s %s :%s\r\n", |
3452 | 1672 g_get_user_name(), hostname, |
1673 gc->user->proto_opt[USEROPT_SERV], | |
3575 | 1674 gc->user->alias && strlen(gc->user->alias) ? gc->user->alias : "gaim"); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1675 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1676 hide_login_progress(gc, "Write error"); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1677 signoff(gc); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1678 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1679 } |
2086 | 1680 |
2574
3526c5581f92
[gaim-migrate @ 2587]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2536
diff
changeset
|
1681 g_snprintf(buf, sizeof(buf), "NICK %s\r\n", gc->username); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1682 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { |
2086 | 1683 hide_login_progress(gc, "Write error"); |
1684 signoff(gc); | |
1685 return; | |
1686 } | |
1687 | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1688 gc->inpa = gaim_input_add(idata->fd, GAIM_INPUT_READ, irc_callback, gc); |
2086 | 1689 } |
1690 | |
3751 | 1691 static void |
1692 irc_login(struct aim_user *user) | |
2086 | 1693 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1694 char buf[IRC_BUF_LEN]; |
2086 | 1695 |
1696 struct gaim_connection *gc = new_gaim_conn(user); | |
1697 struct irc_data *idata = gc->proto_data = g_new0(struct irc_data, 1); | |
1698 | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1699 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", gc->username); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1700 |
2086 | 1701 g_snprintf(buf, sizeof(buf), "Signon: %s", gc->username); |
1702 set_login_progress(gc, 2, buf); | |
1703 | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1704 idata->chantypes = g_strdup("#&!+"); |
3452 | 1705 idata->chanmodes = g_strdup("beI,k,lnt"); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1706 idata->nickmodes = g_strdup("ohv"); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1707 idata->str = g_string_new(""); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1708 |
2086 | 1709 idata->fd = proxy_connect(user->proto_opt[USEROPT_SERV], |
1710 user->proto_opt[USEROPT_PORT][0] ? atoi(user-> | |
1711 proto_opt[USEROPT_PORT]) : | |
1712 6667, irc_login_callback, gc); | |
1713 if (!user->gc || (idata->fd < 0)) { | |
1714 hide_login_progress(gc, "Unable to create socket"); | |
1715 signoff(gc); | |
1716 return; | |
1717 } | |
1718 } | |
1719 | |
3751 | 1720 static void |
1721 irc_close(struct gaim_connection *gc) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1722 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1723 struct irc_data *idata = (struct irc_data *)gc->proto_data; |
3618 | 1724 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1725 gchar buf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1726 |
3452 | 1727 if (idata->str->len > 0) { |
1728 g_snprintf(buf, sizeof(buf), "QUIT :%s\r\n", idata->str->str); | |
1729 } else { | |
1730 g_snprintf(buf, sizeof(buf), | |
1731 "QUIT :Download Gaim [%s]\r\n", WEBSITE); | |
1732 } | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1733 irc_write(idata->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1734 |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1735 if (idata->rxqueue) |
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1736 g_free(idata->rxqueue); |
3618 | 1737 |
3619 | 1738 idata->rxqueue = NULL; |
1739 idata->rxlen = 0; | |
1740 | |
3618 | 1741 /* Kill any existing transfers */ |
1742 while (idata->file_transfers) { | |
3708 | 1743 struct irc_file_transfer *ift = (struct irc_file_transfer *)idata->file_transfers->data; |
3618 | 1744 |
3708 | 1745 g_free(ift->sn); |
1746 g_free(ift->name); | |
1747 gaim_input_remove(ift->watcher); | |
3618 | 1748 |
3708 | 1749 close(ift->fd); |
3618 | 1750 |
3708 | 1751 idata->file_transfers = idata->file_transfers->next; |
3618 | 1752 } |
3619 | 1753 idata->file_transfers = NULL; |
3618 | 1754 |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1755 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1756 g_free(idata->chantypes); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1757 g_free(idata->chanmodes); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1758 g_free(idata->nickmodes); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1759 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1760 g_string_free(idata->str, TRUE); |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1761 if (idata->liststr) |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1762 g_string_free(idata->liststr, TRUE); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1763 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1764 if (idata->timer) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1765 g_source_remove(idata->timer); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1766 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1767 if (gc->inpa) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1768 gaim_input_remove(gc->inpa); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1769 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1770 close(idata->fd); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1771 g_free(gc->proto_data); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1772 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1773 |
3751 | 1774 static void |
1775 set_mode_3(struct gaim_connection *gc, char *who, int sign, int mode, | |
3708 | 1776 int start, int end, char *word[]) |
2086 | 1777 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1778 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1779 char buf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1780 int left; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1781 int i = start; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1782 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1783 while (1) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1784 left = end - i; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1785 switch (left) { |
3708 | 1786 case 0: |
1787 return; | |
1788 case 1: | |
1789 g_snprintf(buf, sizeof(buf), "MODE %s %c%c %s\r\n", | |
1790 who, sign, mode, word[i]); | |
1791 i += 1; | |
1792 break; | |
1793 case 2: | |
1794 g_snprintf(buf, sizeof(buf), "MODE %s %c%c%c %s %s\r\n", | |
1795 who, sign, mode, mode, word[i], word[i + 1]); | |
1796 i += 2; | |
1797 break; | |
1798 default: | |
1799 g_snprintf(buf, sizeof(buf), "MODE %s %c%c%c%c %s %s %s\r\n", | |
1800 who, sign, mode, mode, mode, | |
1801 word[i], word[i + 1], word[i + 2]); | |
1802 i += 2; | |
1803 break; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1804 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1805 irc_write(id->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1806 if (left < 3) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1807 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1808 } |
2086 | 1809 } |
1810 | |
3751 | 1811 static void |
1812 set_mode_6(struct gaim_connection *gc, char *who, int sign, int mode, | |
3708 | 1813 int start, int end, char *word[]) |
2086 | 1814 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1815 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1816 char buf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1817 int left; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1818 int i = start; |
2086 | 1819 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1820 while (1) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1821 left = end - i; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1822 switch (left) { |
3708 | 1823 case 0: |
1824 return; | |
1825 case 1: | |
1826 g_snprintf(buf, sizeof(buf), "MODE %s %c%c %s\r\n", | |
1827 who, sign, mode, word[i]); | |
1828 i += 1; | |
1829 break; | |
1830 case 2: | |
1831 g_snprintf(buf, sizeof(buf), "MODE %s %c%c%c %s %s\r\n", | |
1832 who, sign, mode, mode, word[i], word[i + 1]); | |
1833 i += 2; | |
1834 break; | |
1835 case 3: | |
1836 g_snprintf(buf, sizeof(buf), "MODE %s %c%c%c%c %s %s %s\r\n", | |
1837 who, sign, mode, mode, mode, | |
1838 word[i], word[i + 1], word[i + 2]); | |
1839 i += 3; | |
1840 break; | |
1841 case 4: | |
1842 g_snprintf(buf, sizeof(buf), "MODE %s %c%c%c%c%c %s %s %s %s\r\n", | |
1843 who, sign, mode, mode, mode, mode, | |
1844 word[i], word[i + 1], word[i + 2], word[i + 3]); | |
1845 i += 4; | |
1846 break; | |
1847 case 5: | |
1848 g_snprintf(buf, sizeof(buf), "MODE %s %c%c%c%c%c%c %s %s %s %s %s\r\n", | |
1849 who, sign, mode, mode, mode, mode, mode, | |
1850 word[i], word[i + 1], word[i + 2], | |
1851 word[i + 3], word[i + 4]); | |
1852 i += 5; | |
1853 break; | |
1854 default: | |
1855 g_snprintf(buf, sizeof(buf), "MODE %s %c%c%c%c%c%c%c %s %s %s %s %s %s\r\n", | |
1856 who, sign, mode, mode, mode, mode, mode, mode, | |
1857 word[i], word[i + 1], word[i + 2], | |
1858 word[i + 3], word[i + 4], word[i + 5]); | |
1859 i += 6; | |
1860 break; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1861 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1862 irc_write(id->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1863 if (left < 6) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1864 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1865 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1866 } |
2086 | 1867 |
3751 | 1868 static void |
1869 set_mode(struct gaim_connection *gc, char *who, int sign, int mode, char *word[]) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1870 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1871 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1872 int i = 2; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1873 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1874 while (1) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1875 if (!*word[i]) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1876 if (i == 2) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1877 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1878 if (id->six_modes) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1879 set_mode_6(gc, who, sign, mode, 2, i, word); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1880 else |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1881 set_mode_3(gc, who, sign, mode, 2, i, word); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1882 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1883 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1884 i++; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1885 } |
2086 | 1886 } |
1887 | |
3751 | 1888 static void |
1889 set_chan_mode(struct gaim_connection *gc, char *chan, char *mode_str) | |
3452 | 1890 { |
1891 struct irc_data *id = gc->proto_data; | |
1892 char buf[IRC_BUF_LEN]; | |
1893 | |
1894 if ((mode_str[0] == '-') || (mode_str[0] == '+')) { | |
1895 g_snprintf(buf, sizeof(buf), "MODE %s %s\r\n", chan, mode_str); | |
1896 irc_write(id->fd, buf, strlen(buf)); | |
1897 } | |
1898 } | |
1899 | |
3751 | 1900 static int |
1901 handle_command(struct gaim_connection *gc, char *who, char *what) | |
2086 | 1902 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1903 char buf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1904 char pdibuf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1905 char *word[PDIWORDS], *word_eol[PDIWORDS]; |
3029 | 1906 char *tmp = g_strdup(what); |
1907 GString *str = encode_html(tmp); | |
3751 | 1908 char *intl; |
1909 int len; | |
3029 | 1910 struct dcc_chat *dccchat = find_dcc_chat(gc, who); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1911 struct irc_data *id = gc->proto_data; |
3029 | 1912 g_free(tmp); |
3030 | 1913 what = str->str; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1914 if (*what != '/') { |
3029 | 1915 if (dccchat) { |
3751 | 1916 intl = irc_send_convert(gc, what, sizeof(buf), &len); |
1917 g_snprintf(buf, sizeof(buf), "%s\r\n", intl); | |
1918 g_free(intl); | |
3029 | 1919 irc_write(dccchat->fd, buf, strlen(buf)); |
1920 g_string_free(str, TRUE); | |
1921 return 1; | |
1922 } | |
3751 | 1923 irc_send_privmsg (gc, who, what, TRUE); |
3029 | 1924 g_string_free(str, TRUE); |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
1925 return 1; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1926 } |
3029 | 1927 |
3033 | 1928 process_data_init(pdibuf, what + 1, word, word_eol, TRUE); |
1929 g_string_free(str, FALSE); | |
3029 | 1930 if (!g_strcasecmp(pdibuf, "ME")) { |
1931 if (dccchat) { | |
3751 | 1932 intl = irc_send_convert(gc, word_eol[2], sizeof(buf), &len); |
1933 g_snprintf(buf, sizeof(buf), "\001ACTION %s\001\r\n", intl); | |
1934 g_free(intl); | |
3029 | 1935 irc_write(dccchat->fd, buf, strlen(buf)); |
3033 | 1936 g_free(what); |
3029 | 1937 return 1; |
1938 } | |
3735 | 1939 g_snprintf(buf, sizeof(buf), "\001ACTION %s\001", word_eol[2]); |
3751 | 1940 irc_send_privmsg (gc, who, buf, FALSE); |
3033 | 1941 g_free(what); |
2304
15fb364935ec
[gaim-migrate @ 2314]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1942 return 1; |
2847
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
1943 } else if (!g_strcasecmp(pdibuf, "INVITE")) { |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
1944 char buf[IRC_BUF_LEN]; |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
1945 g_snprintf(buf, sizeof(buf), "INVITE %s\r\n", word_eol[2]); |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
1946 irc_write(id->fd, buf, strlen(buf)); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1947 } else if (!g_strcasecmp(pdibuf, "TOPIC")) { |
3033 | 1948 if (!*word_eol[2]) { |
3501 | 1949 struct conversation *c; |
1950 c = irc_find_chat(gc, who); | |
1951 g_snprintf(buf, sizeof(buf), _("Topic for %s is %s"), who, c->topic ? c->topic : "(no topic set)"); | |
1952 write_to_conv(c, buf, WFLAG_SYSTEM | WFLAG_NOLOG, NULL, time(NULL), -1); | |
1953 } else { | |
3751 | 1954 /* This could be too long */ |
1955 intl = irc_send_convert(gc, word_eol[2], sizeof(buf), &len); | |
1956 g_snprintf(buf, sizeof(buf), "TOPIC %s :%s\r\n", who, intl); | |
1957 g_free(intl); | |
3501 | 1958 irc_write(id->fd, buf, strlen(buf)); |
3033 | 1959 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1960 } else if (!g_strcasecmp(pdibuf, "NICK")) { |
3033 | 1961 if (!*word_eol[2]) { |
1962 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
1963 return -EINVAL; |
3033 | 1964 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1965 g_snprintf(buf, sizeof(buf), "NICK %s\r\n", word_eol[2]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1966 irc_write(id->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1967 } else if (!g_strcasecmp(pdibuf, "OP")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1968 set_mode(gc, who, '+', 'o', word); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1969 } else if (!g_strcasecmp(pdibuf, "DEOP")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1970 set_mode(gc, who, '-', 'o', word); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1971 } else if (!g_strcasecmp(pdibuf, "VOICE")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1972 set_mode(gc, who, '+', 'v', word); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1973 } else if (!g_strcasecmp(pdibuf, "DEVOICE")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1974 set_mode(gc, who, '-', 'v', word); |
3452 | 1975 } else if (!g_strcasecmp(pdibuf, "MODE")) { |
1976 char *chan = who; | |
1977 set_chan_mode(gc, chan, word_eol[2]); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1978 } else if (!g_strcasecmp(pdibuf, "QUOTE")) { |
3033 | 1979 if (!*word_eol[2]) { |
1980 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
1981 return -EINVAL; |
3033 | 1982 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1983 g_snprintf(buf, sizeof(buf), "%s\r\n", word_eol[2]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1984 irc_write(id->fd, buf, strlen(buf)); |
2301
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
1985 } else if (!g_strcasecmp(pdibuf, "SAY")) { |
3033 | 1986 if (!*word_eol[2]) { |
1987 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
1988 return -EINVAL; |
3033 | 1989 } |
3751 | 1990 irc_send_privmsg (gc, who, word_eol[2], TRUE); |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
1991 return 1; |
2302
722a912562a0
[gaim-migrate @ 2312]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2301
diff
changeset
|
1992 } else if (!g_strcasecmp(pdibuf, "MSG")) { |
3033 | 1993 if (!*word[2]) { |
1994 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
1995 return -EINVAL; |
3033 | 1996 } |
1997 if (!*word_eol[3]) { | |
1998 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
1999 return -EINVAL; |
3033 | 2000 } |
3751 | 2001 irc_send_privmsg (gc, word[2], word_eol[3], TRUE); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2002 } else if (!g_strcasecmp(pdibuf, "KICK")) { |
3033 | 2003 if (!*word[2]) { |
2004 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2005 return -EINVAL; |
3033 | 2006 } |
3751 | 2007 if (*word_eol[3]) { |
2008 intl = irc_send_convert(gc, word_eol[3], sizeof(buf), &len); | |
2009 g_snprintf(buf, sizeof(buf), "KICK %s %s :%s\r\n", who, word[2], intl); | |
2010 g_free(intl); | |
2011 } else | |
2298
57da45349e50
[gaim-migrate @ 2308]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2295
diff
changeset
|
2012 g_snprintf(buf, sizeof(buf), "KICK %s %s\r\n", who, word[2]); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2013 irc_write(id->fd, buf, strlen(buf)); |
2801 | 2014 } else if (!g_strcasecmp(pdibuf, "JOIN") || !g_strcasecmp(pdibuf, "J")) { |
3033 | 2015 if (!*word[2]) { |
2016 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2017 return -EINVAL; |
3033 | 2018 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2019 if (*word[3]) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2020 g_snprintf(buf, sizeof(buf), "JOIN %s %s\r\n", word[2], word[3]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2021 else |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2022 g_snprintf(buf, sizeof(buf), "JOIN %s\r\n", word[2]); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2023 irc_write(id->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2024 } else if (!g_strcasecmp(pdibuf, "PART")) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2025 char *chan = *word[2] ? word[2] : who; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2026 char *reason = word_eol[3]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2027 struct conversation *c; |
3033 | 2028 if (!is_channel(gc, chan)) { |
2029 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2030 return -EINVAL; |
3033 | 2031 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2032 c = irc_find_chat(gc, chan); |
3751 | 2033 if (*reason) { |
2034 intl = irc_send_convert(gc, reason, sizeof(buf), &len); | |
2035 g_snprintf(buf, sizeof(buf), "PART %s :%s\r\n", chan, intl); | |
2036 g_free(intl); | |
2037 } else | |
2038 g_snprintf(buf, sizeof(buf), "PART %s\r\n", chan); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2039 irc_write(id->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2040 if (c) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2041 gc->buddy_chats = g_slist_remove(gc->buddy_chats, c); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2042 c->gc = NULL; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2043 g_snprintf(buf, sizeof(buf), _("You have left %s"), chan); |
3707 | 2044 do_error_dialog(buf, _("IRC Part"), GAIM_INFO); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2045 } |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2046 } else if (!g_strcasecmp(pdibuf, "WHOIS")) { |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2047 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", word_eol[2]); |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2048 irc_write(id->fd, buf, strlen(buf)); |
3707 | 2049 } else if (!g_strcasecmp(pdibuf, "WHOWAS")) { |
2050 g_snprintf(buf, sizeof(buf), "WHOWAS %s\r\n", word_eol[2]); | |
2051 irc_write(id->fd, buf, strlen(buf)); | |
2829
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2052 } else if (!g_strcasecmp(pdibuf, "LIST")) { |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2053 g_snprintf(buf, sizeof(buf), "LIST\r\n"); |
e3f98544eae0
[gaim-migrate @ 2842]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2054 irc_write(id->fd, buf, strlen(buf)); |
3452 | 2055 } else if (!g_strcasecmp(pdibuf, "QUIT")) { |
2056 char *reason = word_eol[2]; | |
2057 id->str = g_string_insert(id->str, 0, reason); | |
2058 do_quit(); | |
2059 } else if (!g_strcasecmp(pdibuf, "VERSION")) { | |
2060 g_snprintf(buf, sizeof(buf), "VERSION\r\n"); | |
2061 irc_write(id->fd, buf, strlen(buf)); | |
2062 } else if (!g_strcasecmp(pdibuf, "W")) { | |
2063 g_snprintf(buf, sizeof(buf), "WHO *\r\n"); | |
2064 irc_write(id->fd, buf, strlen(buf)); | |
3707 | 2065 } else if (!g_strcasecmp(pdibuf, "REHASH")) { |
2066 g_snprintf(buf, sizeof(buf), "REHASH\r\n"); | |
2067 irc_write(id->fd, buf, strlen(buf)); | |
2068 } else if (!g_strcasecmp(pdibuf, "RESTART")) { | |
2069 g_snprintf(buf, sizeof(buf), "RESTART\r\n"); | |
2070 irc_write(id->fd, buf, strlen(buf)); | |
2071 } else if (!g_strcasecmp(pdibuf, "CTCP")) { | |
2072 if (!g_strcasecmp(word[2], "CLIENTINFO")) { | |
2073 if (word[3]) | |
2074 irc_ctcp_clientinfo(gc, word[3]); | |
2075 } else if (!g_strcasecmp(word[2], "USERINFO")) { | |
2076 if (word[3]) | |
2077 irc_ctcp_userinfo(gc, word[3]); | |
2078 } else if (!g_strcasecmp(word[2], "VERSION")) { | |
2079 if (word[3]) | |
2080 irc_ctcp_version(gc, word[3]); | |
3735 | 2081 |
2082 } else if (!g_strcasecmp(word[2], "PING")) { | |
2083 if (word[3]) | |
2084 irc_ctcp_ping(gc, word[3]); | |
3707 | 2085 } |
2086 } else if (!g_strcasecmp(pdibuf, "DCC")) { | |
2087 struct conversation *c = NULL; | |
2088 if (!g_strcasecmp(word[2], "CHAT")) { | |
2089 if (word[3]) | |
2090 irc_start_chat(gc, word[3]); | |
2091 | |
2092 if (is_channel(gc, who)) { | |
2093 c = irc_find_chat(gc, who); | |
2094 } else { | |
2095 c = find_conversation(who); | |
2096 } | |
2097 if (c) { | |
4221 | 2098 write_to_conv(c, _("<I>Requesting DCC CHAT</I>"), |
3707 | 2099 WFLAG_SYSTEM, NULL, |
2100 time(NULL), -1); | |
2101 } | |
2102 } | |
2301
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
2103 } else if (!g_strcasecmp(pdibuf, "HELP")) { |
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
2104 struct conversation *c = NULL; |
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
2105 if (is_channel(gc, who)) { |
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
2106 c = irc_find_chat(gc, who); |
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
2107 } else { |
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
2108 c = find_conversation(who); |
171d11fb37b9
[gaim-migrate @ 2311]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2299
diff
changeset
|
2109 } |
3033 | 2110 if (!c) { |
2111 g_free(what); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2112 return -EINVAL; |
3033 | 2113 } |
3707 | 2114 if (!g_strcasecmp(word[2], "OPER")) { |
4221 | 2115 write_to_conv(c, _("<B>Operator commands:<BR>" |
2116 "REHASH RESTART</B>"), | |
3707 | 2117 WFLAG_NOLOG, NULL, time(NULL), -1); |
2118 } else if (!g_strcasecmp(word[2], "CTCP")) { | |
4221 | 2119 write_to_conv(c, _("<B>CTCP commands:<BR>" |
3707 | 2120 "CLIENTINFO <nick><BR>" |
2121 "USERINFO <nick><BR>" | |
3735 | 2122 "VERSION <nick><BR>" |
4221 | 2123 "PING <nick></B><BR>"), |
3707 | 2124 WFLAG_NOLOG, NULL, time(NULL), -1); |
2125 } else if (!g_strcasecmp(word[2], "DCC")) { | |
4221 | 2126 write_to_conv(c, _("<B>DCC commands:<BR>" |
2127 "CHAT <nick></B>"), | |
3707 | 2128 WFLAG_NOLOG, NULL, time(NULL), -1); |
2129 } else { | |
4221 | 2130 write_to_conv(c, _("<B>Currently supported commands:<BR>" |
3707 | 2131 "WHOIS INVITE NICK LIST<BR>" |
2132 "JOIN PART TOPIC KICK<BR>" | |
2133 "OP DEOP VOICE DEVOICE<BR>" | |
2134 "ME MSG QUOTE SAY QUIT<BR>" | |
3735 | 2135 "MODE VERSION W WHOWAS<BR>" |
3707 | 2136 "Type /HELP OPER for operator commands<BR>" |
2137 "Type /HELP CTCP for CTCP commands<BR>" | |
4221 | 2138 "Type /HELP DCC for DCC commands"), |
3707 | 2139 WFLAG_NOLOG, NULL, time(NULL), -1); |
2140 } | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2141 } else { |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2142 struct conversation *c = NULL; |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2143 if (is_channel(gc, who)) { |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2144 c = irc_find_chat(gc, who); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2145 } else { |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2146 c = find_conversation(who); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2147 } |
3033 | 2148 if (!c) { |
2149 g_free(what); | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2304
diff
changeset
|
2150 return -EINVAL; |
3033 | 2151 } |
4221 | 2152 write_to_conv(c, _("<B>Unknown command</B>"), WFLAG_NOLOG, NULL, time(NULL), -1); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2153 } |
3033 | 2154 g_free(what); |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2155 return 0; |
2086 | 2156 } |
2157 | |
3751 | 2158 static int |
2159 send_msg(struct gaim_connection *gc, char *who, char *what) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2160 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2161 char *cr = strchr(what, '\n'); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2162 if (cr) { |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2163 int ret = 0; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2164 while (TRUE) { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2165 if (cr) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2166 *cr = 0; |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2167 ret = handle_command(gc, who, what); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2168 if (!cr) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2169 break; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2170 what = cr + 1; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2171 if (!*what) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2172 break; |
2295
24dc9ce95127
[gaim-migrate @ 2305]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2294
diff
changeset
|
2173 *cr = '\n'; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2174 cr = strchr(what, '\n'); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2175 } |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2176 return ret; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2177 } else |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2178 return handle_command(gc, who, what); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2179 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2180 |
3751 | 2181 static void |
2182 irc_chat_invite(struct gaim_connection *gc, int idn, const char *message, const char *name) { | |
2847
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2183 char buf[IRC_BUF_LEN]; |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2184 struct irc_data *id = gc->proto_data; |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2185 struct conversation *c = irc_find_chat_by_id(gc, idn); |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2186 g_snprintf(buf, sizeof(buf), "INVITE %s %s\r\n", name, c->name); |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2187 irc_write(id->fd, buf, strlen(buf)); |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2188 } |
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2189 |
3751 | 2190 static int |
2191 irc_send_im(struct gaim_connection *gc, char *who, char *what, int len, int flags) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2192 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2193 if (*who == '@' || *who == '+') |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2194 return send_msg(gc, who + 1, what); |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2195 return send_msg(gc, who, what); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2196 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2197 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2198 /* IRC doesn't have a buddy list, but we can still figure out who's online with ISON */ |
3751 | 2199 static void |
2200 irc_add_buddy(struct gaim_connection *gc, const char *who) {} | |
2201 static void | |
2202 irc_remove_buddy(struct gaim_connection *gc, char *who, char *group) {} | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2203 |
3751 | 2204 static GList * |
2205 irc_chat_info(struct gaim_connection *gc) | |
2086 | 2206 { |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
2207 GList *m = NULL; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2208 struct proto_chat_entry *pce; |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
2209 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2210 pce = g_new0(struct proto_chat_entry, 1); |
2466
f8eb5f120603
[gaim-migrate @ 2479]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2459
diff
changeset
|
2211 pce->label = _("Channel:"); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2212 m = g_list_append(m, pce); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
2213 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2214 pce = g_new0(struct proto_chat_entry, 1); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2215 pce->label = _("Password:"); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2216 m = g_list_append(m, pce); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
2217 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
2218 return m; |
2086 | 2219 } |
2220 | |
3751 | 2221 static void |
2222 irc_join_chat(struct gaim_connection *gc, GList *data) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2223 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2224 struct irc_data *id = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2225 char buf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2226 char *name, *pass; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2227 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2228 if (!data) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2229 return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2230 name = data->data; |
2299
b5b7dece5249
[gaim-migrate @ 2309]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2298
diff
changeset
|
2231 if (data->next) { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2232 pass = data->next->data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2233 g_snprintf(buf, sizeof(buf), "JOIN %s %s\r\n", name, pass); |
2299
b5b7dece5249
[gaim-migrate @ 2309]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2298
diff
changeset
|
2234 } else |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2235 g_snprintf(buf, sizeof(buf), "JOIN %s\r\n", name); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2236 irc_write(id->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2237 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2238 |
3751 | 2239 static void |
2240 irc_chat_leave(struct gaim_connection *gc, int id) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2241 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2242 struct irc_data *idata = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2243 struct conversation *c = irc_find_chat_by_id(gc, id); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2244 char buf[IRC_BUF_LEN]; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2245 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2246 if (!c) return; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2247 |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2248 g_snprintf(buf, sizeof(buf), "PART %s\r\n", c->name); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2249 irc_write(idata->fd, buf, strlen(buf)); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2250 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2251 |
3751 | 2252 static int |
2253 irc_chat_send(struct gaim_connection *gc, int id, char *what) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2254 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2255 struct conversation *c = irc_find_chat_by_id(gc, id); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2256 if (!c) |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2257 return -EINVAL; |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2258 if (send_msg(gc, c->name, what) > 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2302
diff
changeset
|
2259 serv_got_chat_in(gc, c->id, gc->displayname, 0, what, time(NULL)); |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2260 return 0; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2261 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2262 |
3751 | 2263 static GList * |
2264 irc_away_states(struct gaim_connection *gc) | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2265 { |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2266 return g_list_append(NULL, GAIM_AWAY_CUSTOM); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2267 } |
2086 | 2268 |
3751 | 2269 static void |
2270 irc_set_away(struct gaim_connection *gc, char *state, char *msg) | |
2086 | 2271 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2272 struct irc_data *idata = gc->proto_data; |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2273 char buf[IRC_BUF_LEN]; |
2086 | 2274 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
2275 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
2276 g_free(gc->away); |
2394
579f8d4347ad
[gaim-migrate @ 2407]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
2277 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
2278 } |
2393
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
2279 |
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
2280 if (msg) { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2281 g_snprintf(buf, sizeof(buf), "AWAY :%s\r\n", msg); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
2282 gc->away = g_strdup(msg); |
2393
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
2283 } else |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2284 g_snprintf(buf, sizeof(buf), "AWAY\r\n"); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
2285 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2286 irc_write(idata->fd, buf, strlen(buf)); |
2086 | 2287 } |
2288 | |
3751 | 2289 static char ** |
2290 irc_list_icon(int uc) | |
2086 | 2291 { |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2292 return irc_icon_xpm; |
2086 | 2293 } |
2294 | |
3751 | 2295 static int |
2296 getlocalip(char *ip) /* Thanks, libfaim */ | |
3029 | 2297 { |
2298 struct hostent *hptr; | |
2299 char localhost[129]; | |
2300 long unsigned add; | |
2301 | |
2302 /* XXX if available, use getaddrinfo() */ | |
2303 /* XXX allow client to specify which IP to use for multihomed boxes */ | |
2304 | |
2305 if (gethostname(localhost, 128) < 0) | |
2306 return -1; | |
2307 | |
2308 if (!(hptr = gethostbyname(localhost))) | |
2309 return -1; | |
2310 | |
2311 memcpy(&add, hptr->h_addr_list[0], 4); | |
2312 add = htonl(add); | |
2313 g_snprintf(ip, 11, "%lu", add); | |
2314 | |
2315 return 0; | |
2316 } | |
2317 | |
3751 | 2318 static void |
2319 dcc_chat_connected(gpointer data, gint source, GdkInputCondition condition) | |
3029 | 2320 { |
2321 struct dcc_chat *chat = data; | |
2322 struct conversation *convo; | |
2323 char buf[128]; | |
2324 struct sockaddr_in addr; | |
2325 int addrlen = sizeof (addr); | |
2326 addr.sin_family = AF_INET; | |
2327 addr.sin_port = htons (chat->port); | |
2328 addr.sin_addr.s_addr = INADDR_ANY; | |
2329 chat->fd = accept (chat->fd, (struct sockaddr *) (&addr), &addrlen); | |
3707 | 2330 if (!chat->fd) { |
3730 | 2331 dcc_chat_cancel (chat); |
3707 | 2332 convo = new_conversation (chat->nick); |
2333 g_snprintf (buf, sizeof buf, _("DCC Chat with %s closed"), | |
2334 chat->nick); | |
2335 write_to_conv (convo, buf, WFLAG_SYSTEM, NULL, | |
2336 time ((time_t) NULL), -1); | |
2337 return; | |
2338 } | |
3029 | 2339 chat->inpa = |
2340 gaim_input_add (chat->fd, GAIM_INPUT_READ, dcc_chat_in, chat); | |
2341 convo = new_conversation (chat->nick); | |
4221 | 2342 g_snprintf (buf, sizeof buf, _("DCC Chat with %s established"), |
3029 | 2343 chat->nick); |
2344 write_to_conv (convo, buf, WFLAG_SYSTEM, NULL, time ((time_t) NULL), -1); | |
2345 debug_printf ("Chat with %s established\n", chat->nick); | |
2346 dcc_chat_list = g_slist_append (dcc_chat_list, chat); | |
2347 } | |
3665
7cb6cf20ed7d
[gaim-migrate @ 3794]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3633
diff
changeset
|
2348 #if 0 |
3751 | 2349 static void |
2350 irc_ask_send_file(struct gaim_connection *gc, char *destsn) { | |
3708 | 2351 struct irc_data *id = (struct irc_data *)gc->proto_data; |
2352 struct irc_file_transfer *ift = g_new0(struct irc_file_transfer, 1); | |
2353 char *localip = (char *)malloc(12); | |
3622 | 2354 |
3708 | 2355 if (getlocalip(localip) == -1) { |
2356 free(localip); | |
2357 return; | |
2358 } | |
3616 | 2359 |
3708 | 2360 ift->type = IFT_SENDFILE_OUT; |
2361 ift->sn = g_strdup(destsn); | |
2362 ift->gc = gc; | |
2363 snprintf(ift->ip, sizeof(ift->ip), "%s", localip); | |
2364 id->file_transfers = g_slist_append(id->file_transfers, ift); | |
3622 | 2365 |
3708 | 2366 ift->xfer = transfer_out_add(gc, ift->sn); |
3616 | 2367 } |
3665
7cb6cf20ed7d
[gaim-migrate @ 3794]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3633
diff
changeset
|
2368 #endif |
3751 | 2369 static struct |
2370 irc_file_transfer *find_ift_by_xfer(struct gaim_connection *gc, | |
3708 | 2371 struct file_transfer *xfer) { |
3616 | 2372 |
3708 | 2373 GSList *g = ((struct irc_data *)gc->proto_data)->file_transfers; |
2374 struct irc_file_transfer *f = NULL; | |
3616 | 2375 |
3708 | 2376 while (g) { |
2377 f = (struct irc_file_transfer *)g->data; | |
2378 if (f->xfer == xfer) | |
2379 break; | |
2380 g = g->next; | |
2381 f = NULL; | |
2382 } | |
3616 | 2383 |
3708 | 2384 return f; |
3616 | 2385 } |
2386 | |
3751 | 2387 static void |
2388 irc_file_transfer_data_chunk(struct gaim_connection *gc, struct file_transfer *xfer, const char *data, int len) { | |
3616 | 2389 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); |
2390 guint32 pos; | |
2391 | |
2392 ift->cur += len; | |
2393 pos = htonl(ift->cur); | |
2394 write(ift->fd, (char *)&pos, 4); | |
2395 | |
3623 | 2396 // FIXME: You should check to verify that they received the data when |
2397 // you are sending a file ... | |
3616 | 2398 } |
2399 | |
3751 | 2400 static void |
2401 irc_file_transfer_cancel (struct gaim_connection *gc, struct file_transfer *xfer) { | |
3616 | 2402 struct irc_data *id = (struct irc_data *)gc->proto_data; |
2403 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | |
2404 | |
2405 printf("Our shit got canceled, yo!\n"); | |
2406 | |
2407 /* Remove the FT from our list of transfers */ | |
2408 id->file_transfers = g_slist_remove(id->file_transfers, ift); | |
2409 | |
2410 gaim_input_remove(ift->watcher); | |
2411 | |
2412 /* Close our FT because we're done */ | |
2413 close(ift->fd); | |
2414 | |
2415 g_free(ift->sn); | |
2416 g_free(ift->name); | |
2417 | |
2418 g_free(ift); | |
2419 } | |
2420 | |
3751 | 2421 static void |
2422 irc_file_transfer_done(struct gaim_connection *gc, struct file_transfer *xfer) { | |
3616 | 2423 struct irc_data *id = (struct irc_data *)gc->proto_data; |
2424 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | |
2425 | |
2426 | |
2427 printf("Our shit be done, yo.\n"); | |
2428 | |
2429 /* Remove the FT from our list of transfers */ | |
2430 id->file_transfers = g_slist_remove(id->file_transfers, ift); | |
2431 | |
2432 gaim_input_remove(ift->watcher); | |
2433 | |
2434 /* Close our FT because we're done */ | |
2435 close(ift->fd); | |
2436 | |
2437 g_free(ift->sn); | |
2438 g_free(ift->name); | |
2439 | |
2440 g_free(ift); | |
2441 } | |
2442 | |
3751 | 2443 static void |
2444 irc_file_transfer_out (struct gaim_connection *gc, struct file_transfer *xfer, const char *name, int totfiles, int totsize) { | |
3622 | 2445 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); |
2446 struct sockaddr_in addr; | |
2447 char buf[IRC_BUF_LEN]; | |
2448 int len; | |
2449 | |
2450 | |
2451 ift->fd = socket (AF_INET, SOCK_STREAM, 0); | |
2452 addr.sin_family = AF_INET; | |
2453 addr.sin_port = 0; | |
2454 addr.sin_addr.s_addr = INADDR_ANY; | |
2455 bind (ift->fd, (struct sockaddr *) &addr, sizeof(addr)); | |
2456 listen(ift->fd, 1); | |
2457 | |
2458 len = sizeof(addr); | |
2459 getsockname (ift->fd, (struct sockaddr *) &addr, &len); | |
2460 | |
2461 ift->port = ntohs(addr.sin_port); | |
2462 | |
2463 ift->watcher = gaim_input_add (ift->fd, GAIM_INPUT_READ, dcc_send_callback, ift); | |
3633 | 2464 printf("watcher is %d\n", ift->watcher); |
3622 | 2465 |
2466 snprintf(buf, sizeof(buf), "\001DCC SEND %s %s %d %d\001\n", name, ift->ip, ift->port, totsize); | |
2467 printf("Trying: %s\n", buf); | |
2468 irc_send_im (gc, ift->sn, buf, -1, 0); | |
2469 } | |
2470 | |
3751 | 2471 static void |
2472 irc_file_transfer_in(struct gaim_connection *gc, | |
3708 | 2473 struct file_transfer *xfer, int offset) { |
3616 | 2474 |
2475 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | |
2476 | |
2477 ift->xfer = xfer; | |
2478 proxy_connect(ift->ip, ift->port, dcc_recv_callback, ift); | |
2479 } | |
2480 | |
3751 | 2481 static void |
2482 irc_ctcp_clientinfo(struct gaim_connection *gc, char *who) | |
2483 { | |
2484 char buf[IRC_BUF_LEN]; | |
2485 | |
2486 snprintf (buf, sizeof buf, "\001CLIENTINFO\001"); | |
2487 irc_send_privmsg(gc, who, buf, FALSE); | |
2488 } | |
2489 | |
2490 static void | |
2491 irc_ctcp_userinfo(struct gaim_connection *gc, char *who) | |
3707 | 2492 { |
3735 | 2493 char buf[IRC_BUF_LEN]; |
2494 | |
3751 | 2495 snprintf (buf, sizeof buf, "\001USERINFO\001"); |
2496 irc_send_privmsg(gc, who, buf, FALSE); | |
3707 | 2497 } |
2498 | |
3751 | 2499 static void |
2500 irc_ctcp_version(struct gaim_connection *gc, char *who) | |
3707 | 2501 { |
3735 | 2502 char buf[IRC_BUF_LEN]; |
2503 | |
3751 | 2504 snprintf (buf, sizeof buf, "\001VERSION\001"); |
2505 irc_send_privmsg(gc, who, buf, FALSE); | |
3707 | 2506 } |
2507 | |
3751 | 2508 static void |
2509 irc_ctcp_ping(struct gaim_connection *gc, char *who) | |
3707 | 2510 { |
3735 | 2511 char buf[IRC_BUF_LEN]; |
2512 | |
3867 | 2513 g_snprintf (buf, sizeof(buf), "\001PING %ld\001", time(NULL)); |
3751 | 2514 irc_send_privmsg(gc, who, buf, FALSE); |
3735 | 2515 } |
2516 | |
3751 | 2517 static void |
2518 irc_send_notice(struct gaim_connection *gc, char *who, char *what) | |
3735 | 2519 { |
3751 | 2520 char buf[IRC_BUF_LEN], *intl; |
3735 | 2521 struct irc_data *id = gc->proto_data; |
3751 | 2522 int len; |
2523 | |
2524 intl = irc_send_convert(gc, what, 501, &len); | |
2525 g_snprintf(buf, sizeof(buf), "NOTICE %s :%s\r\n", who, intl); | |
2526 g_free(intl); | |
3735 | 2527 irc_write(id->fd, buf, strlen(buf)); |
2528 } | |
2529 | |
3751 | 2530 /* Don't call this guy with fragment = 1 for anything but straight |
2531 * up privmsgs. (no CTCP/whatever) It's still dangerous for CTCPs | |
2532 * (it might not include the trailing \001), but I think this behavior | |
2533 * is generally better than not fragmenting at all on lots of our | |
2534 * packets. */ | |
2535 /* From RFC2812: | |
2536 * IRC messages are always lines of characters terminated with a CR-LF | |
2537 * (Carriage Return - Line Feed) pair, and these messages SHALL NOT | |
2538 * exceed 512 characters in length, counting all characters including | |
2539 * the trailing CR-LF. Thus, there are 510 characters maximum allowed | |
2540 * for the command and its parameters. */ | |
2541 /* So apparently that includes all the inter-server crap, which is up | |
2542 * to NINETY-THREE chars on dancer, which seems to be a pretty liberal | |
2543 * ircd. My rough calculation for now is ":<nick>!~<user>@<host> ", | |
2544 * where <host> is a max of an (uncalculated) 63 chars. Thanks to | |
2545 * trelane and #freenode for giving a hand here. */ | |
2546 static void | |
2547 irc_send_privmsg(struct gaim_connection *gc, char *who, char *what, gboolean fragment) | |
3735 | 2548 { |
3751 | 2549 char buf[IRC_BUF_LEN], *intl; |
3735 | 2550 struct irc_data *id = gc->proto_data; |
3751 | 2551 /* 512 - 12 (for PRIVMSG" "" :""\r\n") - namelen - nicklen - 68 */ |
2552 int nicklen = (gc->user->alias && strlen(gc->user->alias)) ? strlen(gc->user->alias) : 4; | |
2553 int max = 444 - strlen(who) - strlen(g_get_user_name()) - nicklen; | |
2554 | |
2555 int len; | |
2556 | |
2557 do { | |
2558 /* the \001 on CTCPs may cause a problem here for some | |
2559 * charsets, but probably not ones people use for IRC. */ | |
2560 intl = irc_send_convert(gc, what, max, &len); | |
2561 g_snprintf(buf, sizeof(buf), "PRIVMSG %s :%s\r\n", who, intl); | |
2562 g_free(intl); | |
2563 irc_write(id->fd, buf, strlen(buf)); | |
2564 what += len; | |
2565 } while (fragment && strlen(what)); | |
3707 | 2566 } |
2567 | |
3751 | 2568 static void |
2569 irc_start_chat(struct gaim_connection *gc, char *who) { | |
3029 | 2570 struct dcc_chat *chat; |
2571 int len; | |
2572 struct sockaddr_in addr; | |
3735 | 2573 char buf[IRC_BUF_LEN]; |
3029 | 2574 |
2575 /* Create a socket */ | |
2576 chat = g_new0 (struct dcc_chat, 1); | |
2577 chat->fd = socket (AF_INET, SOCK_STREAM, 0); | |
2578 chat->gc = gc; | |
2579 g_snprintf (chat->nick, sizeof (chat->nick), "%s", who); | |
2580 if (chat->fd < 0) { | |
3730 | 2581 dcc_chat_cancel (chat); |
3708 | 2582 return; |
3029 | 2583 } |
2584 addr.sin_family = AF_INET; | |
2585 addr.sin_port = 0; | |
2586 addr.sin_addr.s_addr = INADDR_ANY; | |
2587 bind (chat->fd, (struct sockaddr *) &addr, sizeof (addr)); | |
2588 listen (chat->fd, 1); | |
2589 len = sizeof (addr); | |
2590 getsockname (chat->fd, (struct sockaddr *) &addr, &len); | |
2591 chat->port = ntohs (addr.sin_port); | |
2592 getlocalip(chat->ip_address); | |
2593 chat->inpa = | |
2594 gaim_input_add (chat->fd, GAIM_INPUT_READ, dcc_chat_connected, | |
3708 | 2595 chat); |
3630 | 2596 g_snprintf (buf, sizeof buf, "\001DCC CHAT chat %s %d\001\n", |
3708 | 2597 chat->ip_address, chat->port); |
3033 | 2598 irc_send_im (gc, who, buf, -1, 0); |
3029 | 2599 } |
2600 | |
3751 | 2601 static void |
2602 irc_get_info(struct gaim_connection *gc, char *who) | |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2603 { |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2604 struct irc_data *idata = gc->proto_data; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2605 char buf[IRC_BUF_LEN]; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2606 |
2633
b740a33875c3
[gaim-migrate @ 2646]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2620
diff
changeset
|
2607 if (*who == '@') |
b740a33875c3
[gaim-migrate @ 2646]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2620
diff
changeset
|
2608 who++; |
b740a33875c3
[gaim-migrate @ 2646]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2620
diff
changeset
|
2609 if (*who == '+') |
b740a33875c3
[gaim-migrate @ 2646]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2620
diff
changeset
|
2610 who++; |
b740a33875c3
[gaim-migrate @ 2646]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2620
diff
changeset
|
2611 |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2612 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who); |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2613 irc_write(idata->fd, buf, strlen(buf)); |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2614 } |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2615 |
3751 | 2616 static GList * |
2617 irc_buddy_menu(struct gaim_connection *gc, char *who) | |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2618 { |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2619 GList *m = NULL; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2620 struct proto_buddy_menu *pbm; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2621 |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2622 pbm = g_new0(struct proto_buddy_menu, 1); |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2623 pbm->label = _("Get Info"); |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2624 pbm->callback = irc_get_info; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2625 pbm->gc = gc; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2626 m = g_list_append(m, pbm); |
3616 | 2627 |
3029 | 2628 pbm = g_new0(struct proto_buddy_menu, 1); |
2629 pbm->label = _("DCC Chat"); | |
2630 pbm->callback = irc_start_chat; | |
2631 pbm->gc = gc; | |
2632 m = g_list_append(m, pbm); | |
3708 | 2633 /* |
2634 pbm = g_new0(struct proto_buddy_menu, 1); | |
2635 pbm->label = _("DCC Send"); | |
2636 pbm->callback = irc_ask_send_file; | |
2637 pbm->gc = gc; | |
2638 m = g_list_append(m, pbm); | |
2639 */ | |
3707 | 2640 |
2641 pbm = g_new0(struct proto_buddy_menu, 1); | |
2642 pbm->label = _("CTCP ClientInfo"); | |
2643 pbm->callback = irc_ctcp_clientinfo; | |
2644 pbm->gc = gc; | |
2645 m = g_list_append(m, pbm); | |
2646 | |
2647 pbm = g_new0(struct proto_buddy_menu, 1); | |
2648 pbm->label = _("CTCP UserInfo"); | |
2649 pbm->callback = irc_ctcp_userinfo; | |
2650 pbm->gc = gc; | |
2651 m = g_list_append(m, pbm); | |
2652 | |
2653 pbm = g_new0(struct proto_buddy_menu, 1); | |
2654 pbm->label = _("CTCP Version"); | |
2655 pbm->callback = irc_ctcp_version; | |
2656 pbm->gc = gc; | |
2657 m = g_list_append(m, pbm); | |
2658 | |
3735 | 2659 pbm = g_new0(struct proto_buddy_menu, 1); |
2660 pbm->label = _("CTCP Ping"); | |
2661 pbm->callback = irc_ctcp_ping; | |
2662 pbm->gc = gc; | |
2663 m = g_list_append(m, pbm); | |
2664 | |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2665 return m; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2666 } |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2667 |
3751 | 2668 G_MODULE_EXPORT void |
2669 irc_init(struct prpl *ret) | |
2086 | 2670 { |
3572 | 2671 struct proto_user_opt *puo; |
2086 | 2672 ret->protocol = PROTO_IRC; |
3789 | 2673 ret->options = OPT_PROTO_CHAT_TOPIC | OPT_PROTO_PASSWORD_OPTIONAL; |
3572 | 2674 ret->name = g_strdup("IRC"); |
2086 | 2675 ret->list_icon = irc_list_icon; |
2676 ret->login = irc_login; | |
2677 ret->close = irc_close; | |
2678 ret->send_im = irc_send_im; | |
2681
37d80035e77f
[gaim-migrate @ 2694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2652
diff
changeset
|
2679 ret->add_buddy = irc_add_buddy; |
37d80035e77f
[gaim-migrate @ 2694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2652
diff
changeset
|
2680 ret->remove_buddy = irc_remove_buddy; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
2681 ret->chat_info = irc_chat_info; |
2086 | 2682 ret->join_chat = irc_join_chat; |
2683 ret->chat_leave = irc_chat_leave; | |
2684 ret->chat_send = irc_chat_send; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
2685 ret->away_states = irc_away_states; |
2086 | 2686 ret->set_away = irc_set_away; |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2687 ret->get_info = irc_get_info; |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
2688 ret->buddy_menu = irc_buddy_menu; |
2847
e49bd1479edd
[gaim-migrate @ 2860]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2831
diff
changeset
|
2689 ret->chat_invite = irc_chat_invite; |
3029 | 2690 ret->convo_closed = irc_convo_closed; |
3622 | 2691 ret->file_transfer_out = irc_file_transfer_out; |
3616 | 2692 ret->file_transfer_in = irc_file_transfer_in; |
2693 ret->file_transfer_data_chunk = irc_file_transfer_data_chunk; | |
2694 ret->file_transfer_done = irc_file_transfer_done; | |
2695 ret->file_transfer_cancel =irc_file_transfer_cancel; | |
3572 | 2696 |
2697 puo = g_new0(struct proto_user_opt, 1); | |
4115 | 2698 puo->label = g_strdup(_("Server:")); |
3914
9ced82507a79
[gaim-migrate @ 4073]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
2699 puo->def = g_strdup("irc.freenode.net"); |
3572 | 2700 puo->pos = USEROPT_SERV; |
2701 ret->user_opts = g_list_append(ret->user_opts, puo); | |
2702 | |
2703 puo = g_new0(struct proto_user_opt, 1); | |
4115 | 2704 puo->label = g_strdup(_("Port:")); |
3572 | 2705 puo->def = g_strdup("6667"); |
2706 puo->pos = USEROPT_PORT; | |
2707 ret->user_opts = g_list_append(ret->user_opts, puo); | |
2708 | |
3751 | 2709 puo = g_new0(struct proto_user_opt, 1); |
4115 | 2710 puo->label = g_strdup(_("Encoding:")); |
3751 | 2711 puo->def = g_strdup("ISO-8859-1"); |
2712 puo->pos = USEROPT_CHARSET; | |
2713 ret->user_opts = g_list_append(ret->user_opts, puo); | |
2714 | |
3616 | 2715 my_protocol = ret; |
2086 | 2716 } |
2717 | |
2718 #ifndef STATIC | |
3751 | 2719 G_MODULE_EXPORT void |
2720 gaim_prpl_init(struct prpl* prpl) | |
2086 | 2721 { |
3572 | 2722 irc_init(prpl); |
2723 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
2086 | 2724 } |
2725 | |
2726 #endif |