From 1418e434c8734277480da28e828705d0336058b8 Mon Sep 17 00:00:00 2001 From: ikeblaster Date: Sat, 15 Jun 2019 14:55:37 +0200 Subject: Facebook - alternative loading of contacts' statuses --- protocols/FacebookRM/src/client.h | 1 + protocols/FacebookRM/src/connection.cpp | 5 ++++- protocols/FacebookRM/src/contacts.cpp | 19 +++++++++++++++++++ protocols/FacebookRM/src/json.cpp | 30 ++++++++++++++++++++++++++++++ protocols/FacebookRM/src/process.cpp | 27 +++++++++++++++++++++++++++ protocols/FacebookRM/src/proto.h | 2 ++ 6 files changed, 83 insertions(+), 1 deletion(-) (limited to 'protocols/FacebookRM/src') diff --git a/protocols/FacebookRM/src/client.h b/protocols/FacebookRM/src/client.h index 866be475b6..07aac1af67 100644 --- a/protocols/FacebookRM/src/client.h +++ b/protocols/FacebookRM/src/client.h @@ -207,6 +207,7 @@ public: HttpRequest* userInfoRequest(const LIST &userIds); HttpRequest* userInfoAllRequest(); + HttpRequest* buddylistUpdate(); // feeds.cpp HttpRequest* newsfeedRequest(); diff --git a/protocols/FacebookRM/src/connection.cpp b/protocols/FacebookRM/src/connection.cpp index 1378e152e0..209f0efc91 100644 --- a/protocols/FacebookRM/src/connection.cpp +++ b/protocols/FacebookRM/src/connection.cpp @@ -230,9 +230,12 @@ void FacebookProto::UpdateLoop(void *) debugLogA(">>> Entering Facebook::UpdateLoop[%d]", tim); for (int i = -1; !isOffline(); i = (i + 1) % 50) { - if (i != -1) + if (i != -1) { if (getByte(FACEBOOK_KEY_EVENT_FEEDS_ENABLE, DEFAULT_EVENT_FEEDS_ENABLE)) ProcessFeeds(nullptr); + } + + ProcessBuddylistUpdate(nullptr); debugLogA("*** FacebookProto::UpdateLoop[%d] going to sleep...", tim); if (WaitForSingleObjectEx(update_loop_event, GetPollRate() * 1000, true) != WAIT_TIMEOUT) diff --git a/protocols/FacebookRM/src/contacts.cpp b/protocols/FacebookRM/src/contacts.cpp index 15471d2819..30271d8bb0 100644 --- a/protocols/FacebookRM/src/contacts.cpp +++ b/protocols/FacebookRM/src/contacts.cpp @@ -715,3 +715,22 @@ HttpRequest* facebook_client::userInfoAllRequest() return p; } + +HttpRequest* facebook_client::buddylistUpdate() +{ + HttpRequest *p = new HttpRequest(REQUEST_POST, FACEBOOK_SERVER_MOBILE "/buddylist_update.php"); + + p->Body + << CHAR_PARAM("data_fetch", "true") + << CHAR_PARAM("m_sess", "") + << CHAR_PARAM("fb_dtsg", dtsg_.c_str()) + << CHAR_PARAM("jazoest", "21824") + << CHAR_PARAM("__dyn", __dyn()) + << CHAR_PARAM("__req", __req()) + << CHAR_PARAM("__ajax__", "") + << CHAR_PARAM("__user", self_.user_id.c_str()); + + // send_full_data=true sends more data + + return p; +} diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp index de642b4186..b6d4797e56 100644 --- a/protocols/FacebookRM/src/json.cpp +++ b/protocols/FacebookRM/src/json.cpp @@ -1192,6 +1192,36 @@ int FacebookProto::ParseMessages(std::string &pData, std::vectorsubstr(9); + + JSONNode root = JSONNode::parse(jsonData.c_str()); + if (!root) + return EXIT_FAILURE; + + const JSONNode &buddylist = root["payload"].at("buddylist"); + if (!buddylist) + return EXIT_FAILURE; + + setAllContactStatuses(ID_STATUS_OFFLINE); + + for (auto &it : buddylist) { + const JSONNode &id = it["id"]; + const JSONNode &status = it["status"]; + + // Facebook now sends info also about some nonfriends, so we just ignore status change of contacts we don't have in list + MCONTACT hContact = ContactIDToHContact(id.as_string()); + if (!hContact) + continue; + + setWord(hContact, "Status", ID_STATUS_ONLINE); + } + + return EXIT_SUCCESS; +} + int FacebookProto::ParseUnreadThreads(std::string *data, std::vector< std::string >* threads) { std::string jsonData = data->substr(9); diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index 29c1fac120..fd03128b60 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -26,6 +26,33 @@ along with this program. If not, see . * Helper function for loading name from database (or use default one specified as parameter), used for title of few notifications. */ + + +void FacebookProto::ProcessBuddylistUpdate(void*) +{ + if (isOffline()) + return; + + facy.handle_entry("buddylist_update"); + + // Get friends list + http::response resp = facy.sendRequest(facy.buddylistUpdate()); + if (resp.code != HTTP_CODE_OK) { + facy.handle_error("buddylist_update"); + return; + } + + debugLogA("*** Starting processing buddylist update"); + + if (ParseBuddylistUpdate(&resp.data) != EXIT_SUCCESS) { + debugLogA("*** Error processing buddylist update"); + return; + } + + debugLogA("*** Buddylist update processed"); +} + + void FacebookProto::ProcessFriendList(void*) { if (isOffline()) diff --git a/protocols/FacebookRM/src/proto.h b/protocols/FacebookRM/src/proto.h index 30f922ab7d..ff261abc73 100644 --- a/protocols/FacebookRM/src/proto.h +++ b/protocols/FacebookRM/src/proto.h @@ -46,6 +46,7 @@ class FacebookProto : public PROTO int ParseThreadMessages(std::string*, std::vector< facebook_message >*, bool unreadOnly); int ParseUnreadThreads(std::string*, std::vector< std::string >*); int ParseUserInfo(std::string* data, facebook_user* fbu); + int ParseBuddylistUpdate(std::string* data); const char* ParseIcon(const std::string &url); @@ -185,6 +186,7 @@ public: // Processing threads void __cdecl ProcessFriendList(void*); + void __cdecl ProcessBuddylistUpdate(void*); void __cdecl ProcessUnreadMessages(void*); void __cdecl ProcessUnreadMessage(void*); void __cdecl ProcessFeeds(void*); -- cgit v1.2.3