From d9e90fa37405092bfde2fa8f1bb0ab6208f716d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C4=83t=C4=83lin=20Badea?= Date: Sun, 12 Aug 2012 14:27:05 +0300 Subject: Fix duplicate messages when joining a muc. diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp index 745c9da..b2ba871 100644 --- a/Swift/Controllers/Chat/MUCController.cpp +++ b/Swift/Controllers/Chat/MUCController.cpp @@ -435,6 +435,7 @@ void MUCController::preHandleIncomingMessage(boost::shared_ptr mes } if (!doneGettingHistory_) { + checkDuplicates(message); messageEvent->conclude(); } } @@ -796,9 +797,9 @@ void MUCController::addRecentLogs() { return; } - std::vector messages = historyController_->getMUCContext(selfJID_, toJID_, lastActivity_); + joinContext_ = historyController_->getMUCContext(selfJID_, toJID_, lastActivity_); - foreach (const HistoryMessage& message, messages) { + foreach (const HistoryMessage& message, joinContext_) { bool senderIsSelf = nick_ == message.getFromJID().getResource(); // the chatWindow uses utc timestamps @@ -806,4 +807,29 @@ void MUCController::addRecentLogs() { } } +void MUCController::checkDuplicates(boost::shared_ptr newMessage) { + std::string body = newMessage->getBody(); + JID jid = newMessage->getFrom(); + boost::optional time = newMessage->getTimestamp(); + + reverse_foreach (const HistoryMessage& message, joinContext_) { + boost::posix_time::ptime messageTime = message.getTime() - boost::posix_time::hours(message.getOffset()); + if (time && time < messageTime) { + break; + } + if (time && time != messageTime) { + continue; + } + if (message.getFromJID() != jid) { + continue; + } + if (message.getMessage() != body) { + continue; + } + + // Mark the message as unreadable + newMessage->setBody(""); + } +} + } diff --git a/Swift/Controllers/Chat/MUCController.h b/Swift/Controllers/Chat/MUCController.h index 0ade758..63893d0 100644 --- a/Swift/Controllers/Chat/MUCController.h +++ b/Swift/Controllers/Chat/MUCController.h @@ -107,6 +107,7 @@ namespace Swift { void handleInviteToMUCWindowDismissed(); void handleInviteToMUCWindowCompleted(); void addRecentLogs(); + void checkDuplicates(boost::shared_ptr newMessage); private: MUC::ref muc_; @@ -128,6 +129,7 @@ namespace Swift { boost::optional password_; InviteToChatWindow* inviteWindow_; XMPPRoster* xmppRoster_; + std::vector joinContext_; }; } -- cgit v0.10.2-6-g49f6