--- 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) {