Mercurial > pidgin
annotate src/protocols/irc/irc.c @ 6687:d524232faed8
[gaim-migrate @ 7213]
Nandan Dixit writes:
" This patch has huge improvements for the yahoo protocol in gaim.
Among the things it fixes are,
Offline message receiving support.
Proper support for buddy list
(lists greater than 1024 chars)
SMS and away embles on custom status"
committer: Tailor Script <tailor@pidgin.im>
| author | Luke Schierer <lschiere@pidgin.im> |
|---|---|
| date | Tue, 02 Sep 2003 02:39:17 +0000 |
| parents | a4622f1fb5a1 |
| children | 0c5637b5462e |
| 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 |
| 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); | |
| 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 | |
| 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"; |
| 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 | |
| 144 gc->proto_data = irc = g_new0(struct irc_conn, 1); | |
| 145 irc->account = account; | |
| 146 | |
| 147 userparts = g_strsplit(username, "@", 2); | |
| 148 gaim_connection_set_display_name(gc, userparts[0]); | |
| 149 irc->server = g_strdup(userparts[1]); | |
| 150 g_strfreev(userparts); | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
151 |
| 6333 | 152 irc->buddies = g_hash_table_new_full((GHashFunc)irc_nick_hash, (GEqualFunc)irc_nick_equal, |
| 153 NULL, (GDestroyNotify)irc_buddy_free); | |
| 154 irc->cmds = g_hash_table_new(g_str_hash, g_str_equal); | |
| 155 irc_cmd_table_build(irc); | |
| 156 irc->msgs = g_hash_table_new(g_str_hash, g_str_equal); | |
| 157 irc_msg_table_build(irc); | |
| 158 | |
| 159 buf = g_strdup_printf(_("Signon: %s"), username); | |
| 160 gaim_connection_update_progress(gc, buf, 1, 2); | |
| 161 g_free(buf); | |
| 162 | |
| 163 err = gaim_proxy_connect(account, irc->server, | |
| 164 gaim_account_get_int(account, "port", IRC_DEFAULT_PORT), | |
| 165 irc_login_cb, gc); | |
| 166 | |
| 167 if (err || !account->gc) { | |
| 168 gaim_connection_error(gc, _("Couldn't create socket")); | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
169 return; |
| 6333 | 170 } |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
171 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
172 |
| 6333 | 173 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
|
174 { |
| 6333 | 175 GaimConnection *gc = data; |
| 176 struct irc_conn *irc = gc->proto_data; | |
| 177 char hostname[256]; | |
| 178 char *buf; | |
| 179 GList *connections = gaim_connections_get_all(); | |
| 180 | |
| 181 if (source < 0) | |
| 182 return; | |
| 183 | |
| 184 if (!g_list_find(connections, gc)) { | |
| 185 close(source); | |
| 186 return; | |
| 187 } | |
| 188 | |
| 189 irc->fd = source; | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
190 |
| 6333 | 191 if (gc->account->password && *gc->account->password) { |
| 192 buf = irc_format(irc, "vv", "PASS", gc->account->password); | |
| 193 if (irc_send(irc, buf) < 0) { | |
| 194 gaim_connection_error(gc, "Error sending password"); | |
| 195 return; | |
| 196 } | |
| 197 g_free(buf); | |
| 198 } | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
199 |
| 6333 | 200 gethostname(hostname, sizeof(hostname)); |
| 201 hostname[sizeof(hostname) - 1] = '\0'; | |
| 202 buf = irc_format(irc, "vvvv:", "USER", g_get_user_name(), hostname, irc->server, | |
| 203 gc->account->alias && *gc->account->alias ? gc->account->alias : IRC_DEFAULT_ALIAS); | |
| 204 if (irc_send(irc, buf) < 0) { | |
| 205 gaim_connection_error(gc, "Error registering with server"); | |
| 206 return; | |
| 207 } | |
| 208 g_free(buf); | |
| 209 buf = irc_format(irc, "vn", "NICK", gaim_connection_get_display_name(gc)); | |
| 210 if (irc_send(irc, buf) < 0) { | |
| 211 gaim_connection_error(gc, "Error sending nickname"); | |
| 212 return; | |
| 213 } | |
| 214 g_free(buf); | |
| 215 | |
| 216 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
|
217 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
218 |
| 6333 | 219 static void irc_close(GaimConnection *gc) |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
220 { |
| 6333 | 221 struct irc_conn *irc = gc->proto_data; |
| 222 | |
| 223 irc_cmd_quit(irc, "quit", NULL, NULL); | |
| 224 | |
| 225 if (gc->inpa) | |
| 226 g_source_remove(gc->inpa); | |
| 227 | |
| 228 g_free(irc->inbuf); | |
| 229 close(irc->fd); | |
| 230 if (irc->timer) | |
| 231 g_source_remove(irc->timer); | |
| 232 g_hash_table_destroy(irc->cmds); | |
| 233 g_hash_table_destroy(irc->msgs); | |
| 234 if (irc->motd) | |
| 235 g_string_free(irc->motd, TRUE); | |
| 236 g_free(irc->server); | |
| 237 g_free(irc); | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
238 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
239 |
| 6622 | 240 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
|
241 { |
| 6333 | 242 struct irc_conn *irc = gc->proto_data; |
| 243 const char *args[2]; | |
| 244 | |
| 245 if (*who == '@' || *who == '%' || *who == '+') | |
| 246 args[0] = who + 1; | |
| 247 else | |
| 248 args[0] = who; | |
| 249 args[1] = what; | |
| 250 | |
| 251 if (*what == '/') { | |
| 252 return irc_parse_cmd(irc, who, what + 1); | |
| 253 } | |
| 254 | |
| 255 irc_cmd_privmsg(irc, "msg", NULL, args); | |
| 256 return 1; | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
257 } |
| 2086 | 258 |
| 6333 | 259 static void irc_get_info(GaimConnection *gc, const char *who) |
| 2086 | 260 { |
| 6333 | 261 struct irc_conn *irc = gc->proto_data; |
| 262 const char *args[1]; | |
| 263 args[0] = who; | |
| 264 irc_cmd_whois(irc, "whois", NULL, args); | |
| 265 } | |
| 266 | |
| 267 static void irc_set_away(GaimConnection *gc, const char *state, const char *msg) | |
| 268 { | |
| 269 struct irc_conn *irc = gc->proto_data; | |
| 270 const char *args[1]; | |
| 2086 | 271 |
|
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
272 if (gc->away) { |
|
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
273 g_free(gc->away); |
|
2394
579f8d4347ad
[gaim-migrate @ 2407]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2393
diff
changeset
|
274 gc->away = NULL; |
|
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
275 } |
|
2393
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
276 |
| 6333 | 277 if (msg) |
|
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4067
diff
changeset
|
278 gc->away = g_strdup(msg); |
| 2086 | 279 |
| 6333 | 280 args[0] = msg; |
| 281 irc_cmd_away(irc, "away", NULL, args); | |
| 4916 | 282 } |
| 283 | |
| 6333 | 284 static void irc_add_buddy(GaimConnection *gc, const char *who) |
| 3029 | 285 { |
| 6333 | 286 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; |
| 287 struct irc_buddy *ib = g_new0(struct irc_buddy, 1); | |
| 288 ib->name = g_strdup(who); | |
| 289 g_hash_table_insert(irc->buddies, ib->name, ib); | |
| 3029 | 290 } |
| 3622 | 291 |
| 6333 | 292 static void irc_remove_buddy(GaimConnection *gc, const char *who, const char *group) |
| 293 { | |
| 294 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; | |
| 295 g_hash_table_remove(irc->buddies, who); | |
| 3616 | 296 } |
|
4514
7521e29658bc
[gaim-migrate @ 4792]
Christian Hammond <chipx86@chipx86.com>
parents:
4509
diff
changeset
|
297 |
| 3616 | 298 |
| 6333 | 299 static void irc_input_cb(gpointer data, gint source, GaimInputCondition cond) |
| 300 { | |
| 301 GaimConnection *gc = data; | |
| 302 struct irc_conn *irc = gc->proto_data; | |
| 303 char *cur, *end; | |
| 304 int len; | |
| 305 | |
| 306 if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) { | |
| 307 irc->inbuflen += IRC_INITIAL_BUFSIZE; | |
| 308 irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); | |
| 3708 | 309 } |
| 3616 | 310 |
| 6333 | 311 if ((len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1)) < 0) { |
| 312 gaim_connection_error(gc, "Read error"); | |
| 313 return; | |
| 6369 | 314 } else if (len == 0) { |
| 315 /* Remote closed the connection, probably */ | |
| 316 return; | |
| 6333 | 317 } |
| 6369 | 318 |
| 6333 | 319 irc->inbufused += len; |
| 320 irc->inbuf[irc->inbufused] = '\0'; | |
| 3616 | 321 |
| 6333 | 322 for (cur = irc->inbuf; cur < irc->inbuf + irc->inbufused && (end = strstr(cur, "\r\n")); cur = end + 2) { |
| 323 *end = '\0'; | |
| 324 irc_parse_msg(irc, cur); | |
| 325 } | |
| 326 if (cur != irc->inbuf + irc->inbufused) { /* leftover */ | |
| 327 irc->inbufused -= (cur - irc->inbuf); | |
| 328 memmove(irc->inbuf, cur, irc->inbufused); | |
| 329 } else { | |
| 330 irc->inbufused = 0; | |
| 331 } | |
| 3616 | 332 } |
| 333 | |
| 6333 | 334 static void irc_chat_join (GaimConnection *gc, GHashTable *data) |
| 335 { | |
| 336 struct irc_conn *irc = gc->proto_data; | |
| 337 const char *args[2]; | |
| 3616 | 338 |
| 6333 | 339 args[0] = g_hash_table_lookup(data, "channel"); |
| 340 args[1] = g_hash_table_lookup(data, "password"); | |
| 341 irc_cmd_join(irc, "join", NULL, args); | |
| 3622 | 342 } |
| 343 | |
| 6333 | 344 static void irc_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) |
| 3751 | 345 { |
| 6333 | 346 struct irc_conn *irc = gc->proto_data; |
| 347 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 348 const char *args[2]; | |
| 3751 | 349 |
| 6333 | 350 if (!convo) { |
| 351 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got chat invite request for bogus chat\n"); | |
| 352 return; | |
| 353 } | |
| 354 args[0] = name; | |
| 355 args[1] = gaim_conversation_get_name(convo); | |
| 356 irc_cmd_invite(irc, "invite", gaim_conversation_get_name(convo), args); | |
| 3707 | 357 } |
| 358 | |
| 6333 | 359 |
| 360 static void irc_chat_leave (GaimConnection *gc, int id) | |
| 3707 | 361 { |
| 6333 | 362 struct irc_conn *irc = gc->proto_data; |
| 363 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 364 const char *args[2]; | |
| 5298 | 365 |
| 6333 | 366 if (!convo) |
| 367 return; | |
| 3735 | 368 |
| 6333 | 369 args[0] = gaim_conversation_get_name(convo); |
| 370 args[1] = NULL; | |
| 371 irc_cmd_part(irc, "part", gaim_conversation_get_name(convo), args); | |
| 372 serv_got_chat_left(gc, id); | |
| 3735 | 373 } |
| 374 | |
| 6333 | 375 static int irc_chat_send(GaimConnection *gc, int id, const char *what) |
| 3735 | 376 { |
| 6333 | 377 struct irc_conn *irc = gc->proto_data; |
| 378 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 379 const char *args[2]; | |
| 380 | |
| 381 if (!convo) { | |
| 382 gaim_debug(GAIM_DEBUG_ERROR, "irc", "chat send on nonexistent chat\n"); | |
| 383 return -EINVAL; | |
| 384 } | |
| 385 | |
| 386 if (*what == '/') { | |
| 387 return irc_parse_cmd(irc, convo->name, what + 1); | |
| 388 } | |
| 389 | |
| 390 args[0] = convo->name; | |
| 391 args[1] = what; | |
| 392 | |
| 393 irc_cmd_privmsg(irc, "msg", NULL, args); | |
| 394 serv_got_chat_in(gc, id, gaim_connection_get_display_name(gc), 0, what, time(NULL)); | |
| 395 return 0; | |
| 3707 | 396 } |
| 397 | |
| 6333 | 398 static guint irc_nick_hash(const char *nick) |
| 399 { | |
| 400 char *lc; | |
| 401 guint bucket; | |
|
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
402 |
| 6333 | 403 lc = g_utf8_strdown(nick, -1); |
| 404 bucket = g_str_hash(lc); | |
| 405 g_free(lc); | |
|
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
406 |
| 6333 | 407 return bucket; |
| 3029 | 408 } |
| 409 | |
| 6333 | 410 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
|
411 { |
| 6333 | 412 return (gaim_utf8_strcasecmp(nick1, nick2) == 0); |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
413 } |
|
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
414 |
| 6333 | 415 static void irc_buddy_free(struct irc_buddy *ib) |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
416 { |
| 6333 | 417 g_free(ib->name); |
| 418 g_free(ib); | |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
419 } |
|
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
420 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
421 static GaimPluginProtocolInfo prpl_info = |
| 2086 | 422 { |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
423 GAIM_PROTO_IRC, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
424 OPT_PROTO_CHAT_TOPIC | OPT_PROTO_PASSWORD_OPTIONAL, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
425 NULL, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
426 NULL, |
| 6333 | 427 irc_blist_icon, |
| 428 irc_blist_emblems, | |
|
5205
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 NULL, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
431 irc_away_states, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
432 NULL, |
| 6350 | 433 irc_buddy_menu, |
| 6333 | 434 irc_chat_join_info, |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
435 irc_login, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
436 irc_close, |
| 6333 | 437 irc_im_send, |
|
5205
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 NULL, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
440 irc_get_info, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
441 irc_set_away, |
|
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 NULL, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
448 irc_add_buddy, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
449 NULL, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
450 irc_remove_buddy, |
|
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, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
457 NULL, |
| 6333 | 458 irc_chat_join, |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
459 irc_chat_invite, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
460 irc_chat_leave, |
|
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 irc_chat_send, |
|
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, |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
470 NULL, |
| 6333 | 471 NULL, /*irc_convo_closed,*/ |
|
5205
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 }; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
474 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
475 static GaimPluginInfo info = |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
476 { |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
477 2, /**< api_version */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
478 GAIM_PLUGIN_PROTOCOL, /**< type */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
479 NULL, /**< ui_requirement */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
480 0, /**< flags */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
481 NULL, /**< dependencies */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
482 GAIM_PRIORITY_DEFAULT, /**< priority */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
483 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
484 "prpl-irc", /**< id */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
485 "IRC", /**< name */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
486 VERSION, /**< version */ |
| 6333 | 487 N_("IRC Protocol Plugin"), /** summary */ |
| 488 N_("The IRC Protocol Plugin that Sucks Less"), /** description */ | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
489 NULL, /**< author */ |
|
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6369
diff
changeset
|
490 GAIM_WEBSITE, /**< homepage */ |
|
5205
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 NULL, /**< load */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
493 NULL, /**< unload */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
494 NULL, /**< destroy */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
495 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
496 NULL, /**< ui_info */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
497 &prpl_info /**< extra_info */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
498 }; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
499 |
| 6333 | 500 static void _init_plugin(GaimPlugin *plugin) |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
501 { |
|
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
502 GaimAccountUserSplit *split; |
|
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
503 GaimAccountOption *option; |
|
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
504 |
| 6333 | 505 split = gaim_account_user_split_new(_("Server"), IRC_DEFAULT_SERVER, '@'); |
|
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
506 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
|
507 |
|
6459
b52870734c21
[gaim-migrate @ 6968]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
508 option = gaim_account_option_int_new(_("Port"), "port", IRC_DEFAULT_PORT); |
| 6333 | 509 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
|
510 |
| 6333 | 511 option = gaim_account_option_string_new(_("Encoding"), "encoding", IRC_DEFAULT_CHARSET); |
| 512 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
|
513 |
| 6333 | 514 _irc_plugin = plugin; |
| 2086 | 515 } |
| 516 | |
| 6333 | 517 GAIM_INIT_PLUGIN(irc, _init_plugin, info); |
