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