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