From f7c563ada4247c1cbed54001bf357289f15f7d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20P=C3=B6sel?= Date: Tue, 30 Jul 2013 00:43:40 +0000 Subject: Facebook: Most awesome variant of getting unread messages at login - but NEED TESTING (and some improvements later) - loads up to 21 unread messages per contact - loads messages also from "Other" messaging tab - uses most effective requests with ability for future function "loading contact history from server" git-svn-id: http://svn.miranda-ng.org/main/trunk@5528 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/FacebookRM/src/process.cpp | 233 ++++++++++++++++++++--------------- 1 file changed, 133 insertions(+), 100 deletions(-) (limited to 'protocols/FacebookRM/src/process.cpp') diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index 64b85103ac..bb8b95f3ea 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -263,129 +263,150 @@ void FacebookProto::ProcessFriendList(void* data) void FacebookProto::ProcessUnreadMessages(void*) { - facy.handle_entry("messages"); + facy.handle_entry("ProcessUnreadMessages"); - int count = 0; - std::string page; + bool loadOther = true; // TODO: db setting? or use everytime? - while (count < 30) // allow max 30 unread threads to be parsed - { - std::string get_data = "&page=" + page; + std::string data = "folders[0]=inbox"; + if (loadOther) + data += "&folders[1]=other"; + data += "&client=mercury"; + data += "__user=" + facy.self_.user_id; + data += "&fb_dtsg=" + (facy.dtsg_.length() ? facy.dtsg_ : "0"); + data += "&__a=1&__dyn=&__req=&ttstamp=0"; - http::response resp = facy.flap(REQUEST_UNREAD_THREADS, NULL, &get_data); + http::response resp = facy.flap(REQUEST_UNREAD_THREADS, &data); + facy.validate_response(&resp); - // Process result data - facy.validate_response(&resp); + if (resp.code == HTTP_CODE_OK) { + + CODE_BLOCK_TRY + + std::vector threads; - if (resp.code == HTTP_CODE_OK) - { - std::string items = utils::text::source_get_value(&resp.data, 2, "
"); + facebook_json_parser* p = new facebook_json_parser(this); + p->parse_unread_threads(&resp.data, &threads); + delete p; - std::string::size_type pos = 0; - std::string::size_type pos2 = 0; + ForkThread(&FacebookProto::ProcessUnreadMessage, new std::vector(threads)); - while ((pos = items.find("id=\"threadlist_row_", pos)) != std::string::npos) { - std::string item = items.substr(pos, items.find("
", pos) - pos); - pos++; count++; + LOG("***** Unread threads list processed"); - std::string tid = utils::text::source_get_value2(&item, "?tid=", "&\""); - if (tid.empty()) - continue; + CODE_BLOCK_CATCH - ForkThread(&FacebookProto::ProcessUnreadMessage, new std::string(tid)); - } - - page = utils::text::source_get_value(&items, 3, "id=\"see_older_threads\"", "page=", "&"); - if (page.empty()) - break; // No more results - } - } + LOG("***** Error processing unread threads list: %s", e.what()); + CODE_BLOCK_END + + facy.handle_success("ProcessUnreadMessages"); + } else { + facy.handle_error("ProcessUnreadMessages"); + } } -void FacebookProto::ProcessUnreadMessage(void *tid_data) +void FacebookProto::ProcessUnreadMessage(void *p) { - if (tid_data == NULL) + if (p == NULL) return; - // TODO: get them from /ajax/mercury/thread_info.php - - std::string get_data = "tid=" + *(std::string*)tid_data; - delete (std::string*)tid_data; - - http::response resp = facy.flap(REQUEST_UNREAD_MESSAGES, NULL, &get_data); - facy.validate_response(&resp); - - if (resp.code != HTTP_CODE_OK) { - LOG(" !! !! Error when getting messages list"); - return; - } + facy.handle_entry("ProcessUnreadMessage"); - if (resp.data.find("