Mercurial > pidgin
diff libgaim/protocols/yahoo/yahoo.c @ 14258:cb2714fdf274
[gaim-migrate @ 16940]
up the protocol version, handle the new buddy list message (which i renamed the service for again), pretend auth type 2 is auth type 1,
note when a buddy is an msn buddy, and possibly even send msn buddy messages correctly.
I haven't really tested if everything works with the new protocol version, but I can always lower it again if bad things start happening and I don't have time to
fix them before the release.
I don't know if sending messages to msn users really works or not, it seems to be down server side at the moment. Someone test when msn gets it working again :P
There's no way to add msn contacts to your yahoo account from within gaim. Not sure how we'll do the UI for that.
committer: Tailor Script <tailor@pidgin.im>
author | Tim Ringenbach <marv@pidgin.im> |
---|---|
date | Mon, 21 Aug 2006 04:12:07 +0000 |
parents | 60b1bc8dbf37 |
children | 0ac0f16aa006 |
line wrap: on
line diff
--- a/libgaim/protocols/yahoo/yahoo.c Mon Aug 21 04:06:33 2006 +0000 +++ b/libgaim/protocols/yahoo/yahoo.c Mon Aug 21 04:12:07 2006 +0000 @@ -469,6 +469,65 @@ } } +static void yahoo_process_list_15(GaimConnection *gc, struct yahoo_packet *pkt) +{ + GSList *l = pkt->hash; + + GaimAccount *account = gaim_connection_get_account(gc); + GHashTable *ht; + char *grp = NULL; + char *norm_bud = NULL; + + ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_slist_free); + + while (l) { + struct yahoo_pair *pair = l->data; + YahooFriend *f = NULL; /* It's your friends. They're going to want you to share your StarBursts. */ + /* But what if you had no friends? */ + GaimBuddy *b; + GaimGroup *g; + + + l = l->next; + + switch (pair->key) { + case 302: /* what is this? it's always 318 before a group, 319 before a s/n */ + case 300: /* ditto */ + break; + case 65: /* This is the group */ + g_free(grp); + grp = yahoo_string_decode(gc, pair->value, FALSE); + break; + case 7: /* buddy's s/n */ + g_free(norm_bud); + norm_bud = g_strdup(gaim_normalize(account, pair->value)); + f = yahoo_friend_find_or_new(gc, norm_bud); + if (!(b = gaim_find_buddy(account, norm_bud))) { + if (!(g = gaim_find_group(grp))) { + g = gaim_group_new(grp); + gaim_blist_add_group(g, NULL); + } + b = gaim_buddy_new(account, norm_bud, NULL); + gaim_blist_add_buddy(b, NULL, g, NULL); + } + yahoo_do_group_check(account, ht, norm_bud, grp); + + break; + case 241: /* msn user */ + if (f && *pair->value == '1') + f->msn = TRUE; + break; + /* case 242: */ /* this seems related to 241 */ + /* break; */ + } + } + + g_hash_table_foreach(ht, yahoo_do_group_cleanup, NULL); + g_hash_table_destroy(ht); + g_free(grp); + g_free(norm_bud); +} + static void yahoo_process_list(GaimConnection *gc, struct yahoo_packet *pkt) { GSList *l = pkt->hash; @@ -1710,6 +1769,7 @@ yahoo_process_auth_old(gc, seed); break; case 1: + case 2: /* This case seems to work, could probably use testing */ yahoo_process_auth_new(gc, seed); break; default: @@ -2042,6 +2102,7 @@ case YAHOO_SERVICE_CHATLOGON: case YAHOO_SERVICE_CHATLOGOFF: case YAHOO_SERVICE_Y6_STATUS_UPDATE: + case YAHOO_SERVICE_STATUS_15: yahoo_process_status(gc, pkt); break; case YAHOO_SERVICE_NOTIFY: @@ -2067,6 +2128,9 @@ case YAHOO_SERVICE_LIST: yahoo_process_list(gc, pkt); break; + case YAHOO_SERVICE_LIST_15: + yahoo_process_list_15(gc, pkt); + break; case YAHOO_SERVICE_AUTH: yahoo_process_auth(gc, pkt); break; @@ -3121,10 +3185,14 @@ gboolean utf8 = TRUE; GaimWhiteboard *wb; int ret = 1; + YahooFriend *f = NULL; msg2 = yahoo_string_encode(gc, msg, &utf8); yahoo_packet_hash(pkt, "ss", 1, gaim_connection_get_display_name(gc), 5, who); + if ((f = yahoo_friend_find(gc, who)) && f->msn) + yahoo_packet_hash_str(pkt, 241, "1"); + if (utf8) yahoo_packet_hash_str(pkt, 97, "1"); yahoo_packet_hash_str(pkt, 14, msg2);