summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/FacebookRM/src/constants.h15
-rw-r--r--protocols/FacebookRM/src/json.cpp142
-rw-r--r--protocols/FacebookRM/src/process.cpp8
3 files changed, 58 insertions, 107 deletions
diff --git a/protocols/FacebookRM/src/constants.h b/protocols/FacebookRM/src/constants.h
index 7d07a010d6..dd389df257 100644
--- a/protocols/FacebookRM/src/constants.h
+++ b/protocols/FacebookRM/src/constants.h
@@ -187,13 +187,14 @@ enum ClientType {
// Each type then could have also separate class representing it. And when giving it in some list, make it map of arrays with key=thread_id to group it by contact/chat, to have it more effective
// Use also for Poke and such events...
enum MessageType {
- MESSAGE = 1, // Classic message
- CALL = 2, // Video call
- ADMIN_TEXT = 3,
- SUBSCRIBE = 4,
- UNSUBSCRIBE = 5,
- THREAD_NAME = 6,
- THREAD_IMAGE = 7,
+ MESSAGE = 1,
+ PHONE_CALL = 2,
+ VIDEO_CALL = 3,
+ ADMIN_TEXT = 4,
+ SUBSCRIBE = 5,
+ UNSUBSCRIBE = 6,
+ THREAD_NAME = 7,
+ THREAD_IMAGE = 8,
};
enum ParticipantRole {
diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp
index a46fd08fb2..c79ad14716 100644
--- a/protocols/FacebookRM/src/json.cpp
+++ b/protocols/FacebookRM/src/json.cpp
@@ -72,6 +72,47 @@ void parseUser(const JSONNode &it, facebook_user *fbu)
}
}
+void parseMessageType(FacebookProto *proto, facebook_message &message, const JSONNode &log_type_, const JSONNode &log_body_, const JSONNode &log_data_) {
+ if (!log_type_ || !log_body_ || !log_data_)
+ return;
+
+ std::string logType = log_type_.as_string();
+
+ if (logType == "log:phone-call") {
+ message.type = PHONE_CALL;
+ }
+ else if (logType == "log:video-call") {
+ message.type = VIDEO_CALL;
+ }
+ else if (logType == "log:generic-admin-text") {
+ message.type = ADMIN_TEXT;
+ }
+ else if (logType == "log:subscribe") {
+ message.type = SUBSCRIBE;
+
+ const JSONNode &fbids_ = log_data_["added_participants"];
+ for (auto it2 = fbids_.begin(); it2 != fbids_.end(); ++it2) {
+ std::string id = (*it2).as_string().substr(5); // strip "fbid:" prefix
+ if (!message.data.empty())
+ message.data += ";";
+ message.data += id;
+ }
+ }
+ else if (logType == "log:unsubscribe") {
+ message.type = UNSUBSCRIBE;
+ }
+ else if (logType == "log:thread-name") {
+ message.type = THREAD_NAME;
+ message.data = log_data_["name"].as_string();
+ }
+ else if (logType == "log:thread-image") {
+ message.type = THREAD_IMAGE;
+ }
+ else {
+ proto->debugLogA("!!! Unknown log type - %s", logType.c_str());
+ }
+}
+
int facebook_json_parser::parse_chat_participant_names(std::string *data, std::map<std::string, chatroom_participant>* participants)
{
std::string jsonData = data->substr(9);
@@ -964,36 +1005,7 @@ int facebook_json_parser::parse_messages(std::string *pData, std::vector<faceboo
message.message_id = message_id;
message.thread_id = thread_id;
- if (logType == "log:video-call") {
- message.type = CALL;
- }
- else if (logType == "log:generic-admin-text") {
- message.type = ADMIN_TEXT;
- }
- else if (logType == "log:subscribe") {
- message.type = SUBSCRIBE;
-
- const JSONNode &fbids_ = log_data_["added_participants"];
- for (auto it2 = fbids_.begin(); it2 != fbids_.end(); ++it2) {
- std::string id = (*it2).as_string().substr(5); // strip "fbid:" prefix
- if (!message.data.empty())
- message.data += ";";
- message.data += id;
- }
- }
- else if (logType == "log:unsubscribe") {
- message.type = UNSUBSCRIBE;
- }
- else if (logType == "log:thread-name") {
- message.type = THREAD_NAME;
- message.data = log_data_["name"].as_string();
- }
- else if (logType == "log:thread-image") {
- message.type = THREAD_IMAGE;
- }
- else {
- proto->debugLogA("!!! Unknown log type - %s", logType.c_str());
- }
+ parseMessageType(proto, message, log_type_, log_body_, log_data_);
messages->push_back(message);
}
@@ -1191,40 +1203,8 @@ int facebook_json_parser::parse_thread_messages(std::string *data, std::vector<
else
continue;
}
-
- if (log_type_) {
- std::string log_type = log_type_.as_string();
- if (log_type == "log:video-call") {
- message.type = CALL;
- }
- else if (log_type == "log:generic-admin-text") {
- message.type = ADMIN_TEXT;
- }
- else if (log_type == "log:subscribe") {
- message.type = SUBSCRIBE;
-
- const JSONNode &fbids_ = log_data_["added_participants"];
- for (auto it2 = fbids_.begin(); it2 != fbids_.end(); ++it2) {
- std::string id = (*it2).as_string().substr(5); // strip "fbid:" prefix
- if (!message.data.empty())
- message.data += ";";
- message.data += id;
- }
- }
- else if (log_type == "log:unsubscribe") {
- message.type = UNSUBSCRIBE;
- }
- else if (log_type == "log:thread-name") {
- message.type = THREAD_NAME;
- message.data = log_data_["name"].as_string();
- }
- else if (log_type == "log:thread-image") {
- message.type = THREAD_IMAGE;
- }
- else {
- proto->debugLogA("parse_thread_messages: unknown message log type (%s) - %s", mid.as_string().c_str(), log_type.c_str());
- }
- }
+
+ parseMessageType(proto, message, log_type_, log_body_, log_data_);
messages->push_back(message);
}
@@ -1306,39 +1286,7 @@ int facebook_json_parser::parse_history(std::string *data, std::vector< facebook
message.isChat = false;
message.user_id = other_user_id;
- if (log_type_) {
- std::string log_type = log_type_.as_string();
- if (log_type == "log:video-call") {
- message.type = CALL;
- }
- else if (log_type == "log:generic-admin-text") {
- message.type = ADMIN_TEXT;
- }
- else if (log_type == "log:subscribe") {
- message.type = SUBSCRIBE;
-
- const JSONNode &fbids_ = log_data_["added_participants"];
- for (auto it2 = fbids_.begin(); it2 != fbids_.end(); ++it2) {
- std::string id = (*it2).as_string().substr(5); // strip "fbid:" prefix
- if (!message.data.empty())
- message.data += ";";
- message.data += id;
- }
- }
- else if (log_type == "log:unsubscribe") {
- message.type = UNSUBSCRIBE;
- }
- else if (log_type == "log:thread-name") {
- message.type = THREAD_NAME;
- message.data = log_data_["name"].as_string();
- }
- else if (log_type == "log:thread-image") {
- message.type = THREAD_IMAGE;
- }
- else {
- proto->debugLogA("parse_history: unknown message log type (%s) - %s", mid.as_string().c_str(), log_type.c_str());
- }
- }
+ parseMessageType(proto, message, log_type_, log_body_, log_data_);
messages->push_back(message);
}
diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp
index 9e47f091ee..4a64b638db 100644
--- a/protocols/FacebookRM/src/process.cpp
+++ b/protocols/FacebookRM/src/process.cpp
@@ -595,10 +595,12 @@ void FacebookProto::LoadHistory(void *pParam)
DBEVENTINFO dbei = { 0 };
dbei.cbSize = sizeof(dbei);
- if (msg.type == CALL)
+ if (msg.type == MESSAGE)
+ dbei.eventType = EVENTTYPE_MESSAGE;
+ else if (msg.type == VIDEO_CALL || msg.type == PHONE_CALL)
dbei.eventType = FACEBOOK_EVENTTYPE_CALL;
else
- dbei.eventType = EVENTTYPE_MESSAGE;
+ dbei.eventType = EVENTTYPE_URL; // FIXME: Use better and specific type for our other event types.
dbei.flags = DBEF_UTF;
@@ -1074,7 +1076,7 @@ void FacebookProto::ReceiveMessages(std::vector<facebook_message> &messages, boo
if (msg.type == MESSAGE)
dbei.eventType = EVENTTYPE_MESSAGE;
- else if (msg.type == CALL)
+ else if (msg.type == VIDEO_CALL || msg.type == PHONE_CALL)
dbei.eventType = FACEBOOK_EVENTTYPE_CALL;
else
dbei.eventType = EVENTTYPE_URL; // FIXME: Use better and specific type for our other event types.