static void on_buddystatus_changed()

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);
	}
}