/soc/2015/jgeboski/facebook: 4c091ac7c55a: facebook: implemented...
James Geboski <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 4c091ac7c55add5807c84e9e87d03310d535b9ad Author: James Geboski <[email protected]> Date: 2015-08-08 22:01 -0400 Branch: facebook URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/4c091ac7c55a Description: facebook: implemented the invisible presence state diffstat: libpurple/protocols/facebook/api.c | 157 ++++++++++++++++++------------- libpurple/protocols/facebook/api.h | 6 +- libpurple/protocols/facebook/facebook.c | 40 +++++++- 3 files changed, 133 insertions(+), 70 deletions(-) diffs (truncated from 337 to 300 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 @@ -60,6 +60,7 @@ struct _FbApiPrivate gchar *token; GHashTable *msgids; + gboolean invisible; guint unread; }; @@ -615,13 +616,13 @@ fb_api_cb_mqtt_open(FbMqtt *mqtt, gpoint fb_thrift_write_field(thft, FB_THRIFT_TYPE_I32, 9); fb_thrift_write_i32(thft, 1); - /* Write the UNKNOWN ("chat_on"?) */ + /* Write the UNKNOWN ("no_auto_fg"?) */ fb_thrift_write_field(thft, FB_THRIFT_TYPE_BOOL, 10); fb_thrift_write_bool(thft, TRUE); - /* Write the UNKNOWN ("no_auto_fg"?) */ + /* Write the visibility state */ fb_thrift_write_field(thft, FB_THRIFT_TYPE_BOOL, 11); - fb_thrift_write_bool(thft, TRUE); + fb_thrift_write_bool(thft, !priv->invisible); /* Write the device identifier */ fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 12); @@ -666,6 +667,70 @@ fb_api_cb_mqtt_open(FbMqtt *mqtt, gpoint } static void +fb_api_connect_queue(FbApi *api) +{ + FbApiPrivate *priv = api->priv; + gchar *json; + JsonBuilder *bldr; + + bldr = fb_json_bldr_new(JSON_NODE_OBJECT); + fb_json_bldr_add_int(bldr, "delta_batch_size", 125); + fb_json_bldr_add_int(bldr, "max_deltas_able_to_process", 1250); + fb_json_bldr_add_int(bldr, "sync_api_version", 3); + fb_json_bldr_add_str(bldr, "encoding", "JSON"); + + if (priv->stoken == NULL) { + fb_json_bldr_add_int(bldr, "initial_titan_sequence_id", + priv->sid); + fb_json_bldr_add_str(bldr, "device_id", priv->did); + fb_json_bldr_add_int(bldr, "entity_fbid", priv->uid); + + fb_json_bldr_obj_begin(bldr, "device_params"); + fb_json_bldr_add_str(bldr, "animated_image_format", "GIF"); + + fb_json_bldr_obj_begin(bldr, "animated_image_sizes"); + fb_json_bldr_add_str(bldr, "0", "9001x9001"); + fb_json_bldr_obj_end(bldr); + + fb_json_bldr_obj_begin(bldr, "image_sizes"); + fb_json_bldr_add_str(bldr, "0", "9001x9001"); + fb_json_bldr_obj_end(bldr); + fb_json_bldr_obj_end(bldr); + + fb_json_bldr_obj_begin(bldr, "queue_params"); + fb_json_bldr_add_str(bldr, "buzz_on_deltas_enabled", "false"); + + fb_json_bldr_obj_begin(bldr, "graphql_query_hashes"); + fb_json_bldr_add_str(bldr, "xma_query_id", FB_API_QRYID_XMA); + fb_json_bldr_obj_end(bldr); + + fb_json_bldr_obj_begin(bldr, "graphql_query_params"); + fb_json_bldr_obj_begin(bldr, FB_API_QRYID_XMA); + fb_json_bldr_add_str(bldr, "xma_id", "<ID>"); + fb_json_bldr_add_str(bldr, "small_preview_size", "9001"); + fb_json_bldr_add_str(bldr, "large_preview_size", "9001"); + fb_json_bldr_obj_end(bldr); + fb_json_bldr_obj_end(bldr); + fb_json_bldr_obj_end(bldr); + + json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL); + fb_api_publish(api, "/messenger_sync_create_queue", "%s", + json); + g_free(json); + return; + } + + fb_json_bldr_add_int(bldr, "last_seq_id", priv->sid); + fb_json_bldr_add_str(bldr, "sync_token", priv->stoken); + + json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL); + fb_api_publish(api, "/messenger_sync_get_diffs", "%s", json); + g_signal_emit_by_name(api, "connect"); + g_free(json); + +} + +static void fb_api_cb_seqid(PurpleHttpConnection *con, PurpleHttpResponse *res, gpointer data) { @@ -673,9 +738,7 @@ fb_api_cb_seqid(PurpleHttpConnection *co FbApi *api = data; FbApiPrivate *priv = api->priv; FbJsonValues *values; - gchar *json; GError *err = NULL; - JsonBuilder *bldr; JsonNode *root; if (!fb_api_http_chk(api, con, res, &root)) { @@ -698,69 +761,17 @@ fb_api_cb_seqid(PurpleHttpConnection *co str = fb_json_values_next_str(values, "0"); priv->sid = g_ascii_strtoll(str, NULL, 10); priv->unread = fb_json_values_next_int(values, 0); + + fb_api_connect_queue(api); fb_json_values_free(values); json_node_free(root); - - bldr = fb_json_bldr_new(JSON_NODE_OBJECT); - fb_json_bldr_add_int(bldr, "delta_batch_size", 125); - fb_json_bldr_add_int(bldr, "max_deltas_able_to_process", 1250); - fb_json_bldr_add_int(bldr, "sync_api_version", 3); - fb_json_bldr_add_str(bldr, "encoding", "JSON"); - - if (priv->stoken == NULL) { - fb_json_bldr_add_int(bldr, "initial_titan_sequence_id", - priv->sid); - fb_json_bldr_add_str(bldr, "device_id", priv->did); - fb_json_bldr_add_int(bldr, "entity_fbid", priv->uid); - - fb_json_bldr_obj_begin(bldr, "device_params"); - fb_json_bldr_add_str(bldr, "animated_image_format", "GIF"); - - fb_json_bldr_obj_begin(bldr, "animated_image_sizes"); - fb_json_bldr_add_str(bldr, "0", "9001x9001"); - fb_json_bldr_obj_end(bldr); - - fb_json_bldr_obj_begin(bldr, "image_sizes"); - fb_json_bldr_add_str(bldr, "0", "9001x9001"); - fb_json_bldr_obj_end(bldr); - fb_json_bldr_obj_end(bldr); - - fb_json_bldr_obj_begin(bldr, "queue_params"); - fb_json_bldr_add_str(bldr, "buzz_on_deltas_enabled", "false"); - - fb_json_bldr_obj_begin(bldr, "graphql_query_hashes"); - fb_json_bldr_add_str(bldr, "xma_query_id", FB_API_QRYID_XMA); - fb_json_bldr_obj_end(bldr); - - fb_json_bldr_obj_begin(bldr, "graphql_query_params"); - fb_json_bldr_obj_begin(bldr, FB_API_QRYID_XMA); - fb_json_bldr_add_str(bldr, "xma_id", "<ID>"); - fb_json_bldr_add_str(bldr, "small_preview_size", "9001"); - fb_json_bldr_add_str(bldr, "large_preview_size", "9001"); - fb_json_bldr_obj_end(bldr); - fb_json_bldr_obj_end(bldr); - fb_json_bldr_obj_end(bldr); - - json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL); - fb_api_publish(api, "/messenger_sync_create_queue", "%s", - json); - g_free(json); - return; - } - - fb_json_bldr_add_int(bldr, "last_seq_id", priv->sid); - fb_json_bldr_add_str(bldr, "sync_token", priv->stoken); - - json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL); - fb_api_publish(api, "/messenger_sync_get_diffs", "%s", json); - g_signal_emit_by_name(api, "connect"); - g_free(json); } static void fb_api_cb_mqtt_connect(FbMqtt *mqtt, gpointer data) { FbApi *api = data; + FbApiPrivate *priv = api->priv; gchar *json; JsonBuilder *bldr; @@ -797,10 +808,14 @@ fb_api_cb_mqtt_connect(FbMqtt *mqtt, gpo /* Notifications seem to lead to some sort of sending rate limit */ fb_mqtt_unsubscribe(mqtt, "/orca_message_notifications", NULL); - /* See fb_api_thread_list() for key mapping */ - bldr = fb_json_bldr_new(JSON_NODE_OBJECT); - fb_json_bldr_add_str(bldr, "1", "0"); - fb_api_http_graph(api, &info, bldr, FB_API_QRYID_THREAD_LIST); + if (priv->sid == 0) { + /* See fb_api_thread_list() for key mapping */ + bldr = fb_json_bldr_new(JSON_NODE_OBJECT); + fb_json_bldr_add_str(bldr, "1", "0"); + fb_api_http_graph(api, &info, bldr, FB_API_QRYID_THREAD_LIST); + } else { + fb_api_connect_queue(api); + } } static void @@ -1334,6 +1349,17 @@ fb_api_rehash(FbApi *api) } } +gboolean +fb_api_is_invisible(FbApi *api) +{ + FbApiPrivate *priv; + + g_return_val_if_fail(FB_IS_API(api), FALSE); + priv = api->priv; + + return priv->invisible; +} + void fb_api_error(FbApi *api, FbApiError error, const gchar *format, ...) { @@ -1555,13 +1581,14 @@ fb_api_contacts_after(FbApi *api, const } void -fb_api_connect(FbApi *api) +fb_api_connect(FbApi *api, gboolean invisible) { FbApiPrivate *priv; g_return_if_fail(FB_IS_API(api)); priv = api->priv; + priv->invisible = invisible; fb_mqtt_open(priv->mqtt, FB_MQTT_HOST, FB_MQTT_PORT); } 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 @@ -164,8 +164,8 @@ fb_api_new(PurpleConnection *gc); void fb_api_rehash(FbApi *api); -void -fb_api_free(FbApi *api); +gboolean +fb_api_is_invisible(FbApi *api); void fb_api_error(FbApi *api, FbApiError err, const gchar *fmt, ...) @@ -181,7 +181,7 @@ void fb_api_contacts(FbApi *api); void -fb_api_connect(FbApi *api); +fb_api_connect(FbApi *api, gboolean invisible); void fb_api_disconnect(FbApi *api); diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c --- a/libpurple/protocols/facebook/facebook.c +++ b/libpurple/protocols/facebook/facebook.c @@ -139,6 +139,9 @@ fb_cb_api_contacts(FbApi *api, GSList *u PurpleConnection *gc; PurpleConnectionState state; PurpleGroup *grp; + PurpleStatus *status; + PurpleStatusPrimitive pstat; + PurpleStatusType *type; gc = fb_data_get_connection(fata); acct = purple_connection_get_account(gc); @@ -183,8 +186,12 @@ fb_cb_api_contacts(FbApi *api, GSList *u fb_data_icon_queue(fata); if (complete && (state != PURPLE_CONNECTION_CONNECTED)) { + status = purple_account_get_active_status(acct); + type = purple_status_get_status_type(status); + pstat = purple_status_type_get_primitive(type); + purple_connection_update_progress(gc, _("Connecting"), 3, 4); - fb_api_connect(api); + fb_api_connect(api, pstat == PURPLE_STATUS_INVISIBLE); } } @@ -595,6 +602,10 @@ fb_status_types(PurpleAccount *acct) NULL, NULL, TRUE); types = g_list_prepend(types, type); + type = purple_status_type_new(PURPLE_STATUS_INVISIBLE, + NULL, NULL, TRUE); + types = g_list_prepend(types, type); + type = purple_status_type_new(PURPLE_STATUS_OFFLINE, NULL, NULL, TRUE); types = g_list_prepend(types, type); @@ -660,6 +671,31 @@ fb_client_offline_message(const PurpleBu return TRUE; } _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits