Mercurial > pidgin
annotate src/protocols/irc/irc.c @ 6792:62aec9fd7aca
[gaim-migrate @ 7331]
Jesse Farmer (vann) writes:
" Oops! gaim_privacy_deny_add only adds someone to the
server list if they're not already in the local deny
list, but this is exactly the situation with Yahoo!
when you add someone to the deny list who is also on
your buddy list. The call to gaim_privacy_deny_add was
changed to serv_add_deny, and also some formatting
issues were cleared up (tabs instead of spaces). The
diff is against the "latest" CVS sources in that I
applied all the available patches."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Mon, 08 Sep 2003 10:07:14 +0000 |
parents | faa491042c66 |
children | 083d1e4a9c78 |
rev | line source |
---|---|
6333 | 1 /** |
2 * @file irc.c | |
6459
b52870734c21
[gaim-migrate @ 6968]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
3 * |
6333 | 4 * gaim |
2086 | 5 * |
6333 | 6 * Copyright (C) 2003, Ethan Blanton <eblanton@cs.purdue.edu> |
7 * Copyright (C) 2000-2003, Rob Flynn <rob@tgflinux.com> | |
2086 | 8 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> |
6459
b52870734c21
[gaim-migrate @ 6968]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
9 * |
2086 | 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 */ | |
6333 | 24 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
25 #include "internal.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
26 |
6333 | 27 #include "plugin.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
28 #include "accountopt.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
29 #include "multi.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
30 #include "prpl.h" |
6333 | 31 #include "conversation.h" |
32 #include "debug.h" | |
33 #include "blist.h" | |
6350 | 34 #include "util.h" |
6333 | 35 #include "irc.h" |
4422 | 36 |
6333 | 37 static void irc_buddy_append(char *name, struct irc_buddy *ib, GString *string); |
2086 | 38 |
6695 | 39 static const char *irc_blist_icon(GaimAccount *a, GaimBuddy *b); |
40 static void irc_blist_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne); | |
6333 | 41 static GList *irc_away_states(GaimConnection *gc); |
42 /* static GList *irc_chat_info(GaimConnection *gc); */ | |
43 static void irc_login(GaimAccount *account); | |
44 static void irc_login_cb(gpointer data, gint source, GaimInputCondition cond); | |
45 static void irc_close(GaimConnection *gc); | |
6622 | 46 static int irc_im_send(GaimConnection *gc, const char *who, const char *what, int len, GaimImFlags flags); |
6333 | 47 static int irc_chat_send(GaimConnection *gc, int id, const char *what); |
48 static void irc_chat_join (GaimConnection *gc, GHashTable *data); | |
49 static void irc_input_cb(gpointer data, gint source, GaimInputCondition cond); | |
3751 | 50 |
6333 | 51 static guint irc_nick_hash(const char *nick); |
52 static gboolean irc_nick_equal(const char *nick1, const char *nick2); | |
53 static void irc_buddy_free(struct irc_buddy *ib); | |
3751 | 54 |
6333 | 55 static GaimPlugin *_irc_plugin = NULL; |
3029 | 56 |
6333 | 57 int irc_send(struct irc_conn *irc, const char *buf) |
3751 | 58 { |
6333 | 59 if (irc->fd < 0) |
60 return -1; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
61 |
6333 | 62 /* gaim_debug(GAIM_DEBUG_MISC, "irc", "sent: %s", buf); */ |
63 return write(irc->fd, buf, strlen(buf)); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
64 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
65 |
6333 | 66 /* XXX I don't like messing directly with these buddies */ |
67 gboolean irc_blist_timeout(struct irc_conn *irc) | |
2086 | 68 { |
6333 | 69 GString *string = g_string_sized_new(512); |
70 char *list, *buf; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
71 |
6333 | 72 g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_append, (gpointer)string); |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
73 |
6333 | 74 list = g_string_free(string, FALSE); |
75 if (!list || !strlen(list)) { | |
76 g_free(list); | |
2137
18722ae5b882
[gaim-migrate @ 2147]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2131
diff
changeset
|
77 return TRUE; |
2086 | 78 } |
4416
8e62cee6d738
[gaim-migrate @ 4689]
Christian Hammond <chipx86@chipx86.com>
parents:
4373
diff
changeset
|
79 |
6333 | 80 buf = irc_format(irc, "v:", "ISON", list); |
81 g_free(list); | |
82 irc_send(irc, buf); | |
83 g_free(buf); | |
4416
8e62cee6d738
[gaim-migrate @ 4689]
Christian Hammond <chipx86@chipx86.com>
parents:
4373
diff
changeset
|
84 |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
85 return TRUE; |
2086 | 86 } |
87 | |
6333 | 88 static void irc_buddy_append(char *name, struct irc_buddy *ib, GString *string) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
89 { |
6333 | 90 ib->flag = FALSE; |
91 g_string_append_printf(string, "%s ", name); | |
3511 | 92 } |
93 | |
6695 | 94 static const char *irc_blist_icon(GaimAccount *a, GaimBuddy *b) |
3029 | 95 { |
6333 | 96 return "irc"; |
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
97 } |
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
98 |
6695 | 99 static void irc_blist_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne) |
3751 | 100 { |
6333 | 101 if (b->present == GAIM_BUDDY_OFFLINE) |
102 *se = "offline"; | |
2086 | 103 } |
104 | |
6333 | 105 static GList *irc_away_states(GaimConnection *gc) |
2086 | 106 { |
6333 | 107 return g_list_append(NULL, (gpointer)GAIM_AWAY_CUSTOM); |
3452 | 108 } |
109 | |
6333 | 110 static GList *irc_buddy_menu(GaimConnection *gc, const char *who) |
2086 | 111 { |
6333 | 112 return NULL; |
2086 | 113 } |
114 | |
6333 | 115 static GList *irc_chat_join_info(GaimConnection *gc) |
2086 | 116 { |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
117 GList *m = NULL; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
118 struct proto_chat_entry *pce; |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
119 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
120 pce = g_new0(struct proto_chat_entry, 1); |
2466
f8eb5f120603
[gaim-migrate @ 2479]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2459
diff
changeset
|
121 pce->label = _("Channel:"); |
5234 | 122 pce->identifier = "channel"; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
123 m = g_list_append(m, pce); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
124 |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
125 pce = g_new0(struct proto_chat_entry, 1); |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
126 pce->label = _("Password:"); |
5234 | 127 pce->identifier = "password"; |
6499 | 128 pce->secret = TRUE; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
129 m = g_list_append(m, pce); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
130 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
131 return m; |
2086 | 132 } |
133 | |
6333 | 134 static void irc_login(GaimAccount *account) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
135 { |
6333 | 136 GaimConnection *gc; |
137 struct irc_conn *irc; | |
138 char *buf, **userparts; | |
139 const char *username = gaim_account_get_username(account); | |
140 int err; | |
141 | |
142 gc = gaim_account_get_connection(account); | |
143 | |
6752 | 144 if (strpbrk(username, " \t\v\r\n") != NULL) { |
145 gaim_connection_error(gc, _("IRC nicks may not contain whitespace")); | |
146 return; | |
147 } | |
148 | |
6333 | 149 gc->proto_data = irc = g_new0(struct irc_conn, 1); |
150 irc->account = account; | |
151 | |
152 userparts = g_strsplit(username, "@", 2); | |
153 gaim_connection_set_display_name(gc, userparts[0]); | |
154 irc->server = g_strdup(userparts[1]); | |
155 g_strfreev(userparts); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
156 |
6333 | 157 irc->buddies = g_hash_table_new_full((GHashFunc)irc_nick_hash, (GEqualFunc)irc_nick_equal, |
158 NULL, (GDestroyNotify)irc_buddy_free); | |
159 irc->cmds = g_hash_table_new(g_str_hash, g_str_equal); | |
160 irc_cmd_table_build(irc); | |
161 irc->msgs = g_hash_table_new(g_str_hash, g_str_equal); | |
162 irc_msg_table_build(irc); | |
163 | |
164 buf = g_strdup_printf(_("Signon: %s"), username); | |
165 gaim_connection_update_progress(gc, buf, 1, 2); | |
166 g_free(buf); | |
167 | |
168 err = gaim_proxy_connect(account, irc->server, | |
169 gaim_account_get_int(account, "port", IRC_DEFAULT_PORT), | |
170 irc_login_cb, gc); | |
171 | |
172 if (err || !account->gc) { | |
173 gaim_connection_error(gc, _("Couldn't create socket")); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
174 return; |
6333 | 175 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
176 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
177 |
6333 | 178 static void irc_login_cb(gpointer data, gint source, GaimInputCondition cond) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
179 { |
6333 | 180 GaimConnection *gc = data; |
181 struct irc_conn *irc = gc->proto_data; | |
182 char hostname[256]; | |
183 char *buf; | |
184 GList *connections = gaim_connections_get_all(); | |
185 | |
186 if (source < 0) | |
187 return; | |
188 | |
189 if (!g_list_find(connections, gc)) { | |
190 close(source); | |
191 return; | |
192 } | |
193 | |
194 irc->fd = source; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
195 |
6333 | 196 if (gc->account->password && *gc->account->password) { |
197 buf = irc_format(irc, "vv", "PASS", gc->account->password); | |
198 if (irc_send(irc, buf) < 0) { | |
199 gaim_connection_error(gc, "Error sending password"); | |
200 return; | |
201 } | |
202 g_free(buf); | |
203 } | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
204 |
6333 | 205 gethostname(hostname, sizeof(hostname)); |
206 hostname[sizeof(hostname) - 1] = '\0'; | |
207 buf = irc_format(irc, "vvvv:", "USER", g_get_user_name(), hostname, irc->server, | |
208 gc->account->alias && *gc->account->alias ? gc->account->alias : IRC_DEFAULT_ALIAS); | |
209 if (irc_send(irc, buf) < 0) { | |
210 gaim_connection_error(gc, "Error registering with server"); | |
211 return; | |
212 } | |
213 g_free(buf); | |
214 buf = irc_format(irc, "vn", "NICK", gaim_connection_get_display_name(gc)); | |
215 if (irc_send(irc, buf) < 0) { | |
216 gaim_connection_error(gc, "Error sending nickname"); | |
217 return; | |
218 } | |
219 g_free(buf); | |
220 | |
221 gc->inpa = gaim_input_add(irc->fd, GAIM_INPUT_READ, irc_input_cb, gc); | |
2289
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 |
6333 | 224 static void irc_close(GaimConnection *gc) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
225 { |
6333 | 226 struct irc_conn *irc = gc->proto_data; |
227 | |
6752 | 228 if (irc == NULL) |
229 return; | |
230 | |
6333 | 231 irc_cmd_quit(irc, "quit", NULL, NULL); |
232 | |
233 if (gc->inpa) | |
234 g_source_remove(gc->inpa); | |
235 | |
236 g_free(irc->inbuf); | |
237 close(irc->fd); | |
238 if (irc->timer) | |
239 g_source_remove(irc->timer); | |
240 g_hash_table_destroy(irc->cmds); | |
241 g_hash_table_destroy(irc->msgs); | |
242 if (irc->motd) | |
243 g_string_free(irc->motd, TRUE); | |
244 g_free(irc->server); | |
245 g_free(irc); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
246 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
247 |
6622 | 248 static int irc_im_send(GaimConnection *gc, const char *who, const char *what, int len, GaimImFlags flags) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
249 { |
6333 | 250 struct irc_conn *irc = gc->proto_data; |
251 const char *args[2]; | |
252 | |
253 if (*who == '@' || *who == '%' || *who == '+') | |
254 args[0] = who + 1; | |
255 else | |
256 args[0] = who; | |
257 args[1] = what; | |
258 | |
259 if (*what == '/') { | |
260 return irc_parse_cmd(irc, who, what + 1); | |
261 } | |
262 | |
263 irc_cmd_privmsg(irc, "msg", NULL, args); | |
264 return 1; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
265 } |
2086 | 266 |
6333 | 267 static void irc_get_info(GaimConnection *gc, const char *who) |
2086 | 268 { |
6333 | 269 struct irc_conn *irc = gc->proto_data; |
270 const char *args[1]; | |
271 args[0] = who; | |
272 irc_cmd_whois(irc, "whois", NULL, args); | |
273 } | |
274 | |
275 static void irc_set_away(GaimConnection *gc, const char *state, const char *msg) | |
276 { | |
277 struct irc_conn *irc = gc->proto_data; | |
278 const char *args[1]; | |
2086 | 279 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
280 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
281 g_free(gc->away); |
2394
579f8d4347ad
[gaim-migrate @ 2407]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
282 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
283 } |
2393
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
284 |
6333 | 285 if (msg) |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
286 gc->away = g_strdup(msg); |
2086 | 287 |
6333 | 288 args[0] = msg; |
289 irc_cmd_away(irc, "away", NULL, args); | |
4916 | 290 } |
291 | |
6787
faa491042c66
[gaim-migrate @ 7326]
Christian Hammond <chipx86@chipx86.com>
parents:
6752
diff
changeset
|
292 static void irc_add_buddy(GaimConnection *gc, const char *who, GaimGroup *group) |
3029 | 293 { |
6333 | 294 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; |
295 struct irc_buddy *ib = g_new0(struct irc_buddy, 1); | |
296 ib->name = g_strdup(who); | |
297 g_hash_table_insert(irc->buddies, ib->name, ib); | |
3029 | 298 } |
3622 | 299 |
6333 | 300 static void irc_remove_buddy(GaimConnection *gc, const char *who, const char *group) |
301 { | |
302 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; | |
303 g_hash_table_remove(irc->buddies, who); | |
3616 | 304 } |
4514
7521e29658bc
[gaim-migrate @ 4792]
Christian Hammond <chipx86@chipx86.com>
parents:
4509
diff
changeset
|
305 |
3616 | 306 |
6333 | 307 static void irc_input_cb(gpointer data, gint source, GaimInputCondition cond) |
308 { | |
309 GaimConnection *gc = data; | |
310 struct irc_conn *irc = gc->proto_data; | |
311 char *cur, *end; | |
312 int len; | |
313 | |
314 if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) { | |
315 irc->inbuflen += IRC_INITIAL_BUFSIZE; | |
316 irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); | |
3708 | 317 } |
3616 | 318 |
6333 | 319 if ((len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1)) < 0) { |
320 gaim_connection_error(gc, "Read error"); | |
321 return; | |
6369 | 322 } else if (len == 0) { |
323 /* Remote closed the connection, probably */ | |
324 return; | |
6333 | 325 } |
6369 | 326 |
6333 | 327 irc->inbufused += len; |
328 irc->inbuf[irc->inbufused] = '\0'; | |
3616 | 329 |
6333 | 330 for (cur = irc->inbuf; cur < irc->inbuf + irc->inbufused && (end = strstr(cur, "\r\n")); cur = end + 2) { |
331 *end = '\0'; | |
332 irc_parse_msg(irc, cur); | |
333 } | |
334 if (cur != irc->inbuf + irc->inbufused) { /* leftover */ | |
335 irc->inbufused -= (cur - irc->inbuf); | |
336 memmove(irc->inbuf, cur, irc->inbufused); | |
337 } else { | |
338 irc->inbufused = 0; | |
339 } | |
3616 | 340 } |
341 | |
6333 | 342 static void irc_chat_join (GaimConnection *gc, GHashTable *data) |
343 { | |
344 struct irc_conn *irc = gc->proto_data; | |
345 const char *args[2]; | |
3616 | 346 |
6333 | 347 args[0] = g_hash_table_lookup(data, "channel"); |
348 args[1] = g_hash_table_lookup(data, "password"); | |
349 irc_cmd_join(irc, "join", NULL, args); | |
3622 | 350 } |
351 | |
6333 | 352 static void irc_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) |
3751 | 353 { |
6333 | 354 struct irc_conn *irc = gc->proto_data; |
355 GaimConversation *convo = gaim_find_chat(gc, id); | |
356 const char *args[2]; | |
3751 | 357 |
6333 | 358 if (!convo) { |
359 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got chat invite request for bogus chat\n"); | |
360 return; | |
361 } | |
362 args[0] = name; | |
363 args[1] = gaim_conversation_get_name(convo); | |
364 irc_cmd_invite(irc, "invite", gaim_conversation_get_name(convo), args); | |
3707 | 365 } |
366 | |
6333 | 367 |
368 static void irc_chat_leave (GaimConnection *gc, int id) | |
3707 | 369 { |
6333 | 370 struct irc_conn *irc = gc->proto_data; |
371 GaimConversation *convo = gaim_find_chat(gc, id); | |
372 const char *args[2]; | |
5298 | 373 |
6333 | 374 if (!convo) |
375 return; | |
3735 | 376 |
6333 | 377 args[0] = gaim_conversation_get_name(convo); |
378 args[1] = NULL; | |
379 irc_cmd_part(irc, "part", gaim_conversation_get_name(convo), args); | |
380 serv_got_chat_left(gc, id); | |
3735 | 381 } |
382 | |
6333 | 383 static int irc_chat_send(GaimConnection *gc, int id, const char *what) |
3735 | 384 { |
6333 | 385 struct irc_conn *irc = gc->proto_data; |
386 GaimConversation *convo = gaim_find_chat(gc, id); | |
387 const char *args[2]; | |
388 | |
389 if (!convo) { | |
390 gaim_debug(GAIM_DEBUG_ERROR, "irc", "chat send on nonexistent chat\n"); | |
391 return -EINVAL; | |
392 } | |
393 | |
394 if (*what == '/') { | |
395 return irc_parse_cmd(irc, convo->name, what + 1); | |
396 } | |
397 | |
398 args[0] = convo->name; | |
399 args[1] = what; | |
400 | |
401 irc_cmd_privmsg(irc, "msg", NULL, args); | |
402 serv_got_chat_in(gc, id, gaim_connection_get_display_name(gc), 0, what, time(NULL)); | |
403 return 0; | |
3707 | 404 } |
405 | |
6333 | 406 static guint irc_nick_hash(const char *nick) |
407 { | |
408 char *lc; | |
409 guint bucket; | |
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
410 |
6333 | 411 lc = g_utf8_strdown(nick, -1); |
412 bucket = g_str_hash(lc); | |
413 g_free(lc); | |
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
414 |
6333 | 415 return bucket; |
3029 | 416 } |
417 | |
6333 | 418 static gboolean irc_nick_equal(const char *nick1, const char *nick2) |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
419 { |
6333 | 420 return (gaim_utf8_strcasecmp(nick1, nick2) == 0); |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
421 } |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
422 |
6333 | 423 static void irc_buddy_free(struct irc_buddy *ib) |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
424 { |
6333 | 425 g_free(ib->name); |
426 g_free(ib); | |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
427 } |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
428 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
429 static GaimPluginProtocolInfo prpl_info = |
2086 | 430 { |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
431 GAIM_PROTO_IRC, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
432 OPT_PROTO_CHAT_TOPIC | OPT_PROTO_PASSWORD_OPTIONAL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
433 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
434 NULL, |
6333 | 435 irc_blist_icon, |
436 irc_blist_emblems, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
437 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
438 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
439 irc_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
440 NULL, |
6350 | 441 irc_buddy_menu, |
6333 | 442 irc_chat_join_info, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
443 irc_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
444 irc_close, |
6333 | 445 irc_im_send, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
446 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
447 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
448 irc_get_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
449 irc_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
450 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
451 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
452 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
453 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
454 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
455 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
456 irc_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
457 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
458 irc_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
459 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
460 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
461 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
462 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
463 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
464 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
465 NULL, |
6333 | 466 irc_chat_join, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
467 irc_chat_invite, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
468 irc_chat_leave, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
469 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
470 irc_chat_send, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
471 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
472 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
473 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
474 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
475 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
476 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
477 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
478 NULL, |
6333 | 479 NULL, /*irc_convo_closed,*/ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
480 NULL |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
481 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
482 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
483 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
484 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
485 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
486 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
487 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
488 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
489 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
490 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
491 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
492 "prpl-irc", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
493 "IRC", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
494 VERSION, /**< version */ |
6333 | 495 N_("IRC Protocol Plugin"), /** summary */ |
496 N_("The IRC Protocol Plugin that Sucks Less"), /** description */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
497 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6369
diff
changeset
|
498 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
499 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
500 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
501 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
502 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
503 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
504 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
505 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
506 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
507 |
6333 | 508 static void _init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
509 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
510 GaimAccountUserSplit *split; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
511 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
512 |
6333 | 513 split = gaim_account_user_split_new(_("Server"), IRC_DEFAULT_SERVER, '@'); |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
514 prpl_info.user_splits = g_list_append(prpl_info.user_splits, split); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
515 |
6459
b52870734c21
[gaim-migrate @ 6968]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
516 option = gaim_account_option_int_new(_("Port"), "port", IRC_DEFAULT_PORT); |
6333 | 517 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
518 |
6333 | 519 option = gaim_account_option_string_new(_("Encoding"), "encoding", IRC_DEFAULT_CHARSET); |
520 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
521 |
6333 | 522 _irc_plugin = plugin; |
2086 | 523 } |
524 | |
6333 | 525 GAIM_INIT_PLUGIN(irc, _init_plugin, info); |