1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
/*
* Copyright (c) 2012 Maciej Niedzielski
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
/*
* Copyright (c) 2014-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swift/Controllers/Highlighting/Highlighter.h>
#include <set>
#include <string>
#include <Swiften/Base/String.h>
#include <Swiften/Base/format.h>
#include <Swiften/Client/NickResolver.h>
#include <Swift/Controllers/Highlighting/HighlightManager.h>
#include <Swift/Controllers/Intl.h>
#include <Swift/Controllers/XMPPEvents/MessageEvent.h>
namespace Swift {
Highlighter::Highlighter(HighlightManager* manager, NickResolver* nickResolver)
: manager_(manager), nickResolver_(nickResolver) {
}
void Highlighter::handleSystemNotifications(const ChatWindow::ChatMessage& message, std::shared_ptr<MessageEvent> event) {
if (std::shared_ptr<MessageEvent> messageEvent = std::dynamic_pointer_cast<MessageEvent>(event)) {
JID jid = messageEvent->getStanza()->getFrom();
std::string nickname = nickResolver_->jidToNick(jid);
std::string messageText = messageEvent->getStanza()->getBody().get_value_or("");
if (boost::starts_with(messageText, "/me ")) {
messageText = "*" + String::getSplittedAtFirst(messageText, ' ').second + "*";
}
if (message.getHighlightActionDirectMessage().isSystemNotificationEnabled()) {
// title: Romeo says
// message: message
std::string title = str(format(QT_TRANSLATE_NOOP("", "%1% says")) % nickname);
event->addNotification(title, messageText);
}
if (message.getHighlightActionGroupMessage().isSystemNotificationEnabled()) {
// title: Romeo in $roomJID says
// message: message
std::string roomName = jid.getNode();
std::string title = str(format(QT_TRANSLATE_NOOP("", "%1% in %2% says")) % nickname % roomName);
event->addNotification(title, messageText);
}
if (message.getHighlightActionOwnMention().isSystemNotificationEnabled()) {
// title: Romeo mentioned you in $roomJID
// message: message
std::string roomName = jid.getNode();
std::string title = str(format(QT_TRANSLATE_NOOP("", "%1% mentioned you in %2%")) % nickname % roomName);
event->addNotification(title, messageText);
}
if (message.getHighlightActionSender().isSystemNotificationEnabled()) {
// title: Romeo says
// message: message
auto title = str(format(QT_TRANSLATE_NOOP("", "%1% says")) % nickname);
event->addNotification(title, messageText);
}
for (auto&& part : message.getParts()) {
auto highlightPart = std::dynamic_pointer_cast<ChatWindow::ChatHighlightingMessagePart>(part);
if (highlightPart && highlightPart->action.isSystemNotificationEnabled()) {
// title: Romeo mentioned '$keyword'
// message: message
auto title = str(format(QT_TRANSLATE_NOOP("", "%1% mentioned '%2%'")) % nickname % highlightPart->text);
event->addNotification(title, messageText);
}
}
}
}
void Highlighter::handleSoundNotifications(const ChatWindow::ChatMessage& chatMessage) {
std::set<std::string> playedSoundPaths;
std::vector<HighlightAction> actionsToPlay;
// collect unique sounds to play
auto checkSoundActionAndQueueUnique = [&](const HighlightAction& action) {
if (action.getSoundFilePath()) {
auto soundFilePath = action.getSoundFilePath().get_value_or("");
if (playedSoundPaths.find(soundFilePath) == playedSoundPaths.end()) {
playedSoundPaths.insert(soundFilePath);
actionsToPlay.push_back(action);
}
}
};
for (auto&& part : chatMessage.getParts()) {
auto highlightMessage = std::dynamic_pointer_cast<ChatWindow::ChatHighlightingMessagePart>(part);
if (highlightMessage) {
checkSoundActionAndQueueUnique(highlightMessage->action);
}
}
checkSoundActionAndQueueUnique(chatMessage.getHighlightActionSender());
checkSoundActionAndQueueUnique(chatMessage.getHighlightActionOwnMention());
checkSoundActionAndQueueUnique(chatMessage.getHighlightActionDirectMessage());
checkSoundActionAndQueueUnique(chatMessage.getHighlightActionGroupMessage());
// play sounds
for (const auto& action : actionsToPlay) {
manager_->onHighlight(action);
}
}
}
|