--- a/libpurple/protocols/jabber/buddy.c Tue Dec 02 22:45:25 2008 +0000 +++ b/libpurple/protocols/jabber/buddy.c Tue Dec 02 22:45:39 2008 +0000 @@ -115,14 +115,18 @@ break; case JABBER_BUDDY_STATE_AWAY: case JABBER_BUDDY_STATE_DND: - case JABBER_BUDDY_STATE_UNAVAILABLE: - /* This resource is away/dnd/unavailable. Prefer to one which is extended away or unknown. */ - if ((jbr->state == JABBER_BUDDY_STATE_XA) || + /* This resource is away/dnd. Prefer to one which is extended away, unavailable, or unknown. */ + if ((jbr->state == JABBER_BUDDY_STATE_XA) || (jbr->state == JABBER_BUDDY_STATE_UNAVAILABLE) || (jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR)) jbr = l->data; break; case JABBER_BUDDY_STATE_XA: - /* This resource is extended away. That's better than unknown. */ + /* This resource is extended away. That's better than unavailable or unknown. */ + if ((jbr->state == JABBER_BUDDY_STATE_UNAVAILABLE) || (jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR)) + jbr = l->data; + break; + case JABBER_BUDDY_STATE_UNAVAILABLE: + /* This resource is unavailable. That's better than unknown. */ if ((jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR)) jbr = l->data; break; @@ -966,7 +970,7 @@ } #endif } else { - gboolean multiple_resources = jbi->jb->resources && (g_list_length(jbi->jb->resources) > 1); + gboolean multiple_resources = jbi->jb->resources && jbi->jb->resources->next; for(resources = jbi->jb->resources; resources; resources = resources->next) { char *purdy = NULL; @@ -1798,12 +1802,21 @@ void jabber_buddy_get_info(PurpleConnection *gc, const char *who) { JabberStream *js = gc->proto_data; - char *bare_jid = jabber_get_bare_jid(who); + JabberID *jid = jabber_id_new(who); + + if (!jid) + return; - if(bare_jid) { + if (jabber_chat_find(js, jid->node, jid->domain)) { + /* For a conversation, include the resource (indicates the user). */ + jabber_buddy_get_info_for_jid(js, who); + } else { + char *bare_jid = jabber_get_bare_jid(who); jabber_buddy_get_info_for_jid(js, bare_jid); g_free(bare_jid); } + + jabber_id_free(jid); } static void jabber_buddy_set_invisibility(JabberStream *js, const char *who,