summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
authorikeblaster <ike@thez.info>2019-06-15 14:55:37 +0200
committerGeorge Hazan <ghazan@miranda.im>2019-06-16 22:40:04 +0300
commit1418e434c8734277480da28e828705d0336058b8 (patch)
tree4defa3380d87c3e2764b2dab0765c76f718b64da /protocols
parent34967c6ad0a420ac99c1b873b569208bdb88782e (diff)
Facebook - alternative loading of contacts' statuses
Diffstat (limited to 'protocols')
-rw-r--r--protocols/FacebookRM/src/client.h1
-rw-r--r--protocols/FacebookRM/src/connection.cpp5
-rw-r--r--protocols/FacebookRM/src/contacts.cpp19
-rw-r--r--protocols/FacebookRM/src/json.cpp30
-rw-r--r--protocols/FacebookRM/src/process.cpp27
-rw-r--r--protocols/FacebookRM/src/proto.h2
6 files changed, 83 insertions, 1 deletions
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<char> &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::vector<facebook_messag
return EXIT_SUCCESS;
}
+
+int FacebookProto::ParseBuddylistUpdate(std::string* data)
+{
+ std::string jsonData = data->substr(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 <http://www.gnu.org/licenses/>.
* 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<FacebookProto>
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*);