Mercurial > pidgin.yaz
annotate src/protocols/napster/napster.c @ 12595:3169cd6727ad
[gaim-migrate @ 14925]
I've been meaning to spend the time to commit these changes separately, but it's been a couple days without me finding the time...
1. Allow the creation of GaimStatusTypes by passing NULL for the name and/or id. The core uses the default name and/or id. This eliminates quite a bit of duplication in the prpls.
2. Make statuses more consistent. For example, in some prpls, "Busy" was descended from the UNAVAILABLE primitive and on others it was a case of AWAY. Another example... "On Vacation" is definitely an EXTENDED_AWAY not an AWAY.
3. Rename some pixmaps to elminate some special cases. The names of the pixmaps should now match the primitive default IDs.
4. Rename the HIDDEN primitive to INVISIBLE, since we seem to be using that term everywhere. In conjunction with #1, more duplication was eliminated.
5. Add a MOBILE status primitive. It's not used now. It'll be needed in the (hopefully not-too-distant) future, so I'm planning ahead.
6. Shrink the status select for small blist folks. Now if someone can get rid of that stupid extra padding, we'll be set (well, after we deal with imhtml space issues). I've fought with this for many many hours over several days and I can't get it. It's clear that the combo box is requesting more space than is really necessary, but I don't know why.
This is really my first go at anything significant status-related. Everyone should check their favorite prpls carefully to make sure I didn't break anything.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 21 Dec 2005 08:24:17 +0000 |
parents | 1b57012eec7b |
children | 2926e3c3185e |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim - Napster Protocol Plugin | |
3 * | |
3322 | 4 * Copyright (C) 2000-2001, Rob Flynn <rob@marko.net> |
7084
0909ebf6fb28
[gaim-migrate @ 7649]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
5 * |
2086 | 6 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
20 #include "internal.h" |
2086 | 21 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
22 #include "account.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
23 #include "accountopt.h" |
9030 | 24 #include "blist.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
25 #include "conversation.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
26 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
27 #include "notify.h" |
2086 | 28 #include "prpl.h" |
29 #include "proxy.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
30 #include "util.h" |
9943 | 31 #include "version.h" |
3630 | 32 |
3322 | 33 #define NAP_SERVER "64.124.41.187" |
34 #define NAP_PORT 8888 | |
35 | |
5604 | 36 #define NAPSTER_CONNECT_STEPS 2 |
37 | |
2086 | 38 GSList *nap_connections = NULL; |
39 | |
40 struct nap_data { | |
41 int fd; | |
42 gchar *email; | |
43 }; | |
44 | |
5679 | 45 static GaimConversation *nap_find_chat(GaimConnection *gc, const char *name) |
2086 | 46 { |
5402 | 47 GSList *bcs = gc->buddy_chats; |
2086 | 48 |
5402 | 49 while (bcs) { |
5679 | 50 GaimConversation *b = bcs->data; |
5402 | 51 if (!gaim_utf8_strcasecmp(b->name, name)) |
5388 | 52 return b; |
5402 | 53 bcs = bcs->next; |
5388 | 54 } |
55 | |
56 return NULL; | |
57 } | |
58 | |
5604 | 59 static void nap_write_packet(GaimConnection *gc, unsigned short command, const char *format, ...) |
5388 | 60 { |
61 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
62 va_list ap; | |
63 gchar *message; | |
64 unsigned short size; | |
65 | |
66 va_start(ap, format); | |
67 message = g_strdup_vprintf(format, ap); | |
68 va_end(ap); | |
69 | |
70 size = strlen(message); | |
71 gaim_debug(GAIM_DEBUG_MISC, "napster", "S %3hd: %s\n", command, message); | |
72 | |
73 write(ndata->fd, &size, 2); | |
74 write(ndata->fd, &command, 2); | |
75 write(ndata->fd, message, size); | |
76 | |
77 g_free(message); | |
78 } | |
79 | |
5604 | 80 static int nap_do_irc_style(GaimConnection *gc, const char *message, const char *name) |
5388 | 81 { |
82 gchar **res; | |
83 | |
84 gaim_debug(GAIM_DEBUG_MISC, "napster", "C %s\n", message); | |
85 | |
86 res = g_strsplit(message, " ", 2); | |
87 | |
8386 | 88 if (!g_ascii_strcasecmp(res[0], "/ME")) { /* MSG_CLIENT_PUBLIC */ |
5402 | 89 nap_write_packet(gc, 824, "%s \"%s\"", name, res[1]); |
5388 | 90 |
8386 | 91 } else if (!g_ascii_strcasecmp(res[0], "/MSG")) { /* MSG_CLIENT_PUBLIC */ |
5388 | 92 nap_write_packet(gc, 205, "%s", res[1]); |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
93 |
8386 | 94 } else if (!g_ascii_strcasecmp(res[0], "/JOIN")) { /* join chatroom MSG_CLIENT_JOIN */ |
5388 | 95 if (!res[1]) { |
96 g_strfreev(res); | |
97 return 1; | |
98 } | |
99 if (res[1][0] != '#') | |
100 nap_write_packet(gc, 400, "#%s", res[1]); | |
101 else | |
102 nap_write_packet(gc, 400, "%s", res[1]); | |
103 | |
8386 | 104 } else if (!g_ascii_strcasecmp(res[0], "/PART")) { /* partchatroom MSG_CLIENT_PART */ |
5402 | 105 nap_write_packet(gc, 401, "%s", res[1] ? res[1] : name); |
5388 | 106 |
8386 | 107 } else if (!g_ascii_strcasecmp(res[0], "/TOPIC")) { /* set topic MSG_SERVER_TOPIC */ |
5402 | 108 nap_write_packet(gc, 410, "%s", res[1] ? res[1] : name); |
5388 | 109 |
8386 | 110 } else if (!g_ascii_strcasecmp(res[0], "/WHOIS")) { /* whois request MSG_CLIENT_WHOIS */ |
5388 | 111 nap_write_packet(gc, 603, "%s", res[1]); |
112 | |
8386 | 113 } else if (!g_ascii_strcasecmp(res[0], "/PING")) { /* send ping MSG_CLIENT_PING */ |
5388 | 114 nap_write_packet(gc, 751, "%s", res[1]); |
115 | |
8386 | 116 } else if (!g_ascii_strcasecmp(res[0], "/KICK")) { /* kick asswipe MSG_CLIENT_KICK */ |
5388 | 117 nap_write_packet(gc, 829, "%s", res[1]); |
118 | |
119 } else { | |
120 g_strfreev(res); | |
121 return 1; | |
122 } | |
123 | |
124 g_strfreev(res); | |
125 return 0; | |
126 } | |
127 | |
128 /* 205 - MSG_CLIENT_PRIVMSG */ | |
12216 | 129 static int nap_send_im(GaimConnection *gc, const char *who, const char *message, GaimMessageFlags flags) |
5388 | 130 { |
12216 | 131 char *tmp = gaim_unescape_html(message); |
5388 | 132 |
12216 | 133 if ((strlen(tmp) < 2) || (tmp[0] != '/' ) || (tmp[1] == '/')) { |
5388 | 134 /* Actually send a chat message */ |
12216 | 135 nap_write_packet(gc, 205, "%s %s", who, tmp); |
5388 | 136 } else { |
137 /* user typed an IRC-style command */ | |
12216 | 138 nap_do_irc_style(gc, tmp, who); |
2086 | 139 } |
140 | |
12216 | 141 g_free(tmp); |
142 | |
5388 | 143 return 1; |
144 } | |
145 | |
146 /* 207 - MSG_CLIENT_ADD_HOTLIST */ | |
9285 | 147 static void nap_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
5388 | 148 { |
9285 | 149 nap_write_packet(gc, 207, "%s", buddy->name); |
5388 | 150 } |
151 | |
152 /* 208 - MSG_CLIENT_ADD_HOTLIST_SEQ */ | |
10869 | 153 static void nap_send_buddylist(GaimConnection *gc) |
5388 | 154 { |
10869 | 155 GaimBuddyList *blist; |
156 GaimBlistNode *gnode, *cnode, *bnode; | |
157 GaimBuddy *buddy; | |
158 | |
159 if ((blist = gaim_get_blist()) != NULL) | |
160 { | |
161 for (gnode = blist->root; gnode != NULL; gnode = gnode->next) | |
162 { | |
163 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
164 continue; | |
165 for (cnode = gnode->child; cnode != NULL; cnode = cnode->next) | |
166 { | |
167 if (!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
168 continue; | |
169 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
170 { | |
171 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
172 continue; | |
173 buddy = (GaimBuddy *)bnode; | |
174 nap_write_packet(gc, 208, "%s", buddy->name); | |
175 } | |
176 } | |
177 } | |
5388 | 178 } |
179 } | |
180 | |
181 /* 303 - MSG_CLIENT_REMOVE_HOTLIST */ | |
9285 | 182 static void nap_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
5388 | 183 { |
9285 | 184 nap_write_packet(gc, 303, "%s", buddy->name); |
5388 | 185 } |
186 | |
9917 | 187 static char *nap_get_chat_name(GHashTable *data) { |
188 char *name = g_hash_table_lookup(data, "group"); | |
10200 | 189 |
9917 | 190 /* Make sure the name has a # preceding it */ |
191 if (name[0] != '#') { | |
192 return g_strdup_printf("#%s", name); | |
193 } | |
194 | |
195 return g_strdup(name); | |
196 } | |
197 | |
5388 | 198 /* 400 - MSG_CLIENT_JOIN */ |
5604 | 199 static void nap_join_chat(GaimConnection *gc, GHashTable *data) |
5388 | 200 { |
201 char *name; | |
202 | |
203 if (!data) | |
204 return; | |
205 | |
9917 | 206 name = nap_get_chat_name(data); |
5388 | 207 |
9917 | 208 if (name) { |
5388 | 209 nap_write_packet(gc, 400, "%s", name); |
9917 | 210 g_free(name); |
211 } | |
5388 | 212 } |
213 | |
214 /* 401 - MSG_CLIENT_PART */ | |
5604 | 215 static void nap_chat_leave(GaimConnection *gc, int id) |
5388 | 216 { |
5679 | 217 GaimConversation *c = gaim_find_chat(gc, id); |
5388 | 218 |
5402 | 219 if (!c) |
5388 | 220 return; |
221 | |
5402 | 222 nap_write_packet(gc, 401, "%s", c->name); |
5388 | 223 } |
224 | |
225 /* 402 - MSG_CLIENT_PUBLIC */ | |
12216 | 226 static int nap_chat_send(GaimConnection *gc, int id, const char *message, GaimMessageFlags flags) |
5388 | 227 { |
5679 | 228 GaimConversation *c = gaim_find_chat(gc, id); |
12216 | 229 char *tmp = gaim_unescape_html(message); |
5388 | 230 |
5402 | 231 if (!c) |
5388 | 232 return -EINVAL; |
233 | |
12216 | 234 if ((strlen(tmp) < 2) || (tmp[0] != '/' ) || (tmp[1] == '/')) { |
5388 | 235 /* Actually send a chat message */ |
12216 | 236 nap_write_packet(gc, 402, "%s %s", c->name, tmp); |
5388 | 237 } else { |
238 /* user typed an IRC-style command */ | |
12216 | 239 nap_do_irc_style(gc, tmp, c->name); |
5388 | 240 } |
241 | |
12216 | 242 g_free(tmp); |
243 | |
5388 | 244 return 0; |
245 } | |
246 | |
247 /* 603 - MSG_CLIENT_WHOIS */ | |
5604 | 248 static void nap_get_info(GaimConnection *gc, const char *who) |
5388 | 249 { |
250 nap_write_packet(gc, 603, "%s", who); | |
2086 | 251 } |
252 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
253 static void nap_callback(gpointer data, gint source, GaimInputCondition condition) |
2086 | 254 { |
5604 | 255 GaimConnection *gc = data; |
2086 | 256 struct nap_data *ndata = gc->proto_data; |
10010 | 257 GaimAccount *account = gaim_connection_get_account(gc); |
5679 | 258 GaimConversation *c; |
5402 | 259 gchar *buf, *buf2, *buf3, **res; |
2086 | 260 unsigned short header[2]; |
261 int len; | |
262 int command; | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
263 int i; |
2086 | 264 |
5388 | 265 if (read(source, (void*)header, 4) != 4) { |
5604 | 266 gaim_connection_error(gc, _("Unable to read header from server")); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
267 return; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
268 } |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
269 |
2086 | 270 len = header[0]; |
10740 | 271 command = header[1]; |
5388 | 272 buf = (gchar *)g_malloc((len + 1) * sizeof(gchar)); |
273 buf[len] = '\0'; | |
2086 | 274 |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
275 i = 0; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
276 do { |
5388 | 277 int tmp = read(source, buf + i, len - i); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
278 if (tmp <= 0) { |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
279 g_free(buf); |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
280 buf = g_strdup_printf(_("Unable to read message from server: %s. Command is %hd, length is %hd."), strerror(errno), len, command); |
5604 | 281 gaim_connection_error(gc, buf); |
5388 | 282 g_free(buf); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
283 return; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
284 } |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
285 i += tmp; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
286 } while (i != len); |
2086 | 287 |
5388 | 288 gaim_debug(GAIM_DEBUG_MISC, "napster", "R %3hd: %s\n", command, buf); |
2086 | 289 |
5388 | 290 switch (command) { |
291 case 000: /* MSG_SERVER_ERROR */ | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
292 gaim_notify_error(gc, NULL, buf, NULL); |
5388 | 293 gaim_input_remove(gc->inpa); |
294 gc->inpa = 0; | |
2086 | 295 close(source); |
10740 | 296 gaim_connection_error(gc, _("Unknown server error.")); |
5388 | 297 break; |
2086 | 298 |
5388 | 299 case 003: /* MSG_SERVER_EMAIL */ |
300 gaim_debug(GAIM_DEBUG_MISC, "napster", "Registered with e-mail address: %s\n", buf); | |
2086 | 301 ndata->email = g_strdup(buf); |
302 | |
303 /* Our signon is complete */ | |
5604 | 304 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2086 | 305 |
10869 | 306 /* Send the server our buddy list */ |
307 nap_send_buddylist(gc); | |
308 | |
5388 | 309 break; |
310 | |
311 case 201: /* MSG_SERVER_SEARCH_RESULT */ | |
312 res = g_strsplit(buf, " ", 0); | |
11638 | 313 gaim_prpl_got_user_status(account, res[0], "available", NULL); |
5388 | 314 g_strfreev(res); |
315 break; | |
316 | |
317 case 202: /* MSG_SERVER_SEARCH_END */ | |
10123 | 318 gaim_prpl_got_user_status(account, buf, "offline", NULL); |
5388 | 319 break; |
320 | |
321 case 205: /* MSG_CLIENT_PRIVMSG */ | |
322 res = g_strsplit(buf, " ", 2); | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10723
diff
changeset
|
323 buf2 = g_markup_escape_text(res[1], -1); |
8495 | 324 serv_got_im(gc, res[0], buf2, 0, time(NULL)); |
325 g_free(buf2); | |
5388 | 326 g_strfreev(res); |
327 break; | |
328 | |
329 case 209: /* MSG_SERVER_USER_SIGNON */ | |
330 /* USERNAME SPEED */ | |
331 res = g_strsplit(buf, " ", 2); | |
11638 | 332 gaim_prpl_got_user_status(account, res[0], "available", NULL); |
5388 | 333 g_strfreev(res); |
334 break; | |
335 | |
336 case 210: /* MSG_SERVER_USER_SIGNOFF */ | |
337 /* USERNAME SPEED */ | |
338 res = g_strsplit(buf, " ", 2); | |
10010 | 339 gaim_prpl_got_user_status(account, res[0], "offline", NULL); |
5388 | 340 g_strfreev(res); |
341 break; | |
342 | |
343 case 214: /* MSG_SERVER_STATS */ | |
344 res = g_strsplit(buf, " ", 3); | |
345 buf2 = g_strdup_printf(_("users: %s, files: %s, size: %sGB"), res[0], res[1], res[2]); | |
6982 | 346 serv_got_im(gc, "server", buf2, 0, time(NULL)); |
5388 | 347 g_free(buf2); |
348 g_strfreev(res); | |
349 break; | |
350 | |
351 case 301: /* MSG_SERVER_HOTLIST_ACK */ | |
352 /* Our buddy was added successfully */ | |
353 break; | |
354 | |
355 case 302: /* MSG_SERVER_HOTLIST_ERROR */ | |
356 buf2 = g_strdup_printf(_("Unable to add \"%s\" to your Napster hotlist"), buf); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
357 gaim_notify_error(gc, NULL, buf2, NULL); |
5388 | 358 g_free(buf2); |
359 break; | |
360 | |
361 case 316: /* MSG_SERVER_DISCONNECTING */ | |
362 /* we have been kicked off =^( */ | |
10740 | 363 gaim_connection_error(gc, _("You were disconnected from the server.")); |
5388 | 364 break; |
365 | |
366 case 401: /* MSG_CLIENT_PART */ | |
5402 | 367 c = nap_find_chat(gc, buf); |
368 if (c) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7084
diff
changeset
|
369 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(c))); |
5388 | 370 break; |
371 | |
372 case 403: /* MSG_SERVER_PUBLIC */ | |
373 res = g_strsplit(buf, " ", 3); | |
5402 | 374 c = nap_find_chat(gc, res[0]); |
375 if (c) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7084
diff
changeset
|
376 serv_got_chat_in(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(c)), res[1], 0, res[2], time((time_t)NULL)); |
5388 | 377 g_strfreev(res); |
378 break; | |
379 | |
380 case 404: /* MSG_SERVER_NOSUCH */ | |
381 /* abused by opennap servers to broadcast stuff */ | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10723
diff
changeset
|
382 buf2 = g_markup_escape_text(buf, -1); |
8495 | 383 serv_got_im(gc, "server", buf2, 0, time(NULL)); |
384 g_free(buf2); | |
5388 | 385 break; |
386 | |
387 case 405: /* MSG_SERVER_JOIN_ACK */ | |
5402 | 388 c = nap_find_chat(gc, buf); |
389 if (!c) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7084
diff
changeset
|
390 serv_got_joined_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(c)), buf); |
5388 | 391 break; |
392 | |
393 case 407: /* MSG_SERVER_PART */ | |
394 res = g_strsplit(buf, " ", 0); | |
5402 | 395 c = nap_find_chat(gc, res[0]); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7084
diff
changeset
|
396 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c), res[1], NULL); |
5388 | 397 g_strfreev(res); |
398 break; | |
399 | |
400 case 406: /* MSG_SERVER_JOIN */ | |
401 case 408: /* MSG_SERVER_CHANNEL_USER_LIST */ | |
402 res = g_strsplit(buf, " ", 4); | |
5402 | 403 c = nap_find_chat(gc, res[0]); |
9846 | 404 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c), res[1], NULL, GAIM_CBFLAGS_NONE, TRUE); |
5388 | 405 g_strfreev(res); |
406 break; | |
407 | |
408 case 409: /* MSG_SERVER_CHANNEL_USER_LIST_END */ | |
409 break; | |
410 | |
411 case 410: /* MSG_SERVER_TOPIC */ | |
412 /* display the topic in the channel */ | |
413 res = g_strsplit(buf, " ", 2); | |
5402 | 414 c = nap_find_chat(gc, res[0]); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7084
diff
changeset
|
415 gaim_conv_chat_set_topic(GAIM_CONV_CHAT(c), res[0], res[1]); |
5388 | 416 g_strfreev(res); |
417 break; | |
418 | |
419 case 603: /* MSG_CLIENT_WHOIS */ | |
420 buf2 = g_strdup_printf(_("%s requested your information"), buf); | |
6982 | 421 serv_got_im(gc, "server", buf2, 0, time(NULL)); |
5388 | 422 g_free(buf2); |
423 break; | |
424 | |
425 case 604: /* MSG_SERVER_WHOIS_RESPONSE */ | |
426 /* XXX - Format is: "Elite" 37 " " "Active" 0 0 0 0 "gaim 0.63cvs" 0 0 192.168.1.41 32798 0 unknown flounder */ | |
427 res = g_strsplit(buf, " ", 2); | |
7062
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
428 /* res[0] == username */ |
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11531
diff
changeset
|
429 gaim_notify_userinfo(gc, res[0], res[1], NULL, NULL); |
5388 | 430 g_strfreev(res); |
431 break; | |
432 | |
433 case 621: | |
434 case 622: /* MSG_CLIENT_MOTD */ | |
435 /* also replaces MSG_SERVER_MOTD, so we should display it */ | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10723
diff
changeset
|
436 buf2 = g_markup_escape_text(buf, -1); |
8495 | 437 serv_got_im(gc, "motd", buf2, 0, time(NULL)); |
438 g_free(buf2); | |
5388 | 439 break; |
440 | |
441 case 627: /* MSG_CLIENT_WALLOP */ | |
442 /* abused by opennap server maintainers to broadcast stuff */ | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10723
diff
changeset
|
443 buf2 = g_markup_escape_text(buf, -1); |
8495 | 444 serv_got_im(gc, "wallop", buf2, 0, time(NULL)); |
445 g_free(buf2); | |
5388 | 446 break; |
447 | |
448 case 628: /* MSG_CLIENT_ANNOUNCE */ | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10723
diff
changeset
|
449 buf2 = g_markup_escape_text(buf, -1); |
8495 | 450 serv_got_im(gc, "announce", buf2, 0, time(NULL)); |
451 g_free(buf); | |
5388 | 452 break; |
453 | |
454 case 748: /* MSG_SERVER_GHOST */ | |
455 /* Looks like someone logged in as us! =-O */ | |
10740 | 456 gaim_connection_error(gc, _("You have signed on from another location.")); |
5388 | 457 break; |
458 | |
459 case 751: /* MSG_CLIENT_PING */ | |
460 buf2 = g_strdup_printf(_("%s requested a PING"), buf); | |
6982 | 461 serv_got_im(gc, "server", buf2, 0, time(NULL)); |
5388 | 462 g_free(buf2); |
463 /* send back a pong */ | |
464 /* MSG_CLIENT_PONG */ | |
465 nap_write_packet(gc, 752, "%s", buf); | |
466 break; | |
467 | |
468 case 752: /* MSG_CLIENT_PONG */ | |
469 buf2 = g_strdup_printf("Received pong from %s", buf); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
470 gaim_notify_info(gc, NULL, buf2, NULL); |
5388 | 471 g_free(buf2); |
472 break; | |
473 | |
474 case 824: /* MSG_CLIENT_EMOTE */ | |
475 res = g_strsplit(buf, " ", 3); | |
476 buf2 = g_strndup(res[2]+1, strlen(res[2]) - 2); /* chomp off the surround quotes */ | |
477 buf3 = g_strdup_printf("/me %s", buf2); | |
478 g_free(buf2); | |
5402 | 479 if ((c = nap_find_chat(gc, res[0]))) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7084
diff
changeset
|
480 gaim_conv_chat_write(GAIM_CONV_CHAT(c), res[1], buf3, GAIM_MESSAGE_NICK, time(NULL)); |
5388 | 481 } |
482 g_free(buf3); | |
483 g_strfreev(res); | |
484 break; | |
485 | |
486 default: | |
487 gaim_debug(GAIM_DEBUG_MISC, "napster", "Unknown packet %hd: %s\n", command, buf); | |
488 break; | |
2086 | 489 } |
5388 | 490 |
491 g_free(buf); | |
2086 | 492 } |
493 | |
5388 | 494 /* 002 - MSG_CLIENT_LOGIN */ |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
495 static void nap_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 496 { |
5604 | 497 GaimConnection *gc = data; |
5388 | 498 struct nap_data *ndata = (struct nap_data *)gc->proto_data; |
499 gchar *buf; | |
2086 | 500 |
5605 | 501 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2701
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
502 close(source); |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
503 return; |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
504 } |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
505 |
2086 | 506 if (source < 0) { |
7981 | 507 gaim_connection_error(gc, _("Unable to connect.")); |
2086 | 508 return; |
509 } | |
510 | |
4452 | 511 ndata->fd = source; |
2086 | 512 |
5388 | 513 /* Update the login progress status display */ |
5604 | 514 buf = g_strdup_printf("Logging in: %s", gaim_account_get_username(gc->account)); |
7884 | 515 gaim_connection_update_progress(gc, buf, 1, NAPSTER_CONNECT_STEPS); |
5388 | 516 g_free(buf); |
517 | |
518 /* Write our signon data */ | |
5604 | 519 nap_write_packet(gc, 2, "%s %s 0 \"gaim %s\" 0", |
520 gaim_account_get_username(gc->account), | |
10740 | 521 gaim_connection_get_password(gc), VERSION); |
5388 | 522 |
2086 | 523 /* And set up the input watcher */ |
5388 | 524 gc->inpa = gaim_input_add(ndata->fd, GAIM_INPUT_READ, nap_callback, gc); |
2086 | 525 } |
526 | |
11837 | 527 static void nap_login(GaimAccount *account) |
2086 | 528 { |
5604 | 529 GaimConnection *gc = gaim_account_get_connection(account); |
5388 | 530 |
7884 | 531 gaim_connection_update_progress(gc, _("Connecting"), 0, NAPSTER_CONNECT_STEPS); |
5388 | 532 |
4460 | 533 gc->proto_data = g_new0(struct nap_data, 1); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
534 if (gaim_proxy_connect(account, |
5604 | 535 gaim_account_get_string(account, "server", NAP_SERVER), |
536 gaim_account_get_int(account, "port", NAP_PORT), | |
4491 | 537 nap_login_connect, gc) != 0) { |
7981 | 538 gaim_connection_error(gc, _("Unable to connect.")); |
2086 | 539 } |
540 } | |
541 | |
5604 | 542 static void nap_close(GaimConnection *gc) |
2086 | 543 { |
544 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
5388 | 545 |
2086 | 546 if (gc->inpa) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
547 gaim_input_remove(gc->inpa); |
2086 | 548 |
5388 | 549 if (!ndata) |
550 return; | |
551 | |
10882
83e119608cb5
[gaim-migrate @ 12580]
Gary Kramlich <grim@reaperworld.com>
parents:
10869
diff
changeset
|
552 close(ndata->fd); |
83e119608cb5
[gaim-migrate @ 12580]
Gary Kramlich <grim@reaperworld.com>
parents:
10869
diff
changeset
|
553 |
5388 | 554 g_free(ndata->email); |
555 g_free(ndata); | |
2086 | 556 } |
557 | |
6695 | 558 static const char* nap_list_icon(GaimAccount *a, GaimBuddy *b) |
2086 | 559 { |
4687 | 560 return "napster"; |
2086 | 561 } |
562 | |
9953 | 563 static void nap_list_emblems(GaimBuddy *b, const char **se, const char **sw, |
564 const char **nw, const char **ne) | |
4916 | 565 { |
10723
a9c77f7b8ced
[gaim-migrate @ 12323]
Luke Schierer <lschiere@pidgin.im>
parents:
10649
diff
changeset
|
566 if(!GAIM_BUDDY_IS_ONLINE(b)) |
4916 | 567 *se = "offline"; |
568 } | |
569 | |
10200 | 570 static GList *nap_status_types(GaimAccount *account) |
571 { | |
572 GList *types = NULL; | |
573 GaimStatusType *type; | |
574 | |
575 g_return_val_if_fail(account != NULL, NULL); | |
576 | |
577 type = gaim_status_type_new_full(GAIM_STATUS_OFFLINE, | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12467
diff
changeset
|
578 NULL, NULL, TRUE, TRUE, FALSE); |
10200 | 579 types = g_list_append(types, type); |
580 | |
11522 | 581 type = gaim_status_type_new_full(GAIM_STATUS_AVAILABLE, |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12467
diff
changeset
|
582 NULL, NULL, TRUE, TRUE, FALSE); |
10200 | 583 types = g_list_append(types, type); |
584 | |
585 return types; | |
586 } | |
587 | |
5604 | 588 static GList *nap_chat_info(GaimConnection *gc) |
2086 | 589 { |
5388 | 590 GList *m = NULL; |
591 struct proto_chat_entry *pce; | |
592 | |
593 pce = g_new0(struct proto_chat_entry, 1); | |
7844 | 594 pce->label = _("_Group:"); |
5388 | 595 pce->identifier = "group"; |
596 m = g_list_append(m, pce); | |
597 | |
598 return m; | |
2086 | 599 } |
5388 | 600 |
9754 | 601 GHashTable *nap_chat_info_defaults(GaimConnection *gc, const char *chat_name) |
602 { | |
603 GHashTable *defaults; | |
604 | |
605 defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
606 | |
607 if (chat_name != NULL) | |
608 g_hash_table_insert(defaults, "group", g_strdup(chat_name)); | |
609 | |
610 return defaults; | |
611 } | |
612 | |
5388 | 613 static GaimPlugin *my_protocol = NULL; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
614 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
615 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
616 { |
5388 | 617 OPT_PROTO_CHAT_TOPIC, |
9475 | 618 NULL, /* user_splits */ |
619 NULL, /* protocol_options */ | |
620 NO_BUDDY_ICONS, /* icon_spec */ | |
621 nap_list_icon, /* list_icon */ | |
622 nap_list_emblems, /* list_emblems */ | |
623 NULL, /* status_text */ | |
624 NULL, /* tooltip_text */ | |
10200 | 625 nap_status_types, /* status_types */ |
9475 | 626 NULL, /* blist_node_menu */ |
627 nap_chat_info, /* chat_info */ | |
9754 | 628 nap_chat_info_defaults, /* chat_info_defaults */ |
9475 | 629 nap_login, /* login */ |
630 nap_close, /* close */ | |
631 nap_send_im, /* send_im */ | |
632 NULL, /* set_info */ | |
633 NULL, /* send_typing */ | |
634 nap_get_info, /* get_info */ | |
635 NULL, /* set_away */ | |
636 NULL, /* set_idle */ | |
637 NULL, /* change_passwd */ | |
638 nap_add_buddy, /* add_buddy */ | |
10869 | 639 NULL, /* add_buddies */ |
9475 | 640 nap_remove_buddy, /* remove_buddy */ |
641 NULL, /* remove_buddies */ | |
642 NULL, /* add_permit */ | |
643 NULL, /* add_deny */ | |
644 NULL, /* rem_permit */ | |
645 NULL, /* rem_deny */ | |
646 NULL, /* set_permit_deny */ | |
647 nap_join_chat, /* join_chat */ | |
648 NULL, /* reject chat invite */ | |
9917 | 649 nap_get_chat_name, /* get_chat_name */ |
9475 | 650 NULL, /* chat_invite */ |
651 nap_chat_leave, /* chat_leave */ | |
652 NULL, /* chat_whisper */ | |
653 nap_chat_send, /* chat_send */ | |
654 NULL, /* keepalive */ | |
655 NULL, /* register_user */ | |
656 NULL, /* get_cb_info */ | |
657 NULL, /* get_cb_away */ | |
658 NULL, /* alias_buddy */ | |
659 NULL, /* group_buddy */ | |
660 NULL, /* rename_group */ | |
661 NULL, /* buddy_free */ | |
662 NULL, /* convo_closed */ | |
663 NULL, /* normalize */ | |
664 NULL, /* set_buddy_icon */ | |
665 NULL, /* remove_group */ | |
666 NULL, /* get_cb_real_name */ | |
667 NULL, /* set_chat_topic */ | |
668 NULL, /* find_blist_chat */ | |
669 NULL, /* roomlist_get_list */ | |
670 NULL, /* roomlist_cancel */ | |
671 NULL, /* roomlist_expand_category */ | |
672 NULL, /* can_receive_file */ | |
12143
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
11837
diff
changeset
|
673 NULL, /* send_file */ |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
11837
diff
changeset
|
674 NULL /* new_xfer */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
675 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
676 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
677 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
678 { |
9943 | 679 GAIM_PLUGIN_MAGIC, |
11779
80af53b5b3c5
[gaim-migrate @ 14070]
Gary Kramlich <grim@reaperworld.com>
parents:
11638
diff
changeset
|
680 GAIM_MAJOR_VERSION, |
9943 | 681 GAIM_MINOR_VERSION, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
682 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
683 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
684 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
685 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
686 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
687 |
5388 | 688 "prpl-napster", /**< id */ |
689 "Napster", /**< name */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
690 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
691 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
692 N_("NAPSTER Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
693 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
694 N_("NAPSTER Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
695 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
696 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
697 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
698 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
699 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
700 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
701 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
702 NULL, /**< ui_info */ |
8993 | 703 &prpl_info, /**< extra_info */ |
704 NULL, | |
705 NULL | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
706 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
707 |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
708 static void init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
709 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
710 GaimAccountOption *option; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
711 |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
712 option = gaim_account_option_string_new(_("Server"), "server", |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
713 NAP_SERVER); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
714 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
715 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
716 |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
717 option = gaim_account_option_int_new(_("Port"), "port", 8888); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
718 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
719 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
720 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
721 my_protocol = plugin; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
722 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
723 |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
724 GAIM_INIT_PLUGIN(napster, init_plugin, info); |