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