/soc/2015/jgeboski/facebook: 8e23ae2d2ef6: facebook: fixed the c...
James Geboski <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 8e23ae2d2ef6225727b580bf1bcaa7a9bc18d7ea Author: James Geboski <[email protected]> Date: 2015-08-25 20:02 -0400 Branch: facebook URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/8e23ae2d2ef6 Description: facebook: fixed the contact query not fetching non-users diffstat: libpurple/protocols/facebook/api.c | 160 ++++++++++++++---------------------- libpurple/protocols/facebook/api.h | 4 +- 2 files changed, 63 insertions(+), 101 deletions(-) diffs (247 lines): diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c --- a/libpurple/protocols/facebook/api.c +++ b/libpurple/protocols/facebook/api.c @@ -775,7 +775,7 @@ fb_api_http_query(FbApi *api, gint64 que switch (query) { case FB_API_QUERY_CONTACT: - name = "FetchContactQuery"; + name = "UsersQuery"; break; case FB_API_QUERY_CONTACTS: name = "FetchContactsFullQuery"; @@ -1845,71 +1845,15 @@ fb_api_auth(FbApi *api, const gchar *use prms, fb_api_cb_auth); } -static gboolean -fb_api_contact_parse(FbApi *api, FbApiUser *user, JsonNode *root, - GError **error) -{ - const gchar *str; - FbApiPrivate *priv = api->priv; - FbHttpParams *params; - FbJsonValues *values; - GError *err = NULL; - - values = fb_json_values_new(root); - fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, - "$.represented_profile.id"); - fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, - "$.id"); - fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, - "$.represented_profile.friendship_status"); - fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, - "$.structured_name.text"); - fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, - "$.hugePictureUrl.uri"); - fb_json_values_update(values, &err); - - if (G_UNLIKELY(err != NULL)) { - g_propagate_error(error, err); - g_object_unref(values); - return FALSE; - } - - str = fb_json_values_next_str(values, NULL); - - if (str == NULL) { - str = fb_json_values_next_str(values, "0"); - } else { - fb_json_values_next_str(values, NULL); - } - - user->uid = FB_ID_FROM_STR(str); - str = fb_json_values_next_str(values, NULL); - - if ((str != NULL) && - !purple_strequal(str, "ARE_FRIENDS") && - (user->uid != priv->uid)) - { - g_object_unref(values); - return FALSE; - } - - user->name = fb_json_values_next_str_dup(values, NULL); - user->icon = fb_json_values_next_str_dup(values, NULL); - - params = fb_http_params_new_parse(user->icon, TRUE); - user->csum = fb_http_params_dup_str(params, "oh", &err); - fb_http_params_free(params); - - g_object_unref(values); - return TRUE; -} - static void fb_api_cb_contact(PurpleHttpConnection *con, PurpleHttpResponse *res, gpointer data) { + const gchar *str; FbApi *api = data; FbApiUser user; + FbHttpParams *prms; + FbJsonValues *values; GError *err = NULL; JsonNode *node; JsonNode *root; @@ -1927,20 +1871,32 @@ fb_api_cb_contact(PurpleHttpConnection * return; } + values = fb_json_values_new(node); + fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.id"); + fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.name"); + fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, + "$.profile_pic_large.uri"); + fb_json_values_update(values, &err); + + FB_API_ERROR_EMIT(api, err, + g_object_unref(values); + json_node_free(root); + return; + ); + fb_api_user_reset(&user, FALSE); - - if (!fb_api_contact_parse(api, &user, node, &err)) { - if (G_LIKELY(err == NULL)) { - fb_api_error(api, FB_API_ERROR_GENERAL, - _("Failed to parse contact information")); - } else { - fb_api_error_emit(api, err); - } - } else { - g_signal_emit_by_name(api, "contact", &user); - } - + str = fb_json_values_next_str(values, "0"); + user.uid = FB_ID_FROM_STR(str); + user.name = fb_json_values_next_str_dup(values, NULL); + user.icon = fb_json_values_next_str_dup(values, NULL); + + prms = fb_http_params_new_parse(user.icon, TRUE); + user.csum = fb_http_params_dup_str(prms, "oh", &err); + fb_http_params_free(prms); + + g_signal_emit_by_name(api, "contact", &user); fb_api_user_reset(&user, TRUE); + g_object_unref(values); json_node_free(root); } @@ -1950,16 +1906,19 @@ fb_api_contact(FbApi *api, FbId uid) JsonBuilder *bldr; /* Object key mapping: - * 0: contact_id - * 1: big_img_size - * 2: huge_img_size - * 3: small_img_size - * 4: low_res_cover_size - * 6: media_type + * 0: user_fbids + * 1: include_full_user_info + * 2: profile_pic_large_size + * 3: profile_pic_medium_size + * 4: profile_pic_small_size */ bldr = fb_json_bldr_new(JSON_NODE_OBJECT); - fb_json_bldr_add_strf(bldr, "0", "%" FB_ID_FORMAT, uid); + fb_json_bldr_arr_begin(bldr, "0"); + fb_json_bldr_add_strf(bldr, NULL, "%" FB_ID_FORMAT, uid); + fb_json_bldr_arr_end(bldr); + + fb_json_bldr_add_str(bldr, "1", "true"); fb_api_http_query(api, FB_API_QUERY_CONTACT, bldr, fb_api_cb_contact); } @@ -1967,16 +1926,16 @@ static void fb_api_cb_contacts(PurpleHttpConnection *con, PurpleHttpResponse *res, gpointer data) { + const gchar *str; FbApi *api = data; - FbApiUser *duser; - FbApiUser user; + FbApiUser *user; + FbHttpParams *prms; FbJsonValues *values; gboolean complete; gchar *writeid = NULL; GError *err = NULL; GSList *users = NULL; guint count = 0; - JsonNode *node; JsonNode *root; if (!fb_api_http_chk(api, con, res, &root)) { @@ -1986,32 +1945,35 @@ fb_api_cb_contacts(PurpleHttpConnection values = fb_json_values_new(root); fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.graph_api_write_id"); + fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, + "$.represented_profile.id"); + fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, + "$.structured_name.text"); + fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, + "$.hugePictureUrl.uri"); fb_json_values_set_array(values, FALSE, "$.viewer.messenger_contacts" ".nodes"); while (fb_json_values_update(values, &err)) { g_free(writeid); + writeid = fb_json_values_next_str_dup(values, NULL); + user = fb_api_user_dup(NULL, FALSE); + str = fb_json_values_next_str(values, "0"); + + user->uid = FB_ID_FROM_STR(str); + user->name = fb_json_values_next_str_dup(values, NULL); + user->icon = fb_json_values_next_str_dup(values, NULL); + + prms = fb_http_params_new_parse(user->icon, TRUE); + user->csum = fb_http_params_dup_str(prms, "oh", &err); + fb_http_params_free(prms); + count++; - - writeid = fb_json_values_next_str_dup(values, NULL); - node = fb_json_values_get_root(values); - fb_api_user_reset(&user, FALSE); - - if (fb_api_contact_parse(api, &user, node, &err)) { - duser = fb_api_user_dup(&user, FALSE); - users = g_slist_prepend(users, duser); - } else { - fb_api_user_reset(&user, TRUE); - } - - if (G_UNLIKELY(err != NULL)) { - break; - } + users = g_slist_prepend(users, user); } - complete = (writeid == NULL) || (count < FB_API_CONTACTS_COUNT); - if (G_UNLIKELY(err == NULL)) { + complete = (writeid == NULL) || (count < FB_API_CONTACTS_COUNT); g_signal_emit_by_name(api, "contacts", users, complete); if (!complete) { diff --git a/libpurple/protocols/facebook/api.h b/libpurple/protocols/facebook/api.h --- a/libpurple/protocols/facebook/api.h +++ b/libpurple/protocols/facebook/api.h @@ -143,9 +143,9 @@ /** * FB_API_QUERY_CONTACT: * - * The query hash for the `FetchContactQuery`. + * The query hash for the `UsersQuery`. */ -#define FB_API_QUERY_CONTACT 10153746900701729 +#define FB_API_QUERY_CONTACT 10153915107411729 /** * FB_API_QUERY_CONTACTS: _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits