Mercurial > pidgin.yaz
annotate src/protocols/irc/irc.c @ 6371:8f94cce8faa5
[gaim-migrate @ 6876]
I think I touched almost every file. Here's what happened.
I started off fixing up the Makefile.am and configure.ac files to help with
the core/UI split some. Then I got annoyed with the
build_{allow,deny}_list() functions that everything used, and decided to
core/UI split privacy. While doing that, I decided to redesign the dialog.
So now, a lot has changed, but not really so much. Just that most files
got affected.
Oh yeah, and the UI stuff was taken out of internal.h and moved to
gtkinternal.h. If you use this, please be aware of this change.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Tue, 05 Aug 2003 10:55:04 +0000 |
parents | 1cdc8a11eea5 |
children | b52870734c21 |
rev | line source |
---|---|
6333 | 1 /** |
2 * @file irc.c | |
3 * | |
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> |
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 */ | |
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 |
6333 | 39 static const char *irc_blist_icon(GaimAccount *a, struct buddy *b); |
40 static void irc_blist_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne); | |
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); | |
46 static int irc_im_send(GaimConnection *gc, const char *who, const char *what, int len, int flags); | |
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 | |
6333 | 94 static const char *irc_blist_icon(GaimAccount *a, struct buddy *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 |
6333 | 99 static void irc_blist_emblems(struct buddy *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"; |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
128 m = g_list_append(m, pce); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
129 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
130 return m; |
2086 | 131 } |
132 | |
6333 | 133 static void irc_login(GaimAccount *account) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
134 { |
6333 | 135 GaimConnection *gc; |
136 struct irc_conn *irc; | |
137 char *buf, **userparts; | |
138 const char *username = gaim_account_get_username(account); | |
139 int err; | |
140 | |
141 gc = gaim_account_get_connection(account); | |
142 | |
143 gc->proto_data = irc = g_new0(struct irc_conn, 1); | |
144 irc->account = account; | |
145 | |
146 userparts = g_strsplit(username, "@", 2); | |
147 gaim_connection_set_display_name(gc, userparts[0]); | |
148 irc->server = g_strdup(userparts[1]); | |
149 g_strfreev(userparts); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
150 |
6333 | 151 irc->buddies = g_hash_table_new_full((GHashFunc)irc_nick_hash, (GEqualFunc)irc_nick_equal, |
152 NULL, (GDestroyNotify)irc_buddy_free); | |
153 irc->cmds = g_hash_table_new(g_str_hash, g_str_equal); | |
154 irc_cmd_table_build(irc); | |
155 irc->msgs = g_hash_table_new(g_str_hash, g_str_equal); | |
156 irc_msg_table_build(irc); | |
157 | |
158 buf = g_strdup_printf(_("Signon: %s"), username); | |
159 gaim_connection_update_progress(gc, buf, 1, 2); | |
160 g_free(buf); | |
161 | |
162 err = gaim_proxy_connect(account, irc->server, | |
163 gaim_account_get_int(account, "port", IRC_DEFAULT_PORT), | |
164 irc_login_cb, gc); | |
165 | |
166 if (err || !account->gc) { | |
167 gaim_connection_error(gc, _("Couldn't create socket")); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
168 return; |
6333 | 169 } |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
170 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
171 |
6333 | 172 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
|
173 { |
6333 | 174 GaimConnection *gc = data; |
175 struct irc_conn *irc = gc->proto_data; | |
176 char hostname[256]; | |
177 char *buf; | |
178 GList *connections = gaim_connections_get_all(); | |
179 | |
180 if (source < 0) | |
181 return; | |
182 | |
183 if (!g_list_find(connections, gc)) { | |
184 close(source); | |
185 return; | |
186 } | |
187 | |
188 irc->fd = source; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
189 |
6333 | 190 if (gc->account->password && *gc->account->password) { |
191 buf = irc_format(irc, "vv", "PASS", gc->account->password); | |
192 if (irc_send(irc, buf) < 0) { | |
193 gaim_connection_error(gc, "Error sending password"); | |
194 return; | |
195 } | |
196 g_free(buf); | |
197 } | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
198 |
6333 | 199 gethostname(hostname, sizeof(hostname)); |
200 hostname[sizeof(hostname) - 1] = '\0'; | |
201 buf = irc_format(irc, "vvvv:", "USER", g_get_user_name(), hostname, irc->server, | |
202 gc->account->alias && *gc->account->alias ? gc->account->alias : IRC_DEFAULT_ALIAS); | |
203 if (irc_send(irc, buf) < 0) { | |
204 gaim_connection_error(gc, "Error registering with server"); | |
205 return; | |
206 } | |
207 g_free(buf); | |
208 buf = irc_format(irc, "vn", "NICK", gaim_connection_get_display_name(gc)); | |
209 if (irc_send(irc, buf) < 0) { | |
210 gaim_connection_error(gc, "Error sending nickname"); | |
211 return; | |
212 } | |
213 g_free(buf); | |
214 | |
215 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
|
216 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
217 |
6333 | 218 static void irc_close(GaimConnection *gc) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
219 { |
6333 | 220 struct irc_conn *irc = gc->proto_data; |
221 | |
222 irc_cmd_quit(irc, "quit", NULL, NULL); | |
223 | |
224 if (gc->inpa) | |
225 g_source_remove(gc->inpa); | |
226 | |
227 g_free(irc->inbuf); | |
228 close(irc->fd); | |
229 if (irc->timer) | |
230 g_source_remove(irc->timer); | |
231 g_hash_table_destroy(irc->cmds); | |
232 g_hash_table_destroy(irc->msgs); | |
233 if (irc->motd) | |
234 g_string_free(irc->motd, TRUE); | |
235 g_free(irc->server); | |
236 g_free(irc); | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
237 } |
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
238 |
6333 | 239 static int irc_im_send(GaimConnection *gc, const char *who, const char *what, int len, int flags) |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
240 { |
6333 | 241 struct irc_conn *irc = gc->proto_data; |
242 const char *args[2]; | |
243 | |
244 if (*who == '@' || *who == '%' || *who == '+') | |
245 args[0] = who + 1; | |
246 else | |
247 args[0] = who; | |
248 args[1] = what; | |
249 | |
250 if (*what == '/') { | |
251 return irc_parse_cmd(irc, who, what + 1); | |
252 } | |
253 | |
254 irc_cmd_privmsg(irc, "msg", NULL, args); | |
255 return 1; | |
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
256 } |
2086 | 257 |
6333 | 258 static void irc_get_info(GaimConnection *gc, const char *who) |
2086 | 259 { |
6333 | 260 struct irc_conn *irc = gc->proto_data; |
261 const char *args[1]; | |
262 args[0] = who; | |
263 irc_cmd_whois(irc, "whois", NULL, args); | |
264 } | |
265 | |
266 static void irc_set_away(GaimConnection *gc, const char *state, const char *msg) | |
267 { | |
268 struct irc_conn *irc = gc->proto_data; | |
269 const char *args[1]; | |
2086 | 270 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
271 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
272 g_free(gc->away); |
2394
579f8d4347ad
[gaim-migrate @ 2407]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
273 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
274 } |
2393
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
275 |
6333 | 276 if (msg) |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
277 gc->away = g_strdup(msg); |
2086 | 278 |
6333 | 279 args[0] = msg; |
280 irc_cmd_away(irc, "away", NULL, args); | |
4916 | 281 } |
282 | |
6333 | 283 static void irc_add_buddy(GaimConnection *gc, const char *who) |
3029 | 284 { |
6333 | 285 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; |
286 struct irc_buddy *ib = g_new0(struct irc_buddy, 1); | |
287 ib->name = g_strdup(who); | |
288 g_hash_table_insert(irc->buddies, ib->name, ib); | |
3029 | 289 } |
3622 | 290 |
6333 | 291 static void irc_remove_buddy(GaimConnection *gc, const char *who, const char *group) |
292 { | |
293 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; | |
294 g_hash_table_remove(irc->buddies, who); | |
3616 | 295 } |
4514
7521e29658bc
[gaim-migrate @ 4792]
Christian Hammond <chipx86@chipx86.com>
parents:
4509
diff
changeset
|
296 |
3616 | 297 |
6333 | 298 static void irc_input_cb(gpointer data, gint source, GaimInputCondition cond) |
299 { | |
300 GaimConnection *gc = data; | |
301 struct irc_conn *irc = gc->proto_data; | |
302 char *cur, *end; | |
303 int len; | |
304 | |
305 if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) { | |
306 irc->inbuflen += IRC_INITIAL_BUFSIZE; | |
307 irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); | |
3708 | 308 } |
3616 | 309 |
6333 | 310 if ((len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1)) < 0) { |
311 gaim_connection_error(gc, "Read error"); | |
312 return; | |
6369 | 313 } else if (len == 0) { |
314 /* Remote closed the connection, probably */ | |
315 return; | |
6333 | 316 } |
6369 | 317 |
6333 | 318 irc->inbufused += len; |
319 irc->inbuf[irc->inbufused] = '\0'; | |
3616 | 320 |
6333 | 321 for (cur = irc->inbuf; cur < irc->inbuf + irc->inbufused && (end = strstr(cur, "\r\n")); cur = end + 2) { |
322 *end = '\0'; | |
323 irc_parse_msg(irc, cur); | |
324 } | |
325 if (cur != irc->inbuf + irc->inbufused) { /* leftover */ | |
326 irc->inbufused -= (cur - irc->inbuf); | |
327 memmove(irc->inbuf, cur, irc->inbufused); | |
328 } else { | |
329 irc->inbufused = 0; | |
330 } | |
3616 | 331 } |
332 | |
6333 | 333 static void irc_chat_join (GaimConnection *gc, GHashTable *data) |
334 { | |
335 struct irc_conn *irc = gc->proto_data; | |
336 const char *args[2]; | |
3616 | 337 |
6333 | 338 args[0] = g_hash_table_lookup(data, "channel"); |
339 args[1] = g_hash_table_lookup(data, "password"); | |
340 irc_cmd_join(irc, "join", NULL, args); | |
3622 | 341 } |
342 | |
6333 | 343 static void irc_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) |
3751 | 344 { |
6333 | 345 struct irc_conn *irc = gc->proto_data; |
346 GaimConversation *convo = gaim_find_chat(gc, id); | |
347 const char *args[2]; | |
3751 | 348 |
6333 | 349 if (!convo) { |
350 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got chat invite request for bogus chat\n"); | |
351 return; | |
352 } | |
353 args[0] = name; | |
354 args[1] = gaim_conversation_get_name(convo); | |
355 irc_cmd_invite(irc, "invite", gaim_conversation_get_name(convo), args); | |
3707 | 356 } |
357 | |
6333 | 358 |
359 static void irc_chat_leave (GaimConnection *gc, int id) | |
3707 | 360 { |
6333 | 361 struct irc_conn *irc = gc->proto_data; |
362 GaimConversation *convo = gaim_find_chat(gc, id); | |
363 const char *args[2]; | |
5298 | 364 |
6333 | 365 if (!convo) |
366 return; | |
3735 | 367 |
6333 | 368 args[0] = gaim_conversation_get_name(convo); |
369 args[1] = NULL; | |
370 irc_cmd_part(irc, "part", gaim_conversation_get_name(convo), args); | |
371 serv_got_chat_left(gc, id); | |
3735 | 372 } |
373 | |
6333 | 374 static int irc_chat_send(GaimConnection *gc, int id, const char *what) |
3735 | 375 { |
6333 | 376 struct irc_conn *irc = gc->proto_data; |
377 GaimConversation *convo = gaim_find_chat(gc, id); | |
378 const char *args[2]; | |
379 | |
380 if (!convo) { | |
381 gaim_debug(GAIM_DEBUG_ERROR, "irc", "chat send on nonexistent chat\n"); | |
382 return -EINVAL; | |
383 } | |
384 | |
385 if (*what == '/') { | |
386 return irc_parse_cmd(irc, convo->name, what + 1); | |
387 } | |
388 | |
389 args[0] = convo->name; | |
390 args[1] = what; | |
391 | |
392 irc_cmd_privmsg(irc, "msg", NULL, args); | |
393 serv_got_chat_in(gc, id, gaim_connection_get_display_name(gc), 0, what, time(NULL)); | |
394 return 0; | |
3707 | 395 } |
396 | |
6333 | 397 static guint irc_nick_hash(const char *nick) |
398 { | |
399 char *lc; | |
400 guint bucket; | |
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
401 |
6333 | 402 lc = g_utf8_strdown(nick, -1); |
403 bucket = g_str_hash(lc); | |
404 g_free(lc); | |
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
405 |
6333 | 406 return bucket; |
3029 | 407 } |
408 | |
6333 | 409 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
|
410 { |
6333 | 411 return (gaim_utf8_strcasecmp(nick1, nick2) == 0); |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
412 } |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
413 |
6333 | 414 static void irc_buddy_free(struct irc_buddy *ib) |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
415 { |
6333 | 416 g_free(ib->name); |
417 g_free(ib); | |
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
418 } |
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
419 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
420 static GaimPluginProtocolInfo prpl_info = |
2086 | 421 { |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
422 GAIM_PROTO_IRC, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
423 OPT_PROTO_CHAT_TOPIC | OPT_PROTO_PASSWORD_OPTIONAL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
424 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
425 NULL, |
6333 | 426 irc_blist_icon, |
427 irc_blist_emblems, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
428 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
429 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
430 irc_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
431 NULL, |
6350 | 432 irc_buddy_menu, |
6333 | 433 irc_chat_join_info, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
434 irc_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
435 irc_close, |
6333 | 436 irc_im_send, |
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_get_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
440 irc_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
441 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
442 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
443 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
444 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
445 NULL, |
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 irc_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
448 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
449 irc_remove_buddy, |
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 NULL, |
6333 | 457 irc_chat_join, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
458 irc_chat_invite, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
459 irc_chat_leave, |
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 irc_chat_send, |
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, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
466 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
467 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
468 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
469 NULL, |
6333 | 470 NULL, /*irc_convo_closed,*/ |
5205
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 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
473 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
474 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
475 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
476 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
477 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
478 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
479 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
480 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
481 GAIM_PRIORITY_DEFAULT, /**< priority */ |
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 "prpl-irc", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
484 "IRC", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
485 VERSION, /**< version */ |
6333 | 486 N_("IRC Protocol Plugin"), /** summary */ |
487 N_("The IRC Protocol Plugin that Sucks Less"), /** description */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
488 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6369
diff
changeset
|
489 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
490 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
491 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
492 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
493 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
494 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
495 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
496 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
497 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
498 |
6333 | 499 static void _init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
500 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
501 GaimAccountUserSplit *split; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
502 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
503 |
6333 | 504 split = gaim_account_user_split_new(_("Server"), IRC_DEFAULT_SERVER, '@'); |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
505 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
|
506 |
6333 | 507 option = gaim_account_option_int_new(_("Port:"), "port", IRC_DEFAULT_PORT); |
508 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
|
509 |
6333 | 510 option = gaim_account_option_string_new(_("Encoding"), "encoding", IRC_DEFAULT_CHARSET); |
511 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
|
512 |
6333 | 513 _irc_plugin = plugin; |
2086 | 514 } |
515 | |
6333 | 516 GAIM_INIT_PLUGIN(irc, _init_plugin, info); |