diff options
-rw-r--r-- | protocols/FacebookRM/src/json.cpp | 8 | ||||
-rw-r--r-- | protocols/FacebookRM/src/process.cpp | 34 |
2 files changed, 26 insertions, 16 deletions
diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp index 71d706a4e1..310a61b0aa 100644 --- a/protocols/FacebookRM/src/json.cpp +++ b/protocols/FacebookRM/src/json.cpp @@ -100,6 +100,14 @@ void parseMessageType(FacebookProto *proto, facebook_message &message, const JSO } else if (logType == "log:unsubscribe") { message.type = UNSUBSCRIBE; + + const JSONNode &fbids_ = log_data_["removed_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:thread-name") { message.type = THREAD_NAME; diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index 6e678e6ca7..a2b533cda9 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -893,6 +893,7 @@ void FacebookProto::ReceiveMessages(std::vector<facebook_message> &messages, boo UpdateChat(thread_id.c_str(), NULL, NULL, msg.message_text.c_str()); break; case SUBSCRIBE: + case UNSUBSCRIBE: { UpdateChat(thread_id.c_str(), NULL, NULL, msg.message_text.c_str()); @@ -900,26 +901,27 @@ void FacebookProto::ReceiveMessages(std::vector<facebook_message> &messages, boo utils::text::explode(msg.data, ";", &ids); for (std::vector<std::string>::size_type k = 0; k < ids.size(); k++) { - if (fbc->participants.find(ids[k]) != fbc->participants.end()) { - continue; // We have this participant in chatroom already + auto jt = fbc->participants.find(ids[k]); + if (jt == fbc->participants.end()) { + // We don't have this user there yet, so load info about him and then process event + chatroom_participant participant; + participant.is_former = (msg.type == UNSUBSCRIBE); + participant.user_id = ids[k]; + + // FIXME: Load info about all participants at once + fbc->participants.insert(std::make_pair(participant.user_id, participant)); + LoadParticipantsNames(fbc); + jt = fbc->participants.find(ids[k]); + } + if (jt != fbc->participants.end()) { + if (msg.type == SUBSCRIBE) + AddChatContact(thread_id.c_str(), jt->second, msg.isUnread); + else + RemoveChatContact(thread_id.c_str(), jt->second.user_id.c_str(), jt->second.nick.c_str()); } - // We don't have this user there yet, so load info about him and then add him - chatroom_participant participant; - participant.is_former = false; - participant.user_id = ids[k]; - - // FIXME: Load info about all participants at once - fbc->participants.insert(std::make_pair(participant.user_id, participant)); - LoadParticipantsNames(fbc); - - AddChatContact(thread_id.c_str(), participant, msg.isUnread); } - break; } - case UNSUBSCRIBE: - RemoveChatContact(thread_id.c_str(), msg.user_id.c_str(), name.c_str()); - break; case THREAD_NAME: // proto->RenameChat(thread_id.c_str(), msg.data.c_str()); // this don't work, why? setStringUtf(hChatContact, FACEBOOK_KEY_NICK, msg.data.c_str()); |