From 11f01947a76909a24b6d71f64b59fe6448afb476 Mon Sep 17 00:00:00 2001 From: ckath Date: Fri, 14 Dec 2018 22:40:56 +0100 Subject: [PATCH 001/138] stop emotes from being cut off --- src/messages/layouts/MessageLayoutContainer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/messages/layouts/MessageLayoutContainer.cpp b/src/messages/layouts/MessageLayoutContainer.cpp index f24d05e26..c2b43f357 100644 --- a/src/messages/layouts/MessageLayoutContainer.cpp +++ b/src/messages/layouts/MessageLayoutContainer.cpp @@ -157,7 +157,7 @@ void MessageLayoutContainer::breakLine() int yExtra = 0; if (isCompactEmote) { - // yExtra = (COMPACT_EMOTES_OFFSET / 2) * this->scale_; + yExtra = (COMPACT_EMOTES_OFFSET / 2) * this->scale_; } // if (element->getCreator().getFlags() & @@ -165,8 +165,7 @@ void MessageLayoutContainer::breakLine() // { if (element->getRect().height() < this->textLineHeight_) { - // yExtra -= (this->textLineHeight_ - element->getRect().height()) / - // 2; + yExtra -= (this->textLineHeight_ - element->getRect().height()) / 2; } element->setPosition( From 777ac017df7ca7826834f9e23086aba60b30b314 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 2 Mar 2019 09:28:54 +0100 Subject: [PATCH 002/138] add vim bindings to split input movement --- src/widgets/splits/SplitInput.cpp | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/widgets/splits/SplitInput.cpp b/src/widgets/splits/SplitInput.cpp index 58ccb2cdb..0546fb339 100644 --- a/src/widgets/splits/SplitInput.cpp +++ b/src/widgets/splits/SplitInput.cpp @@ -246,6 +246,54 @@ void SplitInput::installKeyPressedEvent() } } } + else if (event->key() == Qt::Key_H && + event->modifiers() == Qt::AltModifier) + { + // h: vim binding for left + SplitContainer *page = this->split_->getContainer(); + event->accept(); + + if (page != nullptr) + { + page->selectNextSplit(SplitContainer::Left); + } + } + else if (event->key() == Qt::Key_J && + event->modifiers() == Qt::AltModifier) + { + // j: vim binding for down + SplitContainer *page = this->split_->getContainer(); + event->accept(); + + if (page != nullptr) + { + page->selectNextSplit(SplitContainer::Below); + } + } + else if (event->key() == Qt::Key_K && + event->modifiers() == Qt::AltModifier) + { + // k: vim binding for up + SplitContainer *page = this->split_->getContainer(); + event->accept(); + + if (page != nullptr) + { + page->selectNextSplit(SplitContainer::Above); + } + } + else if (event->key() == Qt::Key_L && + event->modifiers() == Qt::AltModifier) + { + // l: vim binding for right + SplitContainer *page = this->split_->getContainer(); + event->accept(); + + if (page != nullptr) + { + page->selectNextSplit(SplitContainer::Right); + } + } else if (event->key() == Qt::Key_Down) { if ((event->modifiers() & Qt::ShiftModifier) != 0) From 497c95848566301b26af4759f0d9b0fb98426e83 Mon Sep 17 00:00:00 2001 From: Cranken Date: Wed, 13 Mar 2019 15:26:55 +0100 Subject: [PATCH 003/138] Made links clickable in sent whispers. --- .../commands/CommandController.cpp | 12 ++++- src/messages/MessageBuilder.cpp | 54 +++++++++++++++++++ src/messages/MessageBuilder.hpp | 1 + src/providers/twitch/TwitchMessageBuilder.cpp | 52 +----------------- 4 files changed, 66 insertions(+), 53 deletions(-) diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index 8d98a999a..5767c66b0 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -189,8 +189,16 @@ QString CommandController::execCommand(const QString &textNoEmoji, void operator()(const QString &string, MessageBuilder &b) const { - b.emplace( - string, MessageElementFlag::Text); + auto linkString = b.matchLink(string); + if (linkString.isEmpty()) + { + b.emplace( + string, MessageElementFlag::Text); + } + else + { + b.addLink(string, linkString); + } } } visitor; boost::apply_visitor( diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index 2bc8e70dd..a029aea35 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -5,6 +5,7 @@ #include "messages/Image.hpp" #include "messages/Message.hpp" #include "messages/MessageElement.hpp" +#include "providers/LinkResolver.hpp" #include "providers/twitch/PubsubActions.hpp" #include "singletons/Emotes.hpp" #include "singletons/Resources.hpp" @@ -352,4 +353,57 @@ QString MessageBuilder::matchLink(const QString &string) return captured; } +void MessageBuilder::addLink(const QString &origLink, + const QString &matchedLink) +{ + static QRegularExpression domainRegex( + R"(^(?:(?:ftp|http)s?:\/\/)?([^\/]+)(?:\/.*)?$)", + QRegularExpression::CaseInsensitiveOption); + + QString lowercaseLinkString; + auto match = domainRegex.match(origLink); + if (match.isValid()) + { + lowercaseLinkString = origLink.mid(0, match.capturedStart(1)) + + match.captured(1).toLower() + + origLink.mid(match.capturedEnd(1)); + } + else + { + lowercaseLinkString = origLink; + } + auto linkElement = Link(Link::Url, matchedLink); + + auto textColor = MessageColor(MessageColor::Link); + auto linkMELowercase = + this->emplace(lowercaseLinkString, + MessageElementFlag::LowercaseLink, textColor) + ->setLink(linkElement); + auto linkMEOriginal = + this->emplace(origLink, MessageElementFlag::OriginalLink, + textColor) + ->setLink(linkElement); + + LinkResolver::getLinkInfo(matchedLink, [weakMessage = this->weakOf(), + linkMELowercase, linkMEOriginal, + matchedLink](QString tooltipText, + Link originalLink) { + auto shared = weakMessage.lock(); + if (!shared) + { + return; + } + if (!tooltipText.isEmpty()) + { + linkMELowercase->setTooltip(tooltipText); + linkMEOriginal->setTooltip(tooltipText); + } + if (originalLink.value != matchedLink && !originalLink.value.isEmpty()) + { + linkMELowercase->setLink(originalLink)->updateLink(); + linkMEOriginal->setLink(originalLink)->updateLink(); + } + }); +} + } // namespace chatterino diff --git a/src/messages/MessageBuilder.hpp b/src/messages/MessageBuilder.hpp index 8fe7915e2..dbc58cbb7 100644 --- a/src/messages/MessageBuilder.hpp +++ b/src/messages/MessageBuilder.hpp @@ -54,6 +54,7 @@ public: void append(std::unique_ptr element); QString matchLink(const QString &string); + void addLink(const QString &origLink, const QString &matchedLink); template T *emplace(Args &&... args) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index b8c34cc65..46d604042 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -6,7 +6,6 @@ #include "controllers/ignores/IgnoreController.hpp" #include "debug/Log.hpp" #include "messages/Message.hpp" -#include "providers/LinkResolver.hpp" #include "providers/chatterino/ChatterinoBadges.hpp" #include "providers/twitch/TwitchBadges.hpp" #include "providers/twitch/TwitchChannel.hpp" @@ -512,56 +511,7 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) } else { - static QRegularExpression domainRegex( - R"(^(?:(?:ftp|http)s?:\/\/)?([^\/]+)(?:\/.*)?$)", - QRegularExpression::CaseInsensitiveOption); - - QString lowercaseLinkString; - auto match = domainRegex.match(string); - if (match.isValid()) - { - lowercaseLinkString = string.mid(0, match.capturedStart(1)) + - match.captured(1).toLower() + - string.mid(match.capturedEnd(1)); - } - else - { - lowercaseLinkString = string; - } - link = Link(Link::Url, linkString); - - textColor = MessageColor(MessageColor::Link); - auto linkMELowercase = - this->emplace(lowercaseLinkString, - MessageElementFlag::LowercaseLink, - textColor) - ->setLink(link); - auto linkMEOriginal = - this->emplace(string, MessageElementFlag::OriginalLink, - textColor) - ->setLink(link); - - LinkResolver::getLinkInfo( - linkString, - [weakMessage = this->weakOf(), linkMELowercase, linkMEOriginal, - linkString](QString tooltipText, Link originalLink) { - auto shared = weakMessage.lock(); - if (!shared) - { - return; - } - if (!tooltipText.isEmpty()) - { - linkMELowercase->setTooltip(tooltipText); - linkMEOriginal->setTooltip(tooltipText); - } - if (originalLink.value != linkString && - !originalLink.value.isEmpty()) - { - linkMELowercase->setLink(originalLink)->updateLink(); - linkMEOriginal->setLink(originalLink)->updateLink(); - } - }); + this->addLink(string, linkString); } // if (!linkString.isEmpty()) { From 1a1d0f305c3e4b095cd12da162bc46641e2ecb25 Mon Sep 17 00:00:00 2001 From: hemirt Date: Wed, 20 Mar 2019 20:46:20 +0100 Subject: [PATCH 004/138] make whispers not disabled on clear --- src/common/Channel.cpp | 3 ++- src/common/Channel.hpp | 2 +- src/controllers/commands/CommandController.cpp | 1 + src/messages/Message.hpp | 3 ++- src/messages/layouts/MessageLayoutContainer.hpp | 2 +- src/providers/twitch/IrcMessageHandler.cpp | 1 + src/widgets/helper/ChannelView.hpp | 2 +- 7 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index 8d247cf2f..c34929620 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -179,7 +179,8 @@ void Channel::disableAllMessages() for (int i = 0; i < snapshotLength; i++) { auto &message = snapshot[i]; - if (message->flags.hasAny({MessageFlag::System, MessageFlag::Timeout})) + if (message->flags.hasAny({MessageFlag::System, MessageFlag::Timeout, + MessageFlag::Whisper})) { continue; } diff --git a/src/common/Channel.hpp b/src/common/Channel.hpp index 9e111aa46..7bb2d299f 100644 --- a/src/common/Channel.hpp +++ b/src/common/Channel.hpp @@ -15,7 +15,7 @@ namespace chatterino { struct Message; using MessagePtr = std::shared_ptr; -enum class MessageFlag : uint16_t; +enum class MessageFlag : uint32_t; using MessageFlags = FlagsEnum; class Channel : public std::enable_shared_from_this diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index 8d98a999a..805a1d731 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -200,6 +200,7 @@ QString CommandController::execCommand(const QString &textNoEmoji, } b->flags.set(MessageFlag::DoNotTriggerNotification); + b->flags.set(MessageFlag::Whisper); auto messagexD = b.release(); app->twitch.server->whispersChannel->addMessage(messagexD); diff --git a/src/messages/Message.hpp b/src/messages/Message.hpp index c8efc73d6..cdbb2a8d3 100644 --- a/src/messages/Message.hpp +++ b/src/messages/Message.hpp @@ -12,7 +12,7 @@ namespace chatterino { class MessageElement; -enum class MessageFlag : uint16_t { +enum class MessageFlag : uint32_t { None = 0, System = (1 << 0), Timeout = (1 << 1), @@ -30,6 +30,7 @@ enum class MessageFlag : uint16_t { DoNotLog = (1 << 13), AutoMod = (1 << 14), RecentMessage = (1 << 15), + Whisper = (1 << 16) }; using MessageFlags = FlagsEnum; diff --git a/src/messages/layouts/MessageLayoutContainer.hpp b/src/messages/layouts/MessageLayoutContainer.hpp index e248038a3..112f2bb3c 100644 --- a/src/messages/layouts/MessageLayoutContainer.hpp +++ b/src/messages/layouts/MessageLayoutContainer.hpp @@ -14,7 +14,7 @@ class QPainter; namespace chatterino { -enum class MessageFlag : uint16_t; +enum class MessageFlag : uint32_t; using MessageFlags = FlagsEnum; struct Margin { diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 27df7cb8c..8b9023ea6 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -248,6 +248,7 @@ void IrcMessageHandler::handleWhisperMessage(Communi::IrcMessage *message) if (!builder.isIgnored()) { + builder->flags.set(MessageFlag::Whisper); MessagePtr _message = builder.build(); app->twitch.server->lastUserThatWhisperedMe.set(builder.userName); diff --git a/src/widgets/helper/ChannelView.hpp b/src/widgets/helper/ChannelView.hpp index 4fa8dd53c..70b5fd0b4 100644 --- a/src/widgets/helper/ChannelView.hpp +++ b/src/widgets/helper/ChannelView.hpp @@ -25,7 +25,7 @@ using ChannelPtr = std::shared_ptr; struct Message; using MessagePtr = std::shared_ptr; -enum class MessageFlag : uint16_t; +enum class MessageFlag : uint32_t; using MessageFlags = FlagsEnum; class MessageLayout; From d6c5dd6d6c78daeff67eeefea4f29b07c6b4845a Mon Sep 17 00:00:00 2001 From: hemirt Date: Wed, 20 Mar 2019 20:58:21 +0100 Subject: [PATCH 005/138] do not disable whispers on timeout changed order to short-out the if clause when its not the correct user of the message --- src/common/Channel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index c34929620..6c84c2530 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -154,8 +154,9 @@ void Channel::addOrReplaceTimeout(MessagePtr message) for (int i = 0; i < snapshotLength; i++) { auto &s = snapshot[i]; - if (s->flags.hasNone({MessageFlag::Timeout, MessageFlag::Untimeout}) && - s->loginName == message->timeoutUser) + if (s->loginName == message->timeoutUser && + s->flags.hasNone({MessageFlag::Timeout, MessageFlag::Untimeout, + MessageFlag::Whisper})) { // FOURTF: disabled for now // PAJLADA: Shitty solution described in Message.hpp From 1c8373432ce5d7ab4e0ff3dcef7c3fd5ddb7e172 Mon Sep 17 00:00:00 2001 From: ckath Date: Sat, 23 Mar 2019 23:49:55 +0100 Subject: [PATCH 006/138] but dont fuck up the (dis/re)connected messages --- src/messages/layouts/MessageLayoutContainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/messages/layouts/MessageLayoutContainer.cpp b/src/messages/layouts/MessageLayoutContainer.cpp index c2b43f357..3c852a29d 100644 --- a/src/messages/layouts/MessageLayoutContainer.cpp +++ b/src/messages/layouts/MessageLayoutContainer.cpp @@ -165,7 +165,7 @@ void MessageLayoutContainer::breakLine() // { if (element->getRect().height() < this->textLineHeight_) { - yExtra -= (this->textLineHeight_ - element->getRect().height()) / 2; + //yExtra -= (this->textLineHeight_ - element->getRect().height()) / 2; } element->setPosition( From b49c21a515806081ae6e13a8e7990296603c72cb Mon Sep 17 00:00:00 2001 From: ckath Date: Sat, 23 Mar 2019 23:55:11 +0100 Subject: [PATCH 007/138] change comment to original so it doesnt cause a change --- src/messages/layouts/MessageLayoutContainer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/messages/layouts/MessageLayoutContainer.cpp b/src/messages/layouts/MessageLayoutContainer.cpp index 3c852a29d..f421b053a 100644 --- a/src/messages/layouts/MessageLayoutContainer.cpp +++ b/src/messages/layouts/MessageLayoutContainer.cpp @@ -165,7 +165,8 @@ void MessageLayoutContainer::breakLine() // { if (element->getRect().height() < this->textLineHeight_) { - //yExtra -= (this->textLineHeight_ - element->getRect().height()) / 2; + // yExtra -= (this->textLineHeight_ - element->getRect().height()) / + // 2; } element->setPosition( From 9ca4befd9b8b95b9873bb3c184bb0df7bf1e6205 Mon Sep 17 00:00:00 2001 From: ckath Date: Sun, 24 Mar 2019 15:38:09 +0100 Subject: [PATCH 008/138] Save chat moderation state in splits --- src/singletons/WindowManager.cpp | 1 + src/widgets/splits/SplitContainer.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index ca797be17..e90e04e02 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -516,6 +516,7 @@ void WindowManager::encodeNodeRecusively(SplitNode *node, QJsonObject &obj) case SplitNode::_Split: { obj.insert("type", "split"); + obj.insert("moderationMode", node->getSplit()->getModerationMode()); QJsonObject split; encodeChannel(node->getSplit()->getIndirectChannel(), split); obj.insert("data", split); diff --git a/src/widgets/splits/SplitContainer.cpp b/src/widgets/splits/SplitContainer.cpp index 6b94dd838..507cd20e3 100644 --- a/src/widgets/splits/SplitContainer.cpp +++ b/src/widgets/splits/SplitContainer.cpp @@ -689,6 +689,7 @@ void SplitContainer::decodeNodeRecusively(QJsonObject &obj, Node *node) auto *split = new Split(this); split->setChannel( WindowManager::decodeChannel(obj.value("data").toObject())); + split->setModerationMode(obj.value("moderationMode").toBool(false)); this->appendSplit(split); } @@ -711,6 +712,8 @@ void SplitContainer::decodeNodeRecusively(QJsonObject &obj, Node *node) auto *split = new Split(this); split->setChannel(WindowManager::decodeChannel( _obj.value("data").toObject())); + split->setModerationMode( + _obj.value("moderationMode").toBool(false)); Node *_node = new Node(); _node->parent_ = node; From 28967cb0141e749f61baf65f169057731ae1f22e Mon Sep 17 00:00:00 2001 From: Ruben Anders Date: Sun, 24 Mar 2019 02:23:14 +0100 Subject: [PATCH 009/138] Add broadcaster + VIPs to tabbable users --- src/providers/twitch/TwitchChannel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index a569de5ae..427d76619 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -58,7 +58,7 @@ namespace { } std::pair parseChatters(const QJsonObject &jsonRoot) { - static QStringList categories = {"moderators", "staff", "admins", + static QStringList categories = {"broadcaster", "vips", "moderators", "staff", "admins", "global_mods", "viewers"}; auto usernames = UsernameSet(); From da1b2f91d93e900174b66bf9e51b62a7003d6ceb Mon Sep 17 00:00:00 2001 From: hemirt Date: Thu, 4 Apr 2019 11:30:50 +0200 Subject: [PATCH 010/138] add broadcaster and vips to viewers list and chatters list (#991) --- src/providers/twitch/TwitchChannel.cpp | 5 +++-- src/widgets/splits/Split.cpp | 10 ++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 427d76619..9ce761324 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -58,8 +58,9 @@ namespace { } std::pair parseChatters(const QJsonObject &jsonRoot) { - static QStringList categories = {"broadcaster", "vips", "moderators", "staff", "admins", - "global_mods", "viewers"}; + static QStringList categories = {"broadcaster", "vips", "moderators", + "staff", "admins", "global_mods", + "viewers"}; auto usernames = UsernameSet(); diff --git a/src/widgets/splits/Split.cpp b/src/widgets/splits/Split.cpp index ebc9c6e83..785665dde 100644 --- a/src/widgets/splits/Split.cpp +++ b/src/widgets/splits/Split.cpp @@ -538,10 +538,12 @@ void Split::showViewerList() auto chattersList = new QListWidget(); auto resultList = new QListWidget(); - static QStringList labels = {"Broadcaster", "Moderators", "Staff", - "Admins", "Global Moderators", "Viewers"}; - static QStringList jsonLabels = {"broadcaster", "moderators", "staff", - "admins", "global_mods", "viewers"}; + static QStringList labels = {"Broadcaster", "Vips", "Moderators", + "Staff", "Admins", "Global Moderators", + "Viewers"}; + static QStringList jsonLabels = {"broadcaster", "vips", "moderators", + "staff", "admins", "global_mods", + "viewers"}; QList labelList; for (auto &x : labels) { From 66294ed99b6aef6dbda1553c31bf4c0d3048d3f9 Mon Sep 17 00:00:00 2001 From: ckath Date: Wed, 27 Mar 2019 19:15:37 +0100 Subject: [PATCH 011/138] add account switcher popup flag for linux --- src/widgets/AccountSwitchPopupWidget.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/widgets/AccountSwitchPopupWidget.cpp b/src/widgets/AccountSwitchPopupWidget.cpp index 6e9cfcebe..693fe6da0 100644 --- a/src/widgets/AccountSwitchPopupWidget.cpp +++ b/src/widgets/AccountSwitchPopupWidget.cpp @@ -14,6 +14,9 @@ AccountSwitchPopupWidget::AccountSwitchPopupWidget(QWidget *parent) : QWidget(parent) { this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); +#ifdef Q_OS_LINUX + this->setWindowFlag(Qt::Popup); +#endif this->setContentsMargins(0, 0, 0, 0); From 81a4bff1314958612fcd75d7e67c4fe0dfc1cde5 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 4 Apr 2019 11:47:54 +0200 Subject: [PATCH 012/138] Implement Randers00's recent-messages API (WIP) --- src/providers/twitch/TwitchChannel.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 9ce761324..e1afffd20 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -577,11 +577,9 @@ Outcome TwitchChannel::parseLiveStatus(const rapidjson::Document &document) void TwitchChannel::loadRecentMessages() { static QString genericURL = - "https://tmi.twitch.tv/api/rooms/%1/recent_messages?client_id=" + - getDefaultClientID(); + "https://recent-messages.robotty.de/v1/recent-messages/%1"; - NetworkRequest request(genericURL.arg(this->roomId())); - request.makeAuthorizedV5(getDefaultClientID()); + NetworkRequest request(genericURL.arg(this->getName())); request.setCaller(QThread::currentThread()); // can't be concurrent right now due to SignalVector // request.setExecuteConcurrently(true); From b3af777382ca17866c71718feb01ce8211d8fb2b Mon Sep 17 00:00:00 2001 From: ckath Date: Sun, 24 Mar 2019 00:54:56 +0100 Subject: [PATCH 013/138] add back settings for hiding buttons --- src/widgets/settingspages/GeneralPage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 2d188a60a..19f50e15c 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -190,6 +190,8 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addCheckbox("Show tab close button", s.showTabCloseButton); layout.addCheckbox("Show input when empty", s.showEmptyInput); layout.addCheckbox("Show input message length", s.showMessageLength); + layout.addCheckbox("Hide preferences button (ctrl+p to show)", s.hidePreferencesButton); + layout.addCheckbox("Hide user button", s.hideUserButton); layout.addTitle("Messages"); layout.addCheckbox("Timestamps", s.showTimestamps); From fac1a6d00ca205c43961ae4937de6f53a0665b76 Mon Sep 17 00:00:00 2001 From: ckath Date: Sun, 24 Mar 2019 01:04:25 +0100 Subject: [PATCH 014/138] comply to style guies --- src/widgets/settingspages/GeneralPage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 19f50e15c..fe391debd 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -190,7 +190,8 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addCheckbox("Show tab close button", s.showTabCloseButton); layout.addCheckbox("Show input when empty", s.showEmptyInput); layout.addCheckbox("Show input message length", s.showMessageLength); - layout.addCheckbox("Hide preferences button (ctrl+p to show)", s.hidePreferencesButton); + layout.addCheckbox("Hide preferences button (ctrl+p to show)", + s.hidePreferencesButton); layout.addCheckbox("Hide user button", s.hideUserButton); layout.addTitle("Messages"); From a2fa1bad6b4ec3cc8dbedaef2a1ae4b513324063 Mon Sep 17 00:00:00 2001 From: ckath Date: Thu, 28 Mar 2019 19:09:09 +0100 Subject: [PATCH 015/138] disable requests to resolve link info when its disabled --- src/providers/LinkResolver.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/providers/LinkResolver.cpp b/src/providers/LinkResolver.cpp index d7cc3a1f5..33848e019 100644 --- a/src/providers/LinkResolver.cpp +++ b/src/providers/LinkResolver.cpp @@ -12,9 +12,12 @@ namespace chatterino { void LinkResolver::getLinkInfo( const QString url, std::function successCallback) { + if (!getSettings()->linkInfoTooltip) { + successCallback("No link info loaded", Link(Link::Url, url)); + return; + } QString requestUrl("https://braize.pajlada.com/chatterino/link_resolver/" + QUrl::toPercentEncoding(url, "", "/:")); - // Uncomment to test crashes // QTimer::singleShot(3000, [=]() { NetworkRequest request(requestUrl); From 12600b553f17b569ae276912ddada66e9075ac1f Mon Sep 17 00:00:00 2001 From: apa420 Date: Fri, 5 Apr 2019 21:39:04 +0200 Subject: [PATCH 016/138] Made wording more consistent in generalpage --- src/widgets/settingspages/GeneralPage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 2d188a60a..825782109 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -198,8 +198,8 @@ void GeneralPage::initLayout(SettingsLayout &layout) s.timestampFormat, true); layout.addDropdown( "Collapse messages", - {"Never", "Longer than 2 lines", "Longer than 3 lines", - "Longer than 4 lines", "Longer than 5 lines"}, + {"Never", "After 2 lines", "After 3 lines", "After 4 lines", + "After 5 lines"}, s.collpseMessagesMinLines, [](auto val) { return val ? QString("After ") + QString::number(val) + " lines" From 562bdae09f46fd3343322a2f7a93dcebaa796d43 Mon Sep 17 00:00:00 2001 From: apa420 Date: Wed, 10 Apr 2019 15:32:18 +0200 Subject: [PATCH 017/138] Option to hide moderated messages (timed out messages) --- src/messages/layouts/MessageLayout.cpp | 6 +++++- src/singletons/Settings.hpp | 2 ++ src/widgets/settingspages/GeneralPage.cpp | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index e80a1b2c6..3dfb0e68e 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -127,7 +127,11 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags) for (const auto &element : this->message_->elements) { - element->addToContainer(*this->container_, _flags); + if (!(getSettings()->removeModerated && + this->message_->flags.has(MessageFlag::Disabled))) + { + element->addToContainer(*this->container_, _flags); + } } if (addTest) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 953374193..c041246e9 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -41,6 +41,8 @@ public: BoolSetting separateMessages = {"/appearance/messages/separateMessages", false}; BoolSetting compactEmotes = {"/appearance/messages/compactEmotes", true}; + BoolSetting removeModerated = {"/appearance/messages/removeModerated", + false}; // BoolSetting collapseLongMessages = // {"/appearance/messages/collapseLongMessages", false}; diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 2d188a60a..dc9fc9ad4 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -210,6 +210,7 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addCheckbox("Alternate background color", s.alternateMessages); // layout.addCheckbox("Mark last message you read"); // layout.addDropdown("Last read message style", {"Default"}); + layout.addCheckbox("Remove moderated messages", s.removeModerated); layout.addTitle("Emotes"); layout.addDropdown( From 00d4fbf9eddb4a613893fc4c3cd0f37dc38ff1ec Mon Sep 17 00:00:00 2001 From: Ruben Anders Date: Thu, 11 Apr 2019 12:00:57 +0200 Subject: [PATCH 018/138] Add {channel} replacement --- src/widgets/helper/ChannelView.cpp | 2 +- src/widgets/settingspages/ModerationPage.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index 682a976d7..9578c352a 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -1667,7 +1667,7 @@ void ChannelView::handleLinkClick(QMouseEvent *event, const Link &link, case Link::UserAction: { QString value = link.value; - value.replace("{user}", layout->getMessage()->loginName); + value.replace("{user}", layout->getMessage()->loginName).replace("{channel}", this->channel_->getName()); this->channel_->sendMessage(value); } break; diff --git a/src/widgets/settingspages/ModerationPage.cpp b/src/widgets/settingspages/ModerationPage.cpp index 422da3c05..3349d2e93 100644 --- a/src/widgets/settingspages/ModerationPage.cpp +++ b/src/widgets/settingspages/ModerationPage.cpp @@ -161,7 +161,7 @@ ModerationPage::ModerationPage() // clang-format off auto label = modMode.emplace( "Moderation mode is enabled by clicking in a channel that you moderate.

" - "Moderation buttons can be bound to chat commands such as \"/ban {user}\", \"/timeout {user} 1000\" or any other custom text commands.
"); + "Moderation buttons can be bound to chat commands such as \"/ban {user}\", \"/timeout {user} 1000\", \"/w someusername !report {user} was bad in channel {channel}\" or any other custom text commands.
"); label->setWordWrap(true); label->setStyleSheet("color: #bbb"); // clang-format on From 320d74b287cdf55de971b5a74f1f4dd8f75c3f19 Mon Sep 17 00:00:00 2001 From: pphop <1um6okote@gmail.com> Date: Sat, 13 Apr 2019 01:12:39 +0500 Subject: [PATCH 019/138] implement show ignored users setting --- src/controllers/ignores/IgnoreController.hpp | 2 ++ src/providers/twitch/TwitchMessageBuilder.cpp | 12 +++++++++++ src/singletons/Settings.hpp | 1 + src/widgets/settingspages/IgnoresPage.cpp | 20 +++++++++++++++++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/controllers/ignores/IgnoreController.hpp b/src/controllers/ignores/IgnoreController.hpp index 10c83ac10..59efc4a47 100644 --- a/src/controllers/ignores/IgnoreController.hpp +++ b/src/controllers/ignores/IgnoreController.hpp @@ -12,6 +12,8 @@ class Paths; class IgnoreModel; +enum ShowIgnoredUsersMessages { Never, IfModerator, IfBroadcaster }; + class IgnoreController final : public Singleton { public: diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index b8c34cc65..aad1228bd 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -80,6 +80,18 @@ bool TwitchMessageBuilder::isIgnored() const { if (sourceUserID == user.id) { + switch (getSettings()->showIgnoredUsersMessages) + { + case ShowIgnoredUsersMessages::IfModerator: + if (this->channel->isMod() || + this->channel->isBroadcaster()) + return false; + break; + case ShowIgnoredUsersMessages::IfBroadcaster: + if (this->channel->isBroadcaster()) + return false; + break; + } log("Blocking message because it's from blocked user {}", user.name); return true; diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 953374193..ff71733cb 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -128,6 +128,7 @@ public: /// Ingored Users BoolSetting enableTwitchIgnoredUsers = {"/ignore/enableTwitchIgnoredUsers", true}; + IntSetting showIgnoredUsersMessages = {"/ignore/showIgnoredUsers", 0}; /// Moderation QStringSetting timeoutAction = {"/moderation/timeoutAction", "Disable"}; diff --git a/src/widgets/settingspages/IgnoresPage.cpp b/src/widgets/settingspages/IgnoresPage.cpp index 122dc1109..daf941cf6 100644 --- a/src/widgets/settingspages/IgnoresPage.cpp +++ b/src/widgets/settingspages/IgnoresPage.cpp @@ -77,8 +77,24 @@ void addUsersTab(IgnoresPage &page, LayoutCreator users, auto anyways = users.emplace().withoutMargin(); { - anyways.emplace("Show anyways if:"); - anyways.emplace(); + anyways.emplace("Show messages from ignored users anyways:"); + + auto combo = anyways.emplace().getElement(); + combo->addItems( + {"Never", "If you are Moderator", "If you are Broadcaster"}); + + auto &setting = getSettings()->showIgnoredUsersMessages; + + setting.connect( + [combo](const int value) { combo->setCurrentIndex(value); }); + + QObject::connect(combo, + QOverload::of(&QComboBox::currentIndexChanged), + [&setting](int index) { + if (index != -1) + setting = index; + }); + anyways->addStretch(1); } From 13475332fb22fc1e8001f212dbf7e512007698a0 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 13 Apr 2019 15:26:47 +0200 Subject: [PATCH 020/138] Adds VIP rate limit support Closes #875 --- src/common/Channel.cpp | 5 ++ src/common/Channel.hpp | 1 + src/providers/twitch/IrcMessageHandler.cpp | 59 ++++++++++++++++------ src/providers/twitch/TwitchChannel.cpp | 37 +++++++++++++- src/providers/twitch/TwitchChannel.hpp | 7 +++ src/providers/twitch/TwitchServer.cpp | 9 ++-- 6 files changed, 98 insertions(+), 20 deletions(-) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index 8d247cf2f..570ea64f1 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -239,6 +239,11 @@ bool Channel::hasModRights() const return this->isMod() || this->isBroadcaster(); } +bool Channel::hasHighRateLimit() const +{ + return this->isMod() || this->isBroadcaster(); +} + bool Channel::isLive() const { return false; diff --git a/src/common/Channel.hpp b/src/common/Channel.hpp index 9e111aa46..097957569 100644 --- a/src/common/Channel.hpp +++ b/src/common/Channel.hpp @@ -70,6 +70,7 @@ public: virtual bool isMod() const; virtual bool isBroadcaster() const; virtual bool hasModRights() const; + virtual bool hasHighRateLimit() const; virtual bool isLive() const; virtual bool shouldIgnoreHighlights() const; diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 27df7cb8c..c5526d44a 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -20,6 +20,24 @@ namespace chatterino { +static QMap parseBadges(QString badgesString) +{ + QMap badges; + + for (auto badgeData : badgesString.split(',')) + { + auto parts = badgeData.split('/'); + if (parts.length() != 2) + { + continue; + } + + badges.insert(parts[0], parts[1]); + } + + return badges; +} + IrcMessageHandler &IrcMessageHandler::getInstance() { static IrcMessageHandler instance; @@ -207,24 +225,35 @@ void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message) void IrcMessageHandler::handleUserStateMessage(Communi::IrcMessage *message) { - QVariant _mod = message->tag("mod"); + auto app = getApp(); + QString channelName; + if (!trimChannelName(message->parameter(0), channelName)) + { + return; + } + + auto c = app->twitch.server->getChannelOrEmpty(channelName); + if (c->isEmpty()) + { + return; + } + + QVariant _badges = message->tag("badges"); + if (_badges.isValid()) + { + TwitchChannel *tc = dynamic_cast(c.get()); + if (tc != nullptr) + { + auto parsedBadges = parseBadges(_badges.toString()); + tc->setVIP(parsedBadges.contains("vip")); + tc->setStaff(parsedBadges.contains("staff")); + } + } + + QVariant _mod = message->tag("mod"); if (_mod.isValid()) { - auto app = getApp(); - - QString channelName; - if (!trimChannelName(message->parameter(0), channelName)) - { - return; - } - - auto c = app->twitch.server->getChannelOrEmpty(channelName); - if (c->isEmpty()) - { - return; - } - TwitchChannel *tc = dynamic_cast(c.get()); if (tc != nullptr) { diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index e1afffd20..9551a476c 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -200,7 +200,7 @@ void TwitchChannel::sendMessage(const QString &message) return; } - if (!this->hasModRights()) + if (!this->hasHighRateLimit()) { if (getSettings()->allowDuplicateMessages) { @@ -226,6 +226,16 @@ bool TwitchChannel::isMod() const return this->mod_; } +bool TwitchChannel::isVIP() const +{ + return this->vip_; +} + +bool TwitchChannel::isStaff() const +{ + return this->staff_; +} + void TwitchChannel::setMod(bool value) { if (this->mod_ != value) @@ -236,6 +246,26 @@ void TwitchChannel::setMod(bool value) } } +void TwitchChannel::setVIP(bool value) +{ + if (this->vip_ != value) + { + this->vip_ = value; + + this->userStateChanged.invoke(); + } +} + +void TwitchChannel::setStaff(bool value) +{ + if (this->staff_ != value) + { + this->staff_ = value; + + this->userStateChanged.invoke(); + } +} + bool TwitchChannel::isBroadcaster() const { auto app = getApp(); @@ -243,6 +273,11 @@ bool TwitchChannel::isBroadcaster() const return this->getName() == app->accounts->twitch.getCurrent()->getUserName(); } +bool TwitchChannel::hasHighRateLimit() const +{ + return this->isMod() || this->isBroadcaster() || this->isVIP(); +} + void TwitchChannel::addRecentChatter(const MessagePtr &message) { this->chatters_.access()->insert(message->displayName); diff --git a/src/providers/twitch/TwitchChannel.hpp b/src/providers/twitch/TwitchChannel.hpp index 0383cd43d..00a6c9513 100644 --- a/src/providers/twitch/TwitchChannel.hpp +++ b/src/providers/twitch/TwitchChannel.hpp @@ -61,7 +61,10 @@ public: virtual bool canSendMessage() const override; virtual void sendMessage(const QString &message) override; virtual bool isMod() const override; + bool isVIP() const; + bool isStaff() const; virtual bool isBroadcaster() const override; + virtual bool hasHighRateLimit() const override; // Data const QString &subscriptionUrl(); @@ -123,6 +126,8 @@ private: void addPartedUser(const QString &user); void setLive(bool newLiveStatus); void setMod(bool value); + void setVIP(bool value); + void setStaff(bool value); void setRoomId(const QString &id); void setRoomModes(const RoomModes &roomModes_); @@ -151,6 +156,8 @@ private: FfzModBadge ffzCustomModBadge_; bool mod_ = false; + bool vip_ = false; + bool staff_ = false; UniqueAccess roomID_; UniqueAccess joinedUsers_; diff --git a/src/providers/twitch/TwitchServer.cpp b/src/providers/twitch/TwitchServer.cpp index b12a46190..349e40357 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -293,10 +293,11 @@ void TwitchServer::onMessageSendRequested(TwitchChannel *channel, std::lock_guard guard(this->lastMessageMutex_); // std::queue - auto &lastMessage = channel->hasModRights() ? this->lastMessageMod_ - : this->lastMessagePleb_; - size_t maxMessageCount = channel->hasModRights() ? 99 : 19; - auto minMessageOffset = (channel->hasModRights() ? 100ms : 1100ms); + auto &lastMessage = channel->hasHighRateLimit() + ? this->lastMessageMod_ + : this->lastMessagePleb_; + size_t maxMessageCount = channel->hasHighRateLimit() ? 99 : 19; + auto minMessageOffset = (channel->hasHighRateLimit() ? 100ms : 1100ms); auto now = std::chrono::steady_clock::now(); From a4cba22bcbea250e337ab7567ad602122829b543 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 13 Apr 2019 16:38:01 +0200 Subject: [PATCH 021/138] reformat --- src/common/Channel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index 570ea64f1..15d18f267 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -78,7 +78,7 @@ void Channel::addMessage(MessagePtr message, // FOURTF: change this when adding more providers if (this->isTwitchChannel() && - (!overridingFlags || !overridingFlags->has(MessageFlag::DoNotLog))) + (!overridingFlags || !overridingFlags->has(MessageFlag::DoNotLog))) { app->logging->addMessage(this->name_, message); } From 8b3867fa7da606e09906728ac81f455af2a0c852 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 13 Apr 2019 19:14:58 +0200 Subject: [PATCH 022/138] Switch to v2 of RAnders00's recent-messages API, so we support showing old sub messages and stuff --- src/providers/twitch/IrcMessageHandler.cpp | 148 +++++++++++++++--- src/providers/twitch/IrcMessageHandler.hpp | 21 +++ src/providers/twitch/TwitchChannel.cpp | 39 +++-- src/providers/twitch/TwitchMessageBuilder.cpp | 14 +- 4 files changed, 183 insertions(+), 39 deletions(-) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index c5526d44a..be01f5b0e 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -44,6 +44,46 @@ IrcMessageHandler &IrcMessageHandler::getInstance() return instance; } +std::vector IrcMessageHandler::parseMessage( + Channel *channel, Communi::IrcMessage *message) +{ + std::vector builtMessages; + + auto command = message->command(); + + if (command == "PRIVMSG") + { + return this->parsePrivMessage( + channel, static_cast(message)); + } + else if (command == "USERNOTICE") + { + return this->parseUserNoticeMessage(channel, message); + } + else if (command == "NOTICE") + { + return this->parseNoticeMessage( + static_cast(message)); + } + + return builtMessages; +} + +std::vector IrcMessageHandler::parsePrivMessage( + Channel *channel, Communi::IrcPrivateMessage *message) +{ + log("Parse priv msg"); + std::vector builtMessages; + MessageParseArgs args; + TwitchMessageBuilder builder(channel, message, args, message->content(), + message->isAction()); + if (!builder.isIgnored()) + { + builtMessages.emplace_back(builder.build()); + } + return builtMessages; +} + void IrcMessageHandler::handlePrivMessage(Communi::IrcPrivateMessage *message, TwitchServer &server) { @@ -302,6 +342,56 @@ void IrcMessageHandler::handleWhisperMessage(Communi::IrcMessage *message) } } +std::vector IrcMessageHandler::parseUserNoticeMessage( + Channel *channel, Communi::IrcMessage *message) +{ + std::vector builtMessages; + + auto data = message->toData(); + + auto tags = message->tags(); + auto parameters = message->parameters(); + + auto target = parameters[0]; + QString msgType = tags.value("msg-id", "").toString(); + QString content; + if (parameters.size() >= 2) + { + content = parameters[1]; + } + + if (msgType == "sub" || msgType == "resub" || msgType == "subgift") + { + // Sub-specific message. I think it's only allowed for "resub" messages + // atm + if (!content.isEmpty()) + { + MessageParseArgs args; + args.trimSubscriberUsername = true; + + TwitchMessageBuilder builder(channel, message, args, content, + false); + builder->flags.set(MessageFlag::Subscription); + builder->flags.unset(MessageFlag::Highlighted); + builtMessages.emplace_back(builder.build()); + } + } + + auto it = tags.find("system-msg"); + + if (it != tags.end()) + { + auto b = MessageBuilder(systemMessage, + parseTagString(it.value().toString())); + + b->flags.set(MessageFlag::Subscription); + auto newMessage = b.release(); + builtMessages.emplace_back(newMessage); + } + + return builtMessages; +} + void IrcMessageHandler::handleUserNoticeMessage(Communi::IrcMessage *message, TwitchServer &server) { @@ -381,35 +471,49 @@ void IrcMessageHandler::handleModeMessage(Communi::IrcMessage *message) } } +std::vector IrcMessageHandler::parseNoticeMessage( + Communi::IrcNoticeMessage *message) +{ + std::vector builtMessages; + + builtMessages.emplace_back(makeSystemMessage(message->content())); + + return builtMessages; +} + void IrcMessageHandler::handleNoticeMessage(Communi::IrcNoticeMessage *message) { auto app = getApp(); - MessagePtr msg = makeSystemMessage(message->content()); + auto builtMessages = this->parseNoticeMessage(message); - QString channelName; - if (!trimChannelName(message->target(), channelName)) + for (auto msg : builtMessages) { - // Notice wasn't targeted at a single channel, send to all twitch - // channels - app->twitch.server->forEachChannelAndSpecialChannels( - [msg](const auto &c) { - c->addMessage(msg); // - }); + QString channelName; + if (!trimChannelName(message->target(), channelName)) + { + // Notice wasn't targeted at a single channel, send to all twitch + // channels + app->twitch.server->forEachChannelAndSpecialChannels( + [msg](const auto &c) { + c->addMessage(msg); // + }); - return; + return; + } + + auto channel = app->twitch.server->getChannelOrEmpty(channelName); + + if (channel->isEmpty()) + { + log("[IrcManager:handleNoticeMessage] Channel {} not found in " + "channel " + "manager ", + channelName); + return; + } + + channel->addMessage(msg); } - - auto channel = app->twitch.server->getChannelOrEmpty(channelName); - - if (channel->isEmpty()) - { - log("[IrcManager:handleNoticeMessage] Channel {} not found in channel " - "manager ", - channelName); - return; - } - - channel->addMessage(msg); } void IrcMessageHandler::handleWriteConnectionNoticeMessage( diff --git a/src/providers/twitch/IrcMessageHandler.hpp b/src/providers/twitch/IrcMessageHandler.hpp index 40f1efb12..0474f097b 100644 --- a/src/providers/twitch/IrcMessageHandler.hpp +++ b/src/providers/twitch/IrcMessageHandler.hpp @@ -1,10 +1,12 @@ #pragma once #include +#include "messages/Message.hpp" namespace chatterino { class TwitchServer; +class Channel; class IrcMessageHandler { @@ -13,6 +15,13 @@ class IrcMessageHandler public: static IrcMessageHandler &getInstance(); + // parseMessage parses a single IRC message into 0+ Chatterino messages + std::vector parseMessage(Channel *channel, + Communi::IrcMessage *message); + + // parsePrivMessage arses a single IRC PRIVMSG into 0-1 Chatterino messages + std::vector parsePrivMessage( + Channel *channel, Communi::IrcPrivateMessage *message); void handlePrivMessage(Communi::IrcPrivateMessage *message, TwitchServer &server); @@ -20,10 +29,22 @@ public: void handleClearChatMessage(Communi::IrcMessage *message); void handleUserStateMessage(Communi::IrcMessage *message); void handleWhisperMessage(Communi::IrcMessage *message); + + // parseUserNoticeMessage parses a single IRC USERNOTICE message into 0+ + // chatterino messages + std::vector parseUserNoticeMessage( + Channel *channel, Communi::IrcMessage *message); void handleUserNoticeMessage(Communi::IrcMessage *message, TwitchServer &server); + void handleModeMessage(Communi::IrcMessage *message); + + // parseNoticeMessage parses a single IRC NOTICE message into 0+ chatterino + // messages + std::vector parseNoticeMessage( + Communi::IrcNoticeMessage *message); void handleNoticeMessage(Communi::IrcNoticeMessage *message); + void handleWriteConnectionNoticeMessage(Communi::IrcNoticeMessage *message); void handleJoinMessage(Communi::IrcMessage *message); diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 9551a476c..c32fb138e 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -9,6 +9,7 @@ #include "messages/Message.hpp" #include "providers/bttv/BttvEmotes.hpp" #include "providers/bttv/LoadBttvChannelEmote.hpp" +#include "providers/twitch/IrcMessageHandler.hpp" #include "providers/twitch/PubsubClient.hpp" #include "providers/twitch/TwitchCommon.hpp" #include "providers/twitch/TwitchMessageBuilder.hpp" @@ -29,10 +30,12 @@ namespace chatterino { namespace { + // parseRecentMessages takes a json object and returns a vector of + // Communi IrcMessages auto parseRecentMessages(const QJsonObject &jsonRoot, ChannelPtr channel) { QJsonArray jsonMessages = jsonRoot.value("messages").toArray(); - std::vector messages; + std::vector messages; if (jsonMessages.empty()) return messages; @@ -40,18 +43,8 @@ namespace { for (const auto jsonMessage : jsonMessages) { auto content = jsonMessage.toString().toUtf8(); - // passing nullptr as the channel makes the message invalid but we - // don't check for that anyways - auto message = Communi::IrcMessage::fromData(content, nullptr); - auto privMsg = dynamic_cast(message); - assert(privMsg); - - MessageParseArgs args; - TwitchMessageBuilder builder(channel.get(), privMsg, args); - builder.message().flags.set(MessageFlag::RecentMessage); - - if (!builder.isIgnored()) - messages.push_back(builder.build()); + messages.emplace_back( + Communi::IrcMessage::fromData(content, nullptr)); } return messages; @@ -611,8 +604,8 @@ Outcome TwitchChannel::parseLiveStatus(const rapidjson::Document &document) void TwitchChannel::loadRecentMessages() { - static QString genericURL = - "https://recent-messages.robotty.de/v1/recent-messages/%1"; + static QString genericURL = "https://recent-messages.robotty.de/api/v2/" + "recent-messages/%1?clearchatToNotice=true"; NetworkRequest request(genericURL.arg(this->getName())); request.setCaller(QThread::currentThread()); @@ -626,7 +619,21 @@ void TwitchChannel::loadRecentMessages() auto messages = parseRecentMessages(result.parseJson(), shared); - shared->addMessagesAtStart(messages); + auto &handler = IrcMessageHandler::getInstance(); + + std::vector allBuiltMessages; + + for (auto message : messages) + { + for (auto builtMessage : + handler.parseMessage(shared.get(), message)) + { + builtMessage->flags.set(MessageFlag::RecentMessage); + allBuiltMessages.emplace_back(builtMessage); + } + } + + shared->addMessagesAtStart(allBuiltMessages); return Success; }); diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index b8c34cc65..3f1f94b9f 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -109,12 +109,24 @@ MessagePtr TwitchMessageBuilder::build() this->appendChannelName(); + if (this->tags.contains("rm-deleted")) + { + this->message().flags.set(MessageFlag::Disabled); + } + // timestamp bool isPastMsg = this->tags.contains("historical"); if (isPastMsg) { // This may be architecture dependent(datatype) - qint64 ts = this->tags.value("tmi-sent-ts").toLongLong(); + bool customReceived = false; + qint64 ts = + this->tags.value("rm-received-ts").toLongLong(&customReceived); + if (!customReceived) + { + ts = this->tags.value("tmi-sent-ts").toLongLong(); + } + QDateTime dateTime = QDateTime::fromMSecsSinceEpoch(ts); this->emplace(dateTime.time()); } From de4bc02b66288601d3c9656614f197efdc27fd19 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 13 Apr 2019 19:23:11 +0200 Subject: [PATCH 023/138] Add ability to easily swap out the recent messages API with your own Environment variable: CHATTERINO2_RECENT_MESSAGES_URL For now, the API structure of the recent messages API is undocumented, but once it's released it will have some documentation that describes how to run it yourself, and it should be easy enough to just make your own API that fits --- src/providers/twitch/TwitchChannel.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index c32fb138e..027d4213e 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -604,8 +604,17 @@ Outcome TwitchChannel::parseLiveStatus(const rapidjson::Document &document) void TwitchChannel::loadRecentMessages() { - static QString genericURL = "https://recent-messages.robotty.de/api/v2/" - "recent-messages/%1?clearchatToNotice=true"; + static QString genericURL = [] { + QString url("https://recent-messages.robotty.de/api/v2/recent-messages/" + "%1?clearchatToNotice=true"); + auto envString = std::getenv("CHATTERINO2_RECENT_MESSAGES_URL"); + if (envString != nullptr) + { + url = envString; + } + + return url; + }(); NetworkRequest request(genericURL.arg(this->getName())); request.setCaller(QThread::currentThread()); From e4d3e6de7f28cf14efd57c858f411864e3305b45 Mon Sep 17 00:00:00 2001 From: pphop <1um6okote@gmail.com> Date: Sun, 14 Apr 2019 19:57:41 +0500 Subject: [PATCH 024/138] requested changes --- src/controllers/ignores/IgnoreController.hpp | 2 +- src/providers/twitch/TwitchMessageBuilder.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/controllers/ignores/IgnoreController.hpp b/src/controllers/ignores/IgnoreController.hpp index 59efc4a47..1279f4a88 100644 --- a/src/controllers/ignores/IgnoreController.hpp +++ b/src/controllers/ignores/IgnoreController.hpp @@ -12,7 +12,7 @@ class Paths; class IgnoreModel; -enum ShowIgnoredUsersMessages { Never, IfModerator, IfBroadcaster }; +enum class ShowIgnoredUsersMessages { Never, IfModerator, IfBroadcaster }; class IgnoreController final : public Singleton { diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index aad1228bd..cd1d78cb4 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -80,7 +80,8 @@ bool TwitchMessageBuilder::isIgnored() const { if (sourceUserID == user.id) { - switch (getSettings()->showIgnoredUsersMessages) + switch (static_cast( + getSettings()->showIgnoredUsersMessages.getValue())) { case ShowIgnoredUsersMessages::IfModerator: if (this->channel->isMod() || From ac9106e2f51f5686c1f9ac7b3fc853f6cdd95f25 Mon Sep 17 00:00:00 2001 From: apa420 Date: Mon, 15 Apr 2019 22:55:10 +0200 Subject: [PATCH 025/138] Will now also remove the messages when the timeout occurs, it's a bad implementation of it though, should be better --- src/providers/twitch/IrcMessageHandler.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 27df7cb8c..f5d8686f4 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -203,6 +203,10 @@ void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message) // refresh all app->windows->repaintVisibleChatWidgets(chan.get()); + if (getSettings()->removeModerated) + { + app->windows->forceLayoutChannelViews(); + } } void IrcMessageHandler::handleUserStateMessage(Communi::IrcMessage *message) From 817c40d7335d564812cd0c79cbe0d46637e75006 Mon Sep 17 00:00:00 2001 From: apa420 Date: Tue, 16 Apr 2019 14:36:15 +0200 Subject: [PATCH 026/138] Added continue for readability and removed to hide moderated messages --- src/messages/layouts/MessageLayout.cpp | 7 ++++--- src/providers/twitch/IrcMessageHandler.cpp | 2 +- src/singletons/Settings.hpp | 3 +-- src/widgets/settingspages/GeneralPage.cpp | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index 3dfb0e68e..a7ba26756 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -127,11 +127,12 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags) for (const auto &element : this->message_->elements) { - if (!(getSettings()->removeModerated && - this->message_->flags.has(MessageFlag::Disabled))) + if (getSettings()->hideModerated && + this->message_->flags.has(MessageFlag::Disabled)) { - element->addToContainer(*this->container_, _flags); + continue; } + element->addToContainer(*this->container_, _flags); } if (addTest) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index f5d8686f4..5e15e3682 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -203,7 +203,7 @@ void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message) // refresh all app->windows->repaintVisibleChatWidgets(chan.get()); - if (getSettings()->removeModerated) + if (getSettings()->hideModerated) { app->windows->forceLayoutChannelViews(); } diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index c041246e9..9dcd9a1be 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -41,8 +41,7 @@ public: BoolSetting separateMessages = {"/appearance/messages/separateMessages", false}; BoolSetting compactEmotes = {"/appearance/messages/compactEmotes", true}; - BoolSetting removeModerated = {"/appearance/messages/removeModerated", - false}; + BoolSetting hideModerated = {"/appearance/messages/hideModerated", false}; // BoolSetting collapseLongMessages = // {"/appearance/messages/collapseLongMessages", false}; diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index dc9fc9ad4..2e6b7b15b 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -210,7 +210,7 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addCheckbox("Alternate background color", s.alternateMessages); // layout.addCheckbox("Mark last message you read"); // layout.addDropdown("Last read message style", {"Default"}); - layout.addCheckbox("Remove moderated messages", s.removeModerated); + layout.addCheckbox("Hide moderated messages", s.hideModerated); layout.addTitle("Emotes"); layout.addDropdown( From 0c7807d400e1af628b6e0e398b8173a34b6064e5 Mon Sep 17 00:00:00 2001 From: fourtf Date: Wed, 17 Apr 2019 16:59:52 +0200 Subject: [PATCH 027/138] added script to update SOURCES and HEADERS in chatternio.pro --- update_filelist.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 update_filelist.py diff --git a/update_filelist.py b/update_filelist.py new file mode 100644 index 000000000..411f28d24 --- /dev/null +++ b/update_filelist.py @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import os +import re +import subprocess + +dir_path = os.path.dirname(os.path.realpath(__file__)) +filename = 'chatterino.pro' +data = "" + +with open(filename, 'r') as project: + data = project.read() + sources = subprocess.getoutput("find ./src -type f -regex '.*\.cpp' | sed 's_\./_ _g'") + sources = re.sub(r'$', r' \\\\', sources, flags=re.MULTILINE) + sources += "\n" + data = re.sub(r'^SOURCES(.|\r|\n)*?^$', 'SOURCES += \\\n' + sources, data, flags=re.MULTILINE) + + headers = subprocess.getoutput("find ./src -type f -regex '.*\.hpp' | sed 's_\./_ _g'") + headers = re.sub(r'$', r' \\\\', headers, flags=re.MULTILINE) + headers += "\n" + data = re.sub(r'^HEADERS(.|\r|\n)*?^$', 'HEADERS += \\\n' + headers, data, flags=re.MULTILINE) + +with open(filename, 'w') as project: + project.write(data) + From 9be0d7d458267ee99e35aa4976781266a89b4132 Mon Sep 17 00:00:00 2001 From: fourtf Date: Wed, 17 Apr 2019 17:02:13 +0200 Subject: [PATCH 028/138] removed red stripes and connected tape cut visuals --- chatterino.pro | 808 +++++++++--------- src/messages/HistoricMessageAppearance.hpp | 10 - src/messages/layouts/MessageLayout.cpp | 40 +- src/messages/layouts/MessageLayoutElement.cpp | 68 -- src/messages/layouts/MessageLayoutElement.hpp | 21 - src/providers/irc/AbstractIrcServer.cpp | 1 - src/singletons/Settings.hpp | 5 - src/widgets/settingspages/GeneralPage.cpp | 46 +- src/widgets/settingspages/LookPage.cpp | 6 - 9 files changed, 408 insertions(+), 597 deletions(-) delete mode 100644 src/messages/HistoricMessageAppearance.hpp diff --git a/chatterino.pro b/chatterino.pro index dafca10d3..ccac62a84 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -1,403 +1,405 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2016-12-28T18:23:35 -# -#------------------------------------------------- - -message(----) - -# define project shit -QT += widgets core gui network multimedia svg concurrent -CONFIG += communi -COMMUNI += core model util - -INCLUDEPATH += src/ -TARGET = chatterino -TEMPLATE = app -PRECOMPILED_HEADER = src/PrecompiledHeader.hpp -CONFIG += precompile_header -DEFINES += CHATTERINO -DEFINES += "AB_NAMESPACE=chatterino" -DEFINES += AB_CUSTOM_THEME -DEFINES += AB_CUSTOM_SETTINGS -CONFIG += AB_NOT_STANDALONE - -useBreakpad { - LIBS += -L$$PWD/lib/qBreakpad/handler/build - include(lib/qBreakpad/qBreakpad.pri) - DEFINES += C_USE_BREAKPAD -} - -# https://bugreports.qt.io/browse/QTBUG-27018 -equals(QMAKE_CXX, "clang++")|equals(QMAKE_CXX, "g++") { - TARGET = bin/chatterino -} - -# Icons -#macx:ICON = resources/images/chatterino2.icns -win32:RC_FILE = resources/windows.rc - -macx { - LIBS += -L/usr/local/lib -} - -# Submodules -include(lib/appbase.pri) -include(lib/humanize.pri) -DEFINES += IRC_NAMESPACE=Communi -include(lib/libcommuni.pri) -include(lib/websocketpp.pri) -include(lib/openssl.pri) -include(lib/wintoast.pri) - -# Optional feature: QtWebEngine -#exists ($(QTDIR)/include/QtWebEngine/QtWebEngine) { -# message(Using QWebEngine) -# QT += webenginewidgets -# DEFINES += "USEWEBENGINE" -#} - -SOURCES += \ - src/Application.cpp \ - src/common/Channel.cpp \ - src/common/CompletionModel.cpp \ - src/common/NetworkData.cpp \ - src/common/NetworkManager.cpp \ - src/common/NetworkRequest.cpp \ - src/common/NetworkResult.cpp \ - src/common/NetworkTimer.cpp \ - src/controllers/accounts/Account.cpp \ - src/controllers/accounts/AccountController.cpp \ - src/controllers/accounts/AccountModel.cpp \ - src/controllers/commands/Command.cpp \ - src/controllers/commands/CommandController.cpp \ - src/controllers/commands/CommandModel.cpp \ - src/controllers/highlights/HighlightController.cpp \ - src/controllers/highlights/HighlightModel.cpp \ - src/controllers/highlights/HighlightBlacklistModel.cpp \ - src/controllers/highlights/UserHighlightModel.cpp \ - src/controllers/ignores/IgnoreController.cpp \ - src/controllers/ignores/IgnoreModel.cpp \ - src/controllers/notifications/NotificationController.cpp \ - src/controllers/taggedusers/TaggedUser.cpp \ - src/controllers/taggedusers/TaggedUsersController.cpp \ - src/controllers/taggedusers/TaggedUsersModel.cpp \ - src/main.cpp \ - src/messages/Image.cpp \ - src/messages/layouts/MessageLayout.cpp \ - src/messages/layouts/MessageLayoutContainer.cpp \ - src/messages/layouts/MessageLayoutElement.cpp \ - src/messages/Link.cpp \ - src/messages/Message.cpp \ - src/messages/MessageBuilder.cpp \ - src/messages/MessageColor.cpp \ - src/messages/MessageElement.cpp \ - src/providers/emoji/Emojis.cpp \ - src/providers/irc/AbstractIrcServer.cpp \ - src/providers/irc/IrcAccount.cpp \ - src/providers/irc/IrcChannel2.cpp \ - src/providers/irc/IrcConnection2.cpp \ - src/providers/irc/IrcServer.cpp \ - src/providers/twitch/IrcMessageHandler.cpp \ - src/providers/twitch/PartialTwitchUser.cpp \ - src/providers/twitch/PubsubActions.cpp \ - src/providers/twitch/PubsubHelpers.cpp \ - src/providers/twitch/TwitchAccount.cpp \ - src/providers/twitch/TwitchAccountManager.cpp \ - src/providers/twitch/TwitchChannel.cpp \ - src/providers/twitch/TwitchEmotes.cpp \ - src/providers/twitch/TwitchHelpers.cpp \ - src/providers/twitch/TwitchMessageBuilder.cpp \ - src/providers/twitch/TwitchServer.cpp \ - src/providers/twitch/TwitchUser.cpp \ - src/singletons/helper/GifTimer.cpp \ - src/singletons/helper/LoggingChannel.cpp \ - src/controllers/moderationactions/ModerationAction.cpp \ - src/singletons/WindowManager.cpp \ - src/util/DebugCount.cpp \ - src/util/RapidjsonHelpers.cpp \ - src/util/StreamLink.cpp \ - src/widgets/AccountSwitchPopupWidget.cpp \ - src/widgets/AccountSwitchWidget.cpp \ - src/widgets/AttachedWindow.cpp \ - src/widgets/dialogs/EmotePopup.cpp \ - src/widgets/dialogs/LastRunCrashDialog.cpp \ - src/widgets/dialogs/LoginDialog.cpp \ - src/widgets/dialogs/LogsPopup.cpp \ - src/widgets/dialogs/NotificationPopup.cpp \ - src/widgets/dialogs/QualityPopup.cpp \ - src/widgets/dialogs/SelectChannelDialog.cpp \ - src/widgets/dialogs/SettingsDialog.cpp \ - src/widgets/dialogs/TextInputDialog.cpp \ - src/widgets/dialogs/UserInfoPopup.cpp \ - src/widgets/dialogs/WelcomeDialog.cpp \ - src/widgets/helper/ChannelView.cpp \ - src/widgets/helper/ComboBoxItemDelegate.cpp \ - src/widgets/helper/DebugPopup.cpp \ - src/widgets/helper/EditableModelView.cpp \ - src/widgets/helper/NotebookButton.cpp \ - src/widgets/helper/NotebookTab.cpp \ - src/widgets/helper/ResizingTextEdit.cpp \ - src/widgets/helper/ScrollbarHighlight.cpp \ - src/widgets/helper/SearchPopup.cpp \ - src/widgets/helper/SettingsDialogTab.cpp \ - src/widgets/Notebook.cpp \ - src/widgets/Scrollbar.cpp \ - src/widgets/settingspages/AboutPage.cpp \ - src/widgets/settingspages/AccountsPage.cpp \ - src/widgets/settingspages/BrowserExtensionPage.cpp \ - src/widgets/settingspages/CommandPage.cpp \ - src/widgets/settingspages/EmotesPage.cpp \ - src/widgets/settingspages/ExternalToolsPage.cpp \ - src/widgets/settingspages/HighlightingPage.cpp \ - src/widgets/settingspages/KeyboardSettingsPage.cpp \ - src/widgets/settingspages/LogsPage.cpp \ - src/widgets/settingspages/ModerationPage.cpp \ - src/widgets/settingspages/NotificationPage.cpp \ - src/widgets/settingspages/SettingsPage.cpp \ - src/widgets/settingspages/SpecialChannelsPage.cpp \ - src/widgets/splits/Split.cpp \ - src/widgets/splits/SplitContainer.cpp \ - src/widgets/splits/SplitHeader.cpp \ - src/widgets/splits/SplitInput.cpp \ - src/widgets/splits/SplitOverlay.cpp \ - src/widgets/StreamView.cpp \ - src/widgets/Window.cpp \ - src/common/LinkParser.cpp \ - src/controllers/moderationactions/ModerationActions.cpp \ - src/singletons/NativeMessaging.cpp \ - src/singletons/Emotes.cpp \ - src/singletons/Logging.cpp \ - src/singletons/Paths.cpp \ - src/singletons/Resources.cpp \ - src/singletons/Settings.cpp \ - src/singletons/Updates.cpp \ - src/singletons/Theme.cpp \ - src/controllers/moderationactions/ModerationActionModel.cpp \ - src/widgets/settingspages/LookPage.cpp \ - src/widgets/settingspages/FeelPage.cpp \ - src/util/InitUpdateButton.cpp \ - src/widgets/dialogs/UpdateDialog.cpp \ - src/widgets/settingspages/IgnoresPage.cpp \ - src/providers/twitch/PubsubClient.cpp \ - src/providers/twitch/TwitchApi.cpp \ - src/messages/Emote.cpp \ - src/messages/ImageSet.cpp \ - src/providers/bttv/BttvEmotes.cpp \ - src/providers/LinkResolver.cpp \ - src/providers/ffz/FfzEmotes.cpp \ - src/autogenerated/ResourcesAutogen.cpp \ - src/singletons/Badges.cpp \ - src/providers/twitch/TwitchBadges.cpp \ - src/providers/chatterino/ChatterinoBadges.cpp \ - src/providers/twitch/TwitchParseCheerEmotes.cpp \ - src/providers/bttv/LoadBttvChannelEmote.cpp \ - src/util/JsonQuery.cpp \ - src/RunGui.cpp \ - src/BrowserExtension.cpp \ - src/util/FormatTime.cpp \ - src/controllers/notifications/NotificationModel.cpp \ - src/singletons/Toasts.cpp \ - src/common/DownloadManager.cpp \ - src/messages/MessageContainer.cpp \ - src/common/UsernameSet.cpp \ - src/widgets/settingspages/AdvancedPage.cpp \ - src/util/IncognitoBrowser.cpp \ - src/widgets/splits/ClosedSplits.cpp \ - src/providers/ffz/FfzModBadge.cpp \ - src/widgets/settingspages/GeneralPage.cpp \ - src/providers/twitch/ChatroomChannel.cpp - -HEADERS += \ - src/Application.hpp \ - src/common/Channel.hpp \ - src/common/Common.hpp \ - src/common/CompletionModel.hpp \ - src/common/Atomic.hpp \ - src/common/NetworkCommon.hpp \ - src/common/NetworkData.hpp \ - src/common/NetworkManager.hpp \ - src/common/NetworkRequest.hpp \ - src/common/NetworkRequester.hpp \ - src/common/NetworkResult.hpp \ - src/common/NetworkTimer.hpp \ - src/common/NetworkWorker.hpp \ - src/common/NullablePtr.hpp \ - src/common/ProviderId.hpp \ - src/common/SignalVectorModel.hpp \ - src/common/Version.hpp \ - src/controllers/accounts/Account.hpp \ - src/controllers/accounts/AccountController.hpp \ - src/controllers/accounts/AccountModel.hpp \ - src/controllers/commands/Command.hpp \ - src/controllers/commands/CommandController.hpp \ - src/controllers/commands/CommandModel.hpp \ - src/controllers/highlights/HighlightController.hpp \ - src/controllers/highlights/HighlightModel.hpp \ - src/controllers/highlights/HighlightBlacklistModel.hpp \ - src/controllers/highlights/HighlightPhrase.hpp \ - src/controllers/highlights/HighlightBlacklistUser.hpp \ - src/controllers/highlights/UserHighlightModel.hpp \ - src/controllers/ignores/IgnoreController.hpp \ - src/controllers/ignores/IgnoreModel.hpp \ - src/controllers/ignores/IgnorePhrase.hpp \ - src/controllers/notifications/NotificationController.hpp \ - src/controllers/taggedusers/TaggedUser.hpp \ - src/controllers/taggedusers/TaggedUsersController.hpp \ - src/controllers/taggedusers/TaggedUsersModel.hpp \ - src/messages/Image.hpp \ - src/messages/layouts/MessageLayout.hpp \ - src/messages/layouts/MessageLayoutContainer.hpp \ - src/messages/layouts/MessageLayoutElement.hpp \ - src/messages/LimitedQueue.hpp \ - src/messages/LimitedQueueSnapshot.hpp \ - src/messages/Link.hpp \ - src/messages/Message.hpp \ - src/messages/MessageBuilder.hpp \ - src/messages/MessageColor.hpp \ - src/messages/MessageElement.hpp \ - src/messages/Selection.hpp \ - src/PrecompiledHeader.hpp \ - src/providers/emoji/Emojis.hpp \ - src/providers/irc/AbstractIrcServer.hpp \ - src/providers/irc/IrcAccount.hpp \ - src/providers/irc/IrcChannel2.hpp \ - src/providers/irc/IrcConnection2.hpp \ - src/providers/irc/IrcServer.hpp \ - src/providers/twitch/EmoteValue.hpp \ - src/providers/twitch/IrcMessageHandler.hpp \ - src/providers/twitch/PartialTwitchUser.hpp \ - src/providers/twitch/PubsubActions.hpp \ - src/providers/twitch/PubsubHelpers.hpp \ - src/providers/twitch/TwitchAccount.hpp \ - src/providers/twitch/TwitchAccountManager.hpp \ - src/providers/twitch/TwitchChannel.hpp \ - src/providers/twitch/TwitchEmotes.hpp \ - src/providers/twitch/TwitchHelpers.hpp \ - src/providers/twitch/TwitchMessageBuilder.hpp \ - src/providers/twitch/TwitchServer.hpp \ - src/providers/twitch/TwitchUser.hpp \ - src/singletons/helper/GifTimer.hpp \ - src/singletons/helper/LoggingChannel.hpp \ - src/controllers/moderationactions/ModerationAction.hpp \ - src/singletons/WindowManager.hpp \ - src/util/ConcurrentMap.hpp \ - src/util/DebugCount.hpp \ - src/util/IrcHelpers.hpp \ - src/util/LayoutCreator.hpp \ - src/util/QStringHash.hpp \ - src/util/RapidjsonHelpers.hpp \ - src/util/RemoveScrollAreaBackground.hpp \ - src/util/SharedPtrElementLess.hpp \ - src/util/StandardItemHelper.hpp \ - src/util/StreamLink.hpp \ - src/widgets/AccountSwitchPopupWidget.hpp \ - src/widgets/AccountSwitchWidget.hpp \ - src/widgets/AttachedWindow.hpp \ - src/widgets/dialogs/EmotePopup.hpp \ - src/widgets/dialogs/LastRunCrashDialog.hpp \ - src/widgets/dialogs/LoginDialog.hpp \ - src/widgets/dialogs/LogsPopup.hpp \ - src/widgets/dialogs/NotificationPopup.hpp \ - src/widgets/dialogs/QualityPopup.hpp \ - src/widgets/dialogs/SelectChannelDialog.hpp \ - src/widgets/dialogs/SettingsDialog.hpp \ - src/widgets/dialogs/TextInputDialog.hpp \ - src/widgets/dialogs/UserInfoPopup.hpp \ - src/widgets/dialogs/WelcomeDialog.hpp \ - src/widgets/helper/ChannelView.hpp \ - src/widgets/helper/ComboBoxItemDelegate.hpp \ - src/widgets/helper/DebugPopup.hpp \ - src/widgets/helper/EditableModelView.hpp \ - src/widgets/helper/Line.hpp \ - src/widgets/helper/NotebookButton.hpp \ - src/widgets/helper/NotebookTab.hpp \ - src/widgets/helper/ResizingTextEdit.hpp \ - src/widgets/helper/ScrollbarHighlight.hpp \ - src/widgets/helper/SearchPopup.hpp \ - src/widgets/helper/SettingsDialogTab.hpp \ - src/widgets/Notebook.hpp \ - src/widgets/Scrollbar.hpp \ - src/widgets/settingspages/AboutPage.hpp \ - src/widgets/settingspages/AccountsPage.hpp \ - src/widgets/settingspages/BrowserExtensionPage.hpp \ - src/widgets/settingspages/CommandPage.hpp \ - src/widgets/settingspages/EmotesPage.hpp \ - src/widgets/settingspages/ExternalToolsPage.hpp \ - src/widgets/settingspages/HighlightingPage.hpp \ - src/widgets/settingspages/KeyboardSettingsPage.hpp \ - src/widgets/settingspages/LogsPage.hpp \ - src/widgets/settingspages/ModerationPage.hpp \ - src/widgets/settingspages/NotificationPage.hpp \ - src/widgets/settingspages/SettingsPage.hpp \ - src/widgets/settingspages/SpecialChannelsPage.hpp \ - src/widgets/splits/Split.hpp \ - src/widgets/splits/SplitContainer.hpp \ - src/widgets/splits/SplitHeader.hpp \ - src/widgets/splits/SplitInput.hpp \ - src/widgets/splits/SplitOverlay.hpp \ - src/widgets/StreamView.hpp \ - src/widgets/Window.hpp \ - src/providers/twitch/TwitchCommon.hpp \ - src/util/IsBigEndian.hpp \ - src/common/LinkParser.hpp \ - src/controllers/moderationactions/ModerationActions.hpp \ - src/singletons/Emotes.hpp \ - src/singletons/Logging.hpp \ - src/singletons/Paths.hpp \ - src/singletons/Resources.hpp \ - src/singletons/Settings.hpp \ - src/singletons/Updates.hpp \ - src/singletons/NativeMessaging.hpp \ - src/singletons/Theme.hpp \ - src/common/SignalVector.hpp \ - src/widgets/dialogs/LogsPopup.hpp \ - src/controllers/moderationactions/ModerationActionModel.hpp \ - src/widgets/settingspages/LookPage.hpp \ - src/widgets/settingspages/FeelPage.hpp \ - src/util/InitUpdateButton.hpp \ - src/widgets/dialogs/UpdateDialog.hpp \ - src/widgets/settingspages/IgnoresPage.hpp \ - src/providers/twitch/PubsubClient.hpp \ - src/providers/twitch/TwitchApi.hpp \ - src/messages/Emote.hpp \ - src/messages/ImageSet.hpp \ - src/providers/bttv/BttvEmotes.hpp \ - src/providers/LinkResolver.hpp \ - src/providers/ffz/FfzEmotes.hpp \ - src/autogenerated/ResourcesAutogen.hpp \ - src/singletons/Badges.hpp \ - src/providers/twitch/TwitchBadges.hpp \ - src/providers/chatterino/ChatterinoBadges.hpp \ - src/common/Aliases.hpp \ - src/providers/twitch/TwitchParseCheerEmotes.hpp \ - src/providers/bttv/LoadBttvChannelEmote.hpp \ - src/util/JsonQuery.hpp \ - src/RunGui.hpp \ - src/BrowserExtension.hpp \ - src/util/FormatTime.hpp \ - src/controllers/notifications/NotificationModel.hpp \ - src/singletons/Toasts.hpp \ - src/common/DownloadManager.hpp \ - src/messages/MessageContainer.hpp \ - src/common/UsernameSet.hpp \ - src/widgets/settingspages/AdvancedPage.hpp \ - src/util/IncognitoBrowser.hpp \ - src/widgets/splits/ClosedSplits.hpp \ - src/providers/ffz/FfzModBadge.hpp \ - src/widgets/settingspages/GeneralPage.hpp \ - src/messages/HistoricMessageAppearance.hpp \ - src/providers/twitch/ChatroomChannel.hpp - -RESOURCES += \ - resources/resources.qrc \ - resources/resources_autogenerated.qrc - -DISTFILES += - -FORMS += - -# do not use windows min/max macros -#win32 { -# DEFINES += NOMINMAX -#} +#------------------------------------------------- +# +# Project created by QtCreator 2016-12-28T18:23:35 +# +#------------------------------------------------- + +message(----) + +# define project shit +QT += widgets core gui network multimedia svg concurrent +CONFIG += communi +COMMUNI += core model util + +INCLUDEPATH += src/ +TARGET = chatterino +TEMPLATE = app +PRECOMPILED_HEADER = src/PrecompiledHeader.hpp +CONFIG += precompile_header +DEFINES += CHATTERINO +DEFINES += "AB_NAMESPACE=chatterino" +DEFINES += AB_CUSTOM_THEME +DEFINES += AB_CUSTOM_SETTINGS +CONFIG += AB_NOT_STANDALONE + +useBreakpad { + LIBS += -L$$PWD/lib/qBreakpad/handler/build + include(lib/qBreakpad/qBreakpad.pri) + DEFINES += C_USE_BREAKPAD +} + +# https://bugreports.qt.io/browse/QTBUG-27018 +equals(QMAKE_CXX, "clang++")|equals(QMAKE_CXX, "g++") { + TARGET = bin/chatterino +} + +# Icons +#macx:ICON = resources/images/chatterino2.icns +win32:RC_FILE = resources/windows.rc + +macx { + LIBS += -L/usr/local/lib +} + +# Submodules +include(lib/appbase.pri) +include(lib/humanize.pri) +DEFINES += IRC_NAMESPACE=Communi +include(lib/libcommuni.pri) +include(lib/websocketpp.pri) +include(lib/openssl.pri) +include(lib/wintoast.pri) + +# Optional feature: QtWebEngine +#exists ($(QTDIR)/include/QtWebEngine/QtWebEngine) { +# message(Using QWebEngine) +# QT += webenginewidgets +# DEFINES += "USEWEBENGINE" +#} + +SOURCES += \ + src/Application.cpp \ + src/autogenerated/ResourcesAutogen.cpp \ + src/BrowserExtension.cpp \ + src/common/Channel.cpp \ + src/common/CompletionModel.cpp \ + src/common/DownloadManager.cpp \ + src/common/LinkParser.cpp \ + src/common/NetworkData.cpp \ + src/common/NetworkManager.cpp \ + src/common/NetworkRequest.cpp \ + src/common/NetworkResult.cpp \ + src/common/NetworkTimer.cpp \ + src/common/UsernameSet.cpp \ + src/controllers/accounts/Account.cpp \ + src/controllers/accounts/AccountController.cpp \ + src/controllers/accounts/AccountModel.cpp \ + src/controllers/commands/Command.cpp \ + src/controllers/commands/CommandController.cpp \ + src/controllers/commands/CommandModel.cpp \ + src/controllers/highlights/HighlightBlacklistModel.cpp \ + src/controllers/highlights/HighlightController.cpp \ + src/controllers/highlights/HighlightModel.cpp \ + src/controllers/highlights/UserHighlightModel.cpp \ + src/controllers/ignores/IgnoreController.cpp \ + src/controllers/ignores/IgnoreModel.cpp \ + src/controllers/moderationactions/ModerationAction.cpp \ + src/controllers/moderationactions/ModerationActionModel.cpp \ + src/controllers/moderationactions/ModerationActions.cpp \ + src/controllers/notifications/NotificationController.cpp \ + src/controllers/notifications/NotificationModel.cpp \ + src/controllers/taggedusers/TaggedUser.cpp \ + src/controllers/taggedusers/TaggedUsersController.cpp \ + src/controllers/taggedusers/TaggedUsersModel.cpp \ + src/main.cpp \ + src/messages/Emote.cpp \ + src/messages/Image.cpp \ + src/messages/ImageSet.cpp \ + src/messages/layouts/MessageLayout.cpp \ + src/messages/layouts/MessageLayoutContainer.cpp \ + src/messages/layouts/MessageLayoutElement.cpp \ + src/messages/Link.cpp \ + src/messages/Message.cpp \ + src/messages/MessageBuilder.cpp \ + src/messages/MessageColor.cpp \ + src/messages/MessageContainer.cpp \ + src/messages/MessageElement.cpp \ + src/providers/bttv/BttvEmotes.cpp \ + src/providers/bttv/LoadBttvChannelEmote.cpp \ + src/providers/chatterino/ChatterinoBadges.cpp \ + src/providers/emoji/Emojis.cpp \ + src/providers/ffz/FfzEmotes.cpp \ + src/providers/ffz/FfzModBadge.cpp \ + src/providers/irc/AbstractIrcServer.cpp \ + src/providers/irc/IrcAccount.cpp \ + src/providers/irc/IrcChannel2.cpp \ + src/providers/irc/IrcConnection2.cpp \ + src/providers/irc/IrcServer.cpp \ + src/providers/LinkResolver.cpp \ + src/providers/twitch/ChatroomChannel.cpp \ + src/providers/twitch/IrcMessageHandler.cpp \ + src/providers/twitch/PartialTwitchUser.cpp \ + src/providers/twitch/PubsubActions.cpp \ + src/providers/twitch/PubsubClient.cpp \ + src/providers/twitch/PubsubHelpers.cpp \ + src/providers/twitch/TwitchAccount.cpp \ + src/providers/twitch/TwitchAccountManager.cpp \ + src/providers/twitch/TwitchApi.cpp \ + src/providers/twitch/TwitchBadges.cpp \ + src/providers/twitch/TwitchChannel.cpp \ + src/providers/twitch/TwitchEmotes.cpp \ + src/providers/twitch/TwitchHelpers.cpp \ + src/providers/twitch/TwitchMessageBuilder.cpp \ + src/providers/twitch/TwitchParseCheerEmotes.cpp \ + src/providers/twitch/TwitchServer.cpp \ + src/providers/twitch/TwitchUser.cpp \ + src/RunGui.cpp \ + src/singletons/Badges.cpp \ + src/singletons/Emotes.cpp \ + src/singletons/helper/GifTimer.cpp \ + src/singletons/helper/LoggingChannel.cpp \ + src/singletons/Logging.cpp \ + src/singletons/NativeMessaging.cpp \ + src/singletons/Paths.cpp \ + src/singletons/Resources.cpp \ + src/singletons/Settings.cpp \ + src/singletons/Theme.cpp \ + src/singletons/Toasts.cpp \ + src/singletons/Updates.cpp \ + src/singletons/WindowManager.cpp \ + src/util/DebugCount.cpp \ + src/util/FormatTime.cpp \ + src/util/IncognitoBrowser.cpp \ + src/util/InitUpdateButton.cpp \ + src/util/JsonQuery.cpp \ + src/util/RapidjsonHelpers.cpp \ + src/util/StreamLink.cpp \ + src/widgets/AccountSwitchPopupWidget.cpp \ + src/widgets/AccountSwitchWidget.cpp \ + src/widgets/AttachedWindow.cpp \ + src/widgets/dialogs/EmotePopup.cpp \ + src/widgets/dialogs/LastRunCrashDialog.cpp \ + src/widgets/dialogs/LoginDialog.cpp \ + src/widgets/dialogs/LogsPopup.cpp \ + src/widgets/dialogs/NotificationPopup.cpp \ + src/widgets/dialogs/QualityPopup.cpp \ + src/widgets/dialogs/SelectChannelDialog.cpp \ + src/widgets/dialogs/SettingsDialog.cpp \ + src/widgets/dialogs/TextInputDialog.cpp \ + src/widgets/dialogs/UpdateDialog.cpp \ + src/widgets/dialogs/UserInfoPopup.cpp \ + src/widgets/dialogs/WelcomeDialog.cpp \ + src/widgets/helper/ChannelView.cpp \ + src/widgets/helper/ComboBoxItemDelegate.cpp \ + src/widgets/helper/DebugPopup.cpp \ + src/widgets/helper/EditableModelView.cpp \ + src/widgets/helper/NotebookButton.cpp \ + src/widgets/helper/NotebookTab.cpp \ + src/widgets/helper/ResizingTextEdit.cpp \ + src/widgets/helper/ScrollbarHighlight.cpp \ + src/widgets/helper/SearchPopup.cpp \ + src/widgets/helper/SettingsDialogTab.cpp \ + src/widgets/Notebook.cpp \ + src/widgets/Scrollbar.cpp \ + src/widgets/settingspages/AboutPage.cpp \ + src/widgets/settingspages/AccountsPage.cpp \ + src/widgets/settingspages/AdvancedPage.cpp \ + src/widgets/settingspages/BrowserExtensionPage.cpp \ + src/widgets/settingspages/CommandPage.cpp \ + src/widgets/settingspages/EmotesPage.cpp \ + src/widgets/settingspages/ExternalToolsPage.cpp \ + src/widgets/settingspages/FeelPage.cpp \ + src/widgets/settingspages/GeneralPage.cpp \ + src/widgets/settingspages/HighlightingPage.cpp \ + src/widgets/settingspages/IgnoresPage.cpp \ + src/widgets/settingspages/KeyboardSettingsPage.cpp \ + src/widgets/settingspages/LogsPage.cpp \ + src/widgets/settingspages/LookPage.cpp \ + src/widgets/settingspages/ModerationPage.cpp \ + src/widgets/settingspages/NotificationPage.cpp \ + src/widgets/settingspages/SettingsPage.cpp \ + src/widgets/settingspages/SpecialChannelsPage.cpp \ + src/widgets/splits/ClosedSplits.cpp \ + src/widgets/splits/Split.cpp \ + src/widgets/splits/SplitContainer.cpp \ + src/widgets/splits/SplitHeader.cpp \ + src/widgets/splits/SplitInput.cpp \ + src/widgets/splits/SplitOverlay.cpp \ + src/widgets/StreamView.cpp \ + src/widgets/Window.cpp \ + +HEADERS += \ + src/Application.hpp \ + src/autogenerated/ResourcesAutogen.hpp \ + src/BrowserExtension.hpp \ + src/common/Aliases.hpp \ + src/common/Atomic.hpp \ + src/common/Channel.hpp \ + src/common/Common.hpp \ + src/common/CompletionModel.hpp \ + src/common/ConcurrentMap.hpp \ + src/common/DownloadManager.hpp \ + src/common/LinkParser.hpp \ + src/common/NetworkCommon.hpp \ + src/common/NetworkData.hpp \ + src/common/NetworkManager.hpp \ + src/common/NetworkRequest.hpp \ + src/common/NetworkRequester.hpp \ + src/common/NetworkResult.hpp \ + src/common/NetworkTimer.hpp \ + src/common/NetworkWorker.hpp \ + src/common/NullablePtr.hpp \ + src/common/ProviderId.hpp \ + src/common/SignalVector.hpp \ + src/common/SignalVectorModel.hpp \ + src/common/UniqueAccess.hpp \ + src/common/UsernameSet.hpp \ + src/common/Version.hpp \ + src/controllers/accounts/Account.hpp \ + src/controllers/accounts/AccountController.hpp \ + src/controllers/accounts/AccountModel.hpp \ + src/controllers/commands/Command.hpp \ + src/controllers/commands/CommandController.hpp \ + src/controllers/commands/CommandModel.hpp \ + src/controllers/highlights/HighlightBlacklistModel.hpp \ + src/controllers/highlights/HighlightBlacklistUser.hpp \ + src/controllers/highlights/HighlightController.hpp \ + src/controllers/highlights/HighlightModel.hpp \ + src/controllers/highlights/HighlightPhrase.hpp \ + src/controllers/highlights/UserHighlightModel.hpp \ + src/controllers/ignores/IgnoreController.hpp \ + src/controllers/ignores/IgnoreModel.hpp \ + src/controllers/ignores/IgnorePhrase.hpp \ + src/controllers/moderationactions/ModerationAction.hpp \ + src/controllers/moderationactions/ModerationActionModel.hpp \ + src/controllers/moderationactions/ModerationActions.hpp \ + src/controllers/notifications/NotificationController.hpp \ + src/controllers/notifications/NotificationModel.hpp \ + src/controllers/taggedusers/TaggedUser.hpp \ + src/controllers/taggedusers/TaggedUsersController.hpp \ + src/controllers/taggedusers/TaggedUsersModel.hpp \ + src/messages/Emote.hpp \ + src/messages/Image.hpp \ + src/messages/ImageSet.hpp \ + src/messages/layouts/MessageLayout.hpp \ + src/messages/layouts/MessageLayoutContainer.hpp \ + src/messages/layouts/MessageLayoutElement.hpp \ + src/messages/LimitedQueue.hpp \ + src/messages/LimitedQueueSnapshot.hpp \ + src/messages/Link.hpp \ + src/messages/Message.hpp \ + src/messages/MessageBuilder.hpp \ + src/messages/MessageColor.hpp \ + src/messages/MessageContainer.hpp \ + src/messages/MessageElement.hpp \ + src/messages/MessageParseArgs.hpp \ + src/messages/Selection.hpp \ + src/PrecompiledHeader.hpp \ + src/providers/bttv/BttvEmotes.hpp \ + src/providers/bttv/LoadBttvChannelEmote.hpp \ + src/providers/chatterino/ChatterinoBadges.hpp \ + src/providers/emoji/Emojis.hpp \ + src/providers/ffz/FfzEmotes.hpp \ + src/providers/ffz/FfzModBadge.hpp \ + src/providers/irc/AbstractIrcServer.hpp \ + src/providers/irc/IrcAccount.hpp \ + src/providers/irc/IrcChannel2.hpp \ + src/providers/irc/IrcConnection2.hpp \ + src/providers/irc/IrcServer.hpp \ + src/providers/LinkResolver.hpp \ + src/providers/twitch/ChatroomChannel.hpp \ + src/providers/twitch/EmoteValue.hpp \ + src/providers/twitch/IrcMessageHandler.hpp \ + src/providers/twitch/PartialTwitchUser.hpp \ + src/providers/twitch/PubsubActions.hpp \ + src/providers/twitch/PubsubClient.hpp \ + src/providers/twitch/PubsubHelpers.hpp \ + src/providers/twitch/TwitchAccount.hpp \ + src/providers/twitch/TwitchAccountManager.hpp \ + src/providers/twitch/TwitchApi.hpp \ + src/providers/twitch/TwitchBadges.hpp \ + src/providers/twitch/TwitchChannel.hpp \ + src/providers/twitch/TwitchCommon.hpp \ + src/providers/twitch/TwitchEmotes.hpp \ + src/providers/twitch/TwitchHelpers.hpp \ + src/providers/twitch/TwitchMessageBuilder.hpp \ + src/providers/twitch/TwitchParseCheerEmotes.hpp \ + src/providers/twitch/TwitchServer.hpp \ + src/providers/twitch/TwitchUser.hpp \ + src/RunGui.hpp \ + src/singletons/Badges.hpp \ + src/singletons/Emotes.hpp \ + src/singletons/helper/GifTimer.hpp \ + src/singletons/helper/LoggingChannel.hpp \ + src/singletons/Logging.hpp \ + src/singletons/NativeMessaging.hpp \ + src/singletons/Paths.hpp \ + src/singletons/Resources.hpp \ + src/singletons/Settings.hpp \ + src/singletons/Theme.hpp \ + src/singletons/Toasts.hpp \ + src/singletons/Updates.hpp \ + src/singletons/WindowManager.hpp \ + src/util/ConcurrentMap.hpp \ + src/util/DebugCount.hpp \ + src/util/FormatTime.hpp \ + src/util/IncognitoBrowser.hpp \ + src/util/InitUpdateButton.hpp \ + src/util/IrcHelpers.hpp \ + src/util/IsBigEndian.hpp \ + src/util/JsonQuery.hpp \ + src/util/LayoutCreator.hpp \ + src/util/QStringHash.hpp \ + src/util/rangealgorithm.hpp \ + src/util/RapidjsonHelpers.hpp \ + src/util/RemoveScrollAreaBackground.hpp \ + src/util/SharedPtrElementLess.hpp \ + src/util/StandardItemHelper.hpp \ + src/util/StreamLink.hpp \ + src/widgets/AccountSwitchPopupWidget.hpp \ + src/widgets/AccountSwitchWidget.hpp \ + src/widgets/AttachedWindow.hpp \ + src/widgets/dialogs/EmotePopup.hpp \ + src/widgets/dialogs/LastRunCrashDialog.hpp \ + src/widgets/dialogs/LoginDialog.hpp \ + src/widgets/dialogs/LogsPopup.hpp \ + src/widgets/dialogs/NotificationPopup.hpp \ + src/widgets/dialogs/QualityPopup.hpp \ + src/widgets/dialogs/SelectChannelDialog.hpp \ + src/widgets/dialogs/SettingsDialog.hpp \ + src/widgets/dialogs/TextInputDialog.hpp \ + src/widgets/dialogs/UpdateDialog.hpp \ + src/widgets/dialogs/UserInfoPopup.hpp \ + src/widgets/dialogs/WelcomeDialog.hpp \ + src/widgets/helper/ChannelView.hpp \ + src/widgets/helper/ComboBoxItemDelegate.hpp \ + src/widgets/helper/DebugPopup.hpp \ + src/widgets/helper/EditableModelView.hpp \ + src/widgets/helper/Line.hpp \ + src/widgets/helper/NotebookButton.hpp \ + src/widgets/helper/NotebookTab.hpp \ + src/widgets/helper/ResizingTextEdit.hpp \ + src/widgets/helper/ScrollbarHighlight.hpp \ + src/widgets/helper/SearchPopup.hpp \ + src/widgets/helper/SettingsDialogTab.hpp \ + src/widgets/Notebook.hpp \ + src/widgets/Scrollbar.hpp \ + src/widgets/settingspages/AboutPage.hpp \ + src/widgets/settingspages/AccountsPage.hpp \ + src/widgets/settingspages/AdvancedPage.hpp \ + src/widgets/settingspages/BrowserExtensionPage.hpp \ + src/widgets/settingspages/CommandPage.hpp \ + src/widgets/settingspages/EmotesPage.hpp \ + src/widgets/settingspages/ExternalToolsPage.hpp \ + src/widgets/settingspages/FeelPage.hpp \ + src/widgets/settingspages/GeneralPage.hpp \ + src/widgets/settingspages/HighlightingPage.hpp \ + src/widgets/settingspages/IgnoresPage.hpp \ + src/widgets/settingspages/KeyboardSettingsPage.hpp \ + src/widgets/settingspages/LogsPage.hpp \ + src/widgets/settingspages/LookPage.hpp \ + src/widgets/settingspages/ModerationPage.hpp \ + src/widgets/settingspages/NotificationPage.hpp \ + src/widgets/settingspages/SettingsPage.hpp \ + src/widgets/settingspages/SpecialChannelsPage.hpp \ + src/widgets/splits/ClosedSplits.hpp \ + src/widgets/splits/Split.hpp \ + src/widgets/splits/SplitContainer.hpp \ + src/widgets/splits/SplitHeader.hpp \ + src/widgets/splits/SplitInput.hpp \ + src/widgets/splits/SplitOverlay.hpp \ + src/widgets/StreamView.hpp \ + src/widgets/Window.hpp \ + +RESOURCES += \ + resources/resources.qrc \ + resources/resources_autogenerated.qrc + +DISTFILES += + +FORMS += + +# do not use windows min/max macros +#win32 { +# DEFINES += NOMINMAX +#} diff --git a/src/messages/HistoricMessageAppearance.hpp b/src/messages/HistoricMessageAppearance.hpp deleted file mode 100644 index 54cdb0686..000000000 --- a/src/messages/HistoricMessageAppearance.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -namespace chatterino { - -enum HistoricMessageAppearance { - Crossed = (1 << 0), - Greyed = (1 << 1), -}; - -} // namespace chatterino diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index a7ba26756..808d40d94 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -103,9 +103,6 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags) { this->layoutCount_++; - const auto addTest = this->message_->flags.hasAny( - {MessageFlag::DisconnectedMessage, MessageFlag::ConnectedMessage}); - auto messageFlags = this->message_->flags; if (this->flags.has(MessageLayoutFlag::Expanded) || @@ -117,14 +114,6 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags) this->container_->begin(width, this->scale_, messageFlags); - if (addTest) - { - this->container_->addElementNoLineBreak(new TestLayoutElement( - EmptyElement::instance(), QSize(width, this->scale_ * 6), - getTheme()->messages.backgrounds.regular, false)); - this->container_->breakLine(); - } - for (const auto &element : this->message_->elements) { if (getSettings()->hideModerated && @@ -135,14 +124,6 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags) element->addToContainer(*this->container_, _flags); } - if (addTest) - { - this->container_->breakLine(); - this->container_->addElement(new TestLayoutElement( - EmptyElement::instance(), QSize(width, this->scale_ * 6), - getTheme()->messages.backgrounds.regular, true)); - } - if (this->height_ != this->container_->getHeight()) { this->deleteBuffer(); @@ -205,29 +186,12 @@ void MessageLayout::paint(QPainter &painter, int width, int y, int messageIndex, app->themes->messages.disabled); // painter.fillRect(0, y, pixmap->width(), pixmap->height(), // QBrush(QColor(64, 64, 64, 64))); - - if (getSettings()->redDisabledMessages) - { - painter.fillRect(0, y, pixmap->width(), pixmap->height(), - QBrush(QColor(255, 0, 0, 63), Qt::BDiagPattern)); - // app->themes->messages.disabled); - } } if (this->message_->flags.has(MessageFlag::RecentMessage)) { - const auto &historicMessageAppearance = - getSettings()->historicMessagesAppearance.getValue(); - if (historicMessageAppearance & HistoricMessageAppearance::Crossed) - { - painter.fillRect(0, y, pixmap->width(), pixmap->height(), - QBrush(QColor(255, 0, 0, 63), Qt::BDiagPattern)); - } - if (historicMessageAppearance & HistoricMessageAppearance::Greyed) - { - painter.fillRect(0, y, pixmap->width(), pixmap->height(), - app->themes->messages.disabled); - } + painter.fillRect(0, y, pixmap->width(), pixmap->height(), + app->themes->messages.disabled); } // draw selection diff --git a/src/messages/layouts/MessageLayoutElement.cpp b/src/messages/layouts/MessageLayoutElement.cpp index 93e0afe93..a8bcc30c9 100644 --- a/src/messages/layouts/MessageLayoutElement.cpp +++ b/src/messages/layouts/MessageLayoutElement.cpp @@ -368,72 +368,4 @@ int TextIconLayoutElement::getXFromIndex(int index) } } -// TestLayoutElement -TestLayoutElement::TestLayoutElement(MessageElement &element, const QSize &size, - const QColor &background, bool end) - : MessageLayoutElement(element, size) - , size_(size) - , background_(background) - , end_(end) -{ -} - -void TestLayoutElement::addCopyTextToString(QString &str, int from, - int to) const -{ -} - -int TestLayoutElement::getSelectionIndexCount() const -{ - return 0; -} - -void TestLayoutElement::paint(QPainter &painter) -{ - const auto dy = this->getRect().y(); - const auto color = end_ ? background_ : QColor(0, 0, 0, 127); - - // make zig zag - auto polygon = QPolygon(); - for (auto x = size_.height() / -2; x < size_.width() + 16; - x += size_.height()) - { - polygon.push_back({x, dy + 0}); - polygon.push_back({x + size_.height(), dy + size_.height()}); - x += size_.height(); - polygon.push_back({x, dy + size_.height()}); - polygon.push_back({x + size_.height(), dy + 0}); - } - - // finish polygon - polygon.push_back({size_.width(), 1000}); - polygon.push_back({0, 1000}); - - // finish polygon - polygon.push_back({size_.width(), 1000}); - polygon.push_back({0, 1000}); - - // turn into path - auto path = QPainterPath(); - path.addPolygon(polygon); - - // draw - painter.fillPath(path, color); - painter.strokePath(path, QColor(127, 127, 127, 127)); -} - -void TestLayoutElement::paintAnimated(QPainter &painter, int yOffset) -{ -} - -int TestLayoutElement::getMouseOverIndex(const QPoint &abs) const -{ - return 0; -} - -int TestLayoutElement::getXFromIndex(int index) -{ - return 0; -} - } // namespace chatterino diff --git a/src/messages/layouts/MessageLayoutElement.hpp b/src/messages/layouts/MessageLayoutElement.hpp index 24139be4e..d5e11a0a3 100644 --- a/src/messages/layouts/MessageLayoutElement.hpp +++ b/src/messages/layouts/MessageLayoutElement.hpp @@ -125,25 +125,4 @@ private: QString line2; }; -class TestLayoutElement : public MessageLayoutElement -{ -public: - TestLayoutElement(MessageElement &creator, const QSize &size, - const QColor &background, bool end); - -protected: - void addCopyTextToString(QString &str, int from = 0, - int to = INT_MAX) const override; - int getSelectionIndexCount() const override; - void paint(QPainter &painter) override; - void paintAnimated(QPainter &painter, int yOffset) override; - int getMouseOverIndex(const QPoint &abs) const override; - int getXFromIndex(int index) override; - -private: - QSize size_; - QColor background_; - bool end_; -}; - } // namespace chatterino diff --git a/src/providers/irc/AbstractIrcServer.cpp b/src/providers/irc/AbstractIrcServer.cpp index 7cb45b3c7..d803fdbe9 100644 --- a/src/providers/irc/AbstractIrcServer.cpp +++ b/src/providers/irc/AbstractIrcServer.cpp @@ -233,7 +233,6 @@ void AbstractIrcServer::onConnected() auto connected = makeSystemMessage("connected"); connected->flags.set(MessageFlag::ConnectedMessage); - connected->flags.set(MessageFlag::Centered); auto reconnected = makeSystemMessage("reconnected"); reconnected->flags.set(MessageFlag::ConnectedMessage); diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 4d922af53..c471f0632 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -4,7 +4,6 @@ #include "controllers/highlights/HighlightPhrase.hpp" #include "controllers/moderationactions/ModerationAction.hpp" -#include "messages/HistoricMessageAppearance.hpp" #include #include @@ -32,9 +31,6 @@ public: Qt::VerPattern}; QStringSetting lastMessageColor = {"/appearance/messages/lastMessageColor", ""}; - IntSetting historicMessagesAppearance = { - "/appearance/messages/historicMessagesAppearance", - HistoricMessageAppearance::Crossed | HistoricMessageAppearance::Greyed}; BoolSetting showEmptyInput = {"/appearance/showEmptyInputBox", true}; BoolSetting showMessageLength = {"/appearance/messages/showMessageLength", false}; @@ -68,7 +64,6 @@ public: BoolSetting headerUptime = {"/appearance/splitheader/showUptime", false}; FloatSetting customThemeMultiplier = {"/appearance/customThemeMultiplier", -0.5f}; - BoolSetting redDisabledMessages = {"/appearance/redStripes", true}; // BoolSetting useCustomWindowFrame = {"/appearance/useCustomWindowFrame", // false}; diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index cc8dfb3b9..ee012c21a 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -190,7 +190,7 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addCheckbox("Show tab close button", s.showTabCloseButton); layout.addCheckbox("Show input when empty", s.showEmptyInput); layout.addCheckbox("Show input message length", s.showMessageLength); - layout.addCheckbox("Hide preferences button (ctrl+p to show)", + layout.addCheckbox("Hide preferences button (ctrl+p to show)", s.hidePreferencesButton); layout.addCheckbox("Hide user button", s.hideUserButton); @@ -267,50 +267,6 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addTitle2("Misc"); layout.addCheckbox("Show twitch whispers inline", s.inlineWhispers); - layout.addDropdown( - "Historic messages appearance", - {"Crossed and Greyed", "Crossed", "Greyed", "No change"}, - s.historicMessagesAppearance, - [](auto val) { - if (val & HistoricMessageAppearance::Crossed && - val & HistoricMessageAppearance::Greyed) - { - return QString("Crossed and Greyed"); - } - else if (val & HistoricMessageAppearance::Crossed) - { - return QString("Crossed"); - } - else if (val & HistoricMessageAppearance::Greyed) - { - return QString("Greyed"); - } - else - { - return QString("No Change"); - } - }, - [](auto args) -> int { - switch (args.index) - { - default: - case 0: - return HistoricMessageAppearance::Crossed | - HistoricMessageAppearance::Greyed; - break; - case 1: - return HistoricMessageAppearance::Crossed; - break; - case 2: - return HistoricMessageAppearance::Greyed; - break; - case 3: - return 0; - break; - } - }, - false); - layout.addCheckbox("Emphasize deleted messages", s.redDisabledMessages); /* layout.addTitle2("Cache"); diff --git a/src/widgets/settingspages/LookPage.cpp b/src/widgets/settingspages/LookPage.cpp index 3c1c2ed66..9ba2f983b 100644 --- a/src/widgets/settingspages/LookPage.cpp +++ b/src/widgets/settingspages/LookPage.cpp @@ -182,12 +182,6 @@ void LookPage::addMessageTab(LayoutCreator layout) layout.append( this->createCheckBox("Compact emotes", getSettings()->compactEmotes)); - /// greyOutHistoricMessages setting changed by hemirt from checkbox to - /// historicMessagesBehaviour dropdown QString option - // layout.append(this->createCheckBox("Grey out historic messages", - // getSettings()->greyOutHistoricMessages)); - /// - // -- layout.emplace(false); // bold-slider From 4cf656fe62bb3a1d521fad0cd2caa07eed93edef Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Fri, 19 Apr 2019 12:13:53 +0200 Subject: [PATCH 029/138] add appveyor.yml file to repo --- appveyor.yml | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..57152b197 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,65 @@ +version: 1.0.{build} +branches: + only: + - nightly +image: Visual Studio 2017 +platform: Any CPU +clone_depth: 1 +init: +- cmd: '' +install: +- cmd: >- + git submodule update --init --recursive + + set QTDIR=C:\Qt\5.11\msvc2017_64 + + set PATH=%PATH%;%QTDIR%\bin + + call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 +build_script: +- cmd: >- + curl -fsS -o openssl.7z https://pajlada.se/files/openssl.7z + + 7z x openssl.7z + + dir + + mkdir build + + cd build + + qmake ../chatterino.pro BOOST_DIRECTORY="C:\Libraries\boost_1_64_0" BOOST_LIB_SUFFIX="lib64-msvc-14.1" OPENSSL_DIRECTORY="%APPVEYOR_BUILD_FOLDER%\openssl" DEFINES+="CHATTERINO_NIGHTLY_VERSION_STRING=\\\"$$system(git describe --always)-$$system(git rev-list master --count)\\\"" + + set cl=/MP + + nmake /S /NOLOGO + + git clone https://github.com/pajlada/chatterino2-dlls.git + + mkdir Chatterino2 + + cp ../openssl/bin/libcrypto*.dll ../openssl/bin/libssl*.dll Chatterino2/ + + cp chatterino2-dlls/*.dll Chatterino2/ + + windeployqt release/chatterino.exe --release --no-compiler-runtime --no-translations --no-opengl-sw --dir Chatterino2/ + + cp release/chatterino.exe Chatterino2/ + + 7z a chatterino2.zip Chatterino2/ +artifacts: +- path: build/chatterino2.zip + name: chatterino2 +deploy: +- provider: GitHub + tag: nightly-win + release: nightly-win + description: 'nightly v$(appveyor_build_version) built $(APPVEYOR_REPO_COMMIT_TIMESTAMP)\nLast change: $(APPVEYOR_REPO_COMMIT_MESSAGE) \n$(APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED)' + auth_token: + secure: sAJzAbiQSsYZLT+byDar9u61X0E9o35anaPMSFkOzdHeDFHjx1kW4cDP/4EEbxhx + repository: fourtf/chatterino2 + artifact: build/chatterino2.zip + prerelease: true + force_update: true + on: + branch: nightly \ No newline at end of file From 4f79d6fc07978319143b7a34d03a8d19b398290e Mon Sep 17 00:00:00 2001 From: apa420 Date: Fri, 19 Apr 2019 22:44:02 +0200 Subject: [PATCH 030/138] Added deleted messages, will also add the disabled tag to denied automod messages --- src/Application.cpp | 1 + src/common/Channel.cpp | 25 +++++++++++++ src/common/Channel.hpp | 1 + .../moderationactions/ModerationAction.cpp | 4 +++ src/providers/twitch/IrcMessageHandler.cpp | 35 +++++++++++++++++++ src/providers/twitch/IrcMessageHandler.hpp | 1 + src/providers/twitch/PubsubClient.cpp | 3 ++ src/providers/twitch/TwitchMessageBuilder.cpp | 1 + src/providers/twitch/TwitchServer.cpp | 4 +++ src/widgets/helper/ChannelView.cpp | 4 ++- 10 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/Application.cpp b/src/Application.cpp index 2870c6ed6..d92e6e896 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -264,6 +264,7 @@ void Application::initPubsub() auto msg = MessageBuilder(action).release(); postToThread([chan, msg] { chan->addMessage(msg); }); + chan->deleteMessage(msg->id); }); this->twitch.pubsub->start(); diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index 905bd1b6c..82432db44 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -212,6 +212,31 @@ void Channel::replaceMessage(MessagePtr message, MessagePtr replacement) } } +void Channel::deleteMessage(QString messageID) +{ + LimitedQueueSnapshot snapshot = this->getMessageSnapshot(); + int snapshotLength = snapshot.size(); + + int end = std::max(0, snapshotLength - 20); + + QTime minimumTime = QTime::currentTime().addSecs(-5); + for (int i = snapshotLength - 1; i >= end; --i) + { + auto &s = snapshot[i]; + + if (s->parseTime < minimumTime) + { + break; + } + + if (s->id == messageID) + { + s->flags.set(MessageFlag::Disabled); + break; + } + } +} + void Channel::addRecentChatter(const MessagePtr &message) { } diff --git a/src/common/Channel.hpp b/src/common/Channel.hpp index c45d9c973..9abc668ea 100644 --- a/src/common/Channel.hpp +++ b/src/common/Channel.hpp @@ -62,6 +62,7 @@ public: void addOrReplaceTimeout(MessagePtr message); void disableAllMessages(); void replaceMessage(MessagePtr message, MessagePtr replacement); + void deleteMessage(QString messageID); QStringList modList; diff --git a/src/controllers/moderationactions/ModerationAction.cpp b/src/controllers/moderationactions/ModerationAction.cpp index 0b6418a57..8683f2c4e 100644 --- a/src/controllers/moderationactions/ModerationAction.cpp +++ b/src/controllers/moderationactions/ModerationAction.cpp @@ -73,6 +73,10 @@ ModerationAction::ModerationAction(const QString &action) { this->image_ = Image::fromPixmap(getApp()->resources->buttons.ban); } + else if (action.startsWith("/delete")) + { + this->image_ = Image::fromPixmap(getApp()->resources->pajaDank); + } else { QString xD = action; diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 6c9d9b592..26766b1c0 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -267,6 +267,41 @@ void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message) } } +void IrcMessageHandler::handleClearMessageMessage(Communi::IrcMessage *message) +{ + // check parameter count + if (message->parameters().length() < 1) + { + return; + } + + QString chanName; + if (!trimChannelName(message->parameter(0), chanName)) + { + return; + } + + auto app = getApp(); + + // get channel + auto chan = app->twitch.server->getChannelOrEmpty(chanName); + + if (chan->isEmpty()) + { + log("[IrcMessageHandler:handleClearMessageMessage] Twitch channel {} " + "not " + "found", + chanName); + return; + } + + auto tags = message->tags(); + + QString targetID = tags.value("target-msg-id").toString(); + + chan->deleteMessage(targetID); +} + void IrcMessageHandler::handleUserStateMessage(Communi::IrcMessage *message) { auto app = getApp(); diff --git a/src/providers/twitch/IrcMessageHandler.hpp b/src/providers/twitch/IrcMessageHandler.hpp index 0474f097b..861ee734e 100644 --- a/src/providers/twitch/IrcMessageHandler.hpp +++ b/src/providers/twitch/IrcMessageHandler.hpp @@ -27,6 +27,7 @@ public: void handleRoomStateMessage(Communi::IrcMessage *message); void handleClearChatMessage(Communi::IrcMessage *message); + void handleClearMessageMessage(Communi::IrcMessage *message); void handleUserStateMessage(Communi::IrcMessage *message); void handleWhisperMessage(Communi::IrcMessage *message); diff --git a/src/providers/twitch/PubsubClient.cpp b/src/providers/twitch/PubsubClient.cpp index 0a8976618..5108c5ad4 100644 --- a/src/providers/twitch/PubsubClient.cpp +++ b/src/providers/twitch/PubsubClient.cpp @@ -710,6 +710,9 @@ PubSub::PubSub() // qDebug() << QString::fromStdString(rj::stringify(data)); }; + this->moderationActionHandlers["delete"] = + [this](const auto &data, const auto &roomID) { qDebug() << "xd"; }; + this->websocketClient.set_access_channels(websocketpp::log::alevel::all); this->websocketClient.clear_access_channels( websocketpp::log::alevel::frame_payload); diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 204cf6c04..6073e6449 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -582,6 +582,7 @@ void TwitchMessageBuilder::parseMessageID() { this->messageID = iterator.value().toString(); } + this->message().id = this->messageID; } void TwitchMessageBuilder::parseRoomID() diff --git a/src/providers/twitch/TwitchServer.cpp b/src/providers/twitch/TwitchServer.cpp index 349e40357..eaf90026e 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -156,6 +156,10 @@ void TwitchServer::messageReceived(Communi::IrcMessage *message) { handler.handleClearChatMessage(message); } + else if (command == "CLEARMSG") + { + handler.handleClearMessageMessage(message); + } else if (command == "USERSTATE") { handler.handleUserStateMessage(message); diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index 9578c352a..a1fdf645f 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -1667,7 +1667,9 @@ void ChannelView::handleLinkClick(QMouseEvent *event, const Link &link, case Link::UserAction: { QString value = link.value; - value.replace("{user}", layout->getMessage()->loginName).replace("{channel}", this->channel_->getName()); + value.replace("{user}", layout->getMessage()->loginName) + .replace("{channel}", this->channel_->getName()) + .replace("{msg-id}", layout->getMessage()->id); this->channel_->sendMessage(value); } break; From ad38d0ca1cdb37980365c57df48acac0628da674 Mon Sep 17 00:00:00 2001 From: TranRed Date: Mon, 22 Apr 2019 09:03:52 +0200 Subject: [PATCH 031/138] Added setting for opening streams from toast Implemented #710 Added options for opening streams from clicking the toas notficiation: (according to options in splits) - open in browser - open player in browser - open in streamlink (needs to be tested, but should in theory work, since I only use the already existing function) - don't open the stream (in case someone wants to prevent opening streams "by accident") --- src/singletons/Settings.hpp | 1 + src/singletons/Toasts.cpp | 35 ++++++++++++++++--- .../settingspages/NotificationPage.cpp | 16 +++++++++ 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index c471f0632..9e3df9dcf 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -172,6 +172,7 @@ public: "qrc:/sounds/ping3.wav"}; BoolSetting notificationToast = {"/notifications/enableToast", false}; + QStringSetting openFromToast = {"/notifications/openFromToast", "in browser"}; /// External tools // Streamlink diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index 367724368..9ccefbb3d 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -8,6 +8,7 @@ #include "providers/twitch/TwitchCommon.hpp" #include "providers/twitch/TwitchServer.hpp" #include "singletons/Paths.hpp" +#include "util/StreamLink.hpp" #ifdef Q_OS_WIN @@ -85,12 +86,30 @@ public: } void toastActivated() const { + QString openingMode = getSettings()->openFromToast; QString link; - if (platform_ == Platform::Twitch) + if (openingMode == "in browser") { - link = "http://www.twitch.tv/" + channelName_; + if (platform_ == Platform::Twitch) + { + link = "http://www.twitch.tv/" + channelName_; + } + QDesktopServices::openUrl(QUrl(link)); } - QDesktopServices::openUrl(QUrl(link)); + else if (openingMode == "player in browser") + { + if (platform_ == Platform::Twitch) + { + link = "https://player.twitch.tv/?channel=" + channelName_; + } + QDesktopServices::openUrl(QUrl(link)); + } + else if (openingMode == "in streamlink") + { + openStreamlinkForChannel(channelName_); + } + //the fourth and last option is "don't open" + //in this case obviously nothing should happen } void toastActivated(int actionIndex) const @@ -115,8 +134,14 @@ void Toasts::sendWindowsNotification(const QString &channelName, Platform p) std::wstring widestr = std::wstring(utf8_text.begin(), utf8_text.end()); templ.setTextField(widestr, WinToastLib::WinToastTemplate::FirstLine); - templ.setTextField(L"Click here to open in browser", - WinToastLib::WinToastTemplate::SecondLine); + + if (getSettings()->openFromToast != "don't open") { + QString mode = getSettings()->openFromToast ; + + templ.setTextField(L"Click here to open " + mode.toStdWString(), + WinToastLib::WinToastTemplate::SecondLine); + } + QString Path; if (p == Platform::Twitch) { diff --git a/src/widgets/settingspages/NotificationPage.cpp b/src/widgets/settingspages/NotificationPage.cpp index c557a0178..c1f5fd84e 100644 --- a/src/widgets/settingspages/NotificationPage.cpp +++ b/src/widgets/settingspages/NotificationPage.cpp @@ -17,6 +17,10 @@ #include #include + +#define TOAST_REACTIONS \ +"in browser", "player in browser", "in streamlink", "don't open" + namespace chatterino { NotificationPage::NotificationPage() @@ -39,6 +43,18 @@ NotificationPage::NotificationPage() settings.append( this->createCheckBox("Enable toasts (Windows 8 or later)", getSettings()->notificationToast)); + auto openIn = + settings.emplace().withoutMargin(); + { + openIn.emplace("Open stream from Toast: ")->setSizePolicy( + QSizePolicy::Maximum, QSizePolicy::Preferred); + openIn.append( + this->createComboBox({TOAST_REACTIONS}, + getSettings()->openFromToast))->setSizePolicy( + QSizePolicy::Maximum, QSizePolicy::Preferred); + } + openIn->setContentsMargins(40,0,0,0); + openIn->setSizeConstraint(QLayout::SetMaximumSize); #endif auto customSound = layout.emplace().withoutMargin(); From ac1957ff681a946687752e8fc60b318d4c81c120 Mon Sep 17 00:00:00 2001 From: TranRed Date: Mon, 22 Apr 2019 18:32:58 +0200 Subject: [PATCH 032/138] Quick fix for highlighting in light themes set defaults for highlighting colors. Only use "hidden setting" when populated. --- src/singletons/Settings.hpp | 2 +- src/singletons/Theme.cpp | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 9e3df9dcf..17ff94637 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -144,7 +144,7 @@ public: "/highlighting/whisperHighlight/enableSound", false}; BoolSetting enableWhisperHighlightTaskbar = { "/highlighting/whisperHighlight/enableTaskbarFlashing", false}; - QStringSetting highlightColor = {"/highlighting/color", "#4B282C"}; + QStringSetting highlightColor = {"/highlighting/color", ""}; BoolSetting longAlerts = {"/highlighting/alerts", false}; diff --git a/src/singletons/Theme.cpp b/src/singletons/Theme.cpp index 70d70776c..1c1411ec2 100644 --- a/src/singletons/Theme.cpp +++ b/src/singletons/Theme.cpp @@ -38,6 +38,10 @@ void Theme::actuallyUpdate(double hue, double multiplier) this->splits.resizeHandle = QColor(0, 148, 255, 0xff); this->splits.resizeHandleBackground = QColor(0, 148, 255, 0x50); + + // Highlighted Messages: theme support quick-fix + this->messages.backgrounds.highlighted = + QColor("#BD8489"); } else { @@ -46,6 +50,11 @@ void Theme::actuallyUpdate(double hue, double multiplier) this->splits.resizeHandle = QColor(0, 148, 255, 0x70); this->splits.resizeHandleBackground = QColor(0, 148, 255, 0x20); + + // Highlighted Messages: theme support quick-fix + this->messages.backgrounds.highlighted = + QColor("#4B282C"); + } this->splits.header.background = getColor(0, sat, flat ? 1 : 0.9); @@ -74,8 +83,13 @@ void Theme::actuallyUpdate(double hue, double multiplier) this->splits.dropPreviewBorder = QColor(0, 148, 255, 0xff); // Highlighted Messages - this->messages.backgrounds.highlighted = - QColor(getSettings()->highlightColor); + // hidden setting from PR #744 - if set it will overwrite theme color (for now!) + //TODO: implement full theme support + if (getSettings()->highlightColor != "") { + this->messages.backgrounds.highlighted = + QColor(getSettings()->highlightColor); + } + } void Theme::normalizeColor(QColor &color) From 31135132904f74475211980d865afc98b39400e4 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Tue, 23 Apr 2019 09:10:34 +0200 Subject: [PATCH 033/138] remove stupid log message --- src/providers/twitch/IrcMessageHandler.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 6c9d9b592..7e89c6b45 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -72,7 +72,6 @@ std::vector IrcMessageHandler::parseMessage( std::vector IrcMessageHandler::parsePrivMessage( Channel *channel, Communi::IrcPrivateMessage *message) { - log("Parse priv msg"); std::vector builtMessages; MessageParseArgs args; TwitchMessageBuilder builder(channel, message, args, message->content(), From 68ce262d9eb1ae824a34d597aefb03167d39bd40 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 25 Apr 2019 11:47:36 +0300 Subject: [PATCH 034/138] Edited .travis.yml to add compilation and deployment for OS X. --- .travis.yml | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1267bf14c..bf6c4bdcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,36 @@ -before_install: - - sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa - - sudo apt-get update -qq - - sudo apt-get install qtbase5-dev qtdeclarative5-dev libqt5webkit5-dev libsqlite3-dev - - sudo apt-get install qt5-default qttools5-dev-tools +os: osx +osx_image: xcode10.2 + +addons: + homebrew: + packages: + - boost + - openssl + - rapidjson + - qt + - p7zip + +compiler: clang script: - - qmake -qt=qt5 -v - - qmake -qt=qt5 - - make + - mkdir build && cd build + - /usr/local/opt/qt/bin/qmake .. && make -j8 + - 7z a chatterino2.zip chatterino.app + +before_deploy: + - git config --global user.email "builds@travis-ci.com" + - git config --global user.name "Travis CI" + - export GIT_TAG=nightly-mac-0.$TRAVIS_BUILD_NUMBER + - git tag $GIT_TAG -a -m "Nightly last change - $TRAVIS_COMMIT_MESSAGE" + - git push -q https://$GITHUB_KEY@github.com/fourtf/chatterino2 --tags + - ls -R + +deploy: + skip_cleanup: true + provider: releases + api_key: $GITHUB_KEY + file: "chatterino2.zip" + prerelease: true + on: + tags: false + branch: nightly \ No newline at end of file From 40b4c2fefc6d3a4541f784a1e6bbefffc828a156 Mon Sep 17 00:00:00 2001 From: tetyys Date: Sat, 27 Apr 2019 00:31:15 +0300 Subject: [PATCH 035/138] Change to new character to make duplicate message error bypass work again --- src/providers/twitch/TwitchChannel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 027d4213e..1956e47f9 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -123,7 +123,7 @@ TwitchChannel::TwitchChannel(const QString &name, // -- this->messageSuffix_.append(' '); - this->messageSuffix_.append(QChar(0x206D)); + this->messageSuffix_.append("ó €€"); // E0000 // debugging #if 0 From 53640a90972602ba8f731ccd0b925dce19149f1d Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 27 Apr 2019 14:18:51 +0300 Subject: [PATCH 036/138] Fixed display of text message in empty tabs for Retina screen. --- src/widgets/splits/SplitContainer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/widgets/splits/SplitContainer.cpp b/src/widgets/splits/SplitContainer.cpp index 507cd20e3..9fce4158b 100644 --- a/src/widgets/splits/SplitContainer.cpp +++ b/src/widgets/splits/SplitContainer.cpp @@ -3,6 +3,7 @@ #include "Application.hpp" #include "common/Common.hpp" #include "debug/AssertInGuiThread.hpp" +#include "singletons/Fonts.hpp" #include "singletons/Theme.hpp" #include "singletons/WindowManager.hpp" #include "util/Helpers.hpp" @@ -527,6 +528,10 @@ void SplitContainer::paintEvent(QPaintEvent *) painter.setPen(this->theme->splits.header.text); + const auto font = + getApp()->fonts->getFont(FontStyle::ChatMedium, this->scale()); + painter.setFont(font); + QString text = "Click to add a split"; Notebook *notebook = dynamic_cast(this->parentWidget()); From 780b1e8622a78e6d9ddc28b5bbe4585888cbd3b0 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 27 Apr 2019 16:28:44 +0300 Subject: [PATCH 037/138] Fixed icon of application for OS X. --- chatterino.pro | 2 +- resources/{chatterino2.icns => chatterino.icns} | Bin resources/resources_autogenerated.qrc | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename resources/{chatterino2.icns => chatterino.icns} (100%) diff --git a/chatterino.pro b/chatterino.pro index ccac62a84..f13ae1139 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -34,7 +34,7 @@ equals(QMAKE_CXX, "clang++")|equals(QMAKE_CXX, "g++") { } # Icons -#macx:ICON = resources/images/chatterino2.icns +macx:ICON = resources/chatterino.icns win32:RC_FILE = resources/windows.rc macx { diff --git a/resources/chatterino2.icns b/resources/chatterino.icns similarity index 100% rename from resources/chatterino2.icns rename to resources/chatterino.icns diff --git a/resources/resources_autogenerated.qrc b/resources/resources_autogenerated.qrc index fcf0b5dac..8aed98b94 100644 --- a/resources/resources_autogenerated.qrc +++ b/resources/resources_autogenerated.qrc @@ -1,5 +1,5 @@ - chatterino2.icns + chatterino.icns contributors.txt emoji.json emojidata.txt From 3c1d2646898116cceefb7d66fb44499a10ca570b Mon Sep 17 00:00:00 2001 From: apa420 Date: Sun, 28 Apr 2019 02:25:05 +0200 Subject: [PATCH 038/138] Added trashcan, replaced messageID var with this-message().id, removed pubsub stuff that didn't belong --- resources/buttons/trashCan.png | Bin 0 -> 3087 bytes resources/resources_autogenerated.qrc | 1 + src/autogenerated/ResourcesAutogen.cpp | 1 + src/autogenerated/ResourcesAutogen.hpp | 1 + src/common/Channel.cpp | 8 +------- .../moderationactions/ModerationAction.cpp | 2 +- src/providers/twitch/PubsubClient.cpp | 3 --- src/providers/twitch/TwitchMessageBuilder.cpp | 5 ++--- src/providers/twitch/TwitchMessageBuilder.hpp | 7 ++++--- src/widgets/settingspages/ModerationPage.cpp | 3 ++- 10 files changed, 13 insertions(+), 18 deletions(-) create mode 100644 resources/buttons/trashCan.png diff --git a/resources/buttons/trashCan.png b/resources/buttons/trashCan.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e11bf4969ebe501019b7be6bb691bc5d967cd4 GIT binary patch literal 3087 zcmYjTc{CJk7k>uXw`56{Y$4m&Wgj#4HH>DYvKu9#)L5diuaRVLL}gzpG8#*bB}7KZ zI+pAq>a|2!=F|Iq@A=+)&V7FO{?6~-d!GB(O*n6D!p3}x834d$W@>16gf4%ak^bnN z&BmTP0w#Y`$6ElfxBYQQr(dZD0L(U55s35Wz5N3HZh8Cpihw0$m01v?(dL zWFA{N)p&a=cEfdaWW`7fZviA|kcAPDtnx^Tf^k%i6?o1i z2re2z3QRj^!HDAqu#gmZF@PCEaQJLVdr&|JTzcHy=D>M*;39QzaS-6}yE&l{;Pgn8 z2U3s*L{50d8v<`_P}z4O(FmXw0k@Y$yCxWw2a0AWFH`Wc9+1eKEH!|U6)4)q$D9Rp zp}?g}Ts#Ow=KyZw4V2DbveleRGDn-rsnH=yXc|R0G0F!ppim0J(quC}S#EV#8rNKy zLThjizjA~s$Cu5I02HM09Q}6lAc)LfO(v_S5ZImNSKiT6#oXNH4j1|={9yph1cvt? z%0X*S;k4;-zK2iGtkZd4VJW!1ljK#y0jmQA%j2j`|3AAiDttg38(Wy4A2n}>JGpkF z!VWR5&Lq^q^@`P2N;45=($TJp2C40M%o5T5gY4Z(0q!yru^UO_MLZ>`wdBLW&a| zNSfUNV58Bm<+C&+EzUb?rVmT~u76-sa0cMK%pL{+aK%tU0oh%v-^mDoVL^nCwSB4Y-J=|I=1(vkchOkL*Pr9JD`S3(bW;Qqok17l30Kkac!*mfT0Di3FDGVKw8fN;D@j7+Lp-;wm_?eJ zsghkHQpCYjXhZiVjb_{>wQ!g)6 z(l#b+yZ61q(s4x?k(ku!uy7GqVFOdNCE9w_v{Xb;LiPAKlLixQv~8=DSbC|&YsrS= zzuHf_DJ#XHP36Rgxl&I+IYZ+S?HUqX2?%8=;sYA9SI?0HTm!}fH|)fh<;wC@O;3rZ ze;D`hsbSE3Bqt)<6*G^YZ<|+{7nm2_aAL;0!2+J|+RsYcbzd{*U*KF&U7+{ORyJ^W zmTNazT8KQZmUIrI*r(`^K8iYzA;Dg)s9PZ5_7&Cz8%jb=_N%a zEv#0o)^qKwh{b1%wJo(RJ9|I&KJ6XOQOna+8c|-#Tgn^Bo33}c7<5sNP)c~?X;w3T zvDk5)&~zi_qNZaJ+Tr5mTH`8w)tTYOs>YJzB}D6V>x%qgOxw%92pTR z#i08*`$kpf2q${ZwqM2D=M9=*_%Os*1iUCs06f!hI>XF>+H z@p-j*t!t%}7whWlSJ&evo_th&ayH*l<<_URF2onxg?@dOCmD)9)0N>i2%88@-I6%e z9h!!!8hKe?ge~83{m!TNQ}5=JIlVa@jVa|RN9T_kr24M<9-B75eCL>H#65AU2Q`G+ z4@z)nAQ;+&2!jYGn!VkSyQ1$>^tC9SKWoO;43Z0o20R9-kyVikEmfl4UEdy5iS8_A zlhepo*<;R!e;xkB;JWCV)E3Sv6%!YOiq%i?k4K;CSISbu_D>*gO&k6;%ruP=oPAdA;jR=+?}v z$d~P1`&iped7$z5`xELKS1Z@dLqbuk1xj8Bz1UoNO|wQPAeh2D$8$_J_5yvS&YMJn zjPH<5#TqKBI=opj#L6e)N=tWSOC7{#mBoR1Atr2fVr1>I4I1h=UFZ5c7B8U3laN@= zP2tPpxi>035wsu>=hyu%XX4T8vWj-1N1xY#*Ye_&e7+NVW_i|P7W)mhvGLbz(-&T^ zZT~c)K(l(KDUDGC1o7EBoi|OMB_GJW+WN@n$Sve=r26{6WS#5C?v4I+fzYO(s^5kv zPE9)pdLQ0W93T!>LtaCkduDsJJNnfL<;%O7d%l;etbGI4I%x-J4;aMR2_wYMLqY?( zNW0Ww*;Nzv&eLxX@!zrXZ0c+d_aAr6iu)S|&oA#VP45V^X^r1W4y~MF7(9JP2qOf& z2G8BdHO{lo-E(qtYOwjJ*FU^66|!$aInD7{RmU;dd=vTM>iBZxU^-@_FBzYK4+~fL zHQ_>eN(fzYCr@AF@cZ7t88|awL`_=KZqg=S+ISPVQA1fcfqH|=eWB&-yArsfbC^D8 z)7kjAF}Ip{$%nWe(p(qnwX-acuR)&NY7YL3mpVL@ucuj1^{pwWeJjD-($$9bRAjks?|t#g#~R-NVb$QSY%uKX!<{vOEd9nj@xK2)c0?u;28V@B%Y6!?kH=3=;)HmH~*(h zAke^GHOGFsknbpz~4u-5!A52ROycnp8uPr z!6-!W+i}^y8O3e*{(LAcDF^!FC@0B6YPx<{&=`v2{;StqrNM?Ah0=|wqdu`50Hz&% z!HJ)6`fwTahwWMb4-;QN17H9!!hXFy(ow0jAjII%zpm!XwLcxqjI0f-;VzN?0m{mR AivR!s literal 0 HcmV?d00001 diff --git a/resources/resources_autogenerated.qrc b/resources/resources_autogenerated.qrc index fcf0b5dac..4c15a6a82 100644 --- a/resources/resources_autogenerated.qrc +++ b/resources/resources_autogenerated.qrc @@ -24,6 +24,7 @@ buttons/modModeEnabled.png buttons/modModeEnabled2.png buttons/timeout.png + buttons/trashCan.png buttons/unban.png buttons/unmod.png buttons/update.png diff --git a/src/autogenerated/ResourcesAutogen.cpp b/src/autogenerated/ResourcesAutogen.cpp index 34cf039ef..59f5fce70 100644 --- a/src/autogenerated/ResourcesAutogen.cpp +++ b/src/autogenerated/ResourcesAutogen.cpp @@ -18,6 +18,7 @@ Resources2::Resources2() this->buttons.modModeEnabled = QPixmap(":/buttons/modModeEnabled.png"); this->buttons.modModeEnabled2 = QPixmap(":/buttons/modModeEnabled2.png"); this->buttons.timeout = QPixmap(":/buttons/timeout.png"); + this->buttons.trashCan = QPixmap(":/buttons/trashCan.png"); this->buttons.unban = QPixmap(":/buttons/unban.png"); this->buttons.unmod = QPixmap(":/buttons/unmod.png"); this->buttons.update = QPixmap(":/buttons/update.png"); diff --git a/src/autogenerated/ResourcesAutogen.hpp b/src/autogenerated/ResourcesAutogen.hpp index fbbb2fbf3..1c8a0bce4 100644 --- a/src/autogenerated/ResourcesAutogen.hpp +++ b/src/autogenerated/ResourcesAutogen.hpp @@ -24,6 +24,7 @@ public: QPixmap modModeEnabled; QPixmap modModeEnabled2; QPixmap timeout; + QPixmap trashCan; QPixmap unban; QPixmap unmod; QPixmap update; diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index 82432db44..caa432752 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -217,18 +217,12 @@ void Channel::deleteMessage(QString messageID) LimitedQueueSnapshot snapshot = this->getMessageSnapshot(); int snapshotLength = snapshot.size(); - int end = std::max(0, snapshotLength - 20); + int end = std::max(0, snapshotLength - 200); - QTime minimumTime = QTime::currentTime().addSecs(-5); for (int i = snapshotLength - 1; i >= end; --i) { auto &s = snapshot[i]; - if (s->parseTime < minimumTime) - { - break; - } - if (s->id == messageID) { s->flags.set(MessageFlag::Disabled); diff --git a/src/controllers/moderationactions/ModerationAction.cpp b/src/controllers/moderationactions/ModerationAction.cpp index 8683f2c4e..199ea5521 100644 --- a/src/controllers/moderationactions/ModerationAction.cpp +++ b/src/controllers/moderationactions/ModerationAction.cpp @@ -75,7 +75,7 @@ ModerationAction::ModerationAction(const QString &action) } else if (action.startsWith("/delete")) { - this->image_ = Image::fromPixmap(getApp()->resources->pajaDank); + this->image_ = Image::fromPixmap(getApp()->resources->buttons.trashCan); } else { diff --git a/src/providers/twitch/PubsubClient.cpp b/src/providers/twitch/PubsubClient.cpp index 5108c5ad4..0a8976618 100644 --- a/src/providers/twitch/PubsubClient.cpp +++ b/src/providers/twitch/PubsubClient.cpp @@ -710,9 +710,6 @@ PubSub::PubSub() // qDebug() << QString::fromStdString(rj::stringify(data)); }; - this->moderationActionHandlers["delete"] = - [this](const auto &data, const auto &roomID) { qDebug() << "xd"; }; - this->websocketClient.set_access_channels(websocketpp::log::alevel::all); this->websocketClient.clear_access_channels( websocketpp::log::alevel::frame_payload); diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 6073e6449..b935a2831 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -580,9 +580,8 @@ void TwitchMessageBuilder::parseMessageID() if (iterator != this->tags.end()) { - this->messageID = iterator.value().toString(); + this->message().id = iterator.value().toString(); } - this->message().id = this->messageID; } void TwitchMessageBuilder::parseRoomID() @@ -608,7 +607,7 @@ void TwitchMessageBuilder::parseRoomID() void TwitchMessageBuilder::appendChannelName() { QString channelName("#" + this->channel->getName()); - Link link(Link::Url, this->channel->getName() + "\n" + this->messageID); + Link link(Link::Url, this->channel->getName() + "\n" + this->message().id); this->emplace(channelName, MessageElementFlag::ChannelName, MessageColor::System) // diff --git a/src/providers/twitch/TwitchMessageBuilder.hpp b/src/providers/twitch/TwitchMessageBuilder.hpp index 5aa72b204..da7b3865c 100644 --- a/src/providers/twitch/TwitchMessageBuilder.hpp +++ b/src/providers/twitch/TwitchMessageBuilder.hpp @@ -41,7 +41,6 @@ public: MessageParseArgs args; const QVariantMap tags; - QString messageID; QString userName; bool isIgnored() const; @@ -55,8 +54,10 @@ private: void appendUsername(); void parseHighlights(bool isPastMsg); - void appendTwitchEmote(const QString &emote, - std::vector> &vec, std::vector &correctPositions); + void appendTwitchEmote( + const QString &emote, + std::vector> &vec, + std::vector &correctPositions); Outcome tryAppendEmote(const EmoteName &name); void addWords( diff --git a/src/widgets/settingspages/ModerationPage.cpp b/src/widgets/settingspages/ModerationPage.cpp index 3349d2e93..b44e73274 100644 --- a/src/widgets/settingspages/ModerationPage.cpp +++ b/src/widgets/settingspages/ModerationPage.cpp @@ -161,7 +161,8 @@ ModerationPage::ModerationPage() // clang-format off auto label = modMode.emplace( "Moderation mode is enabled by clicking in a channel that you moderate.

" - "Moderation buttons can be bound to chat commands such as \"/ban {user}\", \"/timeout {user} 1000\", \"/w someusername !report {user} was bad in channel {channel}\" or any other custom text commands.
"); + "Moderation buttons can be bound to chat commands such as \"/ban {user}\", \"/timeout {user} 1000\", \"/w someusername !report {user} was bad in channel {channel}\" or any other custom text commands.
" + "For deleting messages use /delete {msg-id}."); label->setWordWrap(true); label->setStyleSheet("color: #bbb"); // clang-format on From ae0122e38976ec215b397daac993004c129eed47 Mon Sep 17 00:00:00 2001 From: apa420 Date: Sun, 28 Apr 2019 11:31:34 +0200 Subject: [PATCH 039/138] Added a message when an invalid /delete appears --- src/providers/twitch/IrcMessageHandler.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 26766b1c0..e1c4c7216 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -552,7 +552,17 @@ void IrcMessageHandler::handleNoticeMessage(Communi::IrcNoticeMessage *message) return; } - channel->addMessage(msg); + QString tags = message->tags().value("msg-id", "").toString(); + if (tags == "bad_delete_message_error" || tags == "usage_delete") + { + channel->addMessage(makeSystemMessage( + "Usage: \"/delete \" - can't take more " + "than one argument")); + } + else + { + channel->addMessage(msg); + } } } From 31ab2428f6c22c00c37236920fcb380e056289f6 Mon Sep 17 00:00:00 2001 From: apa420 Date: Sun, 28 Apr 2019 12:46:55 +0200 Subject: [PATCH 040/138] Pajlada made a nice trashcan, thank him :) --- resources/buttons/trashCan.png | Bin 3087 -> 687 bytes resources/buttons/trashcan.svg | 124 +++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 resources/buttons/trashcan.svg diff --git a/resources/buttons/trashCan.png b/resources/buttons/trashCan.png index b5e11bf4969ebe501019b7be6bb691bc5d967cd4..fd1bce3a0bb38891e1bcc82969b23ca38f673928 100644 GIT binary patch literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ zuwMXS#+}{I=K}>LOI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kz!zA((!b0 z45^s&cJ{_RVMl?s|CT`)KZuCDRM_j7nbFXf&TulK&a@9Yn#|DfD)MLDmzfV0 zdzM{YV#)U8>!pX8l|McmxOLQ~p~`Ciaz=Zlz0QFr{_fp=c>XlI)>LB#hY5_24vI^C zxDb{8Ryd&FpG~WRi?dv4`yTG2d0&Jt>T~_^yXDtizv#!7|9L-jZyA?um^J50!#h>c zh02>h73|nwRPyt{Q}gxlxl3{cr?Q{+cS_;ApdRM*ZOy&ee^quQx-d;JuIAMad!MV? zaJt+j&CF@q37u_1B@t|?3`fiMu-7q4#pYeQxT$`6>Ibb=i=T;Toqx>qYom?C-i&JB zwEFohH<@y57`8D;PiA_S~4SwI}2pZ0ChbJ&9?abNzAU)Lr}ZZ!!lQ)G+f4 zy)WJ!{@~lJ!d1WGeyE%fOL)wv97A+NFZ%&vg^~pwB8-9Nb^o#NW4fRG zIOJ>X%~N+B#JbaqvS0HuBz*jDQCb_ni9MjM;w$?BgYeq;8le>K4Ld(FE}6?5!ge*V zc-EI$6Xi7Zr&kHxY4iG1zeoC1Z#}C`!!~t~3HvQwf-W3gdsukGNo%iLySMTs6qipq tQr;3%9d^C!r&-vxC$nS~`-)A)Eq-rTJnh&y9hkTnJYD@<);T3K0RTr?B&YxY literal 3087 zcmYjTc{CJk7k>uXw`56{Y$4m&Wgj#4HH>DYvKu9#)L5diuaRVLL}gzpG8#*bB}7KZ zI+pAq>a|2!=F|Iq@A=+)&V7FO{?6~-d!GB(O*n6D!p3}x834d$W@>16gf4%ak^bnN z&BmTP0w#Y`$6ElfxBYQQr(dZD0L(U55s35Wz5N3HZh8Cpihw0$m01v?(dL zWFA{N)p&a=cEfdaWW`7fZviA|kcAPDtnx^Tf^k%i6?o1i z2re2z3QRj^!HDAqu#gmZF@PCEaQJLVdr&|JTzcHy=D>M*;39QzaS-6}yE&l{;Pgn8 z2U3s*L{50d8v<`_P}z4O(FmXw0k@Y$yCxWw2a0AWFH`Wc9+1eKEH!|U6)4)q$D9Rp zp}?g}Ts#Ow=KyZw4V2DbveleRGDn-rsnH=yXc|R0G0F!ppim0J(quC}S#EV#8rNKy zLThjizjA~s$Cu5I02HM09Q}6lAc)LfO(v_S5ZImNSKiT6#oXNH4j1|={9yph1cvt? z%0X*S;k4;-zK2iGtkZd4VJW!1ljK#y0jmQA%j2j`|3AAiDttg38(Wy4A2n}>JGpkF z!VWR5&Lq^q^@`P2N;45=($TJp2C40M%o5T5gY4Z(0q!yru^UO_MLZ>`wdBLW&a| zNSfUNV58Bm<+C&+EzUb?rVmT~u76-sa0cMK%pL{+aK%tU0oh%v-^mDoVL^nCwSB4Y-J=|I=1(vkchOkL*Pr9JD`S3(bW;Qqok17l30Kkac!*mfT0Di3FDGVKw8fN;D@j7+Lp-;wm_?eJ zsghkHQpCYjXhZiVjb_{>wQ!g)6 z(l#b+yZ61q(s4x?k(ku!uy7GqVFOdNCE9w_v{Xb;LiPAKlLixQv~8=DSbC|&YsrS= zzuHf_DJ#XHP36Rgxl&I+IYZ+S?HUqX2?%8=;sYA9SI?0HTm!}fH|)fh<;wC@O;3rZ ze;D`hsbSE3Bqt)<6*G^YZ<|+{7nm2_aAL;0!2+J|+RsYcbzd{*U*KF&U7+{ORyJ^W zmTNazT8KQZmUIrI*r(`^K8iYzA;Dg)s9PZ5_7&Cz8%jb=_N%a zEv#0o)^qKwh{b1%wJo(RJ9|I&KJ6XOQOna+8c|-#Tgn^Bo33}c7<5sNP)c~?X;w3T zvDk5)&~zi_qNZaJ+Tr5mTH`8w)tTYOs>YJzB}D6V>x%qgOxw%92pTR z#i08*`$kpf2q${ZwqM2D=M9=*_%Os*1iUCs06f!hI>XF>+H z@p-j*t!t%}7whWlSJ&evo_th&ayH*l<<_URF2onxg?@dOCmD)9)0N>i2%88@-I6%e z9h!!!8hKe?ge~83{m!TNQ}5=JIlVa@jVa|RN9T_kr24M<9-B75eCL>H#65AU2Q`G+ z4@z)nAQ;+&2!jYGn!VkSyQ1$>^tC9SKWoO;43Z0o20R9-kyVikEmfl4UEdy5iS8_A zlhepo*<;R!e;xkB;JWCV)E3Sv6%!YOiq%i?k4K;CSISbu_D>*gO&k6;%ruP=oPAdA;jR=+?}v z$d~P1`&iped7$z5`xELKS1Z@dLqbuk1xj8Bz1UoNO|wQPAeh2D$8$_J_5yvS&YMJn zjPH<5#TqKBI=opj#L6e)N=tWSOC7{#mBoR1Atr2fVr1>I4I1h=UFZ5c7B8U3laN@= zP2tPpxi>035wsu>=hyu%XX4T8vWj-1N1xY#*Ye_&e7+NVW_i|P7W)mhvGLbz(-&T^ zZT~c)K(l(KDUDGC1o7EBoi|OMB_GJW+WN@n$Sve=r26{6WS#5C?v4I+fzYO(s^5kv zPE9)pdLQ0W93T!>LtaCkduDsJJNnfL<;%O7d%l;etbGI4I%x-J4;aMR2_wYMLqY?( zNW0Ww*;Nzv&eLxX@!zrXZ0c+d_aAr6iu)S|&oA#VP45V^X^r1W4y~MF7(9JP2qOf& z2G8BdHO{lo-E(qtYOwjJ*FU^66|!$aInD7{RmU;dd=vTM>iBZxU^-@_FBzYK4+~fL zHQ_>eN(fzYCr@AF@cZ7t88|awL`_=KZqg=S+ISPVQA1fcfqH|=eWB&-yArsfbC^D8 z)7kjAF}Ip{$%nWe(p(qnwX-acuR)&NY7YL3mpVL@ucuj1^{pwWeJjD-($$9bRAjks?|t#g#~R-NVb$QSY%uKX!<{vOEd9nj@xK2)c0?u;28V@B%Y6!?kH=3=;)HmH~*(h zAke^GHOGFsknbpz~4u-5!A52ROycnp8uPr z!6-!W+i}^y8O3e*{(LAcDF^!FC@0B6YPx<{&=`v2{;StqrNM?Ah0=|wqdu`50Hz&% z!HJ)6`fwTahwWMb4-;QN17H9!!hXFy(ow0jAjII%zpm!XwLcxqjI0f-;VzN?0m{mR AivR!s diff --git a/resources/buttons/trashcan.svg b/resources/buttons/trashcan.svg new file mode 100644 index 000000000..e225ee4ea --- /dev/null +++ b/resources/buttons/trashcan.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Trashcan top + + + + + + + From 56956eea588ae575fc1a4bfccbeedc2db033f7a8 Mon Sep 17 00:00:00 2001 From: hemirt Date: Sun, 28 Apr 2019 23:18:59 +0200 Subject: [PATCH 041/138] remove weeb hate --- src/messages/MessageElement.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/messages/MessageElement.hpp b/src/messages/MessageElement.hpp index 4ae74d848..6db4b616e 100644 --- a/src/messages/MessageElement.hpp +++ b/src/messages/MessageElement.hpp @@ -74,8 +74,7 @@ enum class MessageElementFlag { // - Chatterino top donator badge BadgeChatterino = (1 << 18), - // Rest of slots: ffz custom badge? bttv custom badge? mywaifu (puke) - // custom badge? + // Rest of slots: ffz custom badge? bttv custom badge? mywaifu custom badge? Badges = BadgeGlobalAuthority | BadgeChannelAuthority | BadgeSubscription | BadgeVanity | BadgeChatterino, From e0e7d366d3c49fedf21a163f5236f8828719a32c Mon Sep 17 00:00:00 2001 From: hemirt Date: Mon, 29 Apr 2019 20:33:04 +0200 Subject: [PATCH 042/138] remove useless comment --- src/messages/MessageElement.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/messages/MessageElement.hpp b/src/messages/MessageElement.hpp index 6db4b616e..a418347b3 100644 --- a/src/messages/MessageElement.hpp +++ b/src/messages/MessageElement.hpp @@ -74,8 +74,6 @@ enum class MessageElementFlag { // - Chatterino top donator badge BadgeChatterino = (1 << 18), - // Rest of slots: ffz custom badge? bttv custom badge? mywaifu custom badge? - Badges = BadgeGlobalAuthority | BadgeChannelAuthority | BadgeSubscription | BadgeVanity | BadgeChatterino, From 34f820be1847c7ecb75bc2d40c889f59bf3befa4 Mon Sep 17 00:00:00 2001 From: TranRed Date: Wed, 1 May 2019 09:58:13 +0200 Subject: [PATCH 043/138] implemented fallback logic for corrupted window layout (#1039) * fallback logic for corrupted window layout 1. before saving the window-layout a backup will created to avoid corruption due to crashes while saving 2. when starting chatterino and the window-layout file returns and empty window layout (due to corruptio) the backup will be read and the layout will be build from this data * Update WindowManager.hpp * used QSaveFile instead of crude custom implementation * implemented suggested feedback from review * proper method call was tired and slightly drunk Kapp --- src/singletons/WindowManager.cpp | 21 ++++++++++++++------- src/singletons/WindowManager.hpp | 1 + 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index e90e04e02..092014811 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -258,11 +259,7 @@ void WindowManager::initialize(Settings &settings, Paths &paths) // load file QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME; - QFile file(settingsPath); - file.open(QIODevice::ReadOnly); - QByteArray data = file.readAll(); - QJsonDocument document = QJsonDocument::fromJson(data); - QJsonArray windows_arr = document.object().value("windows").toArray(); + QJsonArray windows_arr = this->loadWindowArray(settingsPath); // "deserialize" for (QJsonValue window_val : windows_arr) @@ -477,7 +474,7 @@ void WindowManager::save() // save file QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME; - QFile file(settingsPath); + QSaveFile file(settingsPath); file.open(QIODevice::WriteOnly | QIODevice::Truncate); QJsonDocument::JsonFormat format = @@ -489,7 +486,7 @@ void WindowManager::save() ; file.write(document.toJson(format)); - file.flush(); + file.commit(); } void WindowManager::sendAlert() @@ -622,4 +619,14 @@ void WindowManager::incGeneration() this->generation_++; } +QJsonArray WindowManager::loadWindowArray(const QString &settingsPath) +{ + QFile file(settingsPath); + file.open(QIODevice::ReadOnly); + QByteArray data = file.readAll(); + QJsonDocument document = QJsonDocument::fromJson(data); + QJsonArray windows_arr = document.object().value("windows").toArray(); + return windows_arr; +} + } // namespace chatterino diff --git a/src/singletons/WindowManager.hpp b/src/singletons/WindowManager.hpp index 038eb41ab..dd9e7fb69 100644 --- a/src/singletons/WindowManager.hpp +++ b/src/singletons/WindowManager.hpp @@ -54,6 +54,7 @@ public: virtual void initialize(Settings &settings, Paths &paths) override; virtual void save() override; void closeAll(); + QJsonArray loadWindowArray(const QString &settingsPath); int getGeneration() const; void incGeneration(); From bbf649bf7090efa89c4d3e943031b4214c05c58a Mon Sep 17 00:00:00 2001 From: TranRed Date: Wed, 1 May 2019 16:08:45 +0200 Subject: [PATCH 044/138] Added {message} parameter for moderation buttons --- src/widgets/helper/ChannelView.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index a1fdf645f..a8ee61b34 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -1667,9 +1667,21 @@ void ChannelView::handleLinkClick(QMouseEvent *event, const Link &link, case Link::UserAction: { QString value = link.value; + value.replace("{user}", layout->getMessage()->loginName) .replace("{channel}", this->channel_->getName()) .replace("{msg-id}", layout->getMessage()->id); + + QString messageText; + if (value.contains("{message}")) + { + messageText = layout->getMessage()->searchText; + // remove name + : + space to only get the actual message text + messageText = messageText.remove( + 0, (layout->getMessage()->loginName.length() + 2)); + value.replace("{message}", messageText); + } + this->channel_->sendMessage(value); } break; From b33478d8c6910781d0b0f8c3699a916ce107fd7a Mon Sep 17 00:00:00 2001 From: TranRed Date: Wed, 1 May 2019 16:43:52 +0200 Subject: [PATCH 045/138] stored original message text in message --- src/messages/Message.hpp | 1 + src/messages/MessageBuilder.cpp | 5 +++++ src/providers/twitch/TwitchMessageBuilder.cpp | 1 + src/widgets/helper/ChannelView.cpp | 13 ++----------- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/messages/Message.hpp b/src/messages/Message.hpp index cdbb2a8d3..c187b5f55 100644 --- a/src/messages/Message.hpp +++ b/src/messages/Message.hpp @@ -48,6 +48,7 @@ struct Message : boost::noncopyable { QTime parseTime; QString id; QString searchText; + QString messageText; QString loginName; QString displayName; QString localizedName; diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index a029aea35..7b4c64ae8 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -97,6 +97,7 @@ MessageBuilder::MessageBuilder(const QString &text) this->emplace(); this->emplace(text, MessageElementFlag::Text, MessageColor::System); + this->message().messageText = text; this->message().searchText = text; } @@ -108,6 +109,7 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text) MessageColor::System); this->message().flags.set(MessageFlag::System); this->message().flags.set(MessageFlag::DoNotTriggerNotification); + this->message().messageText = text; this->message().searchText = text; } @@ -158,6 +160,7 @@ MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &username, this->emplace(); this->emplace(text, MessageElementFlag::Text, MessageColor::System); + this->message().messageText = text; this->message().searchText = text; } @@ -214,6 +217,7 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count) this->emplace(text, MessageElementFlag::Text, MessageColor::System); + this->message().messageText = text; this->message().searchText = text; } @@ -243,6 +247,7 @@ MessageBuilder::MessageBuilder(const UnbanAction &action) this->emplace(text, MessageElementFlag::Text, MessageColor::System); + this->message().messageText = text; this->message().searchText = text; } diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index b935a2831..8bccc6ea7 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -438,6 +438,7 @@ MessagePtr TwitchMessageBuilder::build() this->addWords(splits, twitchEmotes); + this->message().messageText = this->originalMessage_; this->message().searchText = this->userName + ": " + this->originalMessage_; return this->release(); diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index a8ee61b34..07c047eba 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -1670,17 +1670,8 @@ void ChannelView::handleLinkClick(QMouseEvent *event, const Link &link, value.replace("{user}", layout->getMessage()->loginName) .replace("{channel}", this->channel_->getName()) - .replace("{msg-id}", layout->getMessage()->id); - - QString messageText; - if (value.contains("{message}")) - { - messageText = layout->getMessage()->searchText; - // remove name + : + space to only get the actual message text - messageText = messageText.remove( - 0, (layout->getMessage()->loginName.length() + 2)); - value.replace("{message}", messageText); - } + .replace("{msg-id}", layout->getMessage()->id) + .replace("{message}", layout->getMessage()->messageText); this->channel_->sendMessage(value); } From 4a7856d9979b8f5403bf9600c9fa187f0c12a62a Mon Sep 17 00:00:00 2001 From: apa420 <17131426+apa420@users.noreply.github.com> Date: Wed, 1 May 2019 20:25:55 +0200 Subject: [PATCH 046/138] Update BUILDING_ON_WINDOWS.md --- BUILDING_ON_WINDOWS.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/BUILDING_ON_WINDOWS.md b/BUILDING_ON_WINDOWS.md index 7aedb0cab..a4ff67c32 100644 --- a/BUILDING_ON_WINDOWS.md +++ b/BUILDING_ON_WINDOWS.md @@ -102,7 +102,14 @@ To produce all supplement files for a standalone build, follow these steps (adju cd C:\Users\example\src\build-chatterino-Desktop_Qt_5_11_2_MSVC2017_64bit-Release\release C:\Qt\5.11.2\msvc2017_64\bin\windeployqt.exe chatterino.exe + 5. Go to `C:\local\bin\` and copy these dll's into your `release folder`. + ``` + libssl-1_1-x64.dll + libcrypto-1_1-x64.dll + ssleay32.dll + libeay32.dll + ``` - 5. The `releases` directory will now be populated with all the required files to make the chatterino build standalone. + 6. The `releases` directory will now be populated with all the required files to make the chatterino build standalone. You can now create a zip archive of all the contents in `releases` and distribute the program as is, without requiring any development tools to be present on the target system. (However, the vcredist package must be present, as usual - see the [README](README.md)). From 91ade0d078be499ca229f669ec2ceddde9213033 Mon Sep 17 00:00:00 2001 From: Ruben Anders Date: Wed, 1 May 2019 20:30:14 +0200 Subject: [PATCH 047/138] Correct indent --- BUILDING_ON_WINDOWS.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/BUILDING_ON_WINDOWS.md b/BUILDING_ON_WINDOWS.md index a4ff67c32..40df39bb0 100644 --- a/BUILDING_ON_WINDOWS.md +++ b/BUILDING_ON_WINDOWS.md @@ -102,13 +102,13 @@ To produce all supplement files for a standalone build, follow these steps (adju cd C:\Users\example\src\build-chatterino-Desktop_Qt_5_11_2_MSVC2017_64bit-Release\release C:\Qt\5.11.2\msvc2017_64\bin\windeployqt.exe chatterino.exe + 5. Go to `C:\local\bin\` and copy these dll's into your `release folder`. - ``` - libssl-1_1-x64.dll - libcrypto-1_1-x64.dll - ssleay32.dll - libeay32.dll - ``` + + libssl-1_1-x64.dll + libcrypto-1_1-x64.dll + ssleay32.dll + libeay32.dll 6. The `releases` directory will now be populated with all the required files to make the chatterino build standalone. From c60b717b988d92d3fb2d7596d3ad724f254bc317 Mon Sep 17 00:00:00 2001 From: apa420 Date: Wed, 1 May 2019 21:46:53 +0200 Subject: [PATCH 048/138] Pubsub messages now go into the correct channel --- src/providers/twitch/TwitchServer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchServer.cpp b/src/providers/twitch/TwitchServer.cpp index eaf90026e..0ea4cd37d 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -268,7 +268,8 @@ std::shared_ptr TwitchServer::getChannelOrEmptyByID( if (!twitchChannel) continue; - if (twitchChannel->roomId() == channelId) + if (twitchChannel->roomId() == channelId && + twitchChannel->getName().split(":").size() < 3) { return twitchChannel; } From effe91badcfab273bca0bf9e5194280a010533b7 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Wed, 1 May 2019 22:10:51 +0200 Subject: [PATCH 049/138] clean up magic message suffix stuff --- src/providers/twitch/TwitchChannel.cpp | 8 +++----- src/providers/twitch/TwitchChannel.hpp | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 1956e47f9..2d4ee4a49 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -30,6 +30,8 @@ namespace chatterino { namespace { + constexpr char MAGIC_MESSAGE_SUFFIX[] = u8" \U000E0000"; + // parseRecentMessages takes a json object and returns a vector of // Communi IrcMessages auto parseRecentMessages(const QJsonObject &jsonRoot, ChannelPtr channel) @@ -121,10 +123,6 @@ TwitchChannel::TwitchChannel(const QString &name, [=] { this->refreshLiveStatus(); }); this->liveStatusTimer_.start(60 * 1000); - // -- - this->messageSuffix_.append(' '); - this->messageSuffix_.append("ó €€"); // E0000 - // debugging #if 0 for (int i = 0; i < 1000; i++) { @@ -199,7 +197,7 @@ void TwitchChannel::sendMessage(const QString &message) { if (parsedMessage == this->lastSentMessage_) { - parsedMessage.append(this->messageSuffix_); + parsedMessage.append(MAGIC_MESSAGE_SUFFIX); } } } diff --git a/src/providers/twitch/TwitchChannel.hpp b/src/providers/twitch/TwitchChannel.hpp index 00a6c9513..9c4089ff0 100644 --- a/src/providers/twitch/TwitchChannel.hpp +++ b/src/providers/twitch/TwitchChannel.hpp @@ -166,7 +166,6 @@ private: bool partedUsersMergeQueued_ = false; // -- - QByteArray messageSuffix_; QString lastSentMessage_; QObject lifetimeGuard_; QTimer liveStatusTimer_; From 8d80eab6491216dd1fd23cd5506c767900aeef51 Mon Sep 17 00:00:00 2001 From: apa420 Date: Wed, 1 May 2019 22:28:46 +0200 Subject: [PATCH 050/138] Changed to ref for better performance --- src/providers/twitch/TwitchServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchServer.cpp b/src/providers/twitch/TwitchServer.cpp index 0ea4cd37d..2a63b1eb7 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -269,7 +269,7 @@ std::shared_ptr TwitchServer::getChannelOrEmptyByID( continue; if (twitchChannel->roomId() == channelId && - twitchChannel->getName().split(":").size() < 3) + twitchChannel->getName().splitRef(":").size() < 3) { return twitchChannel; } From f76df80575824b7ea64f44b60da85fec4dbd36e9 Mon Sep 17 00:00:00 2001 From: TranRed Date: Sat, 27 Apr 2019 10:12:51 +0200 Subject: [PATCH 051/138] creates common texts for opening streams Texts for opening streams were used in multiple locations. Created a file to store GUI texts like this and replaced were applicable --- chatterino.pro | 1 + src/singletons/Settings.hpp | 4 ++- src/singletons/Toasts.cpp | 21 ++++++++------- src/widgets/helper/CommonTexts.hpp | 10 +++++++ .../settingspages/NotificationPage.cpp | 26 +++++++++---------- src/widgets/splits/SplitHeader.cpp | 8 +++--- 6 files changed, 43 insertions(+), 27 deletions(-) create mode 100644 src/widgets/helper/CommonTexts.hpp diff --git a/chatterino.pro b/chatterino.pro index f13ae1139..c0fa05981 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -339,6 +339,7 @@ HEADERS += \ src/widgets/AccountSwitchPopupWidget.hpp \ src/widgets/AccountSwitchWidget.hpp \ src/widgets/AttachedWindow.hpp \ + src/widgets/CommonTexts.hpp \ src/widgets/dialogs/EmotePopup.hpp \ src/widgets/dialogs/LastRunCrashDialog.hpp \ src/widgets/dialogs/LoginDialog.hpp \ diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 17ff94637..34252c8c7 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -4,6 +4,7 @@ #include "controllers/highlights/HighlightPhrase.hpp" #include "controllers/moderationactions/ModerationAction.hpp" +#include "widgets/helper/CommonTexts.hpp" #include #include @@ -172,7 +173,8 @@ public: "qrc:/sounds/ping3.wav"}; BoolSetting notificationToast = {"/notifications/enableToast", false}; - QStringSetting openFromToast = {"/notifications/openFromToast", "in browser"}; + QStringSetting openFromToast = {"/notifications/openFromToast", + OPEN_IN_BROWSER}; /// External tools // Streamlink diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index 9ccefbb3d..e2f396e91 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -9,6 +9,7 @@ #include "providers/twitch/TwitchServer.hpp" #include "singletons/Paths.hpp" #include "util/StreamLink.hpp" +#include "widgets/helper/CommonTexts.hpp" #ifdef Q_OS_WIN @@ -88,7 +89,7 @@ public: { QString openingMode = getSettings()->openFromToast; QString link; - if (openingMode == "in browser") + if (openingMode == OPEN_IN_BROWSER) { if (platform_ == Platform::Twitch) { @@ -96,7 +97,7 @@ public: } QDesktopServices::openUrl(QUrl(link)); } - else if (openingMode == "player in browser") + else if (openingMode == OPEN_PLAYER_IN_BROWSER) { if (platform_ == Platform::Twitch) { @@ -104,12 +105,12 @@ public: } QDesktopServices::openUrl(QUrl(link)); } - else if (openingMode == "in streamlink") + else if (openingMode == OPEN_IN_STREAMLINK) { - openStreamlinkForChannel(channelName_); + openStreamlinkForChannel(channelName_); } - //the fourth and last option is "don't open" - //in this case obviously nothing should happen + // the fourth and last option is "don't open" + // in this case obviously nothing should happen } void toastActivated(int actionIndex) const @@ -135,10 +136,12 @@ void Toasts::sendWindowsNotification(const QString &channelName, Platform p) templ.setTextField(widestr, WinToastLib::WinToastTemplate::FirstLine); - if (getSettings()->openFromToast != "don't open") { - QString mode = getSettings()->openFromToast ; + if (getSettings()->openFromToast != DONT_OPEN) + { + QString mode = getSettings()->openFromToast; + mode = mode.toLower(); - templ.setTextField(L"Click here to open " + mode.toStdWString(), + templ.setTextField(L"Click here to " + mode.toStdWString(), WinToastLib::WinToastTemplate::SecondLine); } diff --git a/src/widgets/helper/CommonTexts.hpp b/src/widgets/helper/CommonTexts.hpp new file mode 100644 index 000000000..c5ea14091 --- /dev/null +++ b/src/widgets/helper/CommonTexts.hpp @@ -0,0 +1,10 @@ +#ifndef COMMONTEXTS_HPP +#define COMMONTEXTS_HPP + +#define OPEN_IN_BROWSER "Open in browser" +#define OPEN_PLAYER_IN_BROWSER "Open in player in browser" +#define OPEN_IN_STREAMLINK "Open in streamlink" +#define DONT_OPEN "Don't open" + + +#endif // COMMONTEXTS_HPP diff --git a/src/widgets/settingspages/NotificationPage.cpp b/src/widgets/settingspages/NotificationPage.cpp index c1f5fd84e..69a25ea7d 100644 --- a/src/widgets/settingspages/NotificationPage.cpp +++ b/src/widgets/settingspages/NotificationPage.cpp @@ -5,6 +5,7 @@ #include "controllers/notifications/NotificationModel.hpp" #include "singletons/Settings.hpp" #include "util/LayoutCreator.hpp" +#include "widgets/helper/CommonTexts.hpp" #include "widgets/helper/EditableModelView.hpp" #include @@ -17,10 +18,6 @@ #include #include - -#define TOAST_REACTIONS \ -"in browser", "player in browser", "in streamlink", "don't open" - namespace chatterino { NotificationPage::NotificationPage() @@ -43,17 +40,20 @@ NotificationPage::NotificationPage() settings.append( this->createCheckBox("Enable toasts (Windows 8 or later)", getSettings()->notificationToast)); - auto openIn = - settings.emplace().withoutMargin(); + auto openIn = settings.emplace().withoutMargin(); { - openIn.emplace("Open stream from Toast: ")->setSizePolicy( - QSizePolicy::Maximum, QSizePolicy::Preferred); - openIn.append( - this->createComboBox({TOAST_REACTIONS}, - getSettings()->openFromToast))->setSizePolicy( - QSizePolicy::Maximum, QSizePolicy::Preferred); + openIn.emplace("Open stream from Toast: ") + ->setSizePolicy(QSizePolicy::Maximum, + QSizePolicy::Preferred); + openIn + .append(this->createComboBox( + {OPEN_IN_BROWSER, OPEN_PLAYER_IN_BROWSER, + OPEN_IN_STREAMLINK, DONT_OPEN}, + getSettings()->openFromToast)) + ->setSizePolicy(QSizePolicy::Maximum, + QSizePolicy::Preferred); } - openIn->setContentsMargins(40,0,0,0); + openIn->setContentsMargins(40, 0, 0, 0); openIn->setSizeConstraint(QLayout::SetMaximumSize); #endif auto customSound = diff --git a/src/widgets/splits/SplitHeader.cpp b/src/widgets/splits/SplitHeader.cpp index 0ba3ca728..8f4baa179 100644 --- a/src/widgets/splits/SplitHeader.cpp +++ b/src/widgets/splits/SplitHeader.cpp @@ -15,6 +15,7 @@ #include "widgets/Label.hpp" #include "widgets/TooltipWidget.hpp" #include "widgets/dialogs/SettingsDialog.hpp" +#include "widgets/helper/CommonTexts.hpp" #include "widgets/helper/EffectLabel.hpp" #include "widgets/splits/Split.hpp" #include "widgets/splits/SplitContainer.hpp" @@ -268,13 +269,12 @@ std::unique_ptr SplitHeader::createMainMenu() }); #endif - menu->addAction("Open in browser", this->split_, &Split::openInBrowser); + menu->addAction(OPEN_IN_BROWSER, this->split_, &Split::openInBrowser); #ifndef USEWEBENGINE - menu->addAction("Open player in browser", this->split_, + menu->addAction(OPEN_PLAYER_IN_BROWSER, this->split_, &Split::openBrowserPlayer); #endif - menu->addAction("Open in streamlink", this->split_, - &Split::openInStreamlink); + menu->addAction(OPEN_IN_STREAMLINK, this->split_, &Split::openInStreamlink); menu->addSeparator(); // sub menu From d749a4771a97a1083c9a49a1a67f94dfb1e1f17e Mon Sep 17 00:00:00 2001 From: TranRed Date: Sat, 27 Apr 2019 10:29:21 +0200 Subject: [PATCH 052/138] made CommonTexts.hpp look like other headers --- src/widgets/helper/CommonTexts.hpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/widgets/helper/CommonTexts.hpp b/src/widgets/helper/CommonTexts.hpp index c5ea14091..7f92051d6 100644 --- a/src/widgets/helper/CommonTexts.hpp +++ b/src/widgets/helper/CommonTexts.hpp @@ -1,10 +1,6 @@ -#ifndef COMMONTEXTS_HPP -#define COMMONTEXTS_HPP +#pragma once #define OPEN_IN_BROWSER "Open in browser" #define OPEN_PLAYER_IN_BROWSER "Open in player in browser" #define OPEN_IN_STREAMLINK "Open in streamlink" #define DONT_OPEN "Don't open" - - -#endif // COMMONTEXTS_HPP From 724ad2118b530ed07f9a9412d19b4192eb713280 Mon Sep 17 00:00:00 2001 From: TranRed Date: Sat, 27 Apr 2019 10:31:02 +0200 Subject: [PATCH 053/138] Update chatterino.pro --- chatterino.pro | 1 + 1 file changed, 1 insertion(+) diff --git a/chatterino.pro b/chatterino.pro index c0fa05981..b2a272808 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -354,6 +354,7 @@ HEADERS += \ src/widgets/dialogs/WelcomeDialog.hpp \ src/widgets/helper/ChannelView.hpp \ src/widgets/helper/ComboBoxItemDelegate.hpp \ + src/widgets/helper/CommonTexts.hpp \ src/widgets/helper/DebugPopup.hpp \ src/widgets/helper/EditableModelView.hpp \ src/widgets/helper/Line.hpp \ From 2be81aa877f56792aedbe2369515cb0cff50f20f Mon Sep 17 00:00:00 2001 From: TranRed Date: Sat, 27 Apr 2019 10:35:15 +0200 Subject: [PATCH 054/138] Update chatterino.pro --- chatterino.pro | 1 - 1 file changed, 1 deletion(-) diff --git a/chatterino.pro b/chatterino.pro index b2a272808..0cd93cf9a 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -339,7 +339,6 @@ HEADERS += \ src/widgets/AccountSwitchPopupWidget.hpp \ src/widgets/AccountSwitchWidget.hpp \ src/widgets/AttachedWindow.hpp \ - src/widgets/CommonTexts.hpp \ src/widgets/dialogs/EmotePopup.hpp \ src/widgets/dialogs/LastRunCrashDialog.hpp \ src/widgets/dialogs/LoginDialog.hpp \ From c20629c16535b488ecda24e15316e6fbf114d19b Mon Sep 17 00:00:00 2001 From: TranRed Date: Sat, 27 Apr 2019 13:47:13 +0200 Subject: [PATCH 055/138] Refactored opening from toasts implemented maps and map look up functions --- src/singletons/Settings.hpp | 7 +- src/singletons/Toasts.cpp | 80 ++++++++++++++----- src/singletons/Toasts.hpp | 12 +++ .../settingspages/NotificationPage.cpp | 13 ++- 4 files changed, 85 insertions(+), 27 deletions(-) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 34252c8c7..6a17024d2 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -4,7 +4,7 @@ #include "controllers/highlights/HighlightPhrase.hpp" #include "controllers/moderationactions/ModerationAction.hpp" -#include "widgets/helper/CommonTexts.hpp" +#include "singletons/Toasts.hpp" #include #include @@ -173,8 +173,9 @@ public: "qrc:/sounds/ping3.wav"}; BoolSetting notificationToast = {"/notifications/enableToast", false}; - QStringSetting openFromToast = {"/notifications/openFromToast", - OPEN_IN_BROWSER}; + QStringSetting openFromToast = { + "/notifications/openFromToast", + Toasts::findStringFromReaction(ToastReactions::openInBrowser)}; /// External tools // Streamlink diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index e2f396e91..2352cccd0 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -27,6 +27,18 @@ namespace chatterino { +std::map Toasts::reactionToString = { + {ToastReactions::openInBrowser, OPEN_IN_BROWSER}, + {ToastReactions::openInPlayer, OPEN_PLAYER_IN_BROWSER}, + {ToastReactions::openInStreamlink, OPEN_IN_STREAMLINK}, + {ToastReactions::dontOpen, DONT_OPEN}}; + +std::map Toasts::stringToReaction = { + {OPEN_IN_BROWSER, ToastReactions::openInBrowser}, + {OPEN_PLAYER_IN_BROWSER, ToastReactions::openInPlayer}, + {OPEN_IN_STREAMLINK, ToastReactions::openInStreamlink}, + {DONT_OPEN, ToastReactions::dontOpen}}; + bool Toasts::isEnabled() { #ifdef Q_OS_WIN @@ -36,6 +48,31 @@ bool Toasts::isEnabled() return false; } +QString Toasts::findStringFromReaction(const ToastReactions &reaction) +{ + auto iterator = Toasts::reactionToString.find(reaction); + if (iterator != Toasts::reactionToString.end()) + { + return iterator->second; + } + else + { + return DONT_OPEN; + } +} + +ToastReactions Toasts::findReactionFromString(const QString &string) +{ + auto iterator = Toasts::stringToReaction.find(string); + if (iterator != Toasts::stringToReaction.end()) + { + return iterator->second; + } + else + { + return ToastReactions::dontOpen; + } +} void Toasts::sendChannelNotification(const QString &channelName, Platform p) { #ifdef Q_OS_WIN @@ -87,30 +124,31 @@ public: } void toastActivated() const { - QString openingMode = getSettings()->openFromToast; QString link; - if (openingMode == OPEN_IN_BROWSER) + switch (Toasts::findReactionFromString(getSettings()->openFromToast)) { - if (platform_ == Platform::Twitch) + case ToastReactions::openInBrowser: + if (platform_ == Platform::Twitch) + { + link = "http://www.twitch.tv/" + channelName_; + } + QDesktopServices::openUrl(QUrl(link)); + break; + case ToastReactions::openInPlayer: + if (platform_ == Platform::Twitch) + { + link = "https://player.twitch.tv/?channel=" + channelName_; + } + QDesktopServices::openUrl(QUrl(link)); + break; + case ToastReactions::openInStreamlink: { - link = "http://www.twitch.tv/" + channelName_; + openStreamlinkForChannel(channelName_); + break; } - QDesktopServices::openUrl(QUrl(link)); + // the fourth and last option is "don't open" + // in this case obviously nothing should happen } - else if (openingMode == OPEN_PLAYER_IN_BROWSER) - { - if (platform_ == Platform::Twitch) - { - link = "https://player.twitch.tv/?channel=" + channelName_; - } - QDesktopServices::openUrl(QUrl(link)); - } - else if (openingMode == OPEN_IN_STREAMLINK) - { - openStreamlinkForChannel(channelName_); - } - // the fourth and last option is "don't open" - // in this case obviously nothing should happen } void toastActivated(int actionIndex) const @@ -135,8 +173,8 @@ void Toasts::sendWindowsNotification(const QString &channelName, Platform p) std::wstring widestr = std::wstring(utf8_text.begin(), utf8_text.end()); templ.setTextField(widestr, WinToastLib::WinToastTemplate::FirstLine); - - if (getSettings()->openFromToast != DONT_OPEN) + if (Toasts::findReactionFromString(getSettings()->openFromToast) != + ToastReactions::dontOpen) { QString mode = getSettings()->openFromToast; mode = mode.toLower(); diff --git a/src/singletons/Toasts.hpp b/src/singletons/Toasts.hpp index 3a245346f..a7ea91861 100644 --- a/src/singletons/Toasts.hpp +++ b/src/singletons/Toasts.hpp @@ -7,10 +7,21 @@ namespace chatterino { enum class Platform : uint8_t; +enum class ToastReactions { + openInBrowser, + openInPlayer, + openInStreamlink, + dontOpen +}; + class Toasts final : public Singleton { public: void sendChannelNotification(const QString &channelName, Platform p); + static QString findStringFromReaction(const ToastReactions &reaction); + static ToastReactions findReactionFromString(const QString &string); + static std::map reactionToString; + static std::map stringToReaction; static bool isEnabled(); @@ -18,6 +29,7 @@ private: #ifdef Q_OS_WIN void sendWindowsNotification(const QString &channelName, Platform p); #endif + static void fetchChannelAvatar( const QString channelName, std::function successCallback); diff --git a/src/widgets/settingspages/NotificationPage.cpp b/src/widgets/settingspages/NotificationPage.cpp index 69a25ea7d..85aab7bb0 100644 --- a/src/widgets/settingspages/NotificationPage.cpp +++ b/src/widgets/settingspages/NotificationPage.cpp @@ -4,8 +4,8 @@ #include "controllers/notifications/NotificationController.hpp" #include "controllers/notifications/NotificationModel.hpp" #include "singletons/Settings.hpp" +#include "singletons/Toasts.hpp" #include "util/LayoutCreator.hpp" -#include "widgets/helper/CommonTexts.hpp" #include "widgets/helper/EditableModelView.hpp" #include @@ -45,10 +45,17 @@ NotificationPage::NotificationPage() openIn.emplace("Open stream from Toast: ") ->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + openIn .append(this->createComboBox( - {OPEN_IN_BROWSER, OPEN_PLAYER_IN_BROWSER, - OPEN_IN_STREAMLINK, DONT_OPEN}, + {Toasts::findStringFromReaction( + ToastReactions::openInBrowser), + Toasts::findStringFromReaction( + ToastReactions::openInPlayer), + Toasts::findStringFromReaction( + ToastReactions::openInStreamlink), + Toasts::findStringFromReaction( + ToastReactions::dontOpen)}, getSettings()->openFromToast)) ->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); From 2a590adba73b7d08e90ee7678e17a6b459f42d00 Mon Sep 17 00:00:00 2001 From: TranRed Date: Sat, 27 Apr 2019 18:15:41 +0200 Subject: [PATCH 056/138] Implemented requested changes changed setting from String to int. changed EnumCase I used createComboBox only has an implementation that handles stringsettings. I implemented my own combobox to handle the ToastsSettings now. Not sure if this is the best way. Won't come up with something smarter for now. --- src/singletons/Settings.hpp | 4 +- src/singletons/Toasts.cpp | 41 +++++++++++------- src/singletons/Toasts.hpp | 10 +++-- .../settingspages/NotificationPage.cpp | 43 ++++++++++++++----- .../settingspages/NotificationPage.hpp | 2 + 5 files changed, 67 insertions(+), 33 deletions(-) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 6a17024d2..2dd350552 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -173,9 +173,9 @@ public: "qrc:/sounds/ping3.wav"}; BoolSetting notificationToast = {"/notifications/enableToast", false}; - QStringSetting openFromToast = { + IntSetting openFromToast = { "/notifications/openFromToast", - Toasts::findStringFromReaction(ToastReactions::openInBrowser)}; + static_cast(ToastReactions::OpenInBrowser)}; /// External tools // Streamlink diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index 2352cccd0..96a640a1d 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -28,16 +28,16 @@ namespace chatterino { std::map Toasts::reactionToString = { - {ToastReactions::openInBrowser, OPEN_IN_BROWSER}, - {ToastReactions::openInPlayer, OPEN_PLAYER_IN_BROWSER}, - {ToastReactions::openInStreamlink, OPEN_IN_STREAMLINK}, - {ToastReactions::dontOpen, DONT_OPEN}}; + {ToastReactions::OpenInBrowser, OPEN_IN_BROWSER}, + {ToastReactions::OpenInPlayer, OPEN_PLAYER_IN_BROWSER}, + {ToastReactions::OpenInStreamlink, OPEN_IN_STREAMLINK}, + {ToastReactions::DontOpen, DONT_OPEN}}; std::map Toasts::stringToReaction = { - {OPEN_IN_BROWSER, ToastReactions::openInBrowser}, - {OPEN_PLAYER_IN_BROWSER, ToastReactions::openInPlayer}, - {OPEN_IN_STREAMLINK, ToastReactions::openInStreamlink}, - {DONT_OPEN, ToastReactions::dontOpen}}; + {OPEN_IN_BROWSER, ToastReactions::OpenInBrowser}, + {OPEN_PLAYER_IN_BROWSER, ToastReactions::OpenInPlayer}, + {OPEN_IN_STREAMLINK, ToastReactions::OpenInStreamlink}, + {DONT_OPEN, ToastReactions::DontOpen}}; bool Toasts::isEnabled() { @@ -61,6 +61,13 @@ QString Toasts::findStringFromReaction(const ToastReactions &reaction) } } +QString Toasts::findStringFromReaction( + const pajlada::Settings::Setting &value) +{ + int i = static_cast(value); + return Toasts::findStringFromReaction(static_cast(i)); +} + ToastReactions Toasts::findReactionFromString(const QString &string) { auto iterator = Toasts::stringToReaction.find(string); @@ -70,7 +77,7 @@ ToastReactions Toasts::findReactionFromString(const QString &string) } else { - return ToastReactions::dontOpen; + return ToastReactions::DontOpen; } } void Toasts::sendChannelNotification(const QString &channelName, Platform p) @@ -125,23 +132,24 @@ public: void toastActivated() const { QString link; - switch (Toasts::findReactionFromString(getSettings()->openFromToast)) + switch (static_cast( + getSettings()->openFromToast.getValue())) { - case ToastReactions::openInBrowser: + case ToastReactions::OpenInBrowser: if (platform_ == Platform::Twitch) { link = "http://www.twitch.tv/" + channelName_; } QDesktopServices::openUrl(QUrl(link)); break; - case ToastReactions::openInPlayer: + case ToastReactions::OpenInPlayer: if (platform_ == Platform::Twitch) { link = "https://player.twitch.tv/?channel=" + channelName_; } QDesktopServices::openUrl(QUrl(link)); break; - case ToastReactions::openInStreamlink: + case ToastReactions::OpenInStreamlink: { openStreamlinkForChannel(channelName_); break; @@ -173,10 +181,11 @@ void Toasts::sendWindowsNotification(const QString &channelName, Platform p) std::wstring widestr = std::wstring(utf8_text.begin(), utf8_text.end()); templ.setTextField(widestr, WinToastLib::WinToastTemplate::FirstLine); - if (Toasts::findReactionFromString(getSettings()->openFromToast) != - ToastReactions::dontOpen) + if (static_cast(getSettings()->openFromToast.getValue()) != + ToastReactions::DontOpen) { - QString mode = getSettings()->openFromToast; + QString mode = + Toasts::findStringFromReaction(getSettings()->openFromToast); mode = mode.toLower(); templ.setTextField(L"Click here to " + mode.toStdWString(), diff --git a/src/singletons/Toasts.hpp b/src/singletons/Toasts.hpp index a7ea91861..a8a51e56b 100644 --- a/src/singletons/Toasts.hpp +++ b/src/singletons/Toasts.hpp @@ -8,10 +8,10 @@ namespace chatterino { enum class Platform : uint8_t; enum class ToastReactions { - openInBrowser, - openInPlayer, - openInStreamlink, - dontOpen + OpenInBrowser = 0, + OpenInPlayer = 1, + OpenInStreamlink = 2, + DontOpen = 3 }; class Toasts final : public Singleton @@ -19,6 +19,8 @@ class Toasts final : public Singleton public: void sendChannelNotification(const QString &channelName, Platform p); static QString findStringFromReaction(const ToastReactions &reaction); + static QString findStringFromReaction( + const pajlada::Settings::Setting &reaction); static ToastReactions findReactionFromString(const QString &string); static std::map reactionToString; static std::map stringToReaction; diff --git a/src/widgets/settingspages/NotificationPage.cpp b/src/widgets/settingspages/NotificationPage.cpp index 85aab7bb0..dfbc5574e 100644 --- a/src/widgets/settingspages/NotificationPage.cpp +++ b/src/widgets/settingspages/NotificationPage.cpp @@ -24,7 +24,6 @@ NotificationPage::NotificationPage() : SettingsPage("Notifications", ":/settings/notification2.svg") { LayoutCreator layoutCreator(this); - auto layout = layoutCreator.emplace().withoutMargin(); { auto tabs = layout.emplace(); @@ -46,17 +45,12 @@ NotificationPage::NotificationPage() ->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + // implementation of custom combobox done + // because addComboBox only can handle strings-settings + // int setting for the ToastReaction is desired openIn - .append(this->createComboBox( - {Toasts::findStringFromReaction( - ToastReactions::openInBrowser), - Toasts::findStringFromReaction( - ToastReactions::openInPlayer), - Toasts::findStringFromReaction( - ToastReactions::openInStreamlink), - Toasts::findStringFromReaction( - ToastReactions::dontOpen)}, - getSettings()->openFromToast)) + .append(this->createToastReactionComboBox( + this->managedConnections_)) ->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); } @@ -140,4 +134,31 @@ NotificationPage::NotificationPage() } } } +QComboBox *NotificationPage::createToastReactionComboBox( + std::vector managedConnections) +{ + QComboBox *toastReactionOptions = new QComboBox(); + + for (int i = 0; i <= static_cast(ToastReactions::DontOpen); i++) + { + toastReactionOptions->insertItem( + i, Toasts::findStringFromReaction(static_cast(i))); + } + + // update when setting changes + pajlada::Settings::Setting setting = getSettings()->openFromToast; + setting.connect( + [toastReactionOptions](const int &index, auto) { + toastReactionOptions->setCurrentIndex(index); + }, + managedConnections); + + QObject::connect(toastReactionOptions, &QComboBox::currentTextChanged, + [setting](const QString &newValue) { + getSettings()->openFromToast.setValue(static_cast( + Toasts::findReactionFromString(newValue))); + }); + + return toastReactionOptions; +} } // namespace chatterino diff --git a/src/widgets/settingspages/NotificationPage.hpp b/src/widgets/settingspages/NotificationPage.hpp index d0e8c12a2..e70f58ad4 100644 --- a/src/widgets/settingspages/NotificationPage.hpp +++ b/src/widgets/settingspages/NotificationPage.hpp @@ -15,6 +15,8 @@ public: NotificationPage(); private: + QComboBox *createToastReactionComboBox( + std::vector managedConnections); }; } // namespace chatterino From a592a3e88204b791154e5d79b8257afad0eff02b Mon Sep 17 00:00:00 2001 From: TranRed Date: Sun, 28 Apr 2019 13:15:48 +0200 Subject: [PATCH 057/138] Connected ComboBox to currentIndexChanged implemented proper connection to combobox (currentIndexChanged instead of currentTextChanged) Thanks, pajlada! FeelsGoodMan --- src/widgets/settingspages/NotificationPage.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/widgets/settingspages/NotificationPage.cpp b/src/widgets/settingspages/NotificationPage.cpp index dfbc5574e..de7995885 100644 --- a/src/widgets/settingspages/NotificationPage.cpp +++ b/src/widgets/settingspages/NotificationPage.cpp @@ -153,10 +153,10 @@ QComboBox *NotificationPage::createToastReactionComboBox( }, managedConnections); - QObject::connect(toastReactionOptions, &QComboBox::currentTextChanged, - [setting](const QString &newValue) { - getSettings()->openFromToast.setValue(static_cast( - Toasts::findReactionFromString(newValue))); + QObject::connect(toastReactionOptions, + QOverload::of(&QComboBox::currentIndexChanged), + [](const int &newValue) { + getSettings()->openFromToast.setValue(newValue); }); return toastReactionOptions; From cd1f717c36219efeada1f4136e232126771cd33f Mon Sep 17 00:00:00 2001 From: TranRed Date: Sun, 28 Apr 2019 18:04:24 +0200 Subject: [PATCH 058/138] deleted dead code not needed anymore since latest commit --- src/singletons/Toasts.cpp | 18 ------------------ src/singletons/Toasts.hpp | 2 -- 2 files changed, 20 deletions(-) diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index 96a640a1d..d6d5f03c3 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -33,12 +33,6 @@ std::map Toasts::reactionToString = { {ToastReactions::OpenInStreamlink, OPEN_IN_STREAMLINK}, {ToastReactions::DontOpen, DONT_OPEN}}; -std::map Toasts::stringToReaction = { - {OPEN_IN_BROWSER, ToastReactions::OpenInBrowser}, - {OPEN_PLAYER_IN_BROWSER, ToastReactions::OpenInPlayer}, - {OPEN_IN_STREAMLINK, ToastReactions::OpenInStreamlink}, - {DONT_OPEN, ToastReactions::DontOpen}}; - bool Toasts::isEnabled() { #ifdef Q_OS_WIN @@ -68,18 +62,6 @@ QString Toasts::findStringFromReaction( return Toasts::findStringFromReaction(static_cast(i)); } -ToastReactions Toasts::findReactionFromString(const QString &string) -{ - auto iterator = Toasts::stringToReaction.find(string); - if (iterator != Toasts::stringToReaction.end()) - { - return iterator->second; - } - else - { - return ToastReactions::DontOpen; - } -} void Toasts::sendChannelNotification(const QString &channelName, Platform p) { #ifdef Q_OS_WIN diff --git a/src/singletons/Toasts.hpp b/src/singletons/Toasts.hpp index a8a51e56b..777cf04e2 100644 --- a/src/singletons/Toasts.hpp +++ b/src/singletons/Toasts.hpp @@ -21,9 +21,7 @@ public: static QString findStringFromReaction(const ToastReactions &reaction); static QString findStringFromReaction( const pajlada::Settings::Setting &reaction); - static ToastReactions findReactionFromString(const QString &string); static std::map reactionToString; - static std::map stringToReaction; static bool isEnabled(); From b5efe12f56197d4ebca191393ddfccc2065f487c Mon Sep 17 00:00:00 2001 From: TranRed Date: Wed, 1 May 2019 23:21:12 +0200 Subject: [PATCH 059/138] renamed enum ToastReactions to ToastReaction (singular) --- src/singletons/Settings.hpp | 2 +- src/singletons/Toasts.cpp | 26 +++++++++---------- src/singletons/Toasts.hpp | 6 ++--- .../settingspages/NotificationPage.cpp | 4 +-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 2dd350552..6c4ca3506 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -175,7 +175,7 @@ public: BoolSetting notificationToast = {"/notifications/enableToast", false}; IntSetting openFromToast = { "/notifications/openFromToast", - static_cast(ToastReactions::OpenInBrowser)}; + static_cast(ToastReaction::OpenInBrowser)}; /// External tools // Streamlink diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index d6d5f03c3..9dcbd6516 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -27,11 +27,11 @@ namespace chatterino { -std::map Toasts::reactionToString = { - {ToastReactions::OpenInBrowser, OPEN_IN_BROWSER}, - {ToastReactions::OpenInPlayer, OPEN_PLAYER_IN_BROWSER}, - {ToastReactions::OpenInStreamlink, OPEN_IN_STREAMLINK}, - {ToastReactions::DontOpen, DONT_OPEN}}; +std::map Toasts::reactionToString = { + {ToastReaction::OpenInBrowser, OPEN_IN_BROWSER}, + {ToastReaction::OpenInPlayer, OPEN_PLAYER_IN_BROWSER}, + {ToastReaction::OpenInStreamlink, OPEN_IN_STREAMLINK}, + {ToastReaction::DontOpen, DONT_OPEN}}; bool Toasts::isEnabled() { @@ -42,7 +42,7 @@ bool Toasts::isEnabled() return false; } -QString Toasts::findStringFromReaction(const ToastReactions &reaction) +QString Toasts::findStringFromReaction(const ToastReaction &reaction) { auto iterator = Toasts::reactionToString.find(reaction); if (iterator != Toasts::reactionToString.end()) @@ -59,7 +59,7 @@ QString Toasts::findStringFromReaction( const pajlada::Settings::Setting &value) { int i = static_cast(value); - return Toasts::findStringFromReaction(static_cast(i)); + return Toasts::findStringFromReaction(static_cast(i)); } void Toasts::sendChannelNotification(const QString &channelName, Platform p) @@ -114,24 +114,24 @@ public: void toastActivated() const { QString link; - switch (static_cast( + switch (static_cast( getSettings()->openFromToast.getValue())) { - case ToastReactions::OpenInBrowser: + case ToastReaction::OpenInBrowser: if (platform_ == Platform::Twitch) { link = "http://www.twitch.tv/" + channelName_; } QDesktopServices::openUrl(QUrl(link)); break; - case ToastReactions::OpenInPlayer: + case ToastReaction::OpenInPlayer: if (platform_ == Platform::Twitch) { link = "https://player.twitch.tv/?channel=" + channelName_; } QDesktopServices::openUrl(QUrl(link)); break; - case ToastReactions::OpenInStreamlink: + case ToastReaction::OpenInStreamlink: { openStreamlinkForChannel(channelName_); break; @@ -163,8 +163,8 @@ void Toasts::sendWindowsNotification(const QString &channelName, Platform p) std::wstring widestr = std::wstring(utf8_text.begin(), utf8_text.end()); templ.setTextField(widestr, WinToastLib::WinToastTemplate::FirstLine); - if (static_cast(getSettings()->openFromToast.getValue()) != - ToastReactions::DontOpen) + if (static_cast(getSettings()->openFromToast.getValue()) != + ToastReaction::DontOpen) { QString mode = Toasts::findStringFromReaction(getSettings()->openFromToast); diff --git a/src/singletons/Toasts.hpp b/src/singletons/Toasts.hpp index 777cf04e2..43c6d1da8 100644 --- a/src/singletons/Toasts.hpp +++ b/src/singletons/Toasts.hpp @@ -7,7 +7,7 @@ namespace chatterino { enum class Platform : uint8_t; -enum class ToastReactions { +enum class ToastReaction { OpenInBrowser = 0, OpenInPlayer = 1, OpenInStreamlink = 2, @@ -18,10 +18,10 @@ class Toasts final : public Singleton { public: void sendChannelNotification(const QString &channelName, Platform p); - static QString findStringFromReaction(const ToastReactions &reaction); + static QString findStringFromReaction(const ToastReaction &reaction); static QString findStringFromReaction( const pajlada::Settings::Setting &reaction); - static std::map reactionToString; + static std::map reactionToString; static bool isEnabled(); diff --git a/src/widgets/settingspages/NotificationPage.cpp b/src/widgets/settingspages/NotificationPage.cpp index de7995885..74510f90c 100644 --- a/src/widgets/settingspages/NotificationPage.cpp +++ b/src/widgets/settingspages/NotificationPage.cpp @@ -139,10 +139,10 @@ QComboBox *NotificationPage::createToastReactionComboBox( { QComboBox *toastReactionOptions = new QComboBox(); - for (int i = 0; i <= static_cast(ToastReactions::DontOpen); i++) + for (int i = 0; i <= static_cast(ToastReaction::DontOpen); i++) { toastReactionOptions->insertItem( - i, Toasts::findStringFromReaction(static_cast(i))); + i, Toasts::findStringFromReaction(static_cast(i))); } // update when setting changes From 30430b0fb3a20b9703f89ce93e55d5142468e7a1 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 2 May 2019 00:08:04 +0200 Subject: [PATCH 060/138] this ctor was used to create a system message we now only use the ctor that takes an explicit SystemMessageTag --- src/messages/MessageBuilder.cpp | 10 ---------- src/messages/MessageBuilder.hpp | 1 - 2 files changed, 11 deletions(-) diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index 7b4c64ae8..727305d68 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -91,16 +91,6 @@ MessageBuilder::MessageBuilder() { } -MessageBuilder::MessageBuilder(const QString &text) - : MessageBuilder() -{ - this->emplace(); - this->emplace(text, MessageElementFlag::Text, - MessageColor::System); - this->message().messageText = text; - this->message().searchText = text; -} - MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text) : MessageBuilder() { diff --git a/src/messages/MessageBuilder.hpp b/src/messages/MessageBuilder.hpp index dbc58cbb7..4793ce9d9 100644 --- a/src/messages/MessageBuilder.hpp +++ b/src/messages/MessageBuilder.hpp @@ -38,7 +38,6 @@ class MessageBuilder { public: MessageBuilder(); - MessageBuilder(const QString &text); MessageBuilder(SystemMessageTag, const QString &text); MessageBuilder(TimeoutMessageTag, const QString &username, const QString &durationInSeconds, const QString &reason, From 7ad6db550dcb72688c0e6104dfc759063a982ce8 Mon Sep 17 00:00:00 2001 From: TranRed Date: Wed, 1 May 2019 12:07:35 +0200 Subject: [PATCH 061/138] made links in system messages clickable needed to make sub ticket in sub only chat accessible. --- src/messages/MessageBuilder.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index 727305d68..239592568 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -95,8 +95,23 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text) : MessageBuilder() { this->emplace(); - this->emplace(text, MessageElementFlag::Text, - MessageColor::System); + + // check system message for links + // (e.g. needed for sub ticket message in sub only mode) + QStringList textFragments = text.split(QRegularExpression("\\s")); + for (const auto &word : textFragments) + { + auto linkString = this->matchLink(word); + if (linkString.isEmpty()) + { + this->emplace(word, MessageElementFlag::Text, + MessageColor::System); + } + else + { + this->addLink(word, linkString); + } + } this->message().flags.set(MessageFlag::System); this->message().flags.set(MessageFlag::DoNotTriggerNotification); this->message().messageText = text; From cff1aa0959d3003a97e9d350cd798b494ff546a2 Mon Sep 17 00:00:00 2001 From: TranRed Date: Fri, 3 May 2019 08:58:54 +0200 Subject: [PATCH 062/138] changed some variables to const --- src/messages/MessageBuilder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index 239592568..3040b535a 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -98,10 +98,10 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text) // check system message for links // (e.g. needed for sub ticket message in sub only mode) - QStringList textFragments = text.split(QRegularExpression("\\s")); + const QStringList textFragments = text.split(QRegularExpression("\\s")); for (const auto &word : textFragments) { - auto linkString = this->matchLink(word); + const auto linkString = this->matchLink(word); if (linkString.isEmpty()) { this->emplace(word, MessageElementFlag::Text, From a3f6d2b773c87e398da74ad77bcdd96413e98536 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 27 Apr 2019 15:42:51 +0300 Subject: [PATCH 063/138] Fixed display of text in Go to Bottom button for Retina screen. --- src/widgets/helper/ChannelView.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index 07c047eba..90c0e9b93 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -294,8 +294,12 @@ void ChannelView::scaleChangedEvent(float scale) if (this->goToBottom_) { + auto factor = this->qtFontScale(); +#ifdef Q_OS_MACOS + factor = scale * 80.f / this->logicalDpiX() * this->devicePixelRatioF(); +#endif this->goToBottom_->getLabel().setFont( - getFonts()->getFont(FontStyle::UiMedium, this->qtFontScale())); + getFonts()->getFont(FontStyle::UiMedium, factor)); } } From 14eb302c3d3e86f059dce1cb9f9475e661ed8255 Mon Sep 17 00:00:00 2001 From: Alexandr Kondratev Date: Sun, 5 May 2019 20:19:47 +0300 Subject: [PATCH 064/138] Close search popup window on Escape pressed --- src/widgets/helper/SearchPopup.cpp | 26 ++++++++++++++++++-------- src/widgets/helper/SearchPopup.hpp | 3 +++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/widgets/helper/SearchPopup.cpp b/src/widgets/helper/SearchPopup.cpp index bd62f631e..a1bfdafed 100644 --- a/src/widgets/helper/SearchPopup.cpp +++ b/src/widgets/helper/SearchPopup.cpp @@ -17,6 +17,24 @@ SearchPopup::SearchPopup() this->resize(400, 600); } +void SearchPopup::setChannel(ChannelPtr channel) +{ + this->snapshot_ = channel->getMessageSnapshot(); + this->performSearch(); + + this->setWindowTitle("Searching in " + channel->getName() + "s history"); +} + +void SearchPopup::keyPressEvent(QKeyEvent *e) +{ + if (e->key() == Qt::Key_Escape) { + this->close(); + return; + } + + BaseWidget::keyPressEvent(e); +} + void SearchPopup::initLayout() { // VBOX @@ -60,14 +78,6 @@ void SearchPopup::initLayout() } } -void SearchPopup::setChannel(ChannelPtr channel) -{ - this->snapshot_ = channel->getMessageSnapshot(); - this->performSearch(); - - this->setWindowTitle("Searching in " + channel->getName() + "s history"); -} - void SearchPopup::performSearch() { QString text = searchInput_->text(); diff --git a/src/widgets/helper/SearchPopup.hpp b/src/widgets/helper/SearchPopup.hpp index 1f2837fbe..cb5bdca63 100644 --- a/src/widgets/helper/SearchPopup.hpp +++ b/src/widgets/helper/SearchPopup.hpp @@ -22,6 +22,9 @@ public: void setChannel(std::shared_ptr channel); +protected: + void keyPressEvent(QKeyEvent *e) override; + private: void initLayout(); void performSearch(); From 536e86f9195f76a2585aa5d4022c68dceede721e Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Tue, 7 May 2019 11:08:50 +0200 Subject: [PATCH 065/138] add a reasonable default installation path modifiable in qmake with the PREFIX argument i.e. qmake PREFIX=/usr --- chatterino.pro | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/chatterino.pro b/chatterino.pro index 0cd93cf9a..68eff9568 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -1,12 +1,3 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2016-12-28T18:23:35 -# -#------------------------------------------------- - -message(----) - -# define project shit QT += widgets core gui network multimedia svg concurrent CONFIG += communi COMMUNI += core model util @@ -404,3 +395,21 @@ FORMS += #win32 { # DEFINES += NOMINMAX #} + +linux:isEmpty(PREFIX) { + message("Using default installation prefix (/usr/local). Change PREFIX in qmake command") + PREFIX = /usr/local +} + +linux { + desktop.files = resources/chatterino.desktop + desktop.path = $$PREFIX/share/applications + + # TODO: fix icon + # icon.files = resources/icon.png + # icon.path = $$PREFIX/share/icons/hicolor/256x256/chatterino.png + + target.path = $$PREFIX/bin + + INSTALLS += desktop target +} From add312b60904309bbbf222c0cf61ba7c87977d27 Mon Sep 17 00:00:00 2001 From: hemirt Date: Sun, 5 May 2019 19:25:11 +0200 Subject: [PATCH 066/138] fix #1062 --- src/providers/twitch/TwitchChannel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 2d4ee4a49..a40859791 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -472,7 +472,7 @@ void TwitchChannel::setLive(bool newLiveStatus) else { auto offline = - makeSystemMessage(this->getName() + " is offline"); + makeSystemMessage(this->getDisplayName() + " is offline"); this->addMessage(offline); } guard->live = newLiveStatus; From bc8175d9ce8ca73444f275e16cf376530829b85d Mon Sep 17 00:00:00 2001 From: hemirt Date: Sun, 5 May 2019 16:05:29 +0200 Subject: [PATCH 067/138] fix #1053 --- .../commands/CommandController.cpp | 250 ++++++++++-------- .../commands/CommandController.hpp | 3 +- 2 files changed, 149 insertions(+), 104 deletions(-) diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index d7ea16932..a4cd22a41 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -15,6 +15,7 @@ #include "singletons/Emotes.hpp" #include "singletons/Paths.hpp" #include "singletons/Settings.hpp" +#include "singletons/Theme.hpp" #include "util/CombinePath.hpp" #include "widgets/dialogs/LogsPopup.hpp" @@ -31,6 +32,136 @@ "/followersoff" \ } +namespace { +using namespace chatterino; + +void sendWhisperMessage(const QString &text) +{ + auto app = getApp(); + app->twitch.server->sendMessage("jtv", text); +} + +bool appendWhisperMessageLocally(const QStringList &words) +{ + auto app = getApp(); + + MessageBuilder b; + + b.emplace(); + b.emplace(app->accounts->twitch.getCurrent()->getUserName(), + MessageElementFlag::Text, MessageColor::Text, + FontStyle::ChatMediumBold); + b.emplace("->", MessageElementFlag::Text, + getApp()->themes->messages.textColors.system); + b.emplace(words[1] + ":", MessageElementFlag::Text, + MessageColor::Text, FontStyle::ChatMediumBold); + + const auto &acc = app->accounts->twitch.getCurrent(); + const auto &accemotes = *acc->accessEmotes(); + const auto &bttvemotes = app->twitch.server->getBttvEmotes(); + const auto &ffzemotes = app->twitch.server->getFfzEmotes(); + auto flags = MessageElementFlags(); + auto emote = boost::optional{}; + for (int i = 2; i < words.length(); i++) + { + { // twitch emote + auto it = accemotes.emotes.find({words[i]}); + if (it != accemotes.emotes.end()) + { + b.emplace(it->second, + MessageElementFlag::TwitchEmote); + continue; + } + } // twitch emote + + { // bttv/ffz emote + if ((emote = bttvemotes.emote({words[i]}))) + { + flags = MessageElementFlag::BttvEmote; + } + else if ((emote = ffzemotes.emote({words[i]}))) + { + flags = MessageElementFlag::FfzEmote; + } + if (emote) + { + b.emplace(emote.get(), flags); + continue; + } + } // bttv/ffz emote + { // emoji/text + for (auto &variant : app->emotes->emojis.parse(words[i])) + { + constexpr const static struct { + void operator()(EmotePtr emote, MessageBuilder &b) const + { + b.emplace(emote, + MessageElementFlag::EmojiAll); + } + void operator()(const QString &string, + MessageBuilder &b) const + { + auto linkString = b.matchLink(string); + if (linkString.isEmpty()) + { + b.emplace(string, + MessageElementFlag::Text); + } + else + { + b.addLink(string, linkString); + } + } + } visitor; + boost::apply_visitor([&b](auto &&arg) { visitor(arg, b); }, + variant); + } // emoji/text + } + } + + b->flags.set(MessageFlag::DoNotTriggerNotification); + b->flags.set(MessageFlag::Whisper); + auto messagexD = b.release(); + + app->twitch.server->whispersChannel->addMessage(messagexD); + + auto overrideFlags = boost::optional(messagexD->flags); + overrideFlags->set(MessageFlag::DoNotLog); + + if (getSettings()->inlineWhispers) + { + app->twitch.server->forEachChannel( + [&messagexD, overrideFlags](ChannelPtr _channel) { + _channel->addMessage(messagexD, overrideFlags); + }); + } + + return true; +} + +bool appendWhisperMessageLocally(const QString &textNoEmoji) +{ + QString text = getApp()->emotes->emojis.replaceShortCodes(textNoEmoji); + QStringList words = text.split(' ', QString::SkipEmptyParts); + + if (words.length() == 0) + { + return false; + } + + QString commandName = words[0]; + + if (commandName == "/w") + { + if (words.length() > 2) + { + return appendWhisperMessageLocally(words); + } + } + return false; +} +} // namespace + namespace chatterino { void CommandController::initialize(Settings &, Paths &paths) @@ -124,106 +255,10 @@ QString CommandController::execCommand(const QString &textNoEmoji, { if (commandName == "/w") { - if (words.length() <= 2) + if (words.length() > 2) { - return ""; - } - - auto app = getApp(); - - MessageBuilder b; - - b.emplace(); - b.emplace( - app->accounts->twitch.getCurrent()->getUserName(), - MessageElementFlag::Text, MessageColor::Text, - FontStyle::ChatMediumBold); - b.emplace("->", MessageElementFlag::Text); - b.emplace(words[1] + ":", MessageElementFlag::Text, - MessageColor::Text, - FontStyle::ChatMediumBold); - - const auto &acc = app->accounts->twitch.getCurrent(); - const auto &accemotes = *acc->accessEmotes(); - const auto &bttvemotes = app->twitch.server->getBttvEmotes(); - const auto &ffzemotes = app->twitch.server->getFfzEmotes(); - auto flags = MessageElementFlags(); - auto emote = boost::optional{}; - for (int i = 2; i < words.length(); i++) - { - { // twitch emote - auto it = accemotes.emotes.find({words[i]}); - if (it != accemotes.emotes.end()) - { - b.emplace( - it->second, MessageElementFlag::TwitchEmote); - continue; - } - } // twitch emote - - { // bttv/ffz emote - if ((emote = bttvemotes.emote({words[i]}))) - { - flags = MessageElementFlag::BttvEmote; - } - else if ((emote = ffzemotes.emote({words[i]}))) - { - flags = MessageElementFlag::FfzEmote; - } - if (emote) - { - b.emplace(emote.get(), flags); - continue; - } - } // bttv/ffz emote - { // emoji/text - for (auto &variant : app->emotes->emojis.parse(words[i])) - { - constexpr const static struct { - void operator()(EmotePtr emote, - MessageBuilder &b) const - { - b.emplace( - emote, MessageElementFlag::EmojiAll); - } - void operator()(const QString &string, - MessageBuilder &b) const - { - auto linkString = b.matchLink(string); - if (linkString.isEmpty()) - { - b.emplace( - string, MessageElementFlag::Text); - } - else - { - b.addLink(string, linkString); - } - } - } visitor; - boost::apply_visitor( - [&b](auto &&arg) { visitor(arg, b); }, variant); - } // emoji/text - } - } - - b->flags.set(MessageFlag::DoNotTriggerNotification); - b->flags.set(MessageFlag::Whisper); - auto messagexD = b.release(); - - app->twitch.server->whispersChannel->addMessage(messagexD); - - app->twitch.server->sendMessage("jtv", text); - - auto overrideFlags = boost::optional(messagexD->flags); - overrideFlags->set(MessageFlag::DoNotLog); - - if (getSettings()->inlineWhispers) - { - app->twitch.server->forEachChannel( - [&messagexD, overrideFlags](ChannelPtr _channel) { - _channel->addMessage(messagexD, overrideFlags); - }); + appendWhisperMessageLocally(words); + sendWhisperMessage(text); } return ""; @@ -428,7 +463,7 @@ QString CommandController::execCommand(const QString &textNoEmoji, auto it = this->commandsMap_.find(commandName); if (it != this->commandsMap_.end()) { - return this->execCustomCommand(words, it.value()); + return this->execCustomCommand(words, it.value(), dryRun); } auto maxSpaces = std::min(this->maxSpaces_, words.length() - 1); @@ -439,7 +474,7 @@ QString CommandController::execCommand(const QString &textNoEmoji, auto it = this->commandsMap_.find(commandName); if (it != this->commandsMap_.end()) { - return this->execCustomCommand(words, it.value()); + return this->execCustomCommand(words, it.value(), dryRun); } } @@ -447,7 +482,8 @@ QString CommandController::execCommand(const QString &textNoEmoji, } QString CommandController::execCustomCommand(const QStringList &words, - const Command &command) + const Command &command, + bool dryRun) { QString result; @@ -518,7 +554,15 @@ QString CommandController::execCustomCommand(const QStringList &words, result = result.mid(1); } - return result.replace("{{", "{"); + auto res = result.replace("{{", "{"); + + if (dryRun) + { + return res; + } + + return appendWhisperMessageLocally(res) ? (sendWhisperMessage(res), "") + : res; } QStringList CommandController::getDefaultTwitchCommandList() diff --git a/src/controllers/commands/CommandController.hpp b/src/controllers/commands/CommandController.hpp index fb6f9d89d..e29ee25a9 100644 --- a/src/controllers/commands/CommandController.hpp +++ b/src/controllers/commands/CommandController.hpp @@ -49,7 +49,8 @@ private: std::unique_ptr>> commandsSetting_; - QString execCustomCommand(const QStringList &words, const Command &command); + QString execCustomCommand(const QStringList &words, const Command &command, + bool dryRun); }; } // namespace chatterino From 23921f3fedffd2a2094e137d8eb0fd65e4c0c924 Mon Sep 17 00:00:00 2001 From: hemirt Date: Sun, 5 May 2019 16:15:35 +0200 Subject: [PATCH 068/138] show whispers notices --- src/providers/twitch/IrcMessageHandler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 2fda025a0..d6f091a76 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -528,7 +528,8 @@ void IrcMessageHandler::handleNoticeMessage(Communi::IrcNoticeMessage *message) for (auto msg : builtMessages) { QString channelName; - if (!trimChannelName(message->target(), channelName)) + if (!trimChannelName(message->target(), channelName) || + channelName == "jtv") { // Notice wasn't targeted at a single channel, send to all twitch // channels From 4f5e3f6a2702bdd8bf04cb99b333af47ea0eec6e Mon Sep 17 00:00:00 2001 From: hemirt Date: Sun, 5 May 2019 16:24:14 +0200 Subject: [PATCH 069/138] fixes #1058 --- src/controllers/commands/CommandController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index a4cd22a41..75403121a 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -38,7 +38,7 @@ using namespace chatterino; void sendWhisperMessage(const QString &text) { auto app = getApp(); - app->twitch.server->sendMessage("jtv", text); + app->twitch.server->sendMessage("jtv", text.simplified()); } bool appendWhisperMessageLocally(const QStringList &words) From 411502de4430be3381f3658db9807cd2700037e8 Mon Sep 17 00:00:00 2001 From: hemirt Date: Tue, 7 May 2019 20:21:08 +0200 Subject: [PATCH 070/138] fix comments --- .../commands/CommandController.cpp | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index 75403121a..e96a7a174 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -35,13 +35,17 @@ namespace { using namespace chatterino; +static const QStringList whisperCommands{"/w", ".w"}; + void sendWhisperMessage(const QString &text) { + // (hemirt) pajlada: "we should not be sending whispers through jtv, but + // rather to your own username" auto app = getApp(); app->twitch.server->sendMessage("jtv", text.simplified()); } -bool appendWhisperMessageLocally(const QStringList &words) +bool appendWhisperMessageWordsLocally(const QStringList &words) { auto app = getApp(); @@ -139,7 +143,7 @@ bool appendWhisperMessageLocally(const QStringList &words) return true; } -bool appendWhisperMessageLocally(const QString &textNoEmoji) +bool appendWhisperMessageStringLocally(const QString &textNoEmoji) { QString text = getApp()->emotes->emojis.replaceShortCodes(textNoEmoji); QStringList words = text.split(' ', QString::SkipEmptyParts); @@ -151,11 +155,11 @@ bool appendWhisperMessageLocally(const QString &textNoEmoji) QString commandName = words[0]; - if (commandName == "/w") + if (whisperCommands.contains(commandName, Qt::CaseInsensitive)) { if (words.length() > 2) { - return appendWhisperMessageLocally(words); + return appendWhisperMessageWordsLocally(words); } } return false; @@ -253,11 +257,11 @@ QString CommandController::execCommand(const QString &textNoEmoji, // works in a valid twitch channel and /whispers, etc... if (!dryRun && channel->isTwitchChannel()) { - if (commandName == "/w") + if (whisperCommands.contains(commandName, Qt::CaseInsensitive)) { if (words.length() > 2) { - appendWhisperMessageLocally(words); + appendWhisperMessageWordsLocally(words); sendWhisperMessage(text); } @@ -556,13 +560,15 @@ QString CommandController::execCustomCommand(const QStringList &words, auto res = result.replace("{{", "{"); - if (dryRun) + if (dryRun || !appendWhisperMessageStringLocally(res)) { return res; } - - return appendWhisperMessageLocally(res) ? (sendWhisperMessage(res), "") - : res; + else + { + sendWhisperMessage(res); + return ""; + } } QStringList CommandController::getDefaultTwitchCommandList() From 2d21bb06951fe1ca6b3adc7a1786fbee80a18cee Mon Sep 17 00:00:00 2001 From: Ruben Anders Date: Thu, 9 May 2019 19:29:43 +0200 Subject: [PATCH 071/138] Add libboost-filesystem-dev to ubuntu dependencies, closes #957 --- BUILDING_ON_LINUX.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILDING_ON_LINUX.md b/BUILDING_ON_LINUX.md index f594e2c10..0c717d8b6 100644 --- a/BUILDING_ON_LINUX.md +++ b/BUILDING_ON_LINUX.md @@ -4,7 +4,7 @@ Note on Qt version compatibility: If you are installing Qt from a package manage ## Ubuntu 18.04 *most likely works the same for other Debian-like distros* -1. Install dependencies (and the C++ IDE Qt Creator) `sudo apt install qtcreator qtmultimedia5-dev libqt5svg5-dev libboost-dev libssl-dev libboost-system-dev` +1. Install dependencies (and the C++ IDE Qt Creator) `sudo apt install qtcreator qtmultimedia5-dev libqt5svg5-dev libboost-dev libssl-dev libboost-system-dev libboost-filesystem-dev` 1. Open `chatterino.pro` with QT Creator and build ## Arch Linux From efec76df5b62d28411c4b62939ca3f62bdaaf0b9 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 4 May 2019 20:39:58 +0300 Subject: [PATCH 072/138] Removed unused local vars. Slightly refactored code. --- src/common/SignalVectorModel.hpp | 2 +- src/messages/MessageElement.cpp | 1 - src/providers/emoji/Emojis.cpp | 2 -- src/providers/twitch/TwitchAccountManager.cpp | 2 -- src/singletons/WindowManager.cpp | 3 --- src/singletons/helper/LoggingChannel.cpp | 16 +++------------- src/util/StreamLink.cpp | 7 ------- src/widgets/helper/NotebookTab.cpp | 4 ---- src/widgets/settingspages/AdvancedPage.cpp | 1 - src/widgets/settingspages/ExternalToolsPage.cpp | 2 -- 10 files changed, 4 insertions(+), 36 deletions(-) diff --git a/src/common/SignalVectorModel.hpp b/src/common/SignalVectorModel.hpp index 187356dea..d79263830 100644 --- a/src/common/SignalVectorModel.hpp +++ b/src/common/SignalVectorModel.hpp @@ -188,7 +188,7 @@ public: assert(row >= 0 && row < this->rows_.size() && column >= 0 && column < this->columnCount_); - return this->rows_[index.row()].items[index.column()]->flags(); + return this->rows_[row].items[column]->flags(); } QStandardItem *getItem(int row, int column) diff --git a/src/messages/MessageElement.cpp b/src/messages/MessageElement.cpp index 8afe72a5a..f480a747c 100644 --- a/src/messages/MessageElement.cpp +++ b/src/messages/MessageElement.cpp @@ -291,7 +291,6 @@ void TimestampElement::addToContainer(MessageLayoutContainer &container, { if (flags.hasAny(this->getFlags())) { - auto app = getApp(); if (getSettings()->timestampFormat != this->format_) { this->format_ = getSettings()->timestampFormat.getValue(); diff --git a/src/providers/emoji/Emojis.cpp b/src/providers/emoji/Emojis.cpp index d42f619ef..f835413db 100644 --- a/src/providers/emoji/Emojis.cpp +++ b/src/providers/emoji/Emojis.cpp @@ -240,8 +240,6 @@ void Emojis::sortEmojis() void Emojis::loadEmojiSet() { - auto app = getApp(); - getSettings()->emojiSet.connect([=](const auto &emojiSet) { this->emojis.each([=](const auto &name, std::shared_ptr &emoji) { diff --git a/src/providers/twitch/TwitchAccountManager.cpp b/src/providers/twitch/TwitchAccountManager.cpp index a42c344da..5b7a2c431 100644 --- a/src/providers/twitch/TwitchAccountManager.cpp +++ b/src/providers/twitch/TwitchAccountManager.cpp @@ -172,8 +172,6 @@ bool TwitchAccountManager::isLoggedIn() const bool TwitchAccountManager::removeUser(TwitchAccount *account) { - const auto &accs = this->accounts.getVector(); - auto userID(account->getUserId()); if (!userID.isEmpty()) { diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index 092014811..982484e6e 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -387,10 +387,7 @@ void WindowManager::initialize(Settings &settings, Paths &paths) void WindowManager::save() { log("[WindowManager] Saving"); - assertInGuiThread(); - auto app = getApp(); - QJsonDocument document; // "serialize" diff --git a/src/singletons/helper/LoggingChannel.cpp b/src/singletons/helper/LoggingChannel.cpp index 74b4ebe30..c4f7f59c6 100644 --- a/src/singletons/helper/LoggingChannel.cpp +++ b/src/singletons/helper/LoggingChannel.cpp @@ -33,20 +33,10 @@ LoggingChannel::LoggingChannel(const QString &_channelName) // FOURTF: change this when adding more providers this->subDirectory = "Twitch/" + this->subDirectory; - auto app = getApp(); - getSettings()->logPath.connect([this](const QString &logPath, auto) { - auto app = getApp(); - - if (logPath.isEmpty()) - { - this->baseDirectory = getPaths()->messageLogDirectory; - } - else - { - this->baseDirectory = logPath; - } - + this->baseDirectory = logPath.isEmpty() + ? getPaths()->messageLogDirectory + : logPath; this->openLogFile(); }); } diff --git a/src/util/StreamLink.cpp b/src/util/StreamLink.cpp index c213c83d8..4c3634c2f 100644 --- a/src/util/StreamLink.cpp +++ b/src/util/StreamLink.cpp @@ -36,8 +36,6 @@ namespace { QString getStreamlinkProgram() { - auto app = getApp(); - if (getSettings()->streamlinkUseCustomPath) { return getSettings()->streamlinkPath + "/" + getBinaryName(); @@ -66,7 +64,6 @@ namespace { { static QErrorMessage *msg = new QErrorMessage; - auto app = getApp(); if (getSettings()->streamlinkUseCustomPath) { msg->showMessage( @@ -172,8 +169,6 @@ void getStreamQualities(const QString &channelURL, void openStreamlink(const QString &channelURL, const QString &quality, QStringList extraArguments) { - auto app = getApp(); - QStringList arguments; QString additionalOptions = getSettings()->streamlinkOpts.getValue(); @@ -202,8 +197,6 @@ void openStreamlink(const QString &channelURL, const QString &quality, void openStreamlinkForChannel(const QString &channel) { - auto app = getApp(); - QString channelURL = "twitch.tv/" + channel; QString preferredQuality = getSettings()->preferredQuality; diff --git a/src/widgets/helper/NotebookTab.cpp b/src/widgets/helper/NotebookTab.cpp index 04d2fc4de..77d2f9e4e 100644 --- a/src/widgets/helper/NotebookTab.cpp +++ b/src/widgets/helper/NotebookTab.cpp @@ -29,8 +29,6 @@ NotebookTab::NotebookTab(Notebook *notebook) , notebook_(notebook) , menu_(this) { - auto app = getApp(); - this->setAcceptDrops(true); this->positionChangedAnimation_.setEasingCurve( @@ -527,8 +525,6 @@ void NotebookTab::dragEnterEvent(QDragEnterEvent *event) void NotebookTab::mouseMoveEvent(QMouseEvent *event) { - auto app = getApp(); - if (getSettings()->showTabCloseButton && this->notebook_->getAllowUserTabManagement()) // { diff --git a/src/widgets/settingspages/AdvancedPage.cpp b/src/widgets/settingspages/AdvancedPage.cpp index 8aa563191..739abd686 100644 --- a/src/widgets/settingspages/AdvancedPage.cpp +++ b/src/widgets/settingspages/AdvancedPage.cpp @@ -26,7 +26,6 @@ namespace chatterino { AdvancedPage::AdvancedPage() : SettingsPage("Advanced", ":/settings/advanced.svg") { - auto app = getApp(); LayoutCreator layoutCreator(this); auto tabs = layoutCreator.emplace(); diff --git a/src/widgets/settingspages/ExternalToolsPage.cpp b/src/widgets/settingspages/ExternalToolsPage.cpp index ce93a755c..a15fc4649 100644 --- a/src/widgets/settingspages/ExternalToolsPage.cpp +++ b/src/widgets/settingspages/ExternalToolsPage.cpp @@ -14,8 +14,6 @@ namespace chatterino { ExternalToolsPage::ExternalToolsPage() : SettingsPage("External tools", ":/settings/externaltools.svg") { - auto app = getApp(); - LayoutCreator layoutCreator(this); auto layout = layoutCreator.setLayoutType(); From 9654650beef86d35ae8e33ec423e1edcee609b37 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 8 May 2019 09:51:14 +0300 Subject: [PATCH 073/138] Renamed variables to clear some warnings. --- src/common/DownloadManager.cpp | 2 -- src/controllers/accounts/AccountModel.cpp | 8 ++--- .../commands/CommandController.cpp | 12 ++++--- .../notifications/NotificationController.cpp | 14 +++----- src/messages/MessageBuilder.cpp | 16 +++------ src/messages/MessageElement.cpp | 4 +-- src/messages/layouts/MessageLayout.cpp | 6 ++-- .../layouts/MessageLayoutContainer.cpp | 8 ++--- src/providers/emoji/Emojis.cpp | 4 +-- src/providers/irc/AbstractIrcServer.cpp | 10 +++--- src/providers/twitch/TwitchChannel.cpp | 8 ++--- src/providers/twitch/TwitchMessageBuilder.cpp | 35 ++++++++----------- src/providers/twitch/TwitchServer.cpp | 2 +- src/singletons/Paths.cpp | 8 ++--- src/singletons/Theme.cpp | 12 +++---- src/singletons/Toasts.cpp | 3 +- src/widgets/Scrollbar.cpp | 2 +- src/widgets/dialogs/SelectChannelDialog.cpp | 1 - src/widgets/settingspages/ModerationPage.cpp | 27 ++++---------- 19 files changed, 73 insertions(+), 109 deletions(-) diff --git a/src/common/DownloadManager.cpp b/src/common/DownloadManager.cpp index 286150a7c..5adc8ef32 100644 --- a/src/common/DownloadManager.cpp +++ b/src/common/DownloadManager.cpp @@ -20,9 +20,7 @@ DownloadManager::~DownloadManager() void DownloadManager::setFile(QString fileURL, const QString &channelName) { - QString filePath = fileURL; QString saveFilePath; - QStringList filePathList = filePath.split('/'); saveFilePath = getPaths()->twitchProfileAvatars + "/twitch/" + channelName + ".png"; QNetworkRequest request; diff --git a/src/controllers/accounts/AccountModel.cpp b/src/controllers/accounts/AccountModel.cpp index 6e1d2a5df..875efbdc5 100644 --- a/src/controllers/accounts/AccountModel.cpp +++ b/src/controllers/accounts/AccountModel.cpp @@ -31,12 +31,12 @@ int AccountModel::beforeInsert(const std::shared_ptr &item, { if (this->categoryCount_[item->getCategory()]++ == 0) { - auto row = this->createRow(); + auto newRow = this->createRow(); - setStringItem(row[0], item->getCategory(), false, false); - row[0]->setData(QFont("Segoe UI Light", 16), Qt::FontRole); + setStringItem(newRow[0], item->getCategory(), false, false); + newRow[0]->setData(QFont("Segoe UI Light", 16), Qt::FontRole); - this->insertCustomRow(std::move(row), proposedIndex); + this->insertCustomRow(std::move(newRow), proposedIndex); return proposedIndex + 1; } diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index e96a7a174..69a6195f4 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -463,11 +463,13 @@ QString CommandController::execCommand(const QString &textNoEmoji, } } - // check if custom command exists - auto it = this->commandsMap_.find(commandName); - if (it != this->commandsMap_.end()) { - return this->execCustomCommand(words, it.value(), dryRun); + // check if custom command exists + const auto it = this->commandsMap_.find(commandName); + if (it != this->commandsMap_.end()) + { + return this->execCustomCommand(words, it.value(), dryRun); + } } auto maxSpaces = std::min(this->maxSpaces_, words.length() - 1); @@ -475,7 +477,7 @@ QString CommandController::execCommand(const QString &textNoEmoji, { commandName += ' ' + words[i + 1]; - auto it = this->commandsMap_.find(commandName); + const auto it = this->commandsMap_.find(commandName); if (it != this->commandsMap_.end()) { return this->execCustomCommand(words, it.value(), dryRun); diff --git a/src/controllers/notifications/NotificationController.cpp b/src/controllers/notifications/NotificationController.cpp index 395de1974..435fb8fa1 100644 --- a/src/controllers/notifications/NotificationController.cpp +++ b/src/controllers/notifications/NotificationController.cpp @@ -103,16 +103,10 @@ void NotificationController::playSound() static auto player = new QMediaPlayer; static QUrl currentPlayerUrl; - QUrl highlightSoundUrl; - if (getSettings()->notificationCustomSound) - { - highlightSoundUrl = QUrl::fromLocalFile( - getSettings()->notificationPathSound.getValue()); - } - else - { - highlightSoundUrl = QUrl("qrc:/sounds/ping2.wav"); - } + QUrl highlightSoundUrl = getSettings()->notificationCustomSound + ? QUrl::fromLocalFile(getSettings()->notificationPathSound.getValue()) + : QUrl("qrc:/sounds/ping2.wav"); + if (currentPlayerUrl != highlightSoundUrl) { player->setMedia(highlightSoundUrl); diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index 3040b535a..3fe89ccf6 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -235,20 +235,12 @@ MessageBuilder::MessageBuilder(const UnbanAction &action) this->message().timeoutUser = action.target.name; - QString text; - - if (action.wasBan()) - { - text = QString("%1 unbanned %2.") // + QString text = QString("%1 %2 %3.") .arg(action.source.name) + .arg(QString(action.wasBan() + ? "unbanned" + : "untimedout")) .arg(action.target.name); - } - else - { - text = QString("%1 untimedout %2.") // - .arg(action.source.name) - .arg(action.target.name); - } this->emplace(text, MessageElementFlag::Text, MessageColor::System); diff --git a/src/messages/MessageElement.cpp b/src/messages/MessageElement.cpp index f480a747c..871bbfffe 100644 --- a/src/messages/MessageElement.cpp +++ b/src/messages/MessageElement.cpp @@ -188,7 +188,7 @@ void TextElement::addToContainer(MessageLayoutContainer &container, for (Word &word : this->words_) { auto getTextLayoutElement = [&](QString text, int width, - bool trailingSpace) { + bool hasTrailingSpace) { auto color = this->color_.getColor(*app->themes); app->themes->normalizeColor(color); @@ -196,7 +196,7 @@ void TextElement::addToContainer(MessageLayoutContainer &container, *this, text, QSize(width, metrics.height()), color, this->style_, container.getScale())) ->setLink(this->getLink()); - e->setTrailingSpace(trailingSpace); + e->setTrailingSpace(hasTrailingSpace); e->setText(text); // If URL link was changed, diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index 808d40d94..5bafe8c19 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -99,14 +99,14 @@ bool MessageLayout::layout(int width, float scale, MessageElementFlags flags) return true; } -void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags) +void MessageLayout::actuallyLayout(int width, MessageElementFlags flags) { this->layoutCount_++; auto messageFlags = this->message_->flags; if (this->flags.has(MessageLayoutFlag::Expanded) || - (_flags.has(MessageElementFlag::ModeratorTools) && + (flags.has(MessageElementFlag::ModeratorTools) && !this->message_->flags.has(MessageFlag::Disabled))) // { messageFlags.unset(MessageFlag::Collapsed); @@ -121,7 +121,7 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags) { continue; } - element->addToContainer(*this->container_, _flags); + element->addToContainer(*this->container_, flags); } if (this->height_ != this->container_->getHeight()) diff --git a/src/messages/layouts/MessageLayoutContainer.cpp b/src/messages/layouts/MessageLayoutContainer.cpp index f421b053a..599564787 100644 --- a/src/messages/layouts/MessageLayoutContainer.cpp +++ b/src/messages/layouts/MessageLayoutContainer.cpp @@ -390,17 +390,17 @@ void MessageLayoutContainer::paintSelection(QPainter &painter, int messageIndex, int lineIndex2 = lineIndex + 1; for (; lineIndex2 < this->lines_.size(); lineIndex2++) { - Line &line = this->lines_[lineIndex2]; - QRect rect = line.rect; + Line &line2 = this->lines_[lineIndex2]; + QRect rect = line2.rect; rect.setTop(std::max(0, rect.top()) + yOffset); rect.setBottom( std::min(this->height_, rect.bottom()) + yOffset); - rect.setLeft(this->elements_[line.startIndex] + rect.setLeft(this->elements_[line2.startIndex] ->getRect() .left()); - rect.setRight(this->elements_[line.endIndex - 1] + rect.setRight(this->elements_[line2.endIndex - 1] ->getRect() .right()); diff --git a/src/providers/emoji/Emojis.cpp b/src/providers/emoji/Emojis.cpp index f835413db..f510d697f 100644 --- a/src/providers/emoji/Emojis.cpp +++ b/src/providers/emoji/Emojis.cpp @@ -36,9 +36,9 @@ namespace { else { const auto &shortCodes = unparsedEmoji["short_names"]; - for (const auto &shortCode : shortCodes.GetArray()) + for (const auto &_shortCode : shortCodes.GetArray()) { - emojiData->shortCodes.emplace_back(shortCode.GetString()); + emojiData->shortCodes.emplace_back(_shortCode.GetString()); } } diff --git a/src/providers/irc/AbstractIrcServer.cpp b/src/providers/irc/AbstractIrcServer.cpp index d803fdbe9..eb1d0def9 100644 --- a/src/providers/irc/AbstractIrcServer.cpp +++ b/src/providers/irc/AbstractIrcServer.cpp @@ -231,8 +231,8 @@ void AbstractIrcServer::onConnected() { std::lock_guard lock(this->channelMutex); - auto connected = makeSystemMessage("connected"); - connected->flags.set(MessageFlag::ConnectedMessage); + auto connectedMsg = makeSystemMessage("connected"); + connectedMsg->flags.set(MessageFlag::ConnectedMessage); auto reconnected = makeSystemMessage("reconnected"); reconnected->flags.set(MessageFlag::ConnectedMessage); @@ -256,7 +256,7 @@ void AbstractIrcServer::onConnected() continue; } - chan->addMessage(connected); + chan->addMessage(connectedMsg); } this->falloffCounter_ = 1; @@ -268,7 +268,7 @@ void AbstractIrcServer::onDisconnected() MessageBuilder b(systemMessage, "disconnected"); b->flags.set(MessageFlag::DisconnectedMessage); - auto disconnected = b.release(); + auto disconnectedMsg = b.release(); for (std::weak_ptr &weak : this->channels.values()) { @@ -278,7 +278,7 @@ void AbstractIrcServer::onDisconnected() continue; } - chan->addMessage(disconnected); + chan->addMessage(disconnectedMsg); } } diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index a40859791..c3a795fff 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -666,11 +666,11 @@ void TwitchChannel::refreshChatters() { // setting? const auto streamStatus = this->accessStreamStatus(); - + const auto viewerCount = static_cast(streamStatus->viewerCount); if (getSettings()->onlyFetchChattersForSmallerStreamers) { if (streamStatus->live && - streamStatus->viewerCount > getSettings()->smallStreamerLimit) + viewerCount > getSettings()->smallStreamerLimit) { return; } @@ -722,8 +722,8 @@ void TwitchChannel::refreshBadges() { auto &versions = (*badgeSets)[jsonBadgeSet.key()]; - auto _ = jsonBadgeSet->toObject()["versions"].toObject(); - for (auto jsonVersion_ = _.begin(); jsonVersion_ != _.end(); + auto _set = jsonBadgeSet->toObject()["versions"].toObject(); + for (auto jsonVersion_ = _set.begin(); jsonVersion_ != _set.end(); jsonVersion_++) { auto jsonVersion = jsonVersion_->toObject(); diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 8bccc6ea7..c39889aba 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -334,13 +334,13 @@ MessagePtr TwitchMessageBuilder::build() QRegularExpression emoteregex( "\\b" + std::get<2>(tup).string + "\\b", QRegularExpression::UseUnicodePropertiesOption); - auto match = emoteregex.match(midExtendedRef); - if (match.hasMatch()) + auto _match = emoteregex.match(midExtendedRef); + if (_match.hasMatch()) { - int last = match.lastCapturedIndex(); + int last = _match.lastCapturedIndex(); for (int i = 0; i <= last; ++i) { - std::get<0>(tup) = from + match.capturedStart(); + std::get<0>(tup) = from + _match.capturedStart(); twitchEmotes.push_back(std::move(tup)); } } @@ -781,16 +781,9 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) } // update the media player url if necessary - QUrl highlightSoundUrl; - if (getSettings()->customHighlightSound) - { - highlightSoundUrl = - QUrl::fromLocalFile(getSettings()->pathHighlightSound.getValue()); - } - else - { - highlightSoundUrl = QUrl("qrc:/sounds/ping2.wav"); - } + QUrl highlightSoundUrl = getSettings()->customHighlightSound + ? QUrl::fromLocalFile(getSettings()->pathHighlightSound.getValue()) + : QUrl("qrc:/sounds/ping2.wav"); if (currentPlayerUrl != highlightSoundUrl) { @@ -1040,11 +1033,11 @@ void TwitchMessageBuilder::appendTwitchBadges() try { if (twitchChannel) - if (const auto &badge = this->twitchChannel->twitchBadge( + if (const auto &_badge = this->twitchChannel->twitchBadge( "bits", cheerAmount)) { this->emplace( - badge.get(), MessageElementFlag::BadgeVanity) + _badge.get(), MessageElementFlag::BadgeVanity) ->setTooltip(tooltip); continue; } @@ -1055,10 +1048,10 @@ void TwitchMessageBuilder::appendTwitchBadges() } // Use default bit badge - if (auto badge = this->twitchChannel->globalTwitchBadges().badge( + if (auto _badge = this->twitchChannel->globalTwitchBadges().badge( "bits", cheerAmount)) { - this->emplace(badge.get(), + this->emplace(_badge.get(), MessageElementFlag::BadgeVanity) ->setTooltip(tooltip); } @@ -1174,12 +1167,12 @@ void TwitchMessageBuilder::appendTwitchBadges() ->setTooltip((*badgeEmote)->tooltip.string); continue; } - if (auto badge = this->twitchChannel->globalTwitchBadges().badge( + if (auto _badge = this->twitchChannel->globalTwitchBadges().badge( splits[0], splits[1])) { - this->emplace(badge.get(), + this->emplace(_badge.get(), MessageElementFlag::BadgeVanity) - ->setTooltip((*badge)->tooltip.string); + ->setTooltip((*_badge)->tooltip.string); continue; } } diff --git a/src/providers/twitch/TwitchServer.cpp b/src/providers/twitch/TwitchServer.cpp index 2a63b1eb7..58f98494c 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -223,7 +223,7 @@ std::shared_ptr TwitchServer::getCustomChannel( { static auto channel = std::make_shared("$$$", chatterino::Channel::Type::Misc); - static auto timer = [&] { + static auto getTimer = [&] { for (auto i = 0; i < 1000; i++) { channel->addMessage(makeSystemMessage(QString::number(i + 1))); diff --git a/src/singletons/Paths.cpp b/src/singletons/Paths.cpp index 3114cf2d6..7c5e4266d 100644 --- a/src/singletons/Paths.cpp +++ b/src/singletons/Paths.cpp @@ -37,7 +37,7 @@ bool Paths::isPortable() QString Paths::cacheDirectory() { - static QStringSetting cachePathSetting = [] { + static const auto path = [] { QStringSetting cachePathSetting("/cache/path"); cachePathSetting.connect([](const auto &newPath, auto) { @@ -45,11 +45,9 @@ QString Paths::cacheDirectory() }); return cachePathSetting; - }(); + }().getValue(); - auto path = cachePathSetting.getValue(); - - if (path == "") + if (path.isEmpty()) { return this->cacheDirectory_; } diff --git a/src/singletons/Theme.cpp b/src/singletons/Theme.cpp index 1c1411ec2..6fb31e352 100644 --- a/src/singletons/Theme.cpp +++ b/src/singletons/Theme.cpp @@ -27,9 +27,9 @@ void Theme::actuallyUpdate(double hue, double multiplier) return QColor::fromHslF(h, s, ((l - 0.5) * multiplier) + 0.5, a); }; - auto sat = qreal(0); - auto isLight_ = this->isLightTheme(); - auto flat = isLight_; + const auto sat = qreal(0); + const auto isLight = this->isLightTheme(); + const auto flat = isLight; if (this->isLightTheme()) { @@ -61,7 +61,7 @@ void Theme::actuallyUpdate(double hue, double multiplier) this->splits.header.border = getColor(0, sat, flat ? 1 : 0.85); this->splits.header.text = this->messages.textColors.regular; this->splits.header.focusedText = - isLight_ ? QColor("#198CFF") : QColor("#84C1FF"); + isLight ? QColor("#198CFF") : QColor("#84C1FF"); this->splits.input.background = getColor(0, sat, flat ? 0.95 : 0.95); this->splits.input.border = getColor(0, sat, flat ? 1 : 1); @@ -71,13 +71,13 @@ void Theme::actuallyUpdate(double hue, double multiplier) "border:" + this->tabs.selected.backgrounds.regular.color().name() + ";" + "color:" + this->messages.textColors.regular.name() + ";" + // "selection-background-color:" + - (isLight_ ? "#68B1FF" + (isLight ? "#68B1FF" : this->tabs.selected.backgrounds.regular.color().name()); this->splits.input.focusedLine = this->tabs.highlighted.line.regular; this->splits.messageSeperator = - isLight_ ? QColor(127, 127, 127) : QColor(60, 60, 60); + isLight ? QColor(127, 127, 127) : QColor(60, 60, 60); this->splits.background = getColor(0, sat, 1); this->splits.dropPreview = QColor(0, 148, 255, 0x30); this->splits.dropPreviewBorder = QColor(0, 148, 255, 0xff); diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index 9dcbd6516..a9dccc614 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -38,8 +38,9 @@ bool Toasts::isEnabled() #ifdef Q_OS_WIN return WinToastLib::WinToast::isCompatible() && getSettings()->notificationToast; -#endif +#else return false; +#endif } QString Toasts::findStringFromReaction(const ToastReaction &reaction) diff --git a/src/widgets/Scrollbar.cpp b/src/widgets/Scrollbar.cpp index a202dcd5c..4c7efeede 100644 --- a/src/widgets/Scrollbar.cpp +++ b/src/widgets/Scrollbar.cpp @@ -110,7 +110,7 @@ void Scrollbar::setSmallChange(qreal value) void Scrollbar::setDesiredValue(qreal value, bool animated) { - animated &= getSettings()->enableSmoothScrolling.getValue(); + animated &= getSettings()->enableSmoothScrolling; value = std::max(this->minimum_, std::min(this->maximum_ - this->largeChange_, value)); diff --git a/src/widgets/dialogs/SelectChannelDialog.cpp b/src/widgets/dialogs/SelectChannelDialog.cpp index 2d8218e69..f965ccb5c 100644 --- a/src/widgets/dialogs/SelectChannelDialog.cpp +++ b/src/widgets/dialogs/SelectChannelDialog.cpp @@ -319,7 +319,6 @@ bool SelectChannelDialog::EventFilter::eventFilter(QObject *watched, { return false; } - return true; } else if (event->type() == QEvent::KeyRelease) { diff --git a/src/widgets/settingspages/ModerationPage.cpp b/src/widgets/settingspages/ModerationPage.cpp index b44e73274..02580ebeb 100644 --- a/src/widgets/settingspages/ModerationPage.cpp +++ b/src/widgets/settingspages/ModerationPage.cpp @@ -61,15 +61,10 @@ QString formatSize(qint64 size) QString fetchLogDirectorySize() { - QString logPathDirectory; - if (getSettings()->logPath == "") - { - logPathDirectory = getPaths()->messageLogDirectory; - } - else - { - logPathDirectory = getSettings()->logPath; - } + QString logPathDirectory = getSettings()->logPath.getValue().isEmpty() + ? getPaths()->messageLogDirectory + : getSettings()->logPath; + qint64 logsSize = dirSize(logPathDirectory); QString logsSizeLabel = "Your logs currently take up "; logsSizeLabel += formatSize(logsSize); @@ -98,16 +93,9 @@ ModerationPage::ModerationPage() // Logs (copied from LoggingMananger) getSettings()->logPath.connect( [logsPathLabel](const QString &logPath, auto) mutable { - QString pathOriginal; - - if (logPath == "") - { - pathOriginal = getPaths()->messageLogDirectory; - } - else - { - pathOriginal = logPath; - } + QString pathOriginal = logPath.isEmpty() + ? getPaths()->messageLogDirectory + : logPath; QString pathShortened = "Logs are saved at setTextFormat(Qt::RichText); logsPathLabel->setTextInteractionFlags(Qt::TextBrowserInteraction | - Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByKeyboard); logsPathLabel->setOpenExternalLinks(true); logs.append(this->createCheckBox("Enable logging", From c43c1dc207b3ace4b75cfaded48874e96b915bbd Mon Sep 17 00:00:00 2001 From: hemirt <1310440+hemirt@users.noreply.github.com> Date: Fri, 10 May 2019 22:36:37 +0200 Subject: [PATCH 074/138] Adds option to mute ping sound for specific channels (#990) Co-Authored-By: hemirt --- chatterino.pro | 4 ++ src/Application.cpp | 2 + src/Application.hpp | 2 + src/controllers/pings/PingController.cpp | 70 +++++++++++++++++++ src/controllers/pings/PingController.hpp | 36 ++++++++++ src/controllers/pings/PingModel.cpp | 28 ++++++++ src/controllers/pings/PingModel.hpp | 28 ++++++++ src/providers/twitch/TwitchMessageBuilder.cpp | 10 ++- src/widgets/splits/SplitHeader.cpp | 18 +++++ 9 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 src/controllers/pings/PingController.cpp create mode 100644 src/controllers/pings/PingController.hpp create mode 100644 src/controllers/pings/PingModel.cpp create mode 100644 src/controllers/pings/PingModel.hpp diff --git a/chatterino.pro b/chatterino.pro index 68eff9568..2cb069551 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -198,6 +198,8 @@ SOURCES += \ src/widgets/splits/SplitOverlay.cpp \ src/widgets/StreamView.cpp \ src/widgets/Window.cpp \ + src/controllers/pings/PingController.cpp \ + src/controllers/pings/PingModel.cpp \ HEADERS += \ src/Application.hpp \ @@ -382,6 +384,8 @@ HEADERS += \ src/widgets/splits/SplitOverlay.hpp \ src/widgets/StreamView.hpp \ src/widgets/Window.hpp \ + src/controllers/pings/PingController.hpp \ + src/controllers/pings/PingModel.hpp \ RESOURCES += \ resources/resources.qrc \ diff --git a/src/Application.cpp b/src/Application.cpp index d92e6e896..42067d9bd 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -6,6 +6,7 @@ #include "controllers/ignores/IgnoreController.hpp" #include "controllers/moderationactions/ModerationActions.hpp" #include "controllers/notifications/NotificationController.hpp" +#include "controllers/pings/PingController.hpp" #include "controllers/taggedusers/TaggedUsersController.hpp" #include "debug/Log.hpp" #include "messages/MessageBuilder.hpp" @@ -53,6 +54,7 @@ Application::Application(Settings &_settings, Paths &_paths) , commands(&this->emplace()) , highlights(&this->emplace()) , notifications(&this->emplace()) + , pings(&this->emplace()) , ignores(&this->emplace()) , taggedUsers(&this->emplace()) , moderationActions(&this->emplace()) diff --git a/src/Application.hpp b/src/Application.hpp index c872a4c62..49c8fe96c 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -18,6 +18,7 @@ class TaggedUsersController; class AccountController; class ModerationActions; class NotificationController; +class PingController; class Theme; class WindowManager; @@ -62,6 +63,7 @@ public: CommandController *const commands{}; HighlightController *const highlights{}; NotificationController *const notifications{}; + PingController *const pings{}; IgnoreController *const ignores{}; TaggedUsersController *const taggedUsers{}; ModerationActions *const moderationActions{}; diff --git a/src/controllers/pings/PingController.cpp b/src/controllers/pings/PingController.cpp new file mode 100644 index 000000000..0f0ed37d8 --- /dev/null +++ b/src/controllers/pings/PingController.cpp @@ -0,0 +1,70 @@ +#include "controllers/pings/PingController.hpp" +#include "controllers/pings/PingModel.hpp" + +namespace chatterino { + +void PingController::initialize(Settings &settings, Paths &paths) +{ + this->initialized_ = true; + for (const QString &channelName : this->pingSetting_.getValue()) + { + this->channelVector.appendItem(channelName); + } + + this->channelVector.delayedItemsChanged.connect([this] { // + this->pingSetting_.setValue(this->channelVector.getVector()); + }); +} + +PingModel *PingController::createModel(QObject *parent) +{ + PingModel *model = new PingModel(parent); + model->init(&this->channelVector); + return model; +} + +bool PingController::isMuted(const QString &channelName) +{ + for (const auto &channel : this->channelVector.getVector()) + { + if (channelName.toLower() == channel.toLower()) + { + return true; + } + } + return false; +} + +void PingController::muteChannel(const QString &channelName) +{ + channelVector.appendItem(channelName); +} + +void PingController::unmuteChannel(const QString &channelName) +{ + for (std::vector::size_type i = 0; + i != channelVector.getVector().size(); i++) + { + if (channelVector.getVector()[i].toLower() == channelName.toLower()) + { + channelVector.removeItem(i); + i--; + } + } +} + +bool PingController::toggleMuteChannel(const QString &channelName) +{ + if (this->isMuted(channelName)) + { + unmuteChannel(channelName); + return false; + } + else + { + muteChannel(channelName); + return true; + } +} + +} // namespace chatterino diff --git a/src/controllers/pings/PingController.hpp b/src/controllers/pings/PingController.hpp new file mode 100644 index 000000000..80805e856 --- /dev/null +++ b/src/controllers/pings/PingController.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include "common/SignalVector.hpp" +#include "common/Singleton.hpp" +#include "singletons/Settings.hpp" + +namespace chatterino { + +class Settings; +class Paths; + +class PingModel; + +class PingController final : public Singleton, private QObject +{ +public: + virtual void initialize(Settings &settings, Paths &paths) override; + + bool isMuted(const QString &channelName); + void muteChannel(const QString &channelName); + void unmuteChannel(const QString &channelName); + bool toggleMuteChannel(const QString &channelName); + + PingModel *createModel(QObject *parent); + +private: + bool initialized_ = false; + + UnsortedSignalVector channelVector; + + ChatterinoSetting> pingSetting_ = {"/pings/muted"}; +}; + +} // namespace chatterino diff --git a/src/controllers/pings/PingModel.cpp b/src/controllers/pings/PingModel.cpp new file mode 100644 index 000000000..28098a209 --- /dev/null +++ b/src/controllers/pings/PingModel.cpp @@ -0,0 +1,28 @@ +#include "PingModel.hpp" + +#include "Application.hpp" +#include "singletons/Settings.hpp" +#include "util/StandardItemHelper.hpp" + +namespace chatterino { + +PingModel::PingModel(QObject *parent) + : SignalVectorModel(1, parent) +{ +} + +// turn a vector item into a model row +QString PingModel::getItemFromRow(std::vector &row, + const QString &original) +{ + return QString(row[0]->data(Qt::DisplayRole).toString()); +} + +// turn a model +void PingModel::getRowFromItem(const QString &item, + std::vector &row) +{ + setStringItem(row[0], item); +} + +} // namespace chatterino diff --git a/src/controllers/pings/PingModel.hpp b/src/controllers/pings/PingModel.hpp new file mode 100644 index 000000000..137be5e0c --- /dev/null +++ b/src/controllers/pings/PingModel.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include "common/SignalVectorModel.hpp" +#include "controllers/notifications/NotificationController.hpp" + +namespace chatterino { + +class PingController; + +class PingModel : public SignalVectorModel +{ + explicit PingModel(QObject *parent); + +protected: + // turn a vector item into a model row + virtual QString getItemFromRow(std::vector &row, + const QString &original) override; + + // turns a row in the model into a vector item + virtual void getRowFromItem(const QString &item, + std::vector &row) override; + + friend class PingController; +}; + +} // namespace chatterino diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index c39889aba..c386d2c8d 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -4,6 +4,7 @@ #include "controllers/accounts/AccountController.hpp" #include "controllers/highlights/HighlightController.hpp" #include "controllers/ignores/IgnoreController.hpp" +#include "controllers/pings/PingController.hpp" #include "debug/Log.hpp" #include "messages/Message.hpp" #include "providers/chatterino/ChatterinoBadges.hpp" @@ -885,13 +886,16 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) if (!isPastMsg) { - if (playSound && - (!hasFocus || getSettings()->highlightAlwaysPlaySound)) + bool notMuted = !getApp()->pings->isMuted(this->channel->getName()); + bool resolveFocus = + !hasFocus || getSettings()->highlightAlwaysPlaySound; + + if (playSound && notMuted && resolveFocus) { player->play(); } - if (doAlert) + if (doAlert && notMuted) { getApp()->windows->sendAlert(); } diff --git a/src/widgets/splits/SplitHeader.cpp b/src/widgets/splits/SplitHeader.cpp index 8f4baa179..bd8949073 100644 --- a/src/widgets/splits/SplitHeader.cpp +++ b/src/widgets/splits/SplitHeader.cpp @@ -4,6 +4,7 @@ #include "controllers/accounts/AccountController.hpp" #include "controllers/moderationactions/ModerationActions.hpp" #include "controllers/notifications/NotificationController.hpp" +#include "controllers/pings/PingController.hpp" #include "providers/twitch/TwitchChannel.hpp" #include "providers/twitch/TwitchServer.hpp" #include "singletons/Resources.hpp" @@ -297,6 +298,23 @@ std::unique_ptr SplitHeader::createMainMenu() moreMenu->addAction(action); + { + auto action = new QAction(this); + action->setText("Mute highlight sound"); + action->setCheckable(true); + + QObject::connect(moreMenu, &QMenu::aboutToShow, this, [action, this]() { + action->setChecked(getApp()->pings->isMuted( + this->split_->getChannel()->getName())); + }); + action->connect(action, &QAction::triggered, this, [this]() { + getApp()->pings->toggleMuteChannel( + this->split_->getChannel()->getName()); + }); + + moreMenu->addAction(action); + } + moreMenu->addSeparator(); moreMenu->addAction("Reconnect", this, SLOT(reconnect())); moreMenu->addAction("Reload channel emotes", this, From 3ea496a99b764abe8e9c0436d3e8612d809c2f5a Mon Sep 17 00:00:00 2001 From: apa420 <17131426+apa420@users.noreply.github.com> Date: Fri, 10 May 2019 22:37:44 +0200 Subject: [PATCH 075/138] Added boldness adjustment for fonts (#1057) * Added boldness adjustment for fonts * Moved setting and changed description of it --- src/singletons/Settings.hpp | 7 +++---- src/widgets/settingspages/GeneralPage.cpp | 10 +++++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 6c4ca3506..eef7a96f2 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -46,7 +46,7 @@ public: "/appearance/messages/collapseMessagesMinLines", 0}; BoolSetting alternateMessages = { "/appearance/messages/alternateMessageBackground", false}; - IntSetting boldScale = {"/appearance/boldScale", 57}; + FloatSetting boldScale = {"/appearance/boldScale", 50}; BoolSetting showTabCloseButton = {"/appearance/showTabCloseButton", true}; BoolSetting showTabLive = {"/appearance/showTabLiveButton", false}; BoolSetting hidePreferencesButton = {"/appearance/hidePreferencesButton", @@ -173,9 +173,8 @@ public: "qrc:/sounds/ping3.wav"}; BoolSetting notificationToast = {"/notifications/enableToast", false}; - IntSetting openFromToast = { - "/notifications/openFromToast", - static_cast(ToastReaction::OpenInBrowser)}; + IntSetting openFromToast = {"/notifications/openFromToast", + static_cast(ToastReaction::OpenInBrowser)}; /// External tools // Streamlink diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index ee012c21a..8e4484796 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -254,9 +254,17 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addTitle("Miscellaneous"); layout.addCheckbox("Show joined users (< 1000 chatters)", s.showJoins); layout.addCheckbox("Show parted users (< 1000 chatters)", s.showParts); - layout.addDropdown("Boldness", {"Not implemented"}); layout.addCheckbox("Lowercase domains", s.lowercaseDomains); layout.addCheckbox("Bold @usernames", s.boldUsernames); + layout.addDropdown( + "Username font weight", {"0", "25", "Default", "75", "100"}, s.boldScale, + [](auto val) { + if (val == 50) + return QString("Default"); + else + return QString::number(val); + }, + [](auto args) { return fuzzyToFloat(args.value, 50.f); }); layout.addCheckbox("Show link info when hovering", s.linkInfoTooltip); layout.addCheckbox("Double click links to open", s.linksDoubleClickOnly); layout.addCheckbox("Unshorten links", s.unshortLinks); From 834b1f3c53a0126330cc59a39358176a446a03e8 Mon Sep 17 00:00:00 2001 From: apa420 <17131426+apa420@users.noreply.github.com> Date: Fri, 10 May 2019 23:16:34 +0200 Subject: [PATCH 076/138] Option to hide system moderation messages (#1066) --- src/messages/layouts/MessageLayout.cpp | 7 +++++++ src/singletons/Settings.hpp | 1 + src/widgets/settingspages/GeneralPage.cpp | 1 + 3 files changed, 9 insertions(+) diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index 5bafe8c19..831b04135 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -121,6 +121,13 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags flags) { continue; } + + if (getSettings()->hideModerationActions && + this->message_->flags.has(MessageFlag::Timeout)) + { + continue; + } + element->addToContainer(*this->container_, flags); } diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index eef7a96f2..79cecb032 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -39,6 +39,7 @@ public: false}; BoolSetting compactEmotes = {"/appearance/messages/compactEmotes", true}; BoolSetting hideModerated = {"/appearance/messages/hideModerated", false}; + BoolSetting hideModerationActions = {"/appearance/messages/hideModerationActions", false}; // BoolSetting collapseLongMessages = // {"/appearance/messages/collapseLongMessages", false}; diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 8e4484796..76e0deaec 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -214,6 +214,7 @@ void GeneralPage::initLayout(SettingsLayout &layout) // layout.addCheckbox("Mark last message you read"); // layout.addDropdown("Last read message style", {"Default"}); layout.addCheckbox("Hide moderated messages", s.hideModerated); + layout.addCheckbox("Hide moderation messages", s.hideModerationActions); layout.addTitle("Emotes"); layout.addDropdown( From fa6c9f2fba9d8d75d1c3ee915b0051eb8598baa7 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Fri, 10 May 2019 23:28:05 +0200 Subject: [PATCH 077/138] make paths cachedirectory formatting nicer --- src/singletons/Paths.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/singletons/Paths.cpp b/src/singletons/Paths.cpp index 7c5e4266d..0ba547135 100644 --- a/src/singletons/Paths.cpp +++ b/src/singletons/Paths.cpp @@ -37,7 +37,7 @@ bool Paths::isPortable() QString Paths::cacheDirectory() { - static const auto path = [] { + static const auto pathSetting = [] { QStringSetting cachePathSetting("/cache/path"); cachePathSetting.connect([](const auto &newPath, auto) { @@ -45,7 +45,9 @@ QString Paths::cacheDirectory() }); return cachePathSetting; - }().getValue(); + }(); + + auto path = pathSetting.getValue(); if (path.isEmpty()) { From 1a7a5409ab11e2810fa0441a6a137290bbc5cd96 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Fri, 10 May 2019 23:31:10 +0200 Subject: [PATCH 078/138] do a full reformat according to our current .clang-format --- .../notifications/NotificationController.cpp | 8 +++--- src/messages/MessageBuilder.cpp | 11 ++++---- src/messages/layouts/MessageLayout.cpp | 2 +- src/providers/LinkResolver.cpp | 3 ++- src/providers/twitch/TwitchMessageBuilder.cpp | 7 ++--- src/singletons/Theme.cpp | 17 +++++------- src/singletons/Toasts.cpp | 6 +++-- src/singletons/helper/LoggingChannel.cpp | 5 ++-- src/widgets/Notebook.cpp | 2 +- src/widgets/dialogs/UserInfoPopup.cpp | 8 +++--- src/widgets/helper/SearchPopup.cpp | 3 ++- src/widgets/settingspages/GeneralPage.cpp | 3 ++- .../settingspages/KeyboardSettingsPage.cpp | 3 ++- src/widgets/settingspages/ModerationPage.cpp | 27 +++++++++---------- 14 files changed, 54 insertions(+), 51 deletions(-) diff --git a/src/controllers/notifications/NotificationController.cpp b/src/controllers/notifications/NotificationController.cpp index 435fb8fa1..081084fba 100644 --- a/src/controllers/notifications/NotificationController.cpp +++ b/src/controllers/notifications/NotificationController.cpp @@ -103,9 +103,11 @@ void NotificationController::playSound() static auto player = new QMediaPlayer; static QUrl currentPlayerUrl; - QUrl highlightSoundUrl = getSettings()->notificationCustomSound - ? QUrl::fromLocalFile(getSettings()->notificationPathSound.getValue()) - : QUrl("qrc:/sounds/ping2.wav"); + QUrl highlightSoundUrl = + getSettings()->notificationCustomSound + ? QUrl::fromLocalFile( + getSettings()->notificationPathSound.getValue()) + : QUrl("qrc:/sounds/ping2.wav"); if (currentPlayerUrl != highlightSoundUrl) { diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index 3fe89ccf6..d8ca5c444 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -235,12 +235,11 @@ MessageBuilder::MessageBuilder(const UnbanAction &action) this->message().timeoutUser = action.target.name; - QString text = QString("%1 %2 %3.") - .arg(action.source.name) - .arg(QString(action.wasBan() - ? "unbanned" - : "untimedout")) - .arg(action.target.name); + QString text = + QString("%1 %2 %3.") + .arg(action.source.name) + .arg(QString(action.wasBan() ? "unbanned" : "untimedout")) + .arg(action.target.name); this->emplace(text, MessageElementFlag::Text, MessageColor::System); diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index 831b04135..f1725f080 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -123,7 +123,7 @@ void MessageLayout::actuallyLayout(int width, MessageElementFlags flags) } if (getSettings()->hideModerationActions && - this->message_->flags.has(MessageFlag::Timeout)) + this->message_->flags.has(MessageFlag::Timeout)) { continue; } diff --git a/src/providers/LinkResolver.cpp b/src/providers/LinkResolver.cpp index 33848e019..7446af98d 100644 --- a/src/providers/LinkResolver.cpp +++ b/src/providers/LinkResolver.cpp @@ -12,7 +12,8 @@ namespace chatterino { void LinkResolver::getLinkInfo( const QString url, std::function successCallback) { - if (!getSettings()->linkInfoTooltip) { + if (!getSettings()->linkInfoTooltip) + { successCallback("No link info loaded", Link(Link::Url, url)); return; } diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index c386d2c8d..a694ad36d 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -782,9 +782,10 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) } // update the media player url if necessary - QUrl highlightSoundUrl = getSettings()->customHighlightSound - ? QUrl::fromLocalFile(getSettings()->pathHighlightSound.getValue()) - : QUrl("qrc:/sounds/ping2.wav"); + QUrl highlightSoundUrl = + getSettings()->customHighlightSound + ? QUrl::fromLocalFile(getSettings()->pathHighlightSound.getValue()) + : QUrl("qrc:/sounds/ping2.wav"); if (currentPlayerUrl != highlightSoundUrl) { diff --git a/src/singletons/Theme.cpp b/src/singletons/Theme.cpp index 6fb31e352..b99b42a5d 100644 --- a/src/singletons/Theme.cpp +++ b/src/singletons/Theme.cpp @@ -40,8 +40,7 @@ void Theme::actuallyUpdate(double hue, double multiplier) this->splits.resizeHandleBackground = QColor(0, 148, 255, 0x50); // Highlighted Messages: theme support quick-fix - this->messages.backgrounds.highlighted = - QColor("#BD8489"); + this->messages.backgrounds.highlighted = QColor("#BD8489"); } else { @@ -52,9 +51,7 @@ void Theme::actuallyUpdate(double hue, double multiplier) this->splits.resizeHandleBackground = QColor(0, 148, 255, 0x20); // Highlighted Messages: theme support quick-fix - this->messages.backgrounds.highlighted = - QColor("#4B282C"); - + this->messages.backgrounds.highlighted = QColor("#4B282C"); } this->splits.header.background = getColor(0, sat, flat ? 1 : 0.9); @@ -72,7 +69,7 @@ void Theme::actuallyUpdate(double hue, double multiplier) ";" + "color:" + this->messages.textColors.regular.name() + ";" + // "selection-background-color:" + (isLight ? "#68B1FF" - : this->tabs.selected.backgrounds.regular.color().name()); + : this->tabs.selected.backgrounds.regular.color().name()); this->splits.input.focusedLine = this->tabs.highlighted.line.regular; @@ -83,13 +80,13 @@ void Theme::actuallyUpdate(double hue, double multiplier) this->splits.dropPreviewBorder = QColor(0, 148, 255, 0xff); // Highlighted Messages - // hidden setting from PR #744 - if set it will overwrite theme color (for now!) - //TODO: implement full theme support - if (getSettings()->highlightColor != "") { + // hidden setting from PR #744 - if set it will overwrite theme color + // TODO: implement full theme support + if (getSettings()->highlightColor != "") + { this->messages.backgrounds.highlighted = QColor(getSettings()->highlightColor); } - } void Theme::normalizeColor(QColor &color) diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index a9dccc614..6b5ba9636 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -115,8 +115,10 @@ public: void toastActivated() const { QString link; - switch (static_cast( - getSettings()->openFromToast.getValue())) + auto toastReaction = + static_cast(getSettings()->openFromToast.getValue()); + + switch (toastReaction) { case ToastReaction::OpenInBrowser: if (platform_ == Platform::Twitch) diff --git a/src/singletons/helper/LoggingChannel.cpp b/src/singletons/helper/LoggingChannel.cpp index c4f7f59c6..82230edcc 100644 --- a/src/singletons/helper/LoggingChannel.cpp +++ b/src/singletons/helper/LoggingChannel.cpp @@ -34,9 +34,8 @@ LoggingChannel::LoggingChannel(const QString &_channelName) this->subDirectory = "Twitch/" + this->subDirectory; getSettings()->logPath.connect([this](const QString &logPath, auto) { - this->baseDirectory = logPath.isEmpty() - ? getPaths()->messageLogDirectory - : logPath; + this->baseDirectory = + logPath.isEmpty() ? getPaths()->messageLogDirectory : logPath; this->openLogFile(); }); } diff --git a/src/widgets/Notebook.cpp b/src/widgets/Notebook.cpp index 88a165afb..416834f70 100644 --- a/src/widgets/Notebook.cpp +++ b/src/widgets/Notebook.cpp @@ -6,11 +6,11 @@ #include "singletons/Theme.hpp" #include "singletons/WindowManager.hpp" #include "util/InitUpdateButton.hpp" +#include "util/Shortcut.hpp" #include "widgets/Window.hpp" #include "widgets/dialogs/SettingsDialog.hpp" #include "widgets/helper/NotebookButton.hpp" #include "widgets/helper/NotebookTab.hpp" -#include "util/Shortcut.hpp" #include "widgets/splits/Split.hpp" #include "widgets/splits/SplitContainer.hpp" diff --git a/src/widgets/dialogs/UserInfoPopup.cpp b/src/widgets/dialogs/UserInfoPopup.cpp index 10ad52fc8..939b85271 100644 --- a/src/widgets/dialogs/UserInfoPopup.cpp +++ b/src/widgets/dialogs/UserInfoPopup.cpp @@ -128,8 +128,8 @@ UserInfoPopup::UserInfoPopup() this->userName_, Qt::CaseInsensitive) == 0; visibilityMod = twitchChannel->isBroadcaster() && !isMyself; - visibilityUnmod = visibilityMod || - (twitchChannel->isMod() && isMyself); + visibilityUnmod = + visibilityMod || (twitchChannel->isMod() && isMyself); } mod->setVisible(visibilityMod); unmod->setVisible(visibilityUnmod); @@ -147,8 +147,8 @@ UserInfoPopup::UserInfoPopup() TwitchChannel *twitchChannel = dynamic_cast(this->channel_.get()); - bool hasModRights = twitchChannel ? twitchChannel->hasModRights() - : false; + bool hasModRights = + twitchChannel ? twitchChannel->hasModRights() : false; lineMod->setVisible(hasModRights); timeout->setVisible(hasModRights); }); diff --git a/src/widgets/helper/SearchPopup.cpp b/src/widgets/helper/SearchPopup.cpp index a1bfdafed..b70afc7b8 100644 --- a/src/widgets/helper/SearchPopup.cpp +++ b/src/widgets/helper/SearchPopup.cpp @@ -27,7 +27,8 @@ void SearchPopup::setChannel(ChannelPtr channel) void SearchPopup::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Escape) { + if (e->key() == Qt::Key_Escape) + { this->close(); return; } diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 76e0deaec..2767bda8d 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -258,7 +258,8 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addCheckbox("Lowercase domains", s.lowercaseDomains); layout.addCheckbox("Bold @usernames", s.boldUsernames); layout.addDropdown( - "Username font weight", {"0", "25", "Default", "75", "100"}, s.boldScale, + "Username font weight", {"0", "25", "Default", "75", "100"}, + s.boldScale, [](auto val) { if (val == 50) return QString("Default"); diff --git a/src/widgets/settingspages/KeyboardSettingsPage.cpp b/src/widgets/settingspages/KeyboardSettingsPage.cpp index f8512d23b..580848b34 100644 --- a/src/widgets/settingspages/KeyboardSettingsPage.cpp +++ b/src/widgets/settingspages/KeyboardSettingsPage.cpp @@ -43,7 +43,8 @@ KeyboardSettingsPage::KeyboardSettingsPage() new QLabel("Search in current channel")); form->addRow(new QLabel("Ctrl + E"), new QLabel("Open Emote menu")); form->addRow(new QLabel("Ctrl + P"), new QLabel("Open Settings menu")); - form->addRow(new QLabel("F5"), new QLabel("Reload subscriber and channel emotes")); + form->addRow(new QLabel("F5"), + new QLabel("Reload subscriber and channel emotes")); } } // namespace chatterino diff --git a/src/widgets/settingspages/ModerationPage.cpp b/src/widgets/settingspages/ModerationPage.cpp index 02580ebeb..38f0944c1 100644 --- a/src/widgets/settingspages/ModerationPage.cpp +++ b/src/widgets/settingspages/ModerationPage.cpp @@ -62,8 +62,8 @@ QString formatSize(qint64 size) QString fetchLogDirectorySize() { QString logPathDirectory = getSettings()->logPath.getValue().isEmpty() - ? getPaths()->messageLogDirectory - : getSettings()->logPath; + ? getPaths()->messageLogDirectory + : getSettings()->logPath; qint64 logsSize = dirSize(logPathDirectory); QString logsSizeLabel = "Your logs currently take up "; @@ -91,20 +91,19 @@ ModerationPage::ModerationPage() QtConcurrent::run([] { return fetchLogDirectorySize(); })); // Logs (copied from LoggingMananger) - getSettings()->logPath.connect( - [logsPathLabel](const QString &logPath, auto) mutable { - QString pathOriginal = logPath.isEmpty() - ? getPaths()->messageLogDirectory - : logPath; + getSettings()->logPath.connect([logsPathLabel](const QString &logPath, + auto) mutable { + QString pathOriginal = + logPath.isEmpty() ? getPaths()->messageLogDirectory : logPath; - QString pathShortened = - "Logs are saved at " + - shortenString(pathOriginal, 50) + ""; + QString pathShortened = + "Logs are saved at " + + shortenString(pathOriginal, 50) + ""; - logsPathLabel->setText(pathShortened); - logsPathLabel->setToolTip(pathOriginal); - }); + logsPathLabel->setText(pathShortened); + logsPathLabel->setToolTip(pathOriginal); + }); logsPathLabel->setTextFormat(Qt::RichText); logsPathLabel->setTextInteractionFlags(Qt::TextBrowserInteraction | From 3bbee62f329c239ec1a671d3614a12a509e4db94 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Fri, 10 May 2019 23:33:30 +0200 Subject: [PATCH 079/138] add missing .desktop file this is used for linux desktops --- resources/chatterino.desktop | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 resources/chatterino.desktop diff --git a/resources/chatterino.desktop b/resources/chatterino.desktop new file mode 100644 index 000000000..d078acc45 --- /dev/null +++ b/resources/chatterino.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=2.0.4 +Name=Chatterino +Comment=Chat client for Twitch +Exec=chatterino +Icon=chatterino.png +Terminal=false +Type=Application +Categories=Network;InstantMessaging; From 8c46cbf571dc8fd77287bf3186445ff52b1d1aaf Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 May 2019 00:01:32 +0200 Subject: [PATCH 080/138] add chatterino icon to linux install script --- chatterino.pro | 10 ++++++---- resources/.gitignore | 1 + resources/generate_resources.py | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 resources/.gitignore diff --git a/chatterino.pro b/chatterino.pro index 2cb069551..42df60d06 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -409,11 +409,13 @@ linux { desktop.files = resources/chatterino.desktop desktop.path = $$PREFIX/share/applications - # TODO: fix icon - # icon.files = resources/icon.png - # icon.path = $$PREFIX/share/icons/hicolor/256x256/chatterino.png + build_icons.path = . + build_icons.commands = @echo $$PWD && mkdir -p $$PWD/resources/linuxinstall/icons/hicolor/256x256 && cp $$PWD/resources/icon.png $$PWD/resources/linuxinstall/icons/hicolor/256x256/chatterino.png + + icon.files = $$PWD/resources/linuxinstall/icons/hicolor/256x256/chatterino.png + icon.path = $$PREFIX/share/icons/hicolor/256x256/apps target.path = $$PREFIX/bin - INSTALLS += desktop target + INSTALLS += desktop build_icons icon target } diff --git a/resources/.gitignore b/resources/.gitignore new file mode 100644 index 000000000..1d38bf357 --- /dev/null +++ b/resources/.gitignore @@ -0,0 +1 @@ +linuxinstall diff --git a/resources/generate_resources.py b/resources/generate_resources.py index 5239e64e8..e48795f72 100755 --- a/resources/generate_resources.py +++ b/resources/generate_resources.py @@ -8,7 +8,7 @@ ignored_files = ['qt.conf', 'resources.qrc', 'resources_autogenerated.qrc', 'win # to ignore all files in a/b, add a/b to ignored_directories. # this will ignore a/b/c/d.txt and a/b/xd.txt -ignored_directories = ['__pycache__'] +ignored_directories = ['__pycache__', 'linuxinstall'] def isNotIgnored(file): # check if file exists in an ignored direcory From 2492a0ba21b5191907e9bea9bd91e69a956f2b41 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 May 2019 13:59:03 +0200 Subject: [PATCH 081/138] reformat usernamset --- src/common/UsernameSet.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/common/UsernameSet.hpp b/src/common/UsernameSet.hpp index d71bcdaf6..0d37f8851 100644 --- a/src/common/UsernameSet.hpp +++ b/src/common/UsernameSet.hpp @@ -6,6 +6,7 @@ #include namespace chatterino { + class Prefix { public: @@ -19,9 +20,11 @@ private: friend struct std::hash; }; + } // namespace chatterino namespace std { + template <> struct hash { size_t operator()(const chatterino::Prefix &prefix) const @@ -30,9 +33,11 @@ struct hash { size_t(prefix.second.unicode()); } }; + } // namespace std namespace chatterino { + class UsernameSet { public: From ee9b0f4c12879128b0ace22b463f996a9304f7cf Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 May 2019 14:00:16 +0200 Subject: [PATCH 082/138] Fix tab completion Fixes #813 This has the "quirk" of not updating names that are already there, which means that display names might not always be used, instead the users lowercase name might just be there and stick --- src/common/UsernameSet.cpp | 2 +- src/common/UsernameSet.hpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/common/UsernameSet.cpp b/src/common/UsernameSet.cpp index 8e0a53af7..d39b8a3e4 100644 --- a/src/common/UsernameSet.cpp +++ b/src/common/UsernameSet.cpp @@ -59,7 +59,7 @@ void UsernameSet::insertPrefix(const QString &value) { auto &string = this->firstKeyForPrefix[Prefix(value)]; - if (string.isNull() || value < string) + if (string.isNull() || value.compare(string, Qt::CaseInsensitive) < 0) string = value; } diff --git a/src/common/UsernameSet.hpp b/src/common/UsernameSet.hpp index 0d37f8851..f33d7d7e6 100644 --- a/src/common/UsernameSet.hpp +++ b/src/common/UsernameSet.hpp @@ -38,6 +38,13 @@ struct hash { namespace chatterino { +struct CaseInsensitiveLess { + bool operator()(const QString &lhs, const QString &rhs) const + { + return lhs.compare(rhs, Qt::CaseInsensitive) < 0; + } +}; + class UsernameSet { public: @@ -71,7 +78,7 @@ public: private: void insertPrefix(const QString &string); - std::set items; + std::set items; std::unordered_map firstKeyForPrefix; }; From 8bf9fc92c32953885cce861b4ae494d724c9f775 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 May 2019 14:00:57 +0200 Subject: [PATCH 083/138] Add a != operator to match the Prefix's == operator --- src/common/UsernameSet.cpp | 5 +++++ src/common/UsernameSet.hpp | 1 + 2 files changed, 6 insertions(+) diff --git a/src/common/UsernameSet.cpp b/src/common/UsernameSet.cpp index d39b8a3e4..964b6c0a7 100644 --- a/src/common/UsernameSet.cpp +++ b/src/common/UsernameSet.cpp @@ -99,6 +99,11 @@ bool Prefix::operator==(const Prefix &other) const std::tie(other.first, other.second); } +bool Prefix::operator!=(const Prefix &other) const +{ + return !(*this == other); +} + bool Prefix::isStartOf(const QString &string) const { if (string.size() == 0) diff --git a/src/common/UsernameSet.hpp b/src/common/UsernameSet.hpp index f33d7d7e6..f07911513 100644 --- a/src/common/UsernameSet.hpp +++ b/src/common/UsernameSet.hpp @@ -12,6 +12,7 @@ class Prefix public: Prefix(const QString &string); bool operator==(const Prefix &other) const; + bool operator!=(const Prefix &other) const; bool isStartOf(const QString &string) const; private: From cbd93f95374d2377b21f2386fb47c8f6c517f45b Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 May 2019 14:13:03 +0200 Subject: [PATCH 084/138] Add tests for the UsernameSet and Prefix classes How to build test: mkdir build_test cd build_test cmake -DBUILD_TESTS=ON .. make -j Then to run the tests, use either: make test ctest ./chatterino-test --- CMakeLists.txt | 37 ++++++++++ tests/src/UsernameSet.cpp | 138 ++++++++++++++++++++++++++++++++++++++ tests/src/main.cpp | 3 + 3 files changed, 178 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 tests/src/UsernameSet.cpp create mode 100644 tests/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..4bcd983a4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.8) + +project(chatterino) + +include_directories(src) + +set(chatterino_SOURCES + src/common/UsernameSet.cpp + ) + +find_package(Qt5Widgets CONFIG REQUIRED) +find_package(Qt5 5.9.0 REQUIRED COMPONENTS + Core + ) + +# set(CMAKE_AUTOMOC ON) + +if (BUILD_TESTS) + message("++ Tests enabled") + find_package(GTest) + enable_testing() + + add_executable(chatterino-test + ${chatterino_SOURCES} + + tests/src/main.cpp + tests/src/UsernameSet.cpp + ) + + target_link_libraries(chatterino-test Qt5::Core) + + target_link_libraries(chatterino-test gtest gtest_main) + + gtest_discover_tests(chatterino-test) +else() + message(FATAL_ERROR "This cmake file is only intended for tests right now. Use qmake to build chatterino2") +endif() diff --git a/tests/src/UsernameSet.cpp b/tests/src/UsernameSet.cpp new file mode 100644 index 000000000..7098941bf --- /dev/null +++ b/tests/src/UsernameSet.cpp @@ -0,0 +1,138 @@ +#include "common/UsernameSet.hpp" + +#include +#include + +chatterino::Prefix prefix_pajlada(QString("pajlada")); +chatterino::Prefix prefix_Pajlada(QString("Pajlada")); +chatterino::Prefix prefix_randers(QString("randers")); +chatterino::Prefix prefix_Chancu(QString("ch")); + +TEST(Prefix, isStartOf) +{ + EXPECT_TRUE(prefix_pajlada.isStartOf("pajlada")); + EXPECT_TRUE(prefix_pajlada.isStartOf("Pajlada")); + EXPECT_FALSE(prefix_pajlada.isStartOf("randers")); + + EXPECT_TRUE(prefix_Pajlada.isStartOf("pajlada")); + EXPECT_TRUE(prefix_Pajlada.isStartOf("Pajlada")); + EXPECT_TRUE(prefix_Pajlada.isStartOf("pajbot")); + EXPECT_TRUE(prefix_Pajlada.isStartOf("Pajbot")); + EXPECT_FALSE(prefix_Pajlada.isStartOf("randers")); +} + +TEST(Prefix, EqualsOperator) +{ + EXPECT_EQ(prefix_pajlada, prefix_Pajlada); + EXPECT_NE(prefix_pajlada, prefix_randers); +} + +TEST(UsernameSet, insert) +{ + std::pair p; + chatterino::UsernameSet set; + + EXPECT_EQ(set.size(), 0); + + p = set.insert("pajlada"); + EXPECT_TRUE(p.second); + + EXPECT_EQ(set.size(), 1); + + p = set.insert("pajlada"); + EXPECT_FALSE(p.second); + + EXPECT_EQ(set.size(), 1); + + p = set.insert("pajbot"); + EXPECT_TRUE(p.second); + + EXPECT_EQ(set.size(), 2); + + p = set.insert("pajlada"); + EXPECT_FALSE(p.second); + + EXPECT_EQ(set.size(), 2); + + p = set.insert("PAJLADA"); + EXPECT_FALSE(p.second); + + EXPECT_EQ(set.size(), 2); +} + +TEST(UsernameSet, CollisionTest) +{ + QString s; + chatterino::UsernameSet set; + chatterino::Prefix prefix("not_"); + + set.insert("pajlada"); + set.insert("Chancu"); + set.insert("chief_tony"); + set.insert("ChodzacyKac"); + set.insert("ChatAbuser"); + set.insert("Normies_GTFO"); + set.insert("not_remzy"); + set.insert("Mullo2500"); + set.insert("muggedbyapie"); + + EXPECT_EQ(set.size(), 9); + + { + QStringList result; + QStringList expectation{"Normies_GTFO", "not_remzy"}; + auto subrange = set.subrange(QString("not_")); + std::copy(subrange.begin(), subrange.end(), std::back_inserter(result)); + EXPECT_EQ(expectation, result); + } + + { + QStringList result; + QStringList expectation{}; + auto subrange = set.subrange(QString("te")); + std::copy(subrange.begin(), subrange.end(), std::back_inserter(result)); + EXPECT_EQ(expectation, result); + } + + { + QStringList result; + QStringList expectation{"pajlada"}; + auto subrange = set.subrange(QString("PA")); + std::copy(subrange.begin(), subrange.end(), std::back_inserter(result)); + EXPECT_EQ(expectation, result); + } + + { + QStringList result; + QStringList expectation{"pajlada"}; + auto subrange = set.subrange(QString("pajlada")); + std::copy(subrange.begin(), subrange.end(), std::back_inserter(result)); + EXPECT_EQ(expectation, result); + } + + { + QStringList result; + QStringList expectation{"pajlada"}; + auto subrange = set.subrange(QString("Pajl")); + std::copy(subrange.begin(), subrange.end(), std::back_inserter(result)); + EXPECT_EQ(expectation, result); + } + + { + QStringList result; + QStringList expectation{"Chancu", "ChatAbuser", "chief_tony", + "ChodzacyKac"}; + auto subrange = set.subrange(QString("chan")); + std::copy(subrange.begin(), subrange.end(), std::back_inserter(result)); + EXPECT_EQ(expectation, result); + } + + { + QStringList result; + QStringList expectation{"muggedbyapie", "Mullo2500"}; + auto subrange = set.subrange(QString("mu")); + std::copy(subrange.begin(), subrange.end(), std::back_inserter(result)); + EXPECT_EQ(expectation, result); + } +} + diff --git a/tests/src/main.cpp b/tests/src/main.cpp new file mode 100644 index 000000000..db640b12d --- /dev/null +++ b/tests/src/main.cpp @@ -0,0 +1,3 @@ +#include + +// do nothing From 9877d9ee3e29cbafb570afbc85ea76c155d1f323 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 18 May 2019 15:42:23 +0200 Subject: [PATCH 085/138] update linux desktop file --- resources/chatterino.desktop | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/chatterino.desktop b/resources/chatterino.desktop index d078acc45..23cc8c356 100644 --- a/resources/chatterino.desktop +++ b/resources/chatterino.desktop @@ -1,9 +1,9 @@ [Desktop Entry] -Version=2.0.4 +Type=Application +Version=1.0 Name=Chatterino Comment=Chat client for Twitch Exec=chatterino -Icon=chatterino.png +Icon=chatterino Terminal=false -Type=Application Categories=Network;InstantMessaging; From 109a157a8c70d49197db12bcc306e768f4bb07b2 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 18 May 2019 15:46:22 +0200 Subject: [PATCH 086/138] add small pull request template --- .github/PULL_REQUEST_TEMPLATE/pull_request_template.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 000000000..9880f2ce1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,3 @@ +# Description + + From 9a7365821d0fce395607586022cd4eed9494de37 Mon Sep 17 00:00:00 2001 From: apa420 <17131426+apa420@users.noreply.github.com> Date: Sat, 18 May 2019 15:37:26 +0000 Subject: [PATCH 087/138] Fixed issue #1071 (#1073) --- src/messages/MessageBuilder.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index d8ca5c444..96a2d25c6 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -65,6 +65,8 @@ std::pair makeAutomodMessage( builder = MessageBuilder(); builder.emplace(); + builder.emplace(); + builder.message().loginName = action.target.name; builder.message().flags.set(MessageFlag::PubSub); builder From 643e5342c94a5f6edbdb87b359cca57603b04bb3 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 18 May 2019 21:33:16 +0200 Subject: [PATCH 088/138] Testing that Appveyor still works --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0dcaebf4c..75ab801d0 100644 --- a/README.md +++ b/README.md @@ -43,3 +43,4 @@ The code is formated using clang format in Qt Creator. [.clang-format](https://g 7. Under `Clang Format` select `Use predefined style: File` and `Fallback style: None` Qt creator should now format the documents when saving it. + From 42cb0e4ec34a7a3c8e074de8f3c95203db7bb921 Mon Sep 17 00:00:00 2001 From: fourtf Date: Sun, 19 May 2019 01:02:32 +0200 Subject: [PATCH 089/138] Removed left padding from general settings page --- src/widgets/settingspages/GeneralPage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 2767bda8d..efea58d04 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -127,7 +127,6 @@ GeneralPage::GeneralPage() y->addWidget(scroll); auto x = new QHBoxLayout; auto layout = new SettingsLayout; - x->addStretch(1); x->addLayout(layout, 0); x->addStretch(1); auto z = new QFrame; From 8de8705f2625e9011a638ac78695323ef53232a3 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 18 May 2019 21:45:16 +0200 Subject: [PATCH 090/138] update travis to use macdeployqt --- .travis.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index bf6c4bdcb..be875ca5c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,22 +15,21 @@ compiler: clang script: - mkdir build && cd build - /usr/local/opt/qt/bin/qmake .. && make -j8 - - 7z a chatterino2.zip chatterino.app + - /usr/local/opt/qt/bin/macdeployqt chatterino.app -dmg + - mv chatterino.dmg chatterino-osx.dmg before_deploy: - git config --global user.email "builds@travis-ci.com" - git config --global user.name "Travis CI" - - export GIT_TAG=nightly-mac-0.$TRAVIS_BUILD_NUMBER - - git tag $GIT_TAG -a -m "Nightly last change - $TRAVIS_COMMIT_MESSAGE" - - git push -q https://$GITHUB_KEY@github.com/fourtf/chatterino2 --tags - - ls -R + - export GIT_TAG=nightly-build + - git tag $GIT_TAG -f deploy: skip_cleanup: true provider: releases - api_key: $GITHUB_KEY - file: "chatterino2.zip" + api_key: + secure: ZzS55wlwtLAVEBaDDMqiuqZwuTpvLbNnaNw0enfiqpjWT7hgbbp/SBw2rbYIkVqm7tBHCLnEzKto6p4Gz6ROo0gGACARmx7EwIloX18rMCuBWygNHRyVruDSlmEOLWRqYByDbUdCkKhYr9aegnkm7zhzCmSBCTW28/uVlxM2bTHIgqKEpB4k1W8OqKdJDxqZKeF4r7nDNSOx5ylhpiK+WNFK8yfiaF1SQlSwsdv9o1RkbJlew7iigvHvEM2kDMkiMWYlJ2khkUWVCVQDQGe4/ya5pgTIHDLu5sZuclp5zhgfDf1U3STvsbQWvxJfsmCId7IQHJ83OSFeoUf6y849i3GMqlNi3aXrxEx0fi0dILQ76/Sj246FPMA4kC0/W49uaxqD784wFuJDjSWeWwi/NPoJ/gz0mGZy+08BoztOGqqOKjJJdESBYTio71N8VcK09zQ0LjXRmX+g3BbrK6a2F3hiMKeuYwdaN2/KdMMoqFDau6L3fXLdpcHKdJC8K/yzJtyyIe0CRB2nj8sZLHfxDwoRm7gOTDXq1zPL7CP9cCwCnCR6nm3CqUW/CnSWuMKpSoQRlP5EBI7zzYT2/tZc/vat5nob7Xif6yFF9fh/VHx4tC6zsfkA1nPPN3+QpdVInRo7dCVxtTqey5FdVjSiv7n11TrFhZ7+Fr5x6CZqa58= + file: "chatterino-osx.dmg" prerelease: true on: - tags: false - branch: nightly \ No newline at end of file + branch: osx-ci-test From 1e2bd6624b56a9e6a6b8a811644ed35aba2ddf82 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sun, 19 May 2019 12:19:49 +0200 Subject: [PATCH 091/138] update OSX CI to run on nightly branch --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index be875ca5c..1ad6dc6e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,4 +32,4 @@ deploy: file: "chatterino-osx.dmg" prerelease: true on: - branch: osx-ci-test + branch: nightly From 2ac4ee5794f0b5ee5a1787ddac0d85bd976cb469 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sun, 19 May 2019 15:01:28 +0200 Subject: [PATCH 092/138] update binary name, tag, and repo of appveyor build --- appveyor.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 57152b197..ee9095839 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -46,20 +46,20 @@ build_script: cp release/chatterino.exe Chatterino2/ - 7z a chatterino2.zip Chatterino2/ + 7z a chatterino-windows-x86-64.zip Chatterino2/ artifacts: - path: build/chatterino2.zip name: chatterino2 deploy: - provider: GitHub - tag: nightly-win - release: nightly-win + tag: nightly-build + release: nightly-build description: 'nightly v$(appveyor_build_version) built $(APPVEYOR_REPO_COMMIT_TIMESTAMP)\nLast change: $(APPVEYOR_REPO_COMMIT_MESSAGE) \n$(APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED)' auth_token: secure: sAJzAbiQSsYZLT+byDar9u61X0E9o35anaPMSFkOzdHeDFHjx1kW4cDP/4EEbxhx - repository: fourtf/chatterino2 - artifact: build/chatterino2.zip + repository: Chatterino/chatterino2 + artifact: build/chatterino-windows-x86-64.zip prerelease: true force_update: true on: - branch: nightly \ No newline at end of file + branch: nightly From c291da68eed61b5fa7809a61d59e21ba5ee27b0a Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sun, 19 May 2019 15:04:41 +0200 Subject: [PATCH 093/138] oops forgot to update the path in one place --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index ee9095839..a589baed7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -48,8 +48,8 @@ build_script: 7z a chatterino-windows-x86-64.zip Chatterino2/ artifacts: -- path: build/chatterino2.zip - name: chatterino2 +- path: build/chatterino-windows-x86-64.zip + name: chatterino deploy: - provider: GitHub tag: nightly-build From 0263248668452d9d68df6bf78b2f41b36bf7c9b2 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Tue, 21 May 2019 22:53:40 +0200 Subject: [PATCH 094/138] Add attribution for Twitch emote data provided by twitchemotes.com --- src/widgets/settingspages/AboutPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/widgets/settingspages/AboutPage.cpp b/src/widgets/settingspages/AboutPage.cpp index 63a1972eb..a8576b240 100644 --- a/src/widgets/settingspages/AboutPage.cpp +++ b/src/widgets/settingspages/AboutPage.cpp @@ -113,6 +113,7 @@ AboutPage::AboutPage() l.emplace("Messenger emojis provided by Facebook")->setOpenExternalLinks(true); l.emplace("Emoji datasource provided by Cal Henderson" "(show license)")->setOpenExternalLinks(true); + l.emplace("Twitch emote data provided by twitchemotes.com through the Chatterino API")->setOpenExternalLinks(true); // clang-format on } From 9dbe66a19b67a7509d2fa19dcb911c3fb3f1103b Mon Sep 17 00:00:00 2001 From: Ruben Anders Date: Mon, 20 May 2019 20:06:32 +0200 Subject: [PATCH 095/138] Change emote parsing order to FFZ -> BTTV -> GlobalFFZ -> GlobalBTTV Fixes #877 --- src/providers/twitch/TwitchMessageBuilder.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index a694ad36d..b8cb7c860 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -987,9 +987,9 @@ Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name) auto flags = MessageElementFlags(); auto emote = boost::optional{}; - if ((emote = this->twitchChannel->globalBttv().emote(name))) + if ((emote = this->twitchChannel->ffzEmote().emote(name))) { - flags = MessageElementFlag::BttvEmote; + flags = MessageElementFlag::FfzEmote; } else if ((emote = this->twitchChannel->bttvEmote(name))) { @@ -999,9 +999,9 @@ Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name) { flags = MessageElementFlag::FfzEmote; } - else if ((emote = this->twitchChannel->ffzEmote(name))) + else if ((emote = this->twitchChannel->globalBttv(name))) { - flags = MessageElementFlag::FfzEmote; + flags = MessageElementFlag::BttvEmote; } if (emote) From 79e4e05a4a098efdb953578a73be299d2f83e804 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 25 May 2019 11:23:58 +0200 Subject: [PATCH 096/138] Fix compilation issue --- src/providers/twitch/TwitchMessageBuilder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index b8cb7c860..31ca6adf5 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -987,7 +987,7 @@ Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name) auto flags = MessageElementFlags(); auto emote = boost::optional{}; - if ((emote = this->twitchChannel->ffzEmote().emote(name))) + if ((emote = this->twitchChannel->ffzEmote(name))) { flags = MessageElementFlag::FfzEmote; } @@ -999,7 +999,7 @@ Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name) { flags = MessageElementFlag::FfzEmote; } - else if ((emote = this->twitchChannel->globalBttv(name))) + else if ((emote = this->twitchChannel->globalBttv().emote(name))) { flags = MessageElementFlag::BttvEmote; } From e1483bfd8a72ea840a1c374ec5d2fe76db3309aa Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 25 May 2019 11:24:10 +0200 Subject: [PATCH 097/138] Make Twitch message history loading optional (On by default) --- src/providers/twitch/TwitchChannel.cpp | 5 +++++ src/singletons/Settings.hpp | 5 ++++- src/widgets/settingspages/GeneralPage.cpp | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index c3a795fff..4eb494ae6 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -602,6 +602,11 @@ Outcome TwitchChannel::parseLiveStatus(const rapidjson::Document &document) void TwitchChannel::loadRecentMessages() { + if (!getSettings()->loadTwitchMessageHistoryOnConnect) + { + return; + } + static QString genericURL = [] { QString url("https://recent-messages.robotty.de/api/v2/recent-messages/" "%1?clearchatToNotice=true"); diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 79cecb032..0d103cc36 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -39,7 +39,8 @@ public: false}; BoolSetting compactEmotes = {"/appearance/messages/compactEmotes", true}; BoolSetting hideModerated = {"/appearance/messages/hideModerated", false}; - BoolSetting hideModerationActions = {"/appearance/messages/hideModerationActions", false}; + BoolSetting hideModerationActions = { + "/appearance/messages/hideModerationActions", false}; // BoolSetting collapseLongMessages = // {"/appearance/messages/collapseLongMessages", false}; @@ -189,6 +190,8 @@ public: /// Misc IntSetting startUpNotification = {"/misc/startUpNotification", 0}; QStringSetting currentVersion = {"/misc/currentVersion", ""}; + BoolSetting loadTwitchMessageHistoryOnConnect = { + "/misc/twitch/loadMessageHistoryOnConnect", true}; QStringSetting cachePath = {"/cache/path", ""}; diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index efea58d04..2df805554 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -274,8 +274,10 @@ void GeneralPage::initLayout(SettingsLayout &layout) layout.addSpacing(16); layout.addSeperator(); - layout.addTitle2("Misc"); + layout.addTitle2("Miscellaneous (Twitch)"); layout.addCheckbox("Show twitch whispers inline", s.inlineWhispers); + layout.addCheckbox("Load message history on connect", + s.loadTwitchMessageHistoryOnConnect); /* layout.addTitle2("Cache"); From acf69139b9b1a42214cf0ef3c3a16e4560f9ec0e Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sun, 26 May 2019 21:25:50 +0200 Subject: [PATCH 098/138] Document current environment variables that can be used the change the Chatterino experience --- docs/ENV.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 docs/ENV.md diff --git a/docs/ENV.md b/docs/ENV.md new file mode 100644 index 000000000..8b84946c3 --- /dev/null +++ b/docs/ENV.md @@ -0,0 +1,8 @@ +# Environment variables +Below I have tried to list all environment variables that can be used to modify the behaviour of Chatterino. Used for things that I don't feel like fit in the settings system. + +## CHATTERINO2_RECENT_MESSAGES_URL +Used to change the URL that Chatterino2 uses when trying to load historic Twitch chat messages (if the setting is enabled). +Default value: `"https://recent-messages.robotty.de/api/v2/recent-messages/%1?clearchatToNotice=true"` +Arguments: +1) `%1` = Name of the Twitch channel From 8ba8bbeef6d08a105f70322b2cfb543450c93a32 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sun, 26 May 2019 21:44:13 +0200 Subject: [PATCH 099/138] Move environment variable parsing and storage to its own class Make the Link resolver and Twitch emotes set resolver urls modifiable with environment variables --- chatterino.pro | 1 + docs/ENV.md | 18 +++++++++++++++--- src/providers/LinkResolver.cpp | 6 +++--- src/providers/twitch/TwitchAccount.cpp | 5 ++--- src/providers/twitch/TwitchChannel.cpp | 16 +++------------- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/chatterino.pro b/chatterino.pro index 42df60d06..41c875862 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -55,6 +55,7 @@ SOURCES += \ src/common/Channel.cpp \ src/common/CompletionModel.cpp \ src/common/DownloadManager.cpp \ + src/common/Env.cpp \ src/common/LinkParser.cpp \ src/common/NetworkData.cpp \ src/common/NetworkManager.cpp \ diff --git a/docs/ENV.md b/docs/ENV.md index 8b84946c3..586aac354 100644 --- a/docs/ENV.md +++ b/docs/ENV.md @@ -1,8 +1,20 @@ # Environment variables Below I have tried to list all environment variables that can be used to modify the behaviour of Chatterino. Used for things that I don't feel like fit in the settings system. -## CHATTERINO2_RECENT_MESSAGES_URL +### CHATTERINO2_RECENT_MESSAGES_URL Used to change the URL that Chatterino2 uses when trying to load historic Twitch chat messages (if the setting is enabled). -Default value: `"https://recent-messages.robotty.de/api/v2/recent-messages/%1?clearchatToNotice=true"` +Default value: `https://recent-messages.robotty.de/api/v2/recent-messages/%1?clearchatToNotice=true` Arguments: -1) `%1` = Name of the Twitch channel + - `%1` = Name of the Twitch channel + +### CHATTERINO2_LINK_RESOLVER_URL +Used to change the URL that Chatterino2 uses when trying to get link information to display in the tooltip on hover. +Default value: `https://braize.pajlada.com/chatterino/link_resolver/%1` +Arguments: + - `%1` = Escaped URL the link resolver should resolve + +### CHATTERINO2_TWITCH_EMOTE_SET_RESOLVER_URL +Used to change the URL that Chatterino2 uses when trying to get emote set information +Default value: `https://braize.pajlada.com/chatterino/twitchemotes/set/%1/` +Arguments: + - `%1` = Emote set ID diff --git a/src/providers/LinkResolver.cpp b/src/providers/LinkResolver.cpp index 7446af98d..0137a130c 100644 --- a/src/providers/LinkResolver.cpp +++ b/src/providers/LinkResolver.cpp @@ -1,6 +1,7 @@ #include "providers/LinkResolver.hpp" #include "common/Common.hpp" +#include "common/Env.hpp" #include "common/NetworkRequest.hpp" #include "messages/Link.hpp" #include "singletons/Settings.hpp" @@ -17,11 +18,10 @@ void LinkResolver::getLinkInfo( successCallback("No link info loaded", Link(Link::Url, url)); return; } - QString requestUrl("https://braize.pajlada.com/chatterino/link_resolver/" + - QUrl::toPercentEncoding(url, "", "/:")); // Uncomment to test crashes // QTimer::singleShot(3000, [=]() { - NetworkRequest request(requestUrl); + NetworkRequest request(Env::get().linkResolverUrl.arg( + QString::fromUtf8(QUrl::toPercentEncoding(url, "", "/:")))); request.setCaller(QThread::currentThread()); request.setTimeout(30000); request.onSuccess([successCallback, url](auto result) mutable -> Outcome { diff --git a/src/providers/twitch/TwitchAccount.cpp b/src/providers/twitch/TwitchAccount.cpp index 1d798f8ce..c397a2248 100644 --- a/src/providers/twitch/TwitchAccount.cpp +++ b/src/providers/twitch/TwitchAccount.cpp @@ -3,6 +3,7 @@ #include #include "Application.hpp" +#include "common/Env.hpp" #include "common/NetworkRequest.hpp" #include "common/Outcome.hpp" #include "debug/Log.hpp" @@ -534,9 +535,7 @@ void TwitchAccount::loadEmoteSetData(std::shared_ptr emoteSet) return; } - NetworkRequest req( - "https://braize.pajlada.com/chatterino/twitchemotes/set/" + - emoteSet->key + "/"); + NetworkRequest req(Env::get().twitchEmoteSetResolverUrl.arg(emoteSet->key)); req.setUseQuickLoadCache(true); req.onError([](int errorCode) -> bool { diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 4eb494ae6..b8ce6509b 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -2,6 +2,7 @@ #include "Application.hpp" #include "common/Common.hpp" +#include "common/Env.hpp" #include "common/NetworkRequest.hpp" #include "controllers/accounts/AccountController.hpp" #include "controllers/notifications/NotificationController.hpp" @@ -607,19 +608,8 @@ void TwitchChannel::loadRecentMessages() return; } - static QString genericURL = [] { - QString url("https://recent-messages.robotty.de/api/v2/recent-messages/" - "%1?clearchatToNotice=true"); - auto envString = std::getenv("CHATTERINO2_RECENT_MESSAGES_URL"); - if (envString != nullptr) - { - url = envString; - } - - return url; - }(); - - NetworkRequest request(genericURL.arg(this->getName())); + NetworkRequest request( + Env::get().recentMessagesApiUrl.arg(this->getName())); request.setCaller(QThread::currentThread()); // can't be concurrent right now due to SignalVector // request.setExecuteConcurrently(true); From b872f83c9e9bbcd13fac1fd6e80d2ad6e7fdda7c Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sun, 26 May 2019 21:48:45 +0200 Subject: [PATCH 100/138] add missing files pepega --- src/common/Env.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/common/Env.hpp | 19 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/common/Env.cpp create mode 100644 src/common/Env.hpp diff --git a/src/common/Env.cpp b/src/common/Env.cpp new file mode 100644 index 000000000..ff711ec47 --- /dev/null +++ b/src/common/Env.cpp @@ -0,0 +1,40 @@ +#include "common/Env.hpp" + +namespace chatterino { + +namespace { + + QString readStringEnv(const char *envName, QString defaultValue) + { + auto envString = std::getenv(envName); + if (envString != nullptr) + { + return QString(envString); + } + + return defaultValue; + } + +} // namespace + +Env::Env() + : recentMessagesApiUrl( + readStringEnv("CHATTERINO2_RECENT_MESSAGES_URL", + "https://recent-messages.robotty.de/api/v2/" + "recent-messages/%1?clearchatToNotice=true")) + , linkResolverUrl(readStringEnv( + "CHATTERINO2_LINK_RESOLVER_URL", + "https://braize.pajlada.com/chatterino/link_resolver/%1")) + , twitchEmoteSetResolverUrl(readStringEnv( + "CHATTERINO2_TWITCH_EMOTE_SET_RESOLVER_URL", + "https://braize.pajlada.com/chatterino/twitchemotes/set/%1/")) +{ +} + +const Env &Env::get() +{ + static Env instance; + return instance; +} + +} // namespace chatterino diff --git a/src/common/Env.hpp b/src/common/Env.hpp new file mode 100644 index 000000000..2dc7fa1ba --- /dev/null +++ b/src/common/Env.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace chatterino { + +class Env +{ + Env(); + +public: + static const Env &get(); + + const QString recentMessagesApiUrl; + const QString linkResolverUrl; + const QString twitchEmoteSetResolverUrl; +}; + +} // namespace chatterino From 2e9b0cad443977f3677f71aa3aba005d6a7a058c Mon Sep 17 00:00:00 2001 From: ckath Date: Thu, 23 May 2019 22:30:59 +0200 Subject: [PATCH 101/138] make it possible to search localized names --- src/providers/twitch/TwitchMessageBuilder.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 31ca6adf5..543772242 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -440,7 +440,9 @@ MessagePtr TwitchMessageBuilder::build() this->addWords(splits, twitchEmotes); this->message().messageText = this->originalMessage_; - this->message().searchText = this->userName + ": " + this->originalMessage_; + this->message().searchText = this->userName + + this->message().localizedName + ": " + + this->originalMessage_; return this->release(); } From 83cf03fb09da9db81d543e3973f06bd6463266f8 Mon Sep 17 00:00:00 2001 From: ckath Date: Mon, 27 May 2019 20:17:59 +0200 Subject: [PATCH 102/138] format with extra : for user search --- src/providers/twitch/TwitchMessageBuilder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 543772242..c599d358a 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -440,7 +440,7 @@ MessagePtr TwitchMessageBuilder::build() this->addWords(splits, twitchEmotes); this->message().messageText = this->originalMessage_; - this->message().searchText = this->userName + + this->message().searchText = this->userName + ": " + this->message().localizedName + ": " + this->originalMessage_; From afe5e826a16d2dc31faf4b75191aa3d7c6c3e7f8 Mon Sep 17 00:00:00 2001 From: ckath Date: Thu, 30 May 2019 17:23:01 +0200 Subject: [PATCH 103/138] fix searchtext format again --- src/providers/twitch/TwitchMessageBuilder.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index c599d358a..98cca8476 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -440,9 +440,8 @@ MessagePtr TwitchMessageBuilder::build() this->addWords(splits, twitchEmotes); this->message().messageText = this->originalMessage_; - this->message().searchText = this->userName + ": " + - this->message().localizedName + ": " + - this->originalMessage_; + this->message().searchText = this->message().localizedName + " " + + this->userName + ": " + this->originalMessage_; return this->release(); } From 74d55941a0646fb6199cd8b1e3a947766301354e Mon Sep 17 00:00:00 2001 From: apa420 Date: Sun, 2 Jun 2019 19:42:49 +0000 Subject: [PATCH 104/138] added usercard button to link to twitch's userbutton --- src/widgets/dialogs/UserInfoPopup.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/widgets/dialogs/UserInfoPopup.cpp b/src/widgets/dialogs/UserInfoPopup.cpp index 939b85271..f326d9cc9 100644 --- a/src/widgets/dialogs/UserInfoPopup.cpp +++ b/src/widgets/dialogs/UserInfoPopup.cpp @@ -84,6 +84,8 @@ UserInfoPopup::UserInfoPopup() .assign(&this->ui_.ignoreHighlights); auto viewLogs = user.emplace(this); viewLogs->getLabel().setText("Online logs"); + auto usercard = user.emplace(this); + usercard->getLabel().setText("Usercard"); auto mod = user.emplace