libpurple/protocols/facebook/api.c

changeset 37514
ad2ee74b913a
parent 37513
250fdd93e9c3
child 37521
21aac0fb8dd0
--- a/libpurple/protocols/facebook/api.c	Mon Jan 04 19:54:13 2016 -0500
+++ b/libpurple/protocols/facebook/api.c	Thu Jan 07 14:06:04 2016 -0500
@@ -67,7 +67,7 @@
 	GQueue *msgs;
 	gboolean invisible;
 	guint unread;
-
+	FbId lastmid;
 };
 
 struct _FbApiData
@@ -1493,6 +1493,8 @@
 
 	values = fb_json_values_new(root);
 	fb_json_values_add(values, FB_JSON_TYPE_INT, FALSE,
+	                   "$.deltaNewMessage.messageMetadata.offlineThreadingId");
+	fb_json_values_add(values, FB_JSON_TYPE_INT, FALSE,
 	                   "$.deltaNewMessage.messageMetadata.actorFbId");
 	fb_json_values_add(values, FB_JSON_TYPE_INT, FALSE,
 	                   "$.deltaNewMessage.messageMetadata"
@@ -1511,6 +1513,20 @@
 	fb_json_values_set_array(values, TRUE, "$.deltas");
 
 	while (fb_json_values_update(values, &err)) {
+		id = fb_json_values_next_int(values, 0);
+
+		/* Ignore everything but new messages */
+		if (id == 0) {
+			continue;
+		}
+
+		/* Ignore sequential duplicates */
+		if (id == priv->lastmid) {
+			fb_util_debug_info("Ignoring duplicate %" FB_ID_FORMAT, id);
+			continue;
+		}
+
+		priv->lastmid = id;
 		fb_api_message_reset(&msg, FALSE);
 		msg.uid = fb_json_values_next_int(values, 0);
 		oid = fb_json_values_next_int(values, 0);
@@ -1525,10 +1541,6 @@
 			}
 		}
 
-		if (msg.uid == 0) {
-			continue;
-		}
-
 		body = fb_json_values_next_str(values, NULL);
 
 		if (body != NULL) {

mercurial