summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swift/Controllers/Chat/ChatControllerBase.cpp8
-rw-r--r--Swift/Controllers/Chat/ChatMessageParser.cpp9
-rw-r--r--Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp15
-rw-r--r--Swift/Controllers/UIInterfaces/ChatWindow.h22
-rw-r--r--Swift/Controllers/UnitTest/MockChatWindow.h6
5 files changed, 40 insertions, 20 deletions
diff --git a/Swift/Controllers/Chat/ChatControllerBase.cpp b/Swift/Controllers/Chat/ChatControllerBase.cpp
index 5b0bbd9..80f4167 100644
--- a/Swift/Controllers/Chat/ChatControllerBase.cpp
+++ b/Swift/Controllers/Chat/ChatControllerBase.cpp
@@ -17,7 +17,6 @@
#include <Swiften/Avatars/AvatarManager.h>
#include <Swiften/Base/Path.h>
-#include <Swiften/Base/String.h>
#include <Swiften/Base/foreach.h>
#include <Swiften/Base/format.h>
#include <Swiften/Client/StanzaChannel.h>
@@ -209,12 +208,7 @@ bool ChatControllerBase::hasOpenWindow() const {
ChatWindow::ChatMessage ChatControllerBase::buildChatWindowChatMessage(const std::string& message, bool senderIsSelf, const HighlightAction& fullMessageHighlightAction) {
ChatWindow::ChatMessage chatMessage;
- if (boost::starts_with(message, "/me ")) {
- chatMessage = chatMessageParser_->parseMessageBody(String::getSplittedAtFirst(message, ' ').second);
- }
- else {
- chatMessage = chatMessageParser_->parseMessageBody(message, highlighter_->getNick(), senderIsSelf);
- }
+ chatMessage = chatMessageParser_->parseMessageBody(message, highlighter_->getNick(), senderIsSelf);
chatMessage.setFullMessageHighlightAction(fullMessageHighlightAction);
return chatMessage;
}
diff --git a/Swift/Controllers/Chat/ChatMessageParser.cpp b/Swift/Controllers/Chat/ChatMessageParser.cpp
index c204371..d639b06 100644
--- a/Swift/Controllers/Chat/ChatMessageParser.cpp
+++ b/Swift/Controllers/Chat/ChatMessageParser.cpp
@@ -13,6 +13,7 @@
#include <boost/algorithm/string.hpp>
#include <Swiften/Base/Regex.h>
+#include <Swiften/Base/String.h>
#include <Swiften/Base/foreach.h>
#include <SwifTools/Linkify.h>
@@ -28,6 +29,11 @@ namespace Swift {
ChatWindow::ChatMessage ChatMessageParser::parseMessageBody(const std::string& body, const std::string& nick, bool senderIsSelf) {
ChatWindow::ChatMessage parsedMessage;
std::string remaining = body;
+ if (boost::starts_with(body, "/me ")) {
+ remaining = String::getSplittedAtFirst(body, ' ').second;
+ parsedMessage.setIsMeCommand(true);
+ }
+
/* Parse one, URLs */
while (!remaining.empty()) {
bool found = false;
@@ -131,8 +137,7 @@ namespace Swift {
newMessage.append(part);
}
}
- parsedMessage = newMessage;
-
+ parsedMessage.setParts(newMessage.getParts());
}
return parsedMessage;
}
diff --git a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
index 90600dc..0a36180 100644
--- a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
+++ b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
@@ -80,6 +80,7 @@ class ChatsManagerTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testLocalMUCServiceDiscoveryResetOnDisconnect);
CPPUNIT_TEST(testChatControllerHighlightingNotificationTesting);
CPPUNIT_TEST(testChatControllerHighlightingNotificationDeduplicateSounds);
+ CPPUNIT_TEST(testChatControllerMeMessageHandling);
CPPUNIT_TEST_SUITE_END();
public:
@@ -803,6 +804,20 @@ public:
CPPUNIT_ASSERT(soundsPlayed_.find(keywordRuleB.getAction().getSoundFile()) != soundsPlayed_.end());
}
+ void testChatControllerMeMessageHandling() {
+ JID messageJID("testling@test.com/resource1");
+
+ MockChatWindow* window = new MockChatWindow();
+ mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(messageJID, uiEventStream_).Return(window);
+
+ std::shared_ptr<Message> message(new Message());
+ message->setFrom(messageJID);
+ std::string body("/me is feeling delighted.");
+ message->setBody(body);
+ manager_->handleIncomingMessage(message);
+ CPPUNIT_ASSERT_EQUAL(std::string("is feeling delighted."), window->lastAddedActionBody_);
+ }
+
private:
std::shared_ptr<Message> makeDeliveryReceiptTestMessage(const JID& from, const std::string& id) {
std::shared_ptr<Message> message = std::make_shared<Message>();
diff --git a/Swift/Controllers/UIInterfaces/ChatWindow.h b/Swift/Controllers/UIInterfaces/ChatWindow.h
index 2636bda..3aa1c7e 100644
--- a/Swift/Controllers/UIInterfaces/ChatWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatWindow.h
@@ -45,9 +45,11 @@ namespace Swift {
class ChatMessage {
public:
ChatMessage() {}
+
ChatMessage(const std::string& text) {
append(std::make_shared<ChatTextMessagePart>(text));
}
+
void append(const std::shared_ptr<ChatMessagePart>& part) {
parts_.push_back(part);
}
@@ -56,6 +58,10 @@ namespace Swift {
return parts_;
}
+ void setParts(const std::vector<std::shared_ptr<ChatMessagePart> >& parts) {
+ parts_ = parts;
+ }
+
void setFullMessageHighlightAction(const HighlightAction& action) {
fullMessageHighlightAction_ = action;
}
@@ -65,21 +71,17 @@ namespace Swift {
}
bool isMeCommand() const {
- bool isMeCommand = false;
- if (!parts_.empty()) {
- std::shared_ptr<ChatTextMessagePart> textPart = std::dynamic_pointer_cast<ChatTextMessagePart>(parts_[0]);
- if (textPart) {
- if (boost::starts_with(textPart->text, "/me ")) {
- isMeCommand = true;
- }
- }
- }
- return isMeCommand;
+ return isMeCommand_;
+ }
+
+ void setIsMeCommand(bool isMeCommand) {
+ isMeCommand_ = isMeCommand;
}
private:
std::vector<std::shared_ptr<ChatMessagePart> > parts_;
HighlightAction fullMessageHighlightAction_;
+ bool isMeCommand_ = false;
};
class ChatTextMessagePart : public ChatMessagePart {
diff --git a/Swift/Controllers/UnitTest/MockChatWindow.h b/Swift/Controllers/UnitTest/MockChatWindow.h
index 9a97994..1430f4f 100644
--- a/Swift/Controllers/UnitTest/MockChatWindow.h
+++ b/Swift/Controllers/UnitTest/MockChatWindow.h
@@ -23,7 +23,10 @@ namespace Swift {
return "id";
}
- virtual std::string addAction(const ChatMessage& /*message*/, const std::string& /*senderName*/, bool /*senderIsSelf*/, std::shared_ptr<SecurityLabel> /*label*/, const std::string& /*avatarPath*/, const boost::posix_time::ptime& /*time*/) {return "id";}
+ virtual std::string addAction(const ChatMessage& message, const std::string& /*senderName*/, bool /*senderIsSelf*/, std::shared_ptr<SecurityLabel> /*label*/, const std::string& /*avatarPath*/, const boost::posix_time::ptime& /*time*/) {
+ lastAddedActionBody_ =bodyFromMessage(message);
+ return "id";
+ }
virtual std::string addSystemMessage(const ChatMessage& message, Direction /*direction*/) {
lastAddedSystemMessage_ = message;
@@ -102,6 +105,7 @@ namespace Swift {
std::string name_;
std::string lastMessageBody_;
+ std::string lastAddedActionBody_;
ChatMessage lastAddedPresence_;
ChatMessage lastReplacedMessage_;
ChatMessage lastAddedSystemMessage_;