Mercurial > pidgin
annotate src/protocols/irc/irc.c @ 10562:e06da39b467c
[gaim-migrate @ 11942]
This will prevent the connection process from hanging when the DNS lookup fails. We need to call the callback function regardless of whether the lookup succeeded. (This is in the DNS lookup functionality that is currently #ifdef _WIN32, but is actually portable),
committer: Tailor Script <tailor@pidgin.im>
| author | Daniel Atallah <daniel.atallah@gmail.com> |
|---|---|
| date | Tue, 01 Feb 2005 05:02:40 +0000 |
| parents | 761822c6f7ca |
| children | 9eb3b224face |
| 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 * |
| 8351 | 6 * Copyright (C) 2003, Robbert Haarman <gaim@inglorion.net> |
| 6333 | 7 * Copyright (C) 2003, Ethan Blanton <eblanton@cs.purdue.edu> |
| 8 * Copyright (C) 2000-2003, Rob Flynn <rob@tgflinux.com> | |
| 2086 | 9 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> |
|
6459
b52870734c21
[gaim-migrate @ 6968]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
10 * |
| 2086 | 11 * This program is free software; you can redistribute it and/or modify |
| 12 * it under the terms of the GNU General Public License as published by | |
| 13 * the Free Software Foundation; either version 2 of the License, or | |
| 14 * (at your option) any later version. | |
| 15 * | |
| 16 * This program is distributed in the hope that it will be useful, | |
| 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 * GNU General Public License for more details. | |
| 20 * | |
| 21 * You should have received a copy of the GNU General Public License | |
| 22 * along with this program; if not, write to the Free Software | |
| 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 24 */ | |
| 6333 | 25 |
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
26 #include "internal.h" |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
27 |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5791
diff
changeset
|
28 #include "accountopt.h" |
| 9030 | 29 #include "blist.h" |
| 6333 | 30 #include "conversation.h" |
| 9030 | 31 #include "debug.h" |
| 7148 | 32 #include "notify.h" |
| 9030 | 33 #include "prpl.h" |
| 34 #include "plugin.h" | |
| 6350 | 35 #include "util.h" |
| 9943 | 36 #include "version.h" |
| 9030 | 37 |
| 6333 | 38 #include "irc.h" |
| 4422 | 39 |
| 6333 | 40 static void irc_buddy_append(char *name, struct irc_buddy *ib, GString *string); |
| 2086 | 41 |
| 6695 | 42 static const char *irc_blist_icon(GaimAccount *a, GaimBuddy *b); |
| 9953 | 43 static void irc_blist_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne); |
| 9951 | 44 static GList *irc_status_types(GaimAccount *account); |
| 9015 | 45 static GList *irc_actions(GaimPlugin *plugin, gpointer context); |
| 6333 | 46 /* static GList *irc_chat_info(GaimConnection *gc); */ |
| 10401 | 47 static void irc_login(GaimAccount *account, GaimStatus *status); |
| 10365 | 48 static void irc_login_cb_ssl(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond); |
| 6333 | 49 static void irc_login_cb(gpointer data, gint source, GaimInputCondition cond); |
| 10365 | 50 static void irc_ssl_connect_failure(GaimSslConnection *gsc, GaimSslErrorType error, gpointer data); |
| 6333 | 51 static void irc_close(GaimConnection *gc); |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
52 static int irc_im_send(GaimConnection *gc, const char *who, const char *what, GaimConvImFlags flags); |
| 6333 | 53 static int irc_chat_send(GaimConnection *gc, int id, const char *what); |
| 54 static void irc_chat_join (GaimConnection *gc, GHashTable *data); | |
| 55 static void irc_input_cb(gpointer data, gint source, GaimInputCondition cond); | |
| 10365 | 56 static void irc_input_cb_ssl(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond); |
| 3751 | 57 |
| 7711 | 58 static guint irc_nick_hash(const char *nick); |
| 59 static gboolean irc_nick_equal(const char *nick1, const char *nick2); | |
| 60 static void irc_buddy_free(struct irc_buddy *ib); | |
| 61 | |
| 62 static GaimPlugin *_irc_plugin = NULL; | |
| 63 | |
| 64 static const char *status_chars = "@+%&"; | |
| 65 | |
| 9015 | 66 static void irc_view_motd(GaimPluginAction *action) |
| 7148 | 67 { |
| 9015 | 68 GaimConnection *gc = (GaimConnection *) action->context; |
| 7148 | 69 struct irc_conn *irc; |
| 70 char *title; | |
| 71 | |
| 72 if (gc == NULL || gc->proto_data == NULL) { | |
| 73 gaim_debug(GAIM_DEBUG_ERROR, "irc", "got MOTD request for NULL gc\n"); | |
| 74 return; | |
| 75 } | |
| 76 irc = gc->proto_data; | |
| 77 if (irc->motd == NULL) { | |
| 78 gaim_notify_error(gc, _("Error displaying MOTD"), _("No MOTD available"), | |
| 79 _("There is no MOTD associated with this connection.")); | |
| 80 return; | |
| 81 } | |
| 82 title = g_strdup_printf(_("MOTD for %s"), irc->server); | |
| 83 gaim_notify_formatted(gc, title, title, NULL, irc->motd->str, NULL, NULL); | |
| 84 } | |
| 85 | |
| 6333 | 86 int irc_send(struct irc_conn *irc, const char *buf) |
| 3751 | 87 { |
| 9440 | 88 int ret; |
| 89 | |
| 10365 | 90 if (irc->gsc) { |
| 91 ret = gaim_ssl_write(irc->gsc, buf, strlen(buf)); | |
| 92 } else { | |
| 93 if (irc->fd < 0) | |
| 94 return -1; | |
| 95 ret = write(irc->fd, buf, strlen(buf)); | |
| 96 } | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
97 |
| 10365 | 98 /* gaim_debug(GAIM_DEBUG_MISC, "irc", "sent%s: %s", |
| 99 irc->gsc ? " (ssl)" : "", buf); */ | |
| 100 if (ret < 0) { | |
| 9440 | 101 gaim_connection_error(gaim_account_get_connection(irc->account), |
| 102 _("Server has disconnected")); | |
| 10365 | 103 } |
| 9440 | 104 |
| 105 return ret; | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
106 } |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2171
diff
changeset
|
107 |
| 6333 | 108 /* XXX I don't like messing directly with these buddies */ |
| 109 gboolean irc_blist_timeout(struct irc_conn *irc) | |
| 2086 | 110 { |
| 6333 | 111 GString *string = g_string_sized_new(512); |
| 112 char *list, *buf; | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
113 |
| 6333 | 114 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
|
115 |
| 6333 | 116 list = g_string_free(string, FALSE); |
| 117 if (!list || !strlen(list)) { | |
| 118 g_free(list); | |
|
2137
18722ae5b882
[gaim-migrate @ 2147]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2131
diff
changeset
|
119 return TRUE; |
| 2086 | 120 } |
|
4416
8e62cee6d738
[gaim-migrate @ 4689]
Christian Hammond <chipx86@chipx86.com>
parents:
4373
diff
changeset
|
121 |
| 8038 | 122 buf = irc_format(irc, "vn", "ISON", list); |
| 6333 | 123 g_free(list); |
| 124 irc_send(irc, buf); | |
| 125 g_free(buf); | |
|
4416
8e62cee6d738
[gaim-migrate @ 4689]
Christian Hammond <chipx86@chipx86.com>
parents:
4373
diff
changeset
|
126 |
|
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
127 return TRUE; |
| 2086 | 128 } |
| 129 | |
| 6333 | 130 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
|
131 { |
| 6333 | 132 ib->flag = FALSE; |
| 133 g_string_append_printf(string, "%s ", name); | |
| 3511 | 134 } |
| 135 | |
| 9553 | 136 static void irc_ison_one(struct irc_conn *irc, struct irc_buddy *ib) |
| 137 { | |
| 138 char *buf; | |
| 139 | |
| 140 ib->flag = FALSE; | |
| 141 buf = irc_format(irc, "vn", "ISON", ib->name); | |
| 142 irc_send(irc, buf); | |
| 143 g_free(buf); | |
| 144 } | |
| 145 | |
| 146 | |
| 6695 | 147 static const char *irc_blist_icon(GaimAccount *a, GaimBuddy *b) |
| 3029 | 148 { |
| 6333 | 149 return "irc"; |
|
2339
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
150 } |
|
9bda60d2d2e6
[gaim-migrate @ 2352]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2331
diff
changeset
|
151 |
| 9953 | 152 static void irc_blist_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) |
| 3751 | 153 { |
| 10244 | 154 GaimPresence *presence = gaim_buddy_get_presence(b); |
| 155 | |
| 156 if (gaim_presence_is_online(presence) == FALSE) { | |
| 6333 | 157 *se = "offline"; |
| 10244 | 158 } |
| 2086 | 159 } |
| 160 | |
| 9944 | 161 static GList *irc_status_types(GaimAccount *account) |
| 2086 | 162 { |
| 9944 | 163 GaimStatusType *type; |
| 164 GList *types = NULL; | |
| 165 | |
| 166 type = gaim_status_type_new(GAIM_STATUS_OFFLINE, "offline", | |
| 167 _("Offline"), FALSE); | |
| 168 types = g_list_append(types, type); | |
| 169 | |
| 170 type = gaim_status_type_new(GAIM_STATUS_ONLINE, "online", | |
| 171 _("Online"), FALSE); | |
| 172 types = g_list_append(types, type); | |
| 173 | |
| 174 type = gaim_status_type_new(GAIM_STATUS_AVAILABLE, "available", | |
| 175 _("Available"), TRUE); | |
| 176 types = g_list_append(types, type); | |
| 177 | |
| 178 type = gaim_status_type_new_with_attrs( | |
| 179 GAIM_STATUS_AWAY, "away", _("Away"), TRUE, TRUE, FALSE, | |
| 10009 | 180 "message", _("Message"), gaim_value_new(GAIM_TYPE_STRING), NULL); |
| 9944 | 181 types = g_list_append(types, type); |
| 182 | |
| 183 return types; | |
| 3452 | 184 } |
| 185 | |
| 9015 | 186 static GList *irc_actions(GaimPlugin *plugin, gpointer context) |
| 7148 | 187 { |
| 188 GList *list = NULL; | |
| 9015 | 189 GaimPluginAction *act = NULL; |
| 7148 | 190 |
| 9015 | 191 act = gaim_plugin_action_new(_("View MOTD"), irc_view_motd); |
| 192 list = g_list_append(list, act); | |
| 7148 | 193 |
| 194 return list; | |
| 195 } | |
| 196 | |
| 6333 | 197 static GList *irc_chat_join_info(GaimConnection *gc) |
| 2086 | 198 { |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
199 GList *m = NULL; |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
200 struct proto_chat_entry *pce; |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
201 |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
202 pce = g_new0(struct proto_chat_entry, 1); |
| 7841 | 203 pce->label = _("_Channel:"); |
| 5234 | 204 pce->identifier = "channel"; |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
205 m = g_list_append(m, pce); |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
206 |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
207 pce = g_new0(struct proto_chat_entry, 1); |
| 7841 | 208 pce->label = _("_Password:"); |
| 5234 | 209 pce->identifier = "password"; |
| 6499 | 210 pce->secret = TRUE; |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
211 m = g_list_append(m, pce); |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
212 |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
213 return m; |
| 2086 | 214 } |
| 215 | |
| 9754 | 216 GHashTable *irc_chat_info_defaults(GaimConnection *gc, const char *chat_name) |
| 217 { | |
| 218 GHashTable *defaults; | |
| 219 | |
| 220 defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
| 221 | |
| 222 if (chat_name != NULL) | |
| 223 g_hash_table_insert(defaults, "channel", g_strdup(chat_name)); | |
| 224 | |
| 225 return defaults; | |
| 226 } | |
| 227 | |
| 10401 | 228 static void irc_login(GaimAccount *account, GaimStatus *status) |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
229 { |
| 6333 | 230 GaimConnection *gc; |
| 231 struct irc_conn *irc; | |
| 10494 | 232 char **userparts; |
| 6333 | 233 const char *username = gaim_account_get_username(account); |
| 234 int err; | |
| 235 | |
| 236 gc = gaim_account_get_connection(account); | |
| 8677 | 237 gc->flags |= GAIM_CONNECTION_NO_NEWLINES; |
| 6333 | 238 |
| 6752 | 239 if (strpbrk(username, " \t\v\r\n") != NULL) { |
| 240 gaim_connection_error(gc, _("IRC nicks may not contain whitespace")); | |
| 241 return; | |
| 242 } | |
| 243 | |
| 6333 | 244 gc->proto_data = irc = g_new0(struct irc_conn, 1); |
| 245 irc->account = account; | |
| 246 | |
| 247 userparts = g_strsplit(username, "@", 2); | |
| 248 gaim_connection_set_display_name(gc, userparts[0]); | |
| 249 irc->server = g_strdup(userparts[1]); | |
| 250 g_strfreev(userparts); | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
251 |
| 10159 | 252 irc->buddies = g_hash_table_new_full((GHashFunc)irc_nick_hash, (GEqualFunc)irc_nick_equal, |
| 6333 | 253 NULL, (GDestroyNotify)irc_buddy_free); |
| 254 irc->cmds = g_hash_table_new(g_str_hash, g_str_equal); | |
| 255 irc_cmd_table_build(irc); | |
| 256 irc->msgs = g_hash_table_new(g_str_hash, g_str_equal); | |
| 257 irc_msg_table_build(irc); | |
| 258 | |
| 10494 | 259 gaim_connection_update_progress(gc, _("Connecting"), 1, 2); |
| 6333 | 260 |
| 10365 | 261 if (gaim_account_get_bool(account, "ssl", FALSE)) { |
| 262 if (gaim_ssl_is_supported()) { | |
| 263 irc->gsc = gaim_ssl_connect(account, irc->server, | |
| 264 gaim_account_get_int(account, "port", IRC_DEFAULT_SSL_PORT), | |
| 265 irc_login_cb_ssl, irc_ssl_connect_failure, gc); | |
| 266 } else { | |
| 267 gaim_connection_error(gc, _("SSL support unavailable")); | |
| 268 } | |
| 269 } | |
| 270 | |
| 271 if (!irc->gsc) { | |
| 272 | |
| 273 err = gaim_proxy_connect(account, irc->server, | |
| 6333 | 274 gaim_account_get_int(account, "port", IRC_DEFAULT_PORT), |
| 275 irc_login_cb, gc); | |
| 276 | |
| 10555 | 277 if (err || !gaim_account_get_connection(account)) { |
| 10365 | 278 gaim_connection_error(gc, _("Couldn't create socket")); |
| 279 return; | |
| 280 } | |
| 281 } | |
| 282 } | |
| 283 | |
| 284 static gboolean do_login(GaimConnection *gc) { | |
| 285 char *buf; | |
| 286 char hostname[256]; | |
| 287 const char *username, *realname; | |
| 288 struct irc_conn *irc = gc->proto_data; | |
| 10555 | 289 const char *pass = gaim_account_get_password(gc->account); |
| 10365 | 290 |
| 10555 | 291 if (pass && *pass) { |
| 292 buf = irc_format(irc, "vv", "PASS", pass); | |
| 10365 | 293 if (irc_send(irc, buf) < 0) { |
| 294 gaim_connection_error(gc, "Error sending password"); | |
| 295 return FALSE; | |
| 296 } | |
| 297 g_free(buf); | |
| 298 } | |
| 299 | |
| 300 gethostname(hostname, sizeof(hostname)); | |
| 301 hostname[sizeof(hostname) - 1] = '\0'; | |
| 302 username = gaim_account_get_string(irc->account, "username", ""); | |
| 303 realname = gaim_account_get_string(irc->account, "realname", ""); | |
| 304 buf = irc_format(irc, "vvvv:", "USER", strlen(username) ? username : g_get_user_name(), hostname, irc->server, | |
| 305 strlen(realname) ? realname : IRC_DEFAULT_ALIAS); | |
| 306 if (irc_send(irc, buf) < 0) { | |
| 307 gaim_connection_error(gc, "Error registering with server"); | |
| 308 return FALSE; | |
| 309 } | |
| 310 g_free(buf); | |
| 311 buf = irc_format(irc, "vn", "NICK", gaim_connection_get_display_name(gc)); | |
| 312 if (irc_send(irc, buf) < 0) { | |
| 313 gaim_connection_error(gc, "Error sending nickname"); | |
| 314 return FALSE; | |
| 315 } | |
| 316 g_free(buf); | |
| 317 | |
| 318 return TRUE; | |
| 319 } | |
| 320 | |
| 321 static void irc_login_cb_ssl(gpointer data, GaimSslConnection *gsc, | |
| 322 GaimInputCondition cond) | |
| 323 { | |
| 324 GaimConnection *gc = data; | |
| 325 struct irc_conn *irc = gc->proto_data; | |
| 326 | |
| 327 if(!g_list_find(gaim_connections_get_all(), gc)) { | |
| 328 gaim_ssl_close(gsc); | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
329 return; |
| 6333 | 330 } |
| 10365 | 331 |
| 332 irc->gsc = gsc; | |
| 333 | |
| 334 if (do_login(gc)) { | |
| 335 gaim_ssl_input_add(gsc, irc_input_cb_ssl, gc); | |
| 336 } | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
337 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
338 |
| 6333 | 339 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
|
340 { |
| 6333 | 341 GaimConnection *gc = data; |
| 342 struct irc_conn *irc = gc->proto_data; | |
| 343 GList *connections = gaim_connections_get_all(); | |
| 344 | |
| 8778 | 345 if (source < 0) { |
| 346 gaim_connection_error(gc, _("Couldn't connect to host")); | |
| 6333 | 347 return; |
| 8778 | 348 } |
| 6333 | 349 |
| 350 if (!g_list_find(connections, gc)) { | |
| 351 close(source); | |
| 352 return; | |
| 353 } | |
| 354 | |
| 355 irc->fd = source; | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
356 |
| 10365 | 357 if (do_login(gc)) { |
| 358 gc->inpa = gaim_input_add(irc->fd, GAIM_INPUT_READ, irc_input_cb, gc); | |
| 359 } | |
| 360 } | |
| 361 | |
| 362 static void | |
| 363 irc_ssl_connect_failure(GaimSslConnection *gsc, GaimSslErrorType error, | |
| 364 gpointer data) | |
| 365 { | |
| 366 GaimConnection *gc = data; | |
| 367 struct irc_conn *irc = gc->proto_data; | |
| 368 | |
| 369 switch(error) { | |
| 370 case GAIM_SSL_CONNECT_FAILED: | |
| 371 gaim_connection_error(gc, _("Connection Failed")); | |
| 372 break; | |
| 373 case GAIM_SSL_HANDSHAKE_FAILED: | |
| 374 gaim_connection_error(gc, _("SSL Handshake Failed")); | |
| 375 break; | |
| 6333 | 376 } |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
377 |
| 10365 | 378 irc->gsc = NULL; |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
379 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
380 |
| 6333 | 381 static void irc_close(GaimConnection *gc) |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
382 { |
| 6333 | 383 struct irc_conn *irc = gc->proto_data; |
| 384 | |
| 6752 | 385 if (irc == NULL) |
| 386 return; | |
| 387 | |
| 6333 | 388 irc_cmd_quit(irc, "quit", NULL, NULL); |
| 389 | |
| 390 if (gc->inpa) | |
| 9441 | 391 gaim_input_remove(gc->inpa); |
| 6333 | 392 |
| 393 g_free(irc->inbuf); | |
| 10365 | 394 if (irc->gsc) { |
| 395 gaim_ssl_close(irc->gsc); | |
| 396 } else if (irc->fd > 0) { | |
| 397 close(irc->fd); | |
| 398 } | |
| 6333 | 399 if (irc->timer) |
|
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8170
diff
changeset
|
400 gaim_timeout_remove(irc->timer); |
| 6333 | 401 g_hash_table_destroy(irc->cmds); |
| 402 g_hash_table_destroy(irc->msgs); | |
| 10504 | 403 g_hash_table_destroy(irc->buddies); |
| 6333 | 404 if (irc->motd) |
| 405 g_string_free(irc->motd, TRUE); | |
| 406 g_free(irc->server); | |
| 407 g_free(irc); | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
408 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
409 |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
410 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
|
411 { |
| 6333 | 412 struct irc_conn *irc = gc->proto_data; |
| 413 const char *args[2]; | |
| 414 | |
| 7711 | 415 if (strchr(status_chars, *who) != NULL) |
| 6333 | 416 args[0] = who + 1; |
| 417 else | |
| 418 args[0] = who; | |
| 419 args[1] = what; | |
| 9442 | 420 |
| 6333 | 421 irc_cmd_privmsg(irc, "msg", NULL, args); |
| 422 return 1; | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
423 } |
| 2086 | 424 |
| 6333 | 425 static void irc_get_info(GaimConnection *gc, const char *who) |
| 2086 | 426 { |
| 6333 | 427 struct irc_conn *irc = gc->proto_data; |
| 428 const char *args[1]; | |
| 429 args[0] = who; | |
| 430 irc_cmd_whois(irc, "whois", NULL, args); | |
| 431 } | |
| 432 | |
| 9944 | 433 static void irc_set_status(GaimAccount *account, GaimStatus *status) |
| 6333 | 434 { |
| 9944 | 435 GaimConnection *gc = gaim_account_get_connection(account); |
| 6333 | 436 struct irc_conn *irc = gc->proto_data; |
| 437 const char *args[1]; | |
| 9944 | 438 const char *status_id = gaim_status_get_id(status); |
| 2086 | 439 |
| 10504 | 440 if (!gaim_status_is_active(status)) |
| 441 return; | |
| 442 | |
| 443 args[0] = NULL; | |
| 444 | |
| 9944 | 445 if (!strcmp(status_id, "away")) |
| 446 args[0] = gaim_status_get_attr_string(status, "message"); | |
|
2393
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
447 |
| 6333 | 448 irc_cmd_away(irc, "away", NULL, args); |
| 4916 | 449 } |
| 450 | |
| 9285 | 451 static void irc_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
| 3029 | 452 { |
| 6333 | 453 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; |
| 454 struct irc_buddy *ib = g_new0(struct irc_buddy, 1); | |
| 9285 | 455 ib->name = g_strdup(buddy->name); |
| 6333 | 456 g_hash_table_insert(irc->buddies, ib->name, ib); |
| 9238 | 457 |
| 9553 | 458 /* if the timer isn't set, this is during signon, so we don't want to flood |
| 459 * ourself off with ISON's, so we don't, but after that we want to know when | |
| 460 * someone's online asap */ | |
| 461 if (irc->timer) | |
| 462 irc_ison_one(irc, ib); | |
| 3029 | 463 } |
| 3622 | 464 |
| 9285 | 465 static void irc_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
| 6333 | 466 { |
| 467 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; | |
| 9285 | 468 g_hash_table_remove(irc->buddies, buddy->name); |
| 3616 | 469 } |
|
4514
7521e29658bc
[gaim-migrate @ 4792]
Christian Hammond <chipx86@chipx86.com>
parents:
4509
diff
changeset
|
470 |
| 10365 | 471 static void read_input(struct irc_conn *irc, int len) |
| 6333 | 472 { |
| 473 char *cur, *end; | |
| 6369 | 474 |
| 6333 | 475 irc->inbufused += len; |
| 476 irc->inbuf[irc->inbufused] = '\0'; | |
| 3616 | 477 |
| 8156 | 478 cur = irc->inbuf; |
| 479 while (cur < irc->inbuf + irc->inbufused && | |
| 480 ((end = strstr(cur, "\r\n")) || (end = strstr(cur, "\n")))) { | |
| 481 int step = (*end == '\r' ? 2 : 1); | |
| 6333 | 482 *end = '\0'; |
| 483 irc_parse_msg(irc, cur); | |
| 8156 | 484 cur = end + step; |
| 6333 | 485 } |
| 486 if (cur != irc->inbuf + irc->inbufused) { /* leftover */ | |
| 487 irc->inbufused -= (cur - irc->inbuf); | |
| 488 memmove(irc->inbuf, cur, irc->inbufused); | |
| 489 } else { | |
| 490 irc->inbufused = 0; | |
| 491 } | |
| 3616 | 492 } |
| 493 | |
| 10365 | 494 static void irc_input_cb_ssl(gpointer data, GaimSslConnection *gsc, |
| 495 GaimInputCondition cond) | |
| 496 { | |
| 497 | |
| 498 GaimConnection *gc = data; | |
| 499 struct irc_conn *irc = gc->proto_data; | |
| 500 int len; | |
| 501 | |
| 502 if(!g_list_find(gaim_connections_get_all(), gc)) { | |
| 503 gaim_ssl_close(gsc); | |
| 504 return; | |
| 505 } | |
| 506 | |
| 507 if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) { | |
| 508 irc->inbuflen += IRC_INITIAL_BUFSIZE; | |
| 509 irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); | |
| 510 } | |
| 511 | |
| 512 if ((len = gaim_ssl_read(gsc, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1)) < 0) { | |
| 513 gaim_connection_error(gc, _("Read error")); | |
| 514 return; | |
| 515 } else if (len == 0) { | |
| 516 gaim_connection_error(gc, _("Server has disconnected")); | |
| 517 return; | |
| 518 } | |
| 519 | |
| 520 read_input(irc, len); | |
| 521 } | |
| 522 | |
| 523 static void irc_input_cb(gpointer data, gint source, GaimInputCondition cond) | |
| 524 { | |
| 525 GaimConnection *gc = data; | |
| 526 struct irc_conn *irc = gc->proto_data; | |
| 527 int len; | |
| 528 | |
| 529 if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) { | |
| 530 irc->inbuflen += IRC_INITIAL_BUFSIZE; | |
| 531 irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); | |
| 532 } | |
| 533 | |
| 534 if ((len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1)) < 0) { | |
| 535 gaim_connection_error(gc, _("Read error")); | |
| 536 return; | |
| 537 } else if (len == 0) { | |
| 538 gaim_connection_error(gc, _("Server has disconnected")); | |
| 539 return; | |
| 540 } | |
| 541 | |
| 542 read_input(irc, len); | |
| 543 } | |
| 544 | |
| 6333 | 545 static void irc_chat_join (GaimConnection *gc, GHashTable *data) |
| 546 { | |
| 547 struct irc_conn *irc = gc->proto_data; | |
| 548 const char *args[2]; | |
| 3616 | 549 |
| 6333 | 550 args[0] = g_hash_table_lookup(data, "channel"); |
| 551 args[1] = g_hash_table_lookup(data, "password"); | |
| 552 irc_cmd_join(irc, "join", NULL, args); | |
| 3622 | 553 } |
| 554 | |
| 9917 | 555 static char *irc_get_chat_name(GHashTable *data) { |
| 556 return g_strdup(g_hash_table_lookup(data, "channel")); | |
| 557 } | |
| 558 | |
| 6333 | 559 static void irc_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) |
| 3751 | 560 { |
| 6333 | 561 struct irc_conn *irc = gc->proto_data; |
| 562 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 563 const char *args[2]; | |
| 3751 | 564 |
| 6333 | 565 if (!convo) { |
| 566 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got chat invite request for bogus chat\n"); | |
| 567 return; | |
| 568 } | |
| 569 args[0] = name; | |
| 570 args[1] = gaim_conversation_get_name(convo); | |
| 571 irc_cmd_invite(irc, "invite", gaim_conversation_get_name(convo), args); | |
| 3707 | 572 } |
| 573 | |
| 6333 | 574 |
| 575 static void irc_chat_leave (GaimConnection *gc, int id) | |
| 3707 | 576 { |
| 6333 | 577 struct irc_conn *irc = gc->proto_data; |
| 578 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 579 const char *args[2]; | |
| 5298 | 580 |
| 6333 | 581 if (!convo) |
| 582 return; | |
| 3735 | 583 |
| 6333 | 584 args[0] = gaim_conversation_get_name(convo); |
| 585 args[1] = NULL; | |
| 586 irc_cmd_part(irc, "part", gaim_conversation_get_name(convo), args); | |
| 587 serv_got_chat_left(gc, id); | |
| 3735 | 588 } |
| 589 | |
| 6333 | 590 static int irc_chat_send(GaimConnection *gc, int id, const char *what) |
| 3735 | 591 { |
| 6333 | 592 struct irc_conn *irc = gc->proto_data; |
| 593 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 594 const char *args[2]; | |
| 8163 | 595 char *tmp; |
| 6333 | 596 |
| 597 if (!convo) { | |
| 598 gaim_debug(GAIM_DEBUG_ERROR, "irc", "chat send on nonexistent chat\n"); | |
| 599 return -EINVAL; | |
| 600 } | |
| 9130 | 601 #if 0 |
| 6333 | 602 if (*what == '/') { |
| 603 return irc_parse_cmd(irc, convo->name, what + 1); | |
| 604 } | |
| 9130 | 605 #endif |
| 6333 | 606 args[0] = convo->name; |
| 607 args[1] = what; | |
| 608 | |
| 609 irc_cmd_privmsg(irc, "msg", NULL, args); | |
| 8163 | 610 |
| 611 tmp = gaim_escape_html(what); | |
| 612 serv_got_chat_in(gc, id, gaim_connection_get_display_name(gc), 0, tmp, time(NULL)); | |
| 613 g_free(tmp); | |
| 6333 | 614 return 0; |
| 3707 | 615 } |
| 616 | |
| 6333 | 617 static guint irc_nick_hash(const char *nick) |
| 618 { | |
| 619 char *lc; | |
| 620 guint bucket; | |
|
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
621 |
| 6333 | 622 lc = g_utf8_strdown(nick, -1); |
| 623 bucket = g_str_hash(lc); | |
| 624 g_free(lc); | |
|
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
625 |
| 6333 | 626 return bucket; |
| 3029 | 627 } |
| 628 | |
| 6333 | 629 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
|
630 { |
| 6333 | 631 return (gaim_utf8_strcasecmp(nick1, nick2) == 0); |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
632 } |
|
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
633 |
| 6333 | 634 static void irc_buddy_free(struct irc_buddy *ib) |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
635 { |
| 6333 | 636 g_free(ib->name); |
| 637 g_free(ib); | |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
638 } |
|
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
639 |
| 9154 | 640 static void irc_chat_set_topic(GaimConnection *gc, int id, const char *topic) |
| 641 { | |
| 642 char *buf; | |
| 643 const char *name = NULL; | |
| 644 struct irc_conn *irc; | |
| 645 | |
| 646 irc = gc->proto_data; | |
| 647 name = gaim_conversation_get_name(gaim_find_chat(gc, id)); | |
| 648 | |
| 649 if (name == NULL) | |
| 650 return; | |
| 651 | |
| 652 buf = irc_format(irc, "vt:", "TOPIC", name, topic); | |
| 653 irc_send(irc, buf); | |
| 654 g_free(buf); | |
| 655 } | |
| 656 | |
| 8114 | 657 static GaimRoomlist *irc_roomlist_get_list(GaimConnection *gc) |
| 658 { | |
| 659 struct irc_conn *irc; | |
| 660 GList *fields = NULL; | |
| 661 GaimRoomlistField *f; | |
| 8352 | 662 char *buf; |
| 8114 | 663 |
| 664 irc = gc->proto_data; | |
| 665 | |
| 666 if (irc->roomlist) | |
| 667 gaim_roomlist_unref(irc->roomlist); | |
| 668 | |
| 669 irc->roomlist = gaim_roomlist_new(gaim_connection_get_account(gc)); | |
| 670 | |
| 671 f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, "", "channel", TRUE); | |
| 672 fields = g_list_append(fields, f); | |
| 673 | |
| 674 f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_INT, _("Users"), "users", FALSE); | |
| 675 fields = g_list_append(fields, f); | |
| 676 | |
| 677 f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, _("Topic"), "topic", FALSE); | |
| 678 fields = g_list_append(fields, f); | |
| 679 | |
| 680 gaim_roomlist_set_fields(irc->roomlist, fields); | |
| 681 | |
| 8352 | 682 buf = irc_format(irc, "v", "LIST"); |
| 683 irc_send(irc, buf); | |
| 684 g_free(buf); | |
| 8114 | 685 |
| 686 return irc->roomlist; | |
| 687 } | |
| 688 | |
| 689 static void irc_roomlist_cancel(GaimRoomlist *list) | |
| 690 { | |
| 691 GaimConnection *gc = gaim_account_get_connection(list->account); | |
| 692 struct irc_conn *irc; | |
| 693 | |
| 694 if (gc == NULL) | |
| 695 return; | |
| 696 | |
| 697 irc = gc->proto_data; | |
| 698 | |
| 699 gaim_roomlist_set_in_progress(list, FALSE); | |
| 700 | |
| 701 if (irc->roomlist == list) { | |
| 702 irc->roomlist = NULL; | |
| 703 gaim_roomlist_unref(list); | |
| 704 } | |
| 705 } | |
| 706 | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
707 static GaimPluginProtocolInfo prpl_info = |
| 2086 | 708 { |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
709 OPT_PROTO_CHAT_TOPIC | OPT_PROTO_PASSWORD_OPTIONAL, |
| 9475 | 710 NULL, /* user_splits */ |
| 711 NULL, /* protocol_options */ | |
| 9951 | 712 NO_BUDDY_ICONS, /* icon_spec */ |
| 713 irc_blist_icon, /* list_icon */ | |
| 714 irc_blist_emblems, /* list_emblems */ | |
| 9475 | 715 NULL, /* status_text */ |
| 716 NULL, /* tooltip_text */ | |
| 9951 | 717 irc_status_types, /* away_states */ |
| 9475 | 718 NULL, /* blist_node_menu */ |
| 9951 | 719 irc_chat_join_info, /* chat_info */ |
| 9754 | 720 irc_chat_info_defaults, /* chat_info_defaults */ |
| 9951 | 721 irc_login, /* login */ |
| 722 irc_close, /* close */ | |
| 723 irc_im_send, /* send_im */ | |
| 9475 | 724 NULL, /* set_info */ |
| 725 NULL, /* send_typing */ | |
| 9951 | 726 irc_get_info, /* get_info */ |
| 727 irc_set_status, /* set_status */ | |
| 9475 | 728 NULL, /* set_idle */ |
| 729 NULL, /* change_passwd */ | |
| 9951 | 730 irc_add_buddy, /* add_buddy */ |
| 9475 | 731 NULL, /* add_buddies */ |
| 9951 | 732 irc_remove_buddy, /* remove_buddy */ |
| 9475 | 733 NULL, /* remove_buddies */ |
| 9741 | 734 NULL, /* add_permit */ |
| 735 NULL, /* add_deny */ | |
| 736 NULL, /* rem_permit */ | |
| 737 NULL, /* rem_deny */ | |
| 738 NULL, /* set_permit_deny */ | |
| 9475 | 739 NULL, /* warn */ |
| 9951 | 740 irc_chat_join, /* join_chat */ |
| 9475 | 741 NULL, /* reject_chat */ |
| 9951 | 742 irc_get_chat_name, /* get_chat_name */ |
| 743 irc_chat_invite, /* chat_invite */ | |
| 744 irc_chat_leave, /* chat_leave */ | |
| 9475 | 745 NULL, /* chat_whisper */ |
| 9951 | 746 irc_chat_send, /* chat_send */ |
| 9475 | 747 NULL, /* keepalive */ |
| 748 NULL, /* register_user */ | |
| 749 NULL, /* get_cb_info */ | |
| 750 NULL, /* get_cb_away */ | |
| 751 NULL, /* alias_buddy */ | |
| 752 NULL, /* group_buddy */ | |
| 753 NULL, /* rename_group */ | |
| 754 NULL, /* buddy_free */ | |
| 755 NULL, /* convo_closed */ | |
| 756 NULL, /* normalize */ | |
| 757 NULL, /* set_buddy_icon */ | |
| 758 NULL, /* remove_group */ | |
| 759 NULL, /* get_cb_real_name */ | |
| 9951 | 760 irc_chat_set_topic, /* set_chat_topic */ |
| 9475 | 761 NULL, /* find_blist_chat */ |
| 762 irc_roomlist_get_list, /* roomlist_get_list */ | |
| 763 irc_roomlist_cancel, /* roomlist_cancel */ | |
| 764 NULL, /* roomlist_expand_category */ | |
| 765 NULL, /* can_receive_file */ | |
| 766 irc_dccsend_send_file /* send_file */ | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
767 }; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
768 |
| 8114 | 769 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
770 static GaimPluginInfo info = |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
771 { |
| 9943 | 772 GAIM_PLUGIN_MAGIC, |
| 773 GAIM_MAJOR_VERSION, | |
| 774 GAIM_MINOR_VERSION, | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
775 GAIM_PLUGIN_PROTOCOL, /**< type */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
776 NULL, /**< ui_requirement */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
777 0, /**< flags */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
778 NULL, /**< dependencies */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
779 GAIM_PRIORITY_DEFAULT, /**< priority */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
780 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
781 "prpl-irc", /**< id */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
782 "IRC", /**< name */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
783 VERSION, /**< version */ |
| 6333 | 784 N_("IRC Protocol Plugin"), /** summary */ |
| 785 N_("The IRC Protocol Plugin that Sucks Less"), /** description */ | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
786 NULL, /**< author */ |
|
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6369
diff
changeset
|
787 GAIM_WEBSITE, /**< homepage */ |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
788 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
789 NULL, /**< load */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
790 NULL, /**< unload */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
791 NULL, /**< destroy */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
792 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
793 NULL, /**< ui_info */ |
| 8993 | 794 &prpl_info, /**< extra_info */ |
| 795 NULL, | |
| 9015 | 796 irc_actions |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
797 }; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
798 |
| 6333 | 799 static void _init_plugin(GaimPlugin *plugin) |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
800 { |
|
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
801 GaimAccountUserSplit *split; |
|
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
802 GaimAccountOption *option; |
|
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
803 |
| 6333 | 804 split = gaim_account_user_split_new(_("Server"), IRC_DEFAULT_SERVER, '@'); |
|
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
805 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
|
806 |
|
6459
b52870734c21
[gaim-migrate @ 6968]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
807 option = gaim_account_option_int_new(_("Port"), "port", IRC_DEFAULT_PORT); |
| 6333 | 808 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
|
809 |
| 10258 | 810 option = gaim_account_option_string_new(_("Encodings"), "encoding", IRC_DEFAULT_CHARSET); |
| 6333 | 811 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
|
812 |
| 7323 | 813 option = gaim_account_option_string_new(_("Username"), "username", ""); |
| 814 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
| 815 | |
| 10002 | 816 option = gaim_account_option_string_new(_("Real name"), "realname", ""); |
| 817 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
| 818 | |
| 10365 | 819 option = gaim_account_option_bool_new(_("Use SSL"), "ssl", FALSE); |
| 820 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
| 821 | |
| 6333 | 822 _irc_plugin = plugin; |
| 9130 | 823 |
| 824 irc_register_commands(); | |
| 2086 | 825 } |
| 826 | |
| 6333 | 827 GAIM_INIT_PLUGIN(irc, _init_plugin, info); |
