Mercurial > pidgin
annotate src/protocols/irc/irc.c @ 10418:bed2c96bc1fb
[gaim-migrate @ 11669]
I split the status-saving code into it's own little API, because it
really is separate from the other status.c
savedstatuses.c sits on top of the rest of the status API.
And you can delete saved statuses now.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 26 Dec 2004 00:46:26 +0000 |
| parents | 3e4ecbdf8d0a |
| children | 93dab54c7bb6 |
| 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; | |
| 232 char *buf, **userparts; | |
| 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 | |
| 10159 | 259 buf = g_strdup_printf(_("Logging in: %s"), username); |
| 6333 | 260 gaim_connection_update_progress(gc, buf, 1, 2); |
| 261 g_free(buf); | |
| 262 | |
| 10365 | 263 if (gaim_account_get_bool(account, "ssl", FALSE)) { |
| 264 if (gaim_ssl_is_supported()) { | |
| 265 irc->gsc = gaim_ssl_connect(account, irc->server, | |
| 266 gaim_account_get_int(account, "port", IRC_DEFAULT_SSL_PORT), | |
| 267 irc_login_cb_ssl, irc_ssl_connect_failure, gc); | |
| 268 } else { | |
| 269 gaim_connection_error(gc, _("SSL support unavailable")); | |
| 270 } | |
| 271 } | |
| 272 | |
| 273 if (!irc->gsc) { | |
| 274 | |
| 275 err = gaim_proxy_connect(account, irc->server, | |
| 6333 | 276 gaim_account_get_int(account, "port", IRC_DEFAULT_PORT), |
| 277 irc_login_cb, gc); | |
| 278 | |
| 10365 | 279 if (err || !account->gc) { |
| 280 gaim_connection_error(gc, _("Couldn't create socket")); | |
| 281 return; | |
| 282 } | |
| 283 } | |
| 284 } | |
| 285 | |
| 286 static gboolean do_login(GaimConnection *gc) { | |
| 287 char *buf; | |
| 288 char hostname[256]; | |
| 289 const char *username, *realname; | |
| 290 struct irc_conn *irc = gc->proto_data; | |
| 291 | |
| 292 if (gc->account->password && *gc->account->password) { | |
| 293 buf = irc_format(irc, "vv", "PASS", gc->account->password); | |
| 294 if (irc_send(irc, buf) < 0) { | |
| 295 gaim_connection_error(gc, "Error sending password"); | |
| 296 return FALSE; | |
| 297 } | |
| 298 g_free(buf); | |
| 299 } | |
| 300 | |
| 301 gethostname(hostname, sizeof(hostname)); | |
| 302 hostname[sizeof(hostname) - 1] = '\0'; | |
| 303 username = gaim_account_get_string(irc->account, "username", ""); | |
| 304 realname = gaim_account_get_string(irc->account, "realname", ""); | |
| 305 buf = irc_format(irc, "vvvv:", "USER", strlen(username) ? username : g_get_user_name(), hostname, irc->server, | |
| 306 strlen(realname) ? realname : IRC_DEFAULT_ALIAS); | |
| 307 if (irc_send(irc, buf) < 0) { | |
| 308 gaim_connection_error(gc, "Error registering with server"); | |
| 309 return FALSE; | |
| 310 } | |
| 311 g_free(buf); | |
| 312 buf = irc_format(irc, "vn", "NICK", gaim_connection_get_display_name(gc)); | |
| 313 if (irc_send(irc, buf) < 0) { | |
| 314 gaim_connection_error(gc, "Error sending nickname"); | |
| 315 return FALSE; | |
| 316 } | |
| 317 g_free(buf); | |
| 318 | |
| 319 return TRUE; | |
| 320 } | |
| 321 | |
| 322 static void irc_login_cb_ssl(gpointer data, GaimSslConnection *gsc, | |
| 323 GaimInputCondition cond) | |
| 324 { | |
| 325 GaimConnection *gc = data; | |
| 326 struct irc_conn *irc = gc->proto_data; | |
| 327 | |
| 328 if(!g_list_find(gaim_connections_get_all(), gc)) { | |
| 329 gaim_ssl_close(gsc); | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
330 return; |
| 6333 | 331 } |
| 10365 | 332 |
| 333 irc->gsc = gsc; | |
| 334 | |
| 335 if (do_login(gc)) { | |
| 336 gaim_ssl_input_add(gsc, irc_input_cb_ssl, gc); | |
| 337 } | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
338 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
339 |
| 6333 | 340 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
|
341 { |
| 6333 | 342 GaimConnection *gc = data; |
| 343 struct irc_conn *irc = gc->proto_data; | |
| 344 GList *connections = gaim_connections_get_all(); | |
| 345 | |
| 8778 | 346 if (source < 0) { |
| 347 gaim_connection_error(gc, _("Couldn't connect to host")); | |
| 6333 | 348 return; |
| 8778 | 349 } |
| 6333 | 350 |
| 351 if (!g_list_find(connections, gc)) { | |
| 352 close(source); | |
| 353 return; | |
| 354 } | |
| 355 | |
| 356 irc->fd = source; | |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
357 |
| 10365 | 358 if (do_login(gc)) { |
| 359 gc->inpa = gaim_input_add(irc->fd, GAIM_INPUT_READ, irc_input_cb, gc); | |
| 360 } | |
| 361 } | |
| 362 | |
| 363 static void | |
| 364 irc_ssl_connect_failure(GaimSslConnection *gsc, GaimSslErrorType error, | |
| 365 gpointer data) | |
| 366 { | |
| 367 GaimConnection *gc = data; | |
| 368 struct irc_conn *irc = gc->proto_data; | |
| 369 | |
| 370 switch(error) { | |
| 371 case GAIM_SSL_CONNECT_FAILED: | |
| 372 gaim_connection_error(gc, _("Connection Failed")); | |
| 373 break; | |
| 374 case GAIM_SSL_HANDSHAKE_FAILED: | |
| 375 gaim_connection_error(gc, _("SSL Handshake Failed")); | |
| 376 break; | |
| 6333 | 377 } |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
378 |
| 10365 | 379 irc->gsc = NULL; |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
380 } |
|
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
381 |
| 6333 | 382 static void irc_close(GaimConnection *gc) |
|
2289
38e156136896
[gaim-migrate @ 2299]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
383 { |
| 6333 | 384 struct irc_conn *irc = gc->proto_data; |
| 385 | |
| 6752 | 386 if (irc == NULL) |
| 387 return; | |
| 388 | |
| 6333 | 389 irc_cmd_quit(irc, "quit", NULL, NULL); |
| 390 | |
| 391 if (gc->inpa) | |
| 9441 | 392 gaim_input_remove(gc->inpa); |
| 6333 | 393 |
| 394 g_free(irc->inbuf); | |
| 10365 | 395 if (irc->gsc) { |
| 396 gaim_ssl_close(irc->gsc); | |
| 397 } else if (irc->fd > 0) { | |
| 398 close(irc->fd); | |
| 399 } | |
| 6333 | 400 if (irc->timer) |
|
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8170
diff
changeset
|
401 gaim_timeout_remove(irc->timer); |
| 6333 | 402 g_hash_table_destroy(irc->cmds); |
| 403 g_hash_table_destroy(irc->msgs); | |
| 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 |
| 9944 | 440 if (!strcmp(status_id, "away")) |
| 441 args[0] = gaim_status_get_attr_string(status, "message"); | |
| 442 else if (!strcmp(status_id, "available")) | |
| 443 args[0] = NULL; | |
|
2393
a7ecfd3f7714
[gaim-migrate @ 2406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
444 |
| 6333 | 445 irc_cmd_away(irc, "away", NULL, args); |
| 4916 | 446 } |
| 447 | |
| 9285 | 448 static void irc_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
| 3029 | 449 { |
| 6333 | 450 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; |
| 451 struct irc_buddy *ib = g_new0(struct irc_buddy, 1); | |
| 9285 | 452 ib->name = g_strdup(buddy->name); |
| 6333 | 453 g_hash_table_insert(irc->buddies, ib->name, ib); |
| 9238 | 454 |
| 9553 | 455 /* if the timer isn't set, this is during signon, so we don't want to flood |
| 456 * ourself off with ISON's, so we don't, but after that we want to know when | |
| 457 * someone's online asap */ | |
| 458 if (irc->timer) | |
| 459 irc_ison_one(irc, ib); | |
| 3029 | 460 } |
| 3622 | 461 |
| 9285 | 462 static void irc_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
| 6333 | 463 { |
| 464 struct irc_conn *irc = (struct irc_conn *)gc->proto_data; | |
| 9285 | 465 g_hash_table_remove(irc->buddies, buddy->name); |
| 3616 | 466 } |
|
4514
7521e29658bc
[gaim-migrate @ 4792]
Christian Hammond <chipx86@chipx86.com>
parents:
4509
diff
changeset
|
467 |
| 10365 | 468 static void read_input(struct irc_conn *irc, int len) |
| 6333 | 469 { |
| 470 char *cur, *end; | |
| 6369 | 471 |
| 6333 | 472 irc->inbufused += len; |
| 473 irc->inbuf[irc->inbufused] = '\0'; | |
| 3616 | 474 |
| 8156 | 475 cur = irc->inbuf; |
| 476 while (cur < irc->inbuf + irc->inbufused && | |
| 477 ((end = strstr(cur, "\r\n")) || (end = strstr(cur, "\n")))) { | |
| 478 int step = (*end == '\r' ? 2 : 1); | |
| 6333 | 479 *end = '\0'; |
| 480 irc_parse_msg(irc, cur); | |
| 8156 | 481 cur = end + step; |
| 6333 | 482 } |
| 483 if (cur != irc->inbuf + irc->inbufused) { /* leftover */ | |
| 484 irc->inbufused -= (cur - irc->inbuf); | |
| 485 memmove(irc->inbuf, cur, irc->inbufused); | |
| 486 } else { | |
| 487 irc->inbufused = 0; | |
| 488 } | |
| 3616 | 489 } |
| 490 | |
| 10365 | 491 static void irc_input_cb_ssl(gpointer data, GaimSslConnection *gsc, |
| 492 GaimInputCondition cond) | |
| 493 { | |
| 494 | |
| 495 GaimConnection *gc = data; | |
| 496 struct irc_conn *irc = gc->proto_data; | |
| 497 int len; | |
| 498 | |
| 499 if(!g_list_find(gaim_connections_get_all(), gc)) { | |
| 500 gaim_ssl_close(gsc); | |
| 501 return; | |
| 502 } | |
| 503 | |
| 504 if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) { | |
| 505 irc->inbuflen += IRC_INITIAL_BUFSIZE; | |
| 506 irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); | |
| 507 } | |
| 508 | |
| 509 if ((len = gaim_ssl_read(gsc, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1)) < 0) { | |
| 510 gaim_connection_error(gc, _("Read error")); | |
| 511 return; | |
| 512 } else if (len == 0) { | |
| 513 gaim_connection_error(gc, _("Server has disconnected")); | |
| 514 return; | |
| 515 } | |
| 516 | |
| 517 read_input(irc, len); | |
| 518 } | |
| 519 | |
| 520 static void irc_input_cb(gpointer data, gint source, GaimInputCondition cond) | |
| 521 { | |
| 522 GaimConnection *gc = data; | |
| 523 struct irc_conn *irc = gc->proto_data; | |
| 524 int len; | |
| 525 | |
| 526 if (irc->inbuflen < irc->inbufused + IRC_INITIAL_BUFSIZE) { | |
| 527 irc->inbuflen += IRC_INITIAL_BUFSIZE; | |
| 528 irc->inbuf = g_realloc(irc->inbuf, irc->inbuflen); | |
| 529 } | |
| 530 | |
| 531 if ((len = read(irc->fd, irc->inbuf + irc->inbufused, IRC_INITIAL_BUFSIZE - 1)) < 0) { | |
| 532 gaim_connection_error(gc, _("Read error")); | |
| 533 return; | |
| 534 } else if (len == 0) { | |
| 535 gaim_connection_error(gc, _("Server has disconnected")); | |
| 536 return; | |
| 537 } | |
| 538 | |
| 539 read_input(irc, len); | |
| 540 } | |
| 541 | |
| 6333 | 542 static void irc_chat_join (GaimConnection *gc, GHashTable *data) |
| 543 { | |
| 544 struct irc_conn *irc = gc->proto_data; | |
| 545 const char *args[2]; | |
| 3616 | 546 |
| 6333 | 547 args[0] = g_hash_table_lookup(data, "channel"); |
| 548 args[1] = g_hash_table_lookup(data, "password"); | |
| 549 irc_cmd_join(irc, "join", NULL, args); | |
| 3622 | 550 } |
| 551 | |
| 9917 | 552 static char *irc_get_chat_name(GHashTable *data) { |
| 553 return g_strdup(g_hash_table_lookup(data, "channel")); | |
| 554 } | |
| 555 | |
| 6333 | 556 static void irc_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) |
| 3751 | 557 { |
| 6333 | 558 struct irc_conn *irc = gc->proto_data; |
| 559 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 560 const char *args[2]; | |
| 3751 | 561 |
| 6333 | 562 if (!convo) { |
| 563 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got chat invite request for bogus chat\n"); | |
| 564 return; | |
| 565 } | |
| 566 args[0] = name; | |
| 567 args[1] = gaim_conversation_get_name(convo); | |
| 568 irc_cmd_invite(irc, "invite", gaim_conversation_get_name(convo), args); | |
| 3707 | 569 } |
| 570 | |
| 6333 | 571 |
| 572 static void irc_chat_leave (GaimConnection *gc, int id) | |
| 3707 | 573 { |
| 6333 | 574 struct irc_conn *irc = gc->proto_data; |
| 575 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 576 const char *args[2]; | |
| 5298 | 577 |
| 6333 | 578 if (!convo) |
| 579 return; | |
| 3735 | 580 |
| 6333 | 581 args[0] = gaim_conversation_get_name(convo); |
| 582 args[1] = NULL; | |
| 583 irc_cmd_part(irc, "part", gaim_conversation_get_name(convo), args); | |
| 584 serv_got_chat_left(gc, id); | |
| 3735 | 585 } |
| 586 | |
| 6333 | 587 static int irc_chat_send(GaimConnection *gc, int id, const char *what) |
| 3735 | 588 { |
| 6333 | 589 struct irc_conn *irc = gc->proto_data; |
| 590 GaimConversation *convo = gaim_find_chat(gc, id); | |
| 591 const char *args[2]; | |
| 8163 | 592 char *tmp; |
| 6333 | 593 |
| 594 if (!convo) { | |
| 595 gaim_debug(GAIM_DEBUG_ERROR, "irc", "chat send on nonexistent chat\n"); | |
| 596 return -EINVAL; | |
| 597 } | |
| 9130 | 598 #if 0 |
| 6333 | 599 if (*what == '/') { |
| 600 return irc_parse_cmd(irc, convo->name, what + 1); | |
| 601 } | |
| 9130 | 602 #endif |
| 6333 | 603 args[0] = convo->name; |
| 604 args[1] = what; | |
| 605 | |
| 606 irc_cmd_privmsg(irc, "msg", NULL, args); | |
| 8163 | 607 |
| 608 tmp = gaim_escape_html(what); | |
| 609 serv_got_chat_in(gc, id, gaim_connection_get_display_name(gc), 0, tmp, time(NULL)); | |
| 610 g_free(tmp); | |
| 6333 | 611 return 0; |
| 3707 | 612 } |
| 613 | |
| 6333 | 614 static guint irc_nick_hash(const char *nick) |
| 615 { | |
| 616 char *lc; | |
| 617 guint bucket; | |
|
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
618 |
| 6333 | 619 lc = g_utf8_strdown(nick, -1); |
| 620 bucket = g_str_hash(lc); | |
| 621 g_free(lc); | |
|
6270
1bf6fd117797
[gaim-migrate @ 6767]
Christian Hammond <chipx86@chipx86.com>
parents:
6240
diff
changeset
|
622 |
| 6333 | 623 return bucket; |
| 3029 | 624 } |
| 625 | |
| 6333 | 626 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
|
627 { |
| 6333 | 628 return (gaim_utf8_strcasecmp(nick1, nick2) == 0); |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
629 } |
|
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
630 |
| 6333 | 631 static void irc_buddy_free(struct irc_buddy *ib) |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
632 { |
| 6333 | 633 g_free(ib->name); |
| 634 g_free(ib); | |
|
2619
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
635 } |
|
536198196dc6
[gaim-migrate @ 2632]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2617
diff
changeset
|
636 |
| 9154 | 637 static void irc_chat_set_topic(GaimConnection *gc, int id, const char *topic) |
| 638 { | |
| 639 char *buf; | |
| 640 const char *name = NULL; | |
| 641 struct irc_conn *irc; | |
| 642 | |
| 643 irc = gc->proto_data; | |
| 644 name = gaim_conversation_get_name(gaim_find_chat(gc, id)); | |
| 645 | |
| 646 if (name == NULL) | |
| 647 return; | |
| 648 | |
| 649 buf = irc_format(irc, "vt:", "TOPIC", name, topic); | |
| 650 irc_send(irc, buf); | |
| 651 g_free(buf); | |
| 652 } | |
| 653 | |
| 8114 | 654 static GaimRoomlist *irc_roomlist_get_list(GaimConnection *gc) |
| 655 { | |
| 656 struct irc_conn *irc; | |
| 657 GList *fields = NULL; | |
| 658 GaimRoomlistField *f; | |
| 8352 | 659 char *buf; |
| 8114 | 660 |
| 661 irc = gc->proto_data; | |
| 662 | |
| 663 if (irc->roomlist) | |
| 664 gaim_roomlist_unref(irc->roomlist); | |
| 665 | |
| 666 irc->roomlist = gaim_roomlist_new(gaim_connection_get_account(gc)); | |
| 667 | |
| 668 f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, "", "channel", TRUE); | |
| 669 fields = g_list_append(fields, f); | |
| 670 | |
| 671 f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_INT, _("Users"), "users", FALSE); | |
| 672 fields = g_list_append(fields, f); | |
| 673 | |
| 674 f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, _("Topic"), "topic", FALSE); | |
| 675 fields = g_list_append(fields, f); | |
| 676 | |
| 677 gaim_roomlist_set_fields(irc->roomlist, fields); | |
| 678 | |
| 8352 | 679 buf = irc_format(irc, "v", "LIST"); |
| 680 irc_send(irc, buf); | |
| 681 g_free(buf); | |
| 8114 | 682 |
| 683 return irc->roomlist; | |
| 684 } | |
| 685 | |
| 686 static void irc_roomlist_cancel(GaimRoomlist *list) | |
| 687 { | |
| 688 GaimConnection *gc = gaim_account_get_connection(list->account); | |
| 689 struct irc_conn *irc; | |
| 690 | |
| 691 if (gc == NULL) | |
| 692 return; | |
| 693 | |
| 694 irc = gc->proto_data; | |
| 695 | |
| 696 gaim_roomlist_set_in_progress(list, FALSE); | |
| 697 | |
| 698 if (irc->roomlist == list) { | |
| 699 irc->roomlist = NULL; | |
| 700 gaim_roomlist_unref(list); | |
| 701 } | |
| 702 } | |
| 703 | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
704 static GaimPluginProtocolInfo prpl_info = |
| 2086 | 705 { |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
706 OPT_PROTO_CHAT_TOPIC | OPT_PROTO_PASSWORD_OPTIONAL, |
| 9475 | 707 NULL, /* user_splits */ |
| 708 NULL, /* protocol_options */ | |
| 9951 | 709 NO_BUDDY_ICONS, /* icon_spec */ |
| 710 irc_blist_icon, /* list_icon */ | |
| 711 irc_blist_emblems, /* list_emblems */ | |
| 9475 | 712 NULL, /* status_text */ |
| 713 NULL, /* tooltip_text */ | |
| 9951 | 714 irc_status_types, /* away_states */ |
| 9475 | 715 NULL, /* blist_node_menu */ |
| 9951 | 716 irc_chat_join_info, /* chat_info */ |
| 9754 | 717 irc_chat_info_defaults, /* chat_info_defaults */ |
| 9951 | 718 irc_login, /* login */ |
| 719 irc_close, /* close */ | |
| 720 irc_im_send, /* send_im */ | |
| 9475 | 721 NULL, /* set_info */ |
| 722 NULL, /* send_typing */ | |
| 9951 | 723 irc_get_info, /* get_info */ |
| 724 irc_set_status, /* set_status */ | |
| 9475 | 725 NULL, /* set_idle */ |
| 726 NULL, /* change_passwd */ | |
| 9951 | 727 irc_add_buddy, /* add_buddy */ |
| 9475 | 728 NULL, /* add_buddies */ |
| 9951 | 729 irc_remove_buddy, /* remove_buddy */ |
| 9475 | 730 NULL, /* remove_buddies */ |
| 9741 | 731 NULL, /* add_permit */ |
| 732 NULL, /* add_deny */ | |
| 733 NULL, /* rem_permit */ | |
| 734 NULL, /* rem_deny */ | |
| 735 NULL, /* set_permit_deny */ | |
| 9475 | 736 NULL, /* warn */ |
| 9951 | 737 irc_chat_join, /* join_chat */ |
| 9475 | 738 NULL, /* reject_chat */ |
| 9951 | 739 irc_get_chat_name, /* get_chat_name */ |
| 740 irc_chat_invite, /* chat_invite */ | |
| 741 irc_chat_leave, /* chat_leave */ | |
| 9475 | 742 NULL, /* chat_whisper */ |
| 9951 | 743 irc_chat_send, /* chat_send */ |
| 9475 | 744 NULL, /* keepalive */ |
| 745 NULL, /* register_user */ | |
| 746 NULL, /* get_cb_info */ | |
| 747 NULL, /* get_cb_away */ | |
| 748 NULL, /* alias_buddy */ | |
| 749 NULL, /* group_buddy */ | |
| 750 NULL, /* rename_group */ | |
| 751 NULL, /* buddy_free */ | |
| 752 NULL, /* convo_closed */ | |
| 753 NULL, /* normalize */ | |
| 754 NULL, /* set_buddy_icon */ | |
| 755 NULL, /* remove_group */ | |
| 756 NULL, /* get_cb_real_name */ | |
| 9951 | 757 irc_chat_set_topic, /* set_chat_topic */ |
| 9475 | 758 NULL, /* find_blist_chat */ |
| 759 irc_roomlist_get_list, /* roomlist_get_list */ | |
| 760 irc_roomlist_cancel, /* roomlist_cancel */ | |
| 761 NULL, /* roomlist_expand_category */ | |
| 762 NULL, /* can_receive_file */ | |
| 763 irc_dccsend_send_file /* send_file */ | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
764 }; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
765 |
| 8114 | 766 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
767 static GaimPluginInfo info = |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
768 { |
| 9943 | 769 GAIM_PLUGIN_MAGIC, |
| 770 GAIM_MAJOR_VERSION, | |
| 771 GAIM_MINOR_VERSION, | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
772 GAIM_PLUGIN_PROTOCOL, /**< type */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
773 NULL, /**< ui_requirement */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
774 0, /**< flags */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
775 NULL, /**< dependencies */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
776 GAIM_PRIORITY_DEFAULT, /**< priority */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
777 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
778 "prpl-irc", /**< id */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
779 "IRC", /**< name */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
780 VERSION, /**< version */ |
| 6333 | 781 N_("IRC Protocol Plugin"), /** summary */ |
| 782 N_("The IRC Protocol Plugin that Sucks Less"), /** description */ | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
783 NULL, /**< author */ |
|
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6369
diff
changeset
|
784 GAIM_WEBSITE, /**< homepage */ |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
785 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
786 NULL, /**< load */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
787 NULL, /**< unload */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
788 NULL, /**< destroy */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
789 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
790 NULL, /**< ui_info */ |
| 8993 | 791 &prpl_info, /**< extra_info */ |
| 792 NULL, | |
| 9015 | 793 irc_actions |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
794 }; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
795 |
| 6333 | 796 static void _init_plugin(GaimPlugin *plugin) |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5150
diff
changeset
|
797 { |
|
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
798 GaimAccountUserSplit *split; |
|
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
799 GaimAccountOption *option; |
|
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
800 |
| 6333 | 801 split = gaim_account_user_split_new(_("Server"), IRC_DEFAULT_SERVER, '@'); |
|
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
802 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
|
803 |
|
6459
b52870734c21
[gaim-migrate @ 6968]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
804 option = gaim_account_option_int_new(_("Port"), "port", IRC_DEFAULT_PORT); |
| 6333 | 805 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
|
806 |
| 10258 | 807 option = gaim_account_option_string_new(_("Encodings"), "encoding", IRC_DEFAULT_CHARSET); |
| 6333 | 808 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
|
809 |
| 7323 | 810 option = gaim_account_option_string_new(_("Username"), "username", ""); |
| 811 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
| 812 | |
| 10002 | 813 option = gaim_account_option_string_new(_("Real name"), "realname", ""); |
| 814 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
| 815 | |
| 10365 | 816 option = gaim_account_option_bool_new(_("Use SSL"), "ssl", FALSE); |
| 817 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
| 818 | |
| 6333 | 819 _irc_plugin = plugin; |
| 9130 | 820 |
| 821 irc_register_commands(); | |
| 2086 | 822 } |
| 823 | |
| 6333 | 824 GAIM_INIT_PLUGIN(irc, _init_plugin, info); |
