in prpl/buddy.c [63:116]
static void on_buddystatus_changed(ChimeContact *contact, GParamSpec *ignored, PurpleConnection *conn)
{
gboolean is_buddy;
const gchar *email;
ChimeAvailability availability;
email = chime_contact_get_email(contact);
availability = chime_contact_get_availability(contact);
is_buddy = chime_contact_get_contacts_list(contact);
if (!is_buddy) {
/* Don't remove from blist until we're fully connected because
* some contacts may appear first from conversations and only
* later from the contacts list. We don't want to delete them
* here only to add them back to the default "Chime Contacts"
* group later. */
if (PURPLE_CONNECTION_IS_CONNECTED(conn)) {
GSList *buddies = purple_find_buddies(conn->account, email);
while (buddies) {
if (PURPLE_BLIST_NODE_SHOULD_SAVE(buddies->data))
purple_blist_remove_buddy(buddies->data);
buddies = g_slist_remove(buddies, buddies->data);
}
}
} else {
const gchar *display_name = chime_contact_get_display_name(contact);
gboolean found = FALSE;
GSList *buddies = purple_find_buddies(conn->account, email);
while (buddies) {
PurpleBuddy *buddy = buddies->data;
if (PURPLE_BLIST_NODE_SHOULD_SAVE(buddy))
found = TRUE;
purple_blist_server_alias_buddy(buddy, display_name);
buddies = g_slist_remove(buddies, buddy);
}
/* If this is a known contact on the server and we didn't find it
in Pidgin except as a transient one, add it now. */
if (!found) {
PurpleGroup *group = purple_find_group(_("Chime Contacts"));
if (!group) {
group = purple_group_new(_("Chime Contacts"));
purple_blist_add_group(group, NULL);
}
PurpleBuddy *buddy = purple_buddy_new(conn->account, email, NULL);
purple_blist_server_alias_buddy(buddy, display_name);
purple_blist_add_buddy(buddy, NULL, group, NULL);
}
if (availability)
purple_prpl_got_user_status(conn->account, email,
chime_availability_name(availability), NULL);
}
}