/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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.