const gchar *fb_get_list_id(FacebookAccount *fba, const gchar *list_name) { if (!purple_utf8_strcasecmp(list_name, DEFAULT_GROUP_NAME)) { return "-1"; } return g_hash_table_lookup(fba->friend_lists_reverse, purple_normalize_nocase(NULL, list_name)); }
static PurpleBuddy *add_buddy(FacebookAccount *fba, const gchar *friend_list_id, const gchar *uid, GHashTable *cur_groups) { const gchar *group_name; PurpleGroup *fb_group; PurpleBuddy *buddy; group_name = g_hash_table_lookup(fba->friend_lists, purple_normalize_nocase(NULL, friend_list_id)); if (!group_name || group_name[0] == '\0') { purple_debug_info("facebook", "did not find name of list %s\n", friend_list_id); group_name = DEFAULT_GROUP_NAME; } // Initialize group as necessary. fb_group = purple_find_group(group_name); if (fb_group == NULL) { purple_debug_info("facebook", "adding friend list %s\n", group_name); fb_group = purple_group_new(group_name); purple_blist_add_group(fb_group, NULL); } buddy = (PurpleBuddy *)g_hash_table_lookup(cur_groups, purple_normalize_nocase(NULL, group_name)); if (!buddy) { purple_debug_info("facebook", "adding %s to %s\n", uid, group_name); buddy = purple_buddy_new(fba->account, uid, NULL); purple_blist_add_buddy(buddy, NULL, fb_group, NULL); g_hash_table_remove(cur_groups, purple_normalize_nocase(NULL, group_name)); } return buddy; }
GList *fb_get_buddies_friend_list (FacebookAccount *fba, const gchar *uid, JsonArray *friend_list_ids) { GSList *buddies; GSList *cur; GHashTable *cur_groups; int i; GList *final_buddies, *cur_buddy; PurpleGroup *fb_group; PurpleBuddy *buddy; final_buddies = NULL; buddies = purple_find_buddies(fba->account, uid); // If we're already in the buddy list, stop. Ignore FB info because // it will be incorrect. if (atoll(uid) == fba->uid && buddies != NULL) { purple_debug_info("facebook", "already have buddies for self, not adding\n"); for (cur = buddies; cur != NULL; cur = cur->next) { final_buddies = g_list_append( final_buddies, cur->data); } g_slist_free(buddies); return final_buddies; } //Do we want to ignore groups? if (!purple_account_get_bool(fba->account, "facebook_use_groups", TRUE)) { if (buddies != NULL) { //Copy the slist into the list for (cur = buddies; cur != NULL; cur = cur->next) { final_buddies = g_list_append( final_buddies, cur->data); } g_slist_free(buddies); return final_buddies; } else { buddy = purple_buddy_new(fba->account, uid, NULL); fb_group = purple_find_group(DEFAULT_GROUP_NAME); if (fb_group == NULL) { fb_group = purple_group_new(DEFAULT_GROUP_NAME); purple_blist_add_group(fb_group, NULL); } purple_blist_add_buddy(buddy, NULL, fb_group, NULL); final_buddies = g_list_append(final_buddies, buddy); return final_buddies; } } // Determine what buddies exist and what groups they are in. cur_groups = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); for (cur = buddies; cur != NULL; cur = cur->next) { const gchar *group_name; group_name = purple_group_get_name(purple_buddy_get_group( (PurpleBuddy *)cur->data)); group_name = purple_normalize_nocase(NULL, group_name); g_hash_table_insert(cur_groups, g_strdup(group_name), cur->data); } g_slist_free(buddies); // Create/insert necessary buddies if (friend_list_ids) { for (i = 0; i < json_array_get_length(friend_list_ids); i++) { const gchar *friend_list_id; friend_list_id = json_node_get_string( json_array_get_element(friend_list_ids, i)); buddy = add_buddy(fba, friend_list_id, uid, cur_groups); final_buddies = g_list_append(final_buddies, buddy); } } else { // No friend list data, so we use the default group. final_buddies = g_list_append(final_buddies, add_buddy(fba, "-1", uid, cur_groups)); } // Figure out which groups/buddies are not represented. for (cur_buddy = final_buddies; cur_buddy != NULL; cur_buddy = cur_buddy->next) { const gchar *group_name = purple_group_get_name(purple_buddy_get_group( (PurpleBuddy *)cur_buddy->data)); g_hash_table_remove(cur_groups, purple_normalize_nocase(NULL, group_name)); } // Delete remaining buddies to maintain sync state with server. g_hash_table_foreach(cur_groups, destroy_buddy, fba); // Cleanup! g_hash_table_destroy(cur_groups); return final_buddies; }
const char *flist_normalize(const PurpleAccount *account, const char *str) { return purple_normalize_nocase(account, str); }