mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
ignore phrases
This commit is contained in:
parent
d2450c298b
commit
d3b6e294ed
6 changed files with 52 additions and 12 deletions
|
@ -8,7 +8,7 @@ namespace chatterino {
|
|||
|
||||
// commandmodel
|
||||
IgnoreModel::IgnoreModel(QObject *parent)
|
||||
: SignalVectorModel<IgnorePhrase>(2, parent)
|
||||
: SignalVectorModel<IgnorePhrase>(4, parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -18,8 +18,9 @@ IgnorePhrase IgnoreModel::getItemFromRow(std::vector<QStandardItem *> &row,
|
|||
{
|
||||
// key, regex
|
||||
|
||||
return IgnorePhrase{row[0]->data(Qt::DisplayRole).toString(),
|
||||
row[1]->data(Qt::CheckStateRole).toBool()};
|
||||
return IgnorePhrase{
|
||||
row[0]->data(Qt::DisplayRole).toString(), row[1]->data(Qt::CheckStateRole).toBool(),
|
||||
row[2]->data(Qt::CheckStateRole).toBool(), row[3]->data(Qt::DisplayRole).toString()};
|
||||
}
|
||||
|
||||
// turns a row in the model into a vector item
|
||||
|
@ -27,6 +28,8 @@ void IgnoreModel::getRowFromItem(const IgnorePhrase &item, std::vector<QStandard
|
|||
{
|
||||
setStringItem(row[0], item.getPattern());
|
||||
setBoolItem(row[1], item.isRegex());
|
||||
setBoolItem(row[2], item.isReplace());
|
||||
setStringItem(row[3], item.getReplace());
|
||||
}
|
||||
|
||||
} // namespace chatterino
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "common/SerializeCustom.hpp"
|
||||
#include "singletons/Settings.hpp"
|
||||
#include "util/RapidjsonHelpers.hpp"
|
||||
|
||||
#include <QRegularExpression>
|
||||
|
@ -16,15 +17,18 @@ class IgnorePhrase
|
|||
public:
|
||||
bool operator==(const IgnorePhrase &other) const
|
||||
{
|
||||
return std::tie(this->pattern_, this->isRegex_) == std::tie(other.pattern_, other.isRegex_);
|
||||
return std::tie(this->pattern_, this->isRegex_, this->isReplace_, this->replace_) ==
|
||||
std::tie(other.pattern_, other.isRegex_, other.isReplace_, other.replace_);
|
||||
}
|
||||
|
||||
IgnorePhrase(const QString &pattern, bool isRegex)
|
||||
IgnorePhrase(const QString &pattern, bool isRegex, bool isReplace, const QString &replace)
|
||||
: pattern_(pattern)
|
||||
, isRegex_(isRegex)
|
||||
, regex_(isRegex_ ? pattern : "\\b" + QRegularExpression::escape(pattern) + "\\b",
|
||||
QRegularExpression::CaseInsensitiveOption |
|
||||
QRegularExpression::UseUnicodePropertiesOption)
|
||||
, isReplace_(isReplace)
|
||||
, replace_(replace)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -47,10 +51,22 @@ public:
|
|||
return this->isValid() && this->regex_.match(subject).hasMatch();
|
||||
}
|
||||
|
||||
bool isReplace() const
|
||||
{
|
||||
return this->isReplace_;
|
||||
}
|
||||
|
||||
const QString &getReplace() const
|
||||
{
|
||||
return this->replace_;
|
||||
}
|
||||
|
||||
private:
|
||||
QString pattern_;
|
||||
bool isRegex_;
|
||||
QRegularExpression regex_;
|
||||
bool isReplace_;
|
||||
QString replace_;
|
||||
};
|
||||
} // namespace chatterino
|
||||
|
||||
|
@ -66,6 +82,8 @@ struct Serialize<chatterino::IgnorePhrase> {
|
|||
|
||||
AddMember(ret, "pattern", value.getPattern(), a);
|
||||
AddMember(ret, "regex", value.isRegex(), a);
|
||||
AddMember(ret, "onlyWord", value.isReplace(), a);
|
||||
AddMember(ret, "replace", value.getReplace(), a);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -76,16 +94,22 @@ struct Deserialize<chatterino::IgnorePhrase> {
|
|||
static chatterino::IgnorePhrase get(const rapidjson::Value &value)
|
||||
{
|
||||
if (!value.IsObject()) {
|
||||
return chatterino::IgnorePhrase(QString(), false);
|
||||
return chatterino::IgnorePhrase(
|
||||
QString(), false, false,
|
||||
::chatterino::getSettings()->ignoredPhraseReplace.getValue());
|
||||
}
|
||||
|
||||
QString _pattern;
|
||||
bool _isRegex = false;
|
||||
bool _isReplace = false;
|
||||
QString _replace;
|
||||
|
||||
chatterino::rj::getSafe(value, "pattern", _pattern);
|
||||
chatterino::rj::getSafe(value, "regex", _isRegex);
|
||||
chatterino::rj::getSafe(value, "onlyWord", _isReplace);
|
||||
chatterino::rj::getSafe(value, "replace", _replace);
|
||||
|
||||
return chatterino::IgnorePhrase(_pattern, _isRegex);
|
||||
return chatterino::IgnorePhrase(_pattern, _isRegex, _isReplace, _replace);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ bool TwitchMessageBuilder::isIgnored() const
|
|||
|
||||
// TODO(pajlada): Do we need to check if the phrase is valid first?
|
||||
for (const auto &phrase : app->ignores->phrases.getVector()) {
|
||||
if (phrase.isMatch(this->originalMessage_)) {
|
||||
if (!phrase.isReplace() && phrase.isMatch(this->originalMessage_)) {
|
||||
Log("Blocking message because it contains ignored phrase {}", phrase.getPattern());
|
||||
return true;
|
||||
}
|
||||
|
@ -168,13 +168,22 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
|
||||
auto currentTwitchEmote = twitchEmotes.begin();
|
||||
|
||||
/*for (const auto &phrase : app->ignores->phrases.getVector()) {
|
||||
if (phrase.isReplace() && phrase.isMatch(this->originalMessage_)) {
|
||||
Log("Replacing message because it contains ignored phrase {}", phrase.getPattern());
|
||||
this->originalMessage_.replace(phrase.getPattern(), phrase.getReplace());
|
||||
}
|
||||
}*/
|
||||
|
||||
// words
|
||||
|
||||
QStringList splits = this->originalMessage_.split(' ');
|
||||
|
||||
long int i = 0;
|
||||
|
||||
for (QString split : splits) {
|
||||
for (int current = 0; current < splits.size(); ++current) {
|
||||
const QString &split = splits[current];
|
||||
Log("Splits {} {} {}", current, split, i);
|
||||
MessageColor textColor =
|
||||
this->action_ ? MessageColor(this->usernameColor_) : MessageColor(MessageColor::Text);
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ private:
|
|||
QString roomID_;
|
||||
|
||||
QColor usernameColor_;
|
||||
const QString originalMessage_;
|
||||
QString originalMessage_;
|
||||
bool senderIsBroadcaster{};
|
||||
|
||||
const bool action_ = false;
|
||||
|
|
|
@ -83,6 +83,9 @@ public:
|
|||
BoolSetting linksDoubleClickOnly = {"/links/doubleClickToOpen", false};
|
||||
BoolSetting lowercaseLink = {"/links/linkLowercase", true};
|
||||
|
||||
/// Ignored phrases
|
||||
QStringSetting ignoredPhraseReplace = {"/ignore/ignoredPhraseReplace", "***"};
|
||||
|
||||
/// Ingored Users
|
||||
BoolSetting enableTwitchIgnoredUsers = {"/ignore/enableTwitchIgnoredUsers", true};
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ void addPhrasesTab(LayoutCreator<QVBoxLayout> layout)
|
|||
{
|
||||
EditableModelView *view =
|
||||
layout.emplace<EditableModelView>(getApp()->ignores->createModel(nullptr)).getElement();
|
||||
view->setTitles({"Pattern", "Regex"});
|
||||
view->setTitles({"Pattern", "Regex", "Replace", "Pattern"});
|
||||
view->getTableView()->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
|
||||
view->getTableView()->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||
|
||||
|
@ -55,7 +55,8 @@ void addPhrasesTab(LayoutCreator<QVBoxLayout> layout)
|
|||
});
|
||||
|
||||
view->addButtonPressed.connect([] {
|
||||
getApp()->ignores->phrases.appendItem(IgnorePhrase{"my phrase", false});
|
||||
getApp()->ignores->phrases.appendItem(IgnorePhrase{
|
||||
"my phrase", false, false, getSettings()->ignoredPhraseReplace.getValue()});
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue