From 3ff89e16119e063eb5719679e7b34d306116b265 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert=20P=C3=B6sel?= <robyer@seznam.cz>
Date: Wed, 2 Apr 2014 22:53:15 +0000
Subject: Facebook: Add support for showing unread notifications count as
 "unread emails" in clist

git-svn-id: http://svn.miranda-ng.org/main/trunk@8831 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
---
 protocols/FacebookRM/src/client.h    |  3 ++-
 protocols/FacebookRM/src/json.cpp    | 11 +++++++++--
 protocols/FacebookRM/src/process.cpp |  8 +++++---
 protocols/FacebookRM/src/proto.cpp   |  9 +++++++++
 protocols/FacebookRM/src/proto.h     |  1 +
 5 files changed, 26 insertions(+), 6 deletions(-)

(limited to 'protocols/FacebookRM/src')

diff --git a/protocols/FacebookRM/src/client.h b/protocols/FacebookRM/src/client.h
index 8184e34513..c2980556c0 100644
--- a/protocols/FacebookRM/src/client.h
+++ b/protocols/FacebookRM/src/client.h
@@ -41,7 +41,7 @@ public:
 		chat_sequence_num_ = chat_channel_host_ = chat_channel_partition_ = \
 		dtsg_ = logout_hash_ = chat_sticky_num_ = chat_conn_num_ = chat_clientid_ = "";
 
-		msgid_ = error_count_ = last_feeds_update_ = last_notification_time_ = 0;
+		msgid_ = error_count_ = last_feeds_update_ = last_notification_time_ = notifications_count_ = 0;
 
 		https_ = is_idle_ = invisible_ = is_typing_ = false;
 
@@ -82,6 +82,7 @@ public:
 	bool	https_;
 	time_t  last_feeds_update_;
 	unsigned __int64 last_notification_time_;
+	int     notifications_count_;
 	int     msgid_;
 
 	////////////////////////////////////////////////////////////
diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp
index 34b23a1fc9..dc824d0cbf 100644
--- a/protocols/FacebookRM/src/json.cpp
+++ b/protocols/FacebookRM/src/json.cpp
@@ -599,13 +599,20 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa
 					messages->push_back(message);
 				}
 			}
+		} else if (t == "notifications_read") {
+			JSONNODE *alerts = json_get(it, "alert_ids");
+			proto->facy.notifications_count_ -= json_size(alerts);
+			
+			if (proto->facy.notifications_count_ < 0)
+				proto->facy.notifications_count_ = 0;
 		} else if (t == "notification_json") {
 			// event notification
+			JSONNODE *nodes = json_get(it, "nodes");
+			proto->facy.notifications_count_ += json_size(nodes);
 
 			if (!proto->getByte(FACEBOOK_KEY_EVENT_NOTIFICATIONS_ENABLE, DEFAULT_EVENT_NOTIFICATIONS_ENABLE))
 				continue;
-
-			JSONNODE *nodes = json_get(it, "nodes");
+			
 			for (unsigned int j = 0; j < json_size(nodes); j++) {
 				JSONNODE *itNodes = json_at(nodes, j);
 
diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp
index c06143bc69..0fd44897ce 100644
--- a/protocols/FacebookRM/src/process.cpp
+++ b/protocols/FacebookRM/src/process.cpp
@@ -552,9 +552,6 @@ void FacebookProto::ProcessNotifications(void*)
 	if (isOffline())
 		return;
 
-	if (!getByte(FACEBOOK_KEY_EVENT_NOTIFICATIONS_ENABLE, DEFAULT_EVENT_NOTIFICATIONS_ENABLE))
-		return;
-
 	facy.handle_entry("notifications");
 
 	// Get notifications
@@ -577,6 +574,11 @@ void FacebookProto::ProcessNotifications(void*)
 	p->parse_notifications(&(resp.data), &notifications);
 	delete p;
 
+	facy.notifications_count_ = notifications.size();
+
+	if (!getByte(FACEBOOK_KEY_EVENT_NOTIFICATIONS_ENABLE, DEFAULT_EVENT_NOTIFICATIONS_ENABLE))
+		return;
+
 	for(std::vector<facebook_notification*>::size_type i=0; i<notifications.size(); i++)
 	{
 		debugLogA("      Got notification: %s", notifications[i]->text.c_str());
diff --git a/protocols/FacebookRM/src/proto.cpp b/protocols/FacebookRM/src/proto.cpp
index 9afdbe0e96..ceb54aa774 100644
--- a/protocols/FacebookRM/src/proto.cpp
+++ b/protocols/FacebookRM/src/proto.cpp
@@ -40,6 +40,7 @@ FacebookProto::FacebookProto(const char* proto_name,const TCHAR* username) :
 	CreateProtoService(PS_GETMYAVATART,   &FacebookProto::GetMyAvatar);
 	CreateProtoService(PS_GETAVATARINFOT, &FacebookProto::GetAvatarInfo);
 	CreateProtoService(PS_GETAVATARCAPS,  &FacebookProto::GetAvatarCaps);
+	CreateProtoService(PS_GETUNREADEMAILCOUNT, &FacebookProto::GetNotificationsCount);
 
 	CreateProtoService(PS_JOINCHAT,  &FacebookProto::OnJoinChat);
 	CreateProtoService(PS_LEAVECHAT, &FacebookProto::OnLeaveChat);
@@ -380,6 +381,14 @@ int FacebookProto::OnIdleChanged(WPARAM wParam, LPARAM lParam)
 	return 0;
 }
 
+INT_PTR FacebookProto::GetNotificationsCount(WPARAM wParam, LPARAM lParam)
+{
+	if (isOffline())
+		return 0;
+
+	return facy.notifications_count_;
+}
+
 //////////////////////////////////////////////////////////////////////////////
 
 int FacebookProto::OnEvent(PROTOEVENTTYPE event, WPARAM wParam, LPARAM lParam)
diff --git a/protocols/FacebookRM/src/proto.h b/protocols/FacebookRM/src/proto.h
index 414e016bf0..49c9102367 100644
--- a/protocols/FacebookRM/src/proto.h
+++ b/protocols/FacebookRM/src/proto.h
@@ -125,6 +125,7 @@ public:
 	INT_PTR __cdecl CheckNewsfeeds(WPARAM, LPARAM);
 	INT_PTR __cdecl CheckFriendRequests(WPARAM, LPARAM);
 	INT_PTR __cdecl RefreshBuddyList(WPARAM, LPARAM);
+	INT_PTR __cdecl GetNotificationsCount(WPARAM, LPARAM);
 
 	INT_PTR __cdecl OnJoinChat(WPARAM,LPARAM);
 	INT_PTR __cdecl OnLeaveChat(WPARAM,LPARAM);
-- 
cgit v1.2.3