--- a/libpurple/protocols/facebook/api.c Fri Jul 24 21:22:25 2015 -0400
+++ b/libpurple/protocols/facebook/api.c Sun Jul 26 14:56:17 2015 -0400
@@ -50,6 +50,7 @@
@@ -551,7 +552,6 @@
@@ -565,7 +565,7 @@
str = fb_json_node_get_str(root, expr, &err);
FB_API_ERROR_CHK(api, err, return);
- nid = g_ascii_strtoll(str, NULL, 10);
+ priv->sid = g_ascii_strtoll(str, NULL, 10); bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
@@ -575,7 +575,8 @@
fb_json_bldr_add_str(bldr, "encoding", "JSON");
if (priv->stoken == NULL) {
- fb_json_bldr_add_int(bldr, "initial_titan_sequence_id", nid);
+ fb_json_bldr_add_int(bldr, "initial_titan_sequence_id", fb_json_bldr_add_str(bldr, "device_id", priv->did);
fb_json_bldr_obj_begin(bldr, "device_params");
fb_json_bldr_obj_end(bldr);
@@ -587,7 +588,7 @@
- fb_json_bldr_add_int(bldr, "last_seq_id", nid);
+ 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);
@@ -643,7 +644,25 @@
-fb_api_cb_publish_tn(FbApi *api, const GByteArray *pload)
+fb_api_cb_publish_mark(FbApi *api, const GByteArray *pload) + if (!fb_api_json_chk(api, pload->data, pload->len, &root)) { + if (fb_json_node_chk_bool(root, "$.succeeded", &res) && !res) { + fb_api_error(api, FB_API_ERROR_GENERAL, + _("Failed to mark thread as read")); +fb_api_cb_publish_typing(FbApi *api, const GByteArray *pload) @@ -712,6 +731,8 @@
+ fb_json_node_chk_int(root, "$.lastIssuedSeqId", &priv->sid); arr = fb_json_node_get_arr(root, "$.deltas", &err);
FB_API_ERROR_CHK(api, err, goto finish);
elms = json_array_get_elements(arr);
@@ -863,6 +884,17 @@
+ void (*func) (FbApi *api, const GByteArray *pload); + {"/mark_thread_response", fb_api_cb_publish_mark}, + {"/orca_typing_notifications", fb_api_cb_publish_typing}, + {"/t_ms", fb_api_cb_publish_ms}, + {"/t_p", fb_api_cb_publish_p} comp = fb_util_zcompressed(pload);
@@ -882,12 +914,11 @@
"Reading message (topic: %s)",
- if (g_ascii_strcasecmp(topic, "/orca_typing_notifications") == 0) {
- fb_api_cb_publish_tn(api, bytes);
- } else if (g_ascii_strcasecmp(topic, "/t_ms") == 0) {
- fb_api_cb_publish_ms(api, bytes);
- } else if (g_ascii_strcasecmp(topic, "/t_p") == 0) {
- fb_api_cb_publish_p(api, bytes);
+ for (i = 0; i < G_N_ELEMENTS(parsers); i++) { + if (g_ascii_strcasecmp(topic, parsers[i].topic) == 0) { + parsers[i].func(api, bytes); @@ -1242,6 +1273,30 @@
g_byte_array_free(bytes, TRUE);
+fb_api_read(FbApi *api, FbId id, gboolean thread) + g_return_if_fail(FB_IS_API(api)); + bldr = fb_json_bldr_new(JSON_NODE_OBJECT); + fb_json_bldr_add_bool(bldr, "state", TRUE); + fb_json_bldr_add_int(bldr, "syncSeqId", priv->sid); + fb_json_bldr_add_str(bldr, "mark", "read"); + key = thread ? "threadFbId" : "otherUserFbId"; + fb_json_bldr_add_strf(bldr, key, "%" FB_ID_FORMAT, id); + json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL); + fb_api_publish(api, "/mark_thread", "%s", json); fb_api_cb_thread_create(PurpleHttpConnection *con, PurpleHttpResponse *res,
--- a/libpurple/protocols/facebook/api.h Fri Jul 24 21:22:25 2015 -0400
+++ b/libpurple/protocols/facebook/api.h Sun Jul 26 14:56:17 2015 -0400
@@ -183,6 +183,9 @@
+fb_api_read(FbApi *api, FbId id, gboolean thread); fb_api_thread_create(FbApi *api, GSList *uids);
--- a/libpurple/protocols/facebook/facebook.c Fri Jul 24 21:22:25 2015 -0400
+++ b/libpurple/protocols/facebook/facebook.c Sun Jul 26 14:56:17 2015 -0400
@@ -194,6 +194,7 @@
@@ -205,6 +206,7 @@
gc = fb_data_get_connection(fata);
acct = purple_connection_get_account(gc);
+ mark = purple_account_get_bool(acct, "mark-read", TRUE); for (l = msgs; l != NULL; l = l->next) {
@@ -214,6 +216,10 @@
FB_ID_TO_STR(msg->uid, uid);
+ fb_api_read(api, msg->uid, TRUE); purple_serv_got_im(gc, uid, html,
@@ -225,6 +231,10 @@
chat = purple_conversations_find_chat_with_account(tid, acct);
+ fb_api_read(api, msg->tid, TRUE); id = purple_chat_conversation_get_id(chat);
purple_serv_got_chat_in(gc, id, uid,
@@ -901,9 +911,17 @@
facebook_protocol_init(PurpleProtocol *protocol)
+ PurpleAccountOption *opt; protocol->id = "prpl-facebook";
protocol->name = "Facebook";
protocol->options = OPT_PROTO_CHAT_TOPIC;
+ opt = purple_account_option_bool_new(_("Mark messages as read"), + opts = g_list_prepend(opts, opt); + protocol->account_options = g_list_reverse(opts);