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