summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Pösel <robyer@seznam.cz>2014-09-19 15:42:26 +0000
committerRobert Pösel <robyer@seznam.cz>2014-09-19 15:42:26 +0000
commit4279c9e641b798b68eb4d520228fc37445264c78 (patch)
treebfae40114dbdb5e7cf826c3e1f8c42afcf097be4
parent9ed60637b814fb9303b4bebefacf8e88e5b52383 (diff)
Facebook: Receive info (message) about missed video call
git-svn-id: http://svn.miranda-ng.org/main/trunk@10520 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r--protocols/FacebookRM/src/constants.h8
-rw-r--r--protocols/FacebookRM/src/entities.h3
-rw-r--r--protocols/FacebookRM/src/json.cpp50
-rw-r--r--protocols/FacebookRM/src/process.cpp9
-rw-r--r--protocols/FacebookRM/src/proto.cpp11
5 files changed, 69 insertions, 12 deletions
diff --git a/protocols/FacebookRM/src/constants.h b/protocols/FacebookRM/src/constants.h
index 1e2c9fc1a6..d2fd847e69 100644
--- a/protocols/FacebookRM/src/constants.h
+++ b/protocols/FacebookRM/src/constants.h
@@ -100,6 +100,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define SEND_MESSAGE_ERROR 1
#define SEND_MESSAGE_CANCEL -1
+// Event types
+#define FACEBOOK_EVENTTYPE_CALL 10010
+
// Facebook request types // TODO: Provide MS_ and release in FB plugin API?
enum RequestType {
REQUEST_LOGIN, // connecting physically
@@ -164,6 +167,11 @@ enum ClientType {
CLIENT_MOBILE = 5 // Facebook on unknown mobile client (can't be determined for offline contacts)
};
+enum MessageType {
+ MESSAGE = 1, // Classic message
+ CALL = 2, // Video call
+};
+
typedef struct {
const char *name;
const char *id;
diff --git a/protocols/FacebookRM/src/entities.h b/protocols/FacebookRM/src/entities.h
index 0be3d2d396..94fb9196f3 100644
--- a/protocols/FacebookRM/src/entities.h
+++ b/protocols/FacebookRM/src/entities.h
@@ -110,6 +110,7 @@ struct facebook_message
bool isIncoming;
bool isUnread;
bool isChat;
+ MessageType type;
int flag_;
@@ -119,6 +120,7 @@ struct facebook_message
this->time = 0;
this->isUnread = this->isIncoming = true;
this->isChat = false;
+ this->type = MESSAGE;
this->flag_ = 0;
}
@@ -133,6 +135,7 @@ struct facebook_message
this->isIncoming = msg.isIncoming;
this->isUnread = msg.isUnread;
this->isChat = msg.isChat;
+ this->type = msg.type;
this->flag_ = msg.flag_;
}
};
diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp
index 9590f0878d..367eb394fc 100644
--- a/protocols/FacebookRM/src/json.cpp
+++ b/protocols/FacebookRM/src/json.cpp
@@ -686,9 +686,7 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa
proto->NotifyEvent()
}*/
} else if (t == "mercury") {
- // rename multi user chat, ...
- if (!proto->m_enableChat)
- continue;
+ // rename multi user chat, video call, ...
JSONNODE *actions_ = json_get(it, "actions");
if (actions_ == NULL)
@@ -700,18 +698,50 @@ int facebook_json_parser::parse_messages(void* data, std::vector< facebook_messa
JSONNODE *thread_id_ = json_get(action_, "thread_id");
JSONNODE *log_body_ = json_get(action_, "log_message_body");
JSONNODE *log_data_ = json_get(action_, "log_message_data");
- if (!log_data_ || !thread_id_)
+ JSONNODE *log_type_ = json_get(action_, "log_message_type");
+ if (!log_data_ || !log_body_ || !thread_id_ || !log_type_)
continue;
- JSONNODE *name_ = json_get(log_data_, "name");
- std::string name = json_as_pstring(name_);
std::tstring thread_id = json_as_string(thread_id_);
- std::string message = json_as_pstring(log_body_);
+ std::string type = json_as_pstring(log_type_);
+ std::string message_text = json_as_pstring(log_body_);
+
+ if (type == "log:video-call") {
+ JSONNODE *other_user_fbid_ = json_get(action_, "other_user_fbid");
+ std::string id = json_as_pstring(other_user_fbid_);
+
+ JSONNODE *timestamp = json_get(action_, "timestamp");
+ JSONNODE *mid_ = json_get(action_, "message_id");
+
+ std::string message_id = json_as_pstring(mid_);
+
+ facebook_message* message = new facebook_message();
+ message->isChat = false;
+ message->isUnread = true;
+ message->isIncoming = (id != proto->facy.self_.user_id);
+ message->message_text = message_text;
+ message->time = utils::time::fix_timestamp(json_as_float(timestamp));
+ message->user_id = id;
+ message->message_id = message_id;
+ message->sender_name = "";
+ message->thread_id = json_as_pstring(thread_id_);
+ message->type = CALL;
- // proto->RenameChat(thread_id.c_str(), name.c_str()); // this don't work, why?
- proto->setStringUtf(proto->ChatIDToHContact(thread_id), FACEBOOK_KEY_NICK, name.c_str());
+ messages->push_back(message);
+ } else {
+ // TODO: check for other types, now we expect this is rename chat
- proto->UpdateChat(thread_id.c_str(), NULL, NULL, message.c_str());
+ if (!proto->m_enableChat)
+ continue;
+
+ JSONNODE *name_ = json_get(log_data_, "name");
+ std::string name = json_as_pstring(name_);
+
+ // proto->RenameChat(thread_id.c_str(), name.c_str()); // this don't work, why?
+ proto->setStringUtf(proto->ChatIDToHContact(thread_id), FACEBOOK_KEY_NICK, name.c_str());
+
+ proto->UpdateChat(thread_id.c_str(), NULL, NULL, message_text.c_str());
+ }
}
} else if (t == "notifications_read" || t == "notifications_seen") {
JSONNODE *alerts = json_get(it, "alert_ids");
diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp
index b10b9165b7..a2934dd1b3 100644
--- a/protocols/FacebookRM/src/process.cpp
+++ b/protocols/FacebookRM/src/process.cpp
@@ -706,7 +706,7 @@ void FacebookProto::ReceiveMessages(std::vector<facebook_message*> messages, boo
if (!tid || strcmp(tid, messages[i]->thread_id.c_str()))
setString(hContact, FACEBOOK_KEY_TID, messages[i]->thread_id.c_str());
- if (messages[i]->isIncoming && messages[i]->isUnread) {
+ if (messages[i]->isIncoming && messages[i]->isUnread && messages[i]->type == MESSAGE) {
PROTORECVEVENT recv = { 0 };
recv.flags = PREF_UTF;
recv.szMessage = const_cast<char*>(messages[i]->message_text.c_str());
@@ -715,7 +715,12 @@ void FacebookProto::ReceiveMessages(std::vector<facebook_message*> messages, boo
} else {
DBEVENTINFO dbei = { 0 };
dbei.cbSize = sizeof(dbei);
- dbei.eventType = EVENTTYPE_MESSAGE;
+
+ if (messages[i]->type == CALL)
+ dbei.eventType = FACEBOOK_EVENTTYPE_CALL;
+ else
+ dbei.eventType = EVENTTYPE_MESSAGE;
+
dbei.flags = DBEF_UTF;
if (!messages[i]->isIncoming)
diff --git a/protocols/FacebookRM/src/proto.cpp b/protocols/FacebookRM/src/proto.cpp
index eed51d5316..2abb8323ee 100644
--- a/protocols/FacebookRM/src/proto.cpp
+++ b/protocols/FacebookRM/src/proto.cpp
@@ -92,6 +92,17 @@ FacebookProto::FacebookProto(const char* proto_name,const TCHAR* username) :
// Set all contacts offline -- in case we crashed
SetAllContactStatuses(ID_STATUS_OFFLINE);
+
+ // register special type of event
+ // there's no need to declare the special service for getting text
+ // because a blob contains only text
+ DBEVENTTYPEDESCR evtype = { sizeof(evtype) };
+ evtype.module = m_szModuleName;
+ evtype.eventType = FACEBOOK_EVENTTYPE_CALL;
+ evtype.descr = LPGEN("Video call");
+ evtype.eventIcon = GetIconHandle("facebook");
+ evtype.flags = DETF_HISTORY | DETF_MSGWINDOW;
+ CallService(MS_DB_EVENT_REGISTERTYPE, 0, (LPARAM)&evtype);
}
FacebookProto::~FacebookProto()