From dd05ea28fe1530196edef605d8c3f2fdbfb65a67 Mon Sep 17 00:00:00 2001 From: fourtf Date: Tue, 23 Jan 2018 21:33:49 +0100 Subject: [PATCH] added basic keyword ignore setting --- chatterino.pro | 8 ++- src/singletons/ircmanager.cpp | 4 +- src/singletons/settingsmanager.cpp | 20 ++++++++ src/singletons/settingsmanager.hpp | 7 +++ src/twitch/twitchchannel.cpp | 5 +- src/twitch/twitchmessagebuilder.cpp | 17 ++++++- src/twitch/twitchmessagebuilder.hpp | 1 + src/util/layoutcreator.hpp | 12 +++++ src/widgets/settingsdialog.cpp | 4 ++ .../settingspages/ignoremessagespage.cpp | 39 ++++++++++++++ .../settingspages/ignoremessagespage.hpp | 19 +++++++ src/widgets/settingspages/ignoreuserspage.cpp | 51 +++++++++++++++++++ src/widgets/settingspages/ignoreuserspage.hpp | 15 ++++++ 13 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 src/widgets/settingspages/ignoremessagespage.cpp create mode 100644 src/widgets/settingspages/ignoremessagespage.hpp create mode 100644 src/widgets/settingspages/ignoreuserspage.cpp create mode 100644 src/widgets/settingspages/ignoreuserspage.hpp diff --git a/chatterino.pro b/chatterino.pro index 18d67f250..81788de6e 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -163,7 +163,9 @@ SOURCES += \ src/widgets/basewindow.cpp \ src/singletons/helper/moderationaction.cpp \ src/widgets/streamview.cpp \ - src/util/networkrequest.cpp + src/util/networkrequest.cpp \ + src/widgets/settingspages/ignoreuserspage.cpp \ + src/widgets/settingspages/ignoremessagespage.cpp HEADERS += \ src/precompiled_header.hpp \ @@ -266,7 +268,9 @@ HEADERS += \ src/widgets/streamview.hpp \ src/util/networkrequest.hpp \ src/util/networkworker.hpp \ - src/util/networkrequester.hpp + src/util/networkrequester.hpp \ + src/widgets/settingspages/ignoreuserspage.hpp \ + src/widgets/settingspages/ignoremessagespage.hpp RESOURCES += \ resources/resources.qrc diff --git a/src/singletons/ircmanager.cpp b/src/singletons/ircmanager.cpp index d14530765..a82f5e586 100644 --- a/src/singletons/ircmanager.cpp +++ b/src/singletons/ircmanager.cpp @@ -255,7 +255,9 @@ void IrcManager::privateMessageReceived(Communi::IrcPrivateMessage *message) twitch::TwitchMessageBuilder builder(c.get(), message, args); - c->addMessage(builder.parse()); + if (!builder.isIgnored()) { + c->addMessage(builder.parse()); + } } void IrcManager::messageReceived(Communi::IrcMessage *message) diff --git a/src/singletons/settingsmanager.cpp b/src/singletons/settingsmanager.cpp index 0aa93c12a..87ab2a9d7 100644 --- a/src/singletons/settingsmanager.cpp +++ b/src/singletons/settingsmanager.cpp @@ -17,6 +17,7 @@ void _registerSetting(std::weak_ptr setting) SettingManager::SettingManager() : snapshot(nullptr) + , _ignoredKeywords(new std::vector) { this->wordFlagsListener.addSetting(this->showTimestamps); this->wordFlagsListener.addSetting(this->showBadges); @@ -29,6 +30,7 @@ SettingManager::SettingManager() }; this->moderationActions.connect([this](auto, auto) { this->updateModerationActions(); }); + this->ignoredKeywords.connect([this](auto, auto) { this->updateIgnoredKeywords(); }); } MessageElement::Flags SettingManager::getWordFlags() @@ -135,6 +137,11 @@ std::vector SettingManager::getModerationActions() const return this->_moderationActions; } +const std::shared_ptr> SettingManager::getIgnoredKeywords() const +{ + return this->_ignoredKeywords; +} + void SettingManager::updateModerationActions() { auto &resources = singletons::ResourceManager::getInstance(); @@ -202,5 +209,18 @@ void SettingManager::updateModerationActions() } } } + +void SettingManager::updateIgnoredKeywords() +{ + static QRegularExpression newLineRegex("(\r\n?|\n)+"); + + auto items = new std::vector(); + + for (QString line : this->ignoredKeywords.getValue().split(newLineRegex)) { + items->push_back(line); + } + + this->_ignoredKeywords = std::shared_ptr>(items); +} } // namespace singletons } // namespace chatterino diff --git a/src/singletons/settingsmanager.hpp b/src/singletons/settingsmanager.hpp index d87f32a70..986115a29 100644 --- a/src/singletons/settingsmanager.hpp +++ b/src/singletons/settingsmanager.hpp @@ -75,6 +75,10 @@ public: /// Links BoolSetting linksDoubleClickOnly = {"/links/doubleClickToOpen", false}; + /// Ingored Users + BoolSetting enableTwitchIgnoredUsers = {"/ignore/enableTwitchIgnoredUsers", true}; + QStringSetting ignoredKeywords = {"/ignore/ignoredKeywords", ""}; + /// Moderation QStringSetting moderationActions = {"/moderation/actions", "/ban {user}\n/timeout {user} 300"}; @@ -107,6 +111,7 @@ public: void recallSnapshot(); std::vector getModerationActions() const; + const std::shared_ptr> getIgnoredKeywords() const; signals: void wordFlagsChanged(); @@ -114,10 +119,12 @@ signals: private: std::vector _moderationActions; std::unique_ptr snapshot; + std::shared_ptr> _ignoredKeywords; SettingManager(); void updateModerationActions(); + void updateIgnoredKeywords(); messages::MessageElement::Flags wordFlags = messages::MessageElement::Default; diff --git a/src/twitch/twitchchannel.cpp b/src/twitch/twitchchannel.cpp index 869912427..37f15c04b 100644 --- a/src/twitch/twitchchannel.cpp +++ b/src/twitch/twitchchannel.cpp @@ -230,7 +230,6 @@ void TwitchChannel::fetchRecentMessages() auto msgArray = obj.value("messages").toArray(); if (msgArray.size() > 0) { std::vector messages; - messages.resize(msgArray.size()); for (int i = 0; i < msgArray.size(); i++) { QByteArray content = msgArray[i].toString().toUtf8(); @@ -239,7 +238,9 @@ void TwitchChannel::fetchRecentMessages() messages::MessageParseArgs args; twitch::TwitchMessageBuilder builder(channel, privMsg, args); - messages.at(i) = builder.parse(); + if (!builder.isIgnored()) { + messages.push_back(builder.parse()); + } } channel->addMessagesAtStart(messages); } diff --git a/src/twitch/twitchmessagebuilder.cpp b/src/twitch/twitchmessagebuilder.cpp index 90a65832b..e7474ab50 100644 --- a/src/twitch/twitchmessagebuilder.cpp +++ b/src/twitch/twitchmessagebuilder.cpp @@ -27,6 +27,21 @@ TwitchMessageBuilder::TwitchMessageBuilder(Channel *_channel, , tags(this->ircMessage->tags()) , usernameColor(singletons::ThemeManager::getInstance().messages.textColors.system) { + this->originalMessage = this->ircMessage->content(); +} + +bool TwitchMessageBuilder::isIgnored() const +{ + singletons::SettingManager &settings = singletons::SettingManager::getInstance(); + std::shared_ptr> ignoredKeywords = settings.getIgnoredKeywords(); + + for (const QString &keyword : *ignoredKeywords) { + if (this->originalMessage.contains(keyword, Qt::CaseInsensitive)) { + return true; + } + } + + return false; } MessagePtr TwitchMessageBuilder::parse() @@ -34,8 +49,6 @@ MessagePtr TwitchMessageBuilder::parse() singletons::SettingManager &settings = singletons::SettingManager::getInstance(); singletons::EmoteManager &emoteManager = singletons::EmoteManager::getInstance(); - this->originalMessage = this->ircMessage->content(); - // PARSING this->parseUsername(); diff --git a/src/twitch/twitchmessagebuilder.hpp b/src/twitch/twitchmessagebuilder.hpp index 30aa7e1f1..180130297 100644 --- a/src/twitch/twitchmessagebuilder.hpp +++ b/src/twitch/twitchmessagebuilder.hpp @@ -38,6 +38,7 @@ public: QString messageID; QString userName; + bool isIgnored() const; messages::MessagePtr parse(); private: diff --git a/src/util/layoutcreator.hpp b/src/util/layoutcreator.hpp index 886886eeb..f28e569ed 100644 --- a/src/util/layoutcreator.hpp +++ b/src/util/layoutcreator.hpp @@ -47,6 +47,18 @@ public: return LayoutCreator(t); } + template ::value, int>::type = 0, + typename std::enable_if::value, int>::type = 0> + LayoutCreator setLayoutType() + { + T2 *layout = new T2; + + this->item->setLayout(layout); + + return LayoutCreator(layout); + } + LayoutCreator assign(T **ptr) { *ptr = this->item; diff --git a/src/widgets/settingsdialog.cpp b/src/widgets/settingsdialog.cpp index 9320e61a1..f6c62ee7f 100644 --- a/src/widgets/settingsdialog.cpp +++ b/src/widgets/settingsdialog.cpp @@ -8,6 +8,8 @@ #include "widgets/settingspages/commandpage.hpp" #include "widgets/settingspages/emotespage.hpp" #include "widgets/settingspages/highlightingpage.hpp" +#include "widgets/settingspages/ignoremessagespage.hpp" +#include "widgets/settingspages/ignoreuserspage.hpp" #include "widgets/settingspages/logspage.hpp" #include "widgets/settingspages/moderationpage.hpp" @@ -77,6 +79,8 @@ void SettingsDialog::addTabs() this->addTab(new settingspages::BehaviourPage); this->addTab(new settingspages::CommandPage); this->addTab(new settingspages::EmotesPage); + this->addTab(new settingspages::IgnoreUsersPage); + this->addTab(new settingspages::IgnoreMessagesPage); this->addTab(new settingspages::HighlightingPage); // this->addTab(new settingspages::LogsPage); this->addTab(new settingspages::ModerationPage); diff --git a/src/widgets/settingspages/ignoremessagespage.cpp b/src/widgets/settingspages/ignoremessagespage.cpp new file mode 100644 index 000000000..2b5ae4eb2 --- /dev/null +++ b/src/widgets/settingspages/ignoremessagespage.cpp @@ -0,0 +1,39 @@ +#include "ignoremessagespage.hpp" + +#include "util/layoutcreator.hpp" + +#include +#include + +namespace chatterino { +namespace widgets { +namespace settingspages { +IgnoreMessagesPage::IgnoreMessagesPage() + : SettingsPage("Ignore Messages", ":/images/theme.svg") +{ + singletons::SettingManager &settings = singletons::SettingManager::getInstance(); + util::LayoutCreator layoutCreator(this); + auto layout = layoutCreator.setLayoutType(); + + layout.emplace("Ignored keywords:"); + QTextEdit *textEdit = layout.emplace().getElement(); + + textEdit->setPlainText(settings.ignoredKeywords); + + QObject::connect(textEdit, &QTextEdit::textChanged, + [this] { this->keywordsUpdated.start(200); }); + + QObject::connect(&this->keywordsUpdated, &QTimer::timeout, [textEdit, &settings] { + QString text = textEdit->toPlainText(); + + settings.ignoredKeywords = text; + + qDebug() << "xD"; + }); + + // ---- misc + this->keywordsUpdated.setSingleShot(true); +} +} // namespace settingspages +} // namespace widgets +} // namespace chatterino diff --git a/src/widgets/settingspages/ignoremessagespage.hpp b/src/widgets/settingspages/ignoremessagespage.hpp new file mode 100644 index 000000000..f6cb3f772 --- /dev/null +++ b/src/widgets/settingspages/ignoremessagespage.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include "widgets/settingspages/settingspage.hpp" + +namespace chatterino { +namespace widgets { +namespace settingspages { + +class IgnoreMessagesPage : public SettingsPage +{ +public: + IgnoreMessagesPage(); + + QTimer keywordsUpdated; +}; +} // namespace settingspages +} // namespace widgets +} // namespace chatterino diff --git a/src/widgets/settingspages/ignoreuserspage.cpp b/src/widgets/settingspages/ignoreuserspage.cpp new file mode 100644 index 000000000..5999dd47d --- /dev/null +++ b/src/widgets/settingspages/ignoreuserspage.cpp @@ -0,0 +1,51 @@ +#include "ignoreuserspage.hpp" + +#include "singletons/settingsmanager.hpp" +#include "util/layoutcreator.hpp" + +#include +#include +#include +#include +#include + +// clang-format off +#define INFO "/ignore in chat ignores a user\n/unignore in chat unignores a user\n\nChatterino uses the twitch api for ignored users so they are shared with the webchat.\nIf you use your own oauth key make sure that it has the correct permissions." +// clang-format on + +namespace chatterino { +namespace widgets { +namespace settingspages { +IgnoreUsersPage::IgnoreUsersPage() + : SettingsPage("Ignore Users", ":/images/theme.svg") +{ + singletons::SettingManager &settings = singletons::SettingManager::getInstance(); + util::LayoutCreator layoutCreator(this); + auto layout = layoutCreator.setLayoutType().withoutMargin(); + + auto label = layout.emplace(INFO); + label->setWordWrap(true); + label->setStyleSheet("color: #BBB"); + + layout.append( + this->createCheckBox("Enable twitch ignored users", settings.enableTwitchIgnoredUsers)); + + auto anyways = layout.emplace().withoutMargin(); + { + anyways.emplace("Show anyways if:"); + anyways.emplace(); + anyways->addStretch(1); + } + + auto addremove = layout.emplace().withoutMargin(); + { + auto add = addremove.emplace("Ignore user"); + auto remove = addremove.emplace("Unignore User"); + addremove->addStretch(1); + } + + auto userList = layout.emplace(); +} +} // namespace settingspages +} // namespace widgets +} // namespace chatterino diff --git a/src/widgets/settingspages/ignoreuserspage.hpp b/src/widgets/settingspages/ignoreuserspage.hpp new file mode 100644 index 000000000..ab231eeaf --- /dev/null +++ b/src/widgets/settingspages/ignoreuserspage.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "widgets/settingspages/settingspage.hpp" + +namespace chatterino { +namespace widgets { +namespace settingspages { +class IgnoreUsersPage : public SettingsPage +{ +public: + IgnoreUsersPage(); +}; +} // namespace settingspages +} // namespace widgets +} // namespace chatterino