From 96dac0fd3dad916f758c78108ef637eb69f95739 Mon Sep 17 00:00:00 2001 From: fourtf Date: Tue, 17 Sep 2019 12:10:38 +0200 Subject: [PATCH] moved chatters to ChannelChatters --- chatterino.pro | 2 + src/common/Channel.cpp | 11 ---- src/common/Channel.hpp | 1 - src/common/ChannelChatters.cpp | 72 +++++++++++++++++++++ src/common/ChannelChatters.hpp | 37 +++++++++++ src/providers/irc/AbstractIrcServer.cpp | 14 ----- src/providers/irc/IrcChannel2.cpp | 1 + src/providers/irc/IrcChannel2.hpp | 3 +- src/providers/twitch/IrcMessageHandler.cpp | 27 ++++++-- src/providers/twitch/TwitchChannel.cpp | 73 +--------------------- src/providers/twitch/TwitchChannel.hpp | 18 ++---- 11 files changed, 142 insertions(+), 117 deletions(-) create mode 100644 src/common/ChannelChatters.cpp create mode 100644 src/common/ChannelChatters.hpp diff --git a/chatterino.pro b/chatterino.pro index 0e422fd5..0e044069 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -77,6 +77,7 @@ SOURCES += \ src/autogenerated/ResourcesAutogen.cpp \ src/BrowserExtension.cpp \ src/common/Channel.cpp \ + src/common/ChannelChatters.cpp \ src/common/CompletionModel.cpp \ src/common/Credentials.cpp \ src/common/DownloadManager.cpp \ @@ -229,6 +230,7 @@ HEADERS += \ src/common/Aliases.hpp \ src/common/Atomic.hpp \ src/common/Channel.hpp \ + src/common/ChannelChatters.hpp \ src/common/Common.hpp \ src/common/CompletionModel.hpp \ src/common/ConcurrentMap.hpp \ diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index 4fe40375..b8247e88 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -70,13 +70,6 @@ void Channel::addMessage(MessagePtr message, auto app = getApp(); MessagePtr deleted; - const QString &username = message->loginName; - if (!username.isEmpty()) - { - // TODO: Add recent chatters display name - this->addRecentChatter(message); - } - // FOURTF: change this when adding more providers if (this->isTwitchChannel() && (!overridingFlags || !overridingFlags->has(MessageFlag::DoNotLog))) @@ -246,10 +239,6 @@ void Channel::deleteMessage(QString messageID) } } -void Channel::addRecentChatter(const MessagePtr &message) -{ -} - bool Channel::canSendMessage() const { return false; diff --git a/src/common/Channel.hpp b/src/common/Channel.hpp index 32ca3e6e..e8bfc29f 100644 --- a/src/common/Channel.hpp +++ b/src/common/Channel.hpp @@ -90,7 +90,6 @@ public: protected: virtual void onConnected(); - virtual void addRecentChatter(const MessagePtr &message); private: const QString name_; diff --git a/src/common/ChannelChatters.cpp b/src/common/ChannelChatters.cpp new file mode 100644 index 00000000..396c74aa --- /dev/null +++ b/src/common/ChannelChatters.cpp @@ -0,0 +1,72 @@ +#include "ChannelChatters.hpp" + +#include "messages/Message.hpp" +#include "messages/MessageBuilder.hpp" + +namespace chatterino { + +ChannelChatters::ChannelChatters(Channel &channel) + : channel_(channel) +{ +} + +AccessGuard ChannelChatters::accessChatters() const +{ + return this->chatters_.accessConst(); +} + +void ChannelChatters::addRecentChatter(const QString &user) +{ + this->chatters_.access()->insert(user); +} + +void ChannelChatters::addJoinedUser(const QString &user) +{ + auto joinedUsers = this->joinedUsers_.access(); + joinedUsers->append(user); + + if (!this->joinedUsersMergeQueued_) + { + this->joinedUsersMergeQueued_ = true; + + QTimer::singleShot(500, &this->lifetimeGuard_, [this] { + auto joinedUsers = this->joinedUsers_.access(); + + MessageBuilder builder(systemMessage, + "Users joined: " + joinedUsers->join(", ")); + builder->flags.set(MessageFlag::Collapsed); + joinedUsers->clear(); + this->channel_.addMessage(builder.release()); + this->joinedUsersMergeQueued_ = false; + }); + } +} + +void ChannelChatters::addPartedUser(const QString &user) +{ + auto partedUsers = this->partedUsers_.access(); + partedUsers->append(user); + + if (!this->partedUsersMergeQueued_) + { + this->partedUsersMergeQueued_ = true; + + QTimer::singleShot(500, &this->lifetimeGuard_, [this] { + auto partedUsers = this->partedUsers_.access(); + + MessageBuilder builder(systemMessage, + "Users parted: " + partedUsers->join(", ")); + builder->flags.set(MessageFlag::Collapsed); + this->channel_.addMessage(builder.release()); + partedUsers->clear(); + + this->partedUsersMergeQueued_ = false; + }); + } +} +void ChannelChatters::setChatters(UsernameSet &&set) +{ + *this->chatters_.access() = set; +} + +} // namespace chatterino diff --git a/src/common/ChannelChatters.hpp b/src/common/ChannelChatters.hpp new file mode 100644 index 00000000..a0c5896e --- /dev/null +++ b/src/common/ChannelChatters.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "common/Channel.hpp" +#include "common/UniqueAccess.hpp" +#include "common/UsernameSet.hpp" + +namespace chatterino { + +class ChannelChatters +{ +public: + ChannelChatters(Channel &channel); + virtual ~ChannelChatters() = default; // add vtable + + AccessGuard accessChatters() const; + + void addRecentChatter(const QString &user); + void addJoinedUser(const QString &user); + void addPartedUser(const QString &user); + void setChatters(UsernameSet &&set); + +private: + Channel &channel_; + + // maps 2 char prefix to set of names + UniqueAccess chatters_; + + // combines multiple joins/parts into one message + UniqueAccess joinedUsers_; + bool joinedUsersMergeQueued_ = false; + UniqueAccess partedUsers_; + bool partedUsersMergeQueued_ = false; + + QObject lifetimeGuard_; +}; + +} // namespace chatterino diff --git a/src/providers/irc/AbstractIrcServer.cpp b/src/providers/irc/AbstractIrcServer.cpp index ce2c4e29..5e8b766c 100644 --- a/src/providers/irc/AbstractIrcServer.cpp +++ b/src/providers/irc/AbstractIrcServer.cpp @@ -359,20 +359,6 @@ void AbstractIrcServer::privateMessageReceived( void AbstractIrcServer::readConnectionMessageReceived( Communi::IrcMessage *message) { - /* XXX: only print this message once - if (message->type() == Communi::IrcMessage::Join) - { - auto x = static_cast(message); - - if (auto it = this->channels.find(this->cleanChannelName(x->channel())); - it != this->channels.end()) - { - if (auto shared = it->lock()) - shared->addMessage( - MessageBuilder(systemMessage, "joined").release()); - } - } - */ } void AbstractIrcServer::forEachChannel(std::function func) diff --git a/src/providers/irc/IrcChannel2.cpp b/src/providers/irc/IrcChannel2.cpp index d19af8b5..8db724e3 100644 --- a/src/providers/irc/IrcChannel2.cpp +++ b/src/providers/irc/IrcChannel2.cpp @@ -8,6 +8,7 @@ namespace chatterino { IrcChannel::IrcChannel(const QString &name, IrcServer *server) : Channel(name, Channel::Type::Irc) + , ChannelChatters(*static_cast(this)) , server_(server) { } diff --git a/src/providers/irc/IrcChannel2.hpp b/src/providers/irc/IrcChannel2.hpp index 2dd1b662..8b89346a 100644 --- a/src/providers/irc/IrcChannel2.hpp +++ b/src/providers/irc/IrcChannel2.hpp @@ -1,13 +1,14 @@ #pragma once #include "common/Channel.hpp" +#include "common/ChannelChatters.hpp" namespace chatterino { class Irc; class IrcServer; -class IrcChannel : public Channel +class IrcChannel : public Channel, public ChannelChatters { public: explicit IrcChannel(const QString &name, IrcServer *server); diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 5cbf439d..22aaed7e 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -1,14 +1,16 @@ #include "IrcMessageHandler.hpp" #include "Application.hpp" +#include "controllers/accounts/AccountController.hpp" #include "controllers/highlights/HighlightController.hpp" #include "debug/Log.hpp" #include "messages/LimitedQueue.hpp" #include "messages/Message.hpp" +#include "providers/twitch/TwitchAccountManager.hpp" #include "providers/twitch/TwitchChannel.hpp" #include "providers/twitch/TwitchHelpers.hpp" -#include "providers/twitch/TwitchMessageBuilder.hpp" #include "providers/twitch/TwitchIrcServer.hpp" +#include "providers/twitch/TwitchMessageBuilder.hpp" #include "singletons/Resources.hpp" #include "singletons/Settings.hpp" #include "singletons/WindowManager.hpp" @@ -93,8 +95,9 @@ void IrcMessageHandler::handlePrivMessage(Communi::IrcPrivateMessage *message, void IrcMessageHandler::addMessage(Communi::IrcMessage *_message, const QString &target, - const QString &content, TwitchIrcServer &server, - bool isSub, bool isAction) + const QString &content, + TwitchIrcServer &server, bool isSub, + bool isAction) { QString channelName; if (!trimChannelName(target, channelName)) @@ -144,6 +147,10 @@ void IrcMessageHandler::addMessage(Communi::IrcMessage *_message, } chan->addMessage(msg); + if (auto chatters = dynamic_cast(chan.get())) + { + chatters->addRecentChatter(msg->displayName); + } } } @@ -591,7 +598,12 @@ void IrcMessageHandler::handleJoinMessage(Communi::IrcMessage *message) if (TwitchChannel *twitchChannel = dynamic_cast(channel.get())) { - twitchChannel->addJoinedUser(message->nick()); + if (message->nick() != + getApp()->accounts->twitch.getCurrent()->getUserName() && + getSettings()->showJoins.getValue()) + { + twitchChannel->addJoinedUser(message->nick()); + } } } @@ -604,7 +616,12 @@ void IrcMessageHandler::handlePartMessage(Communi::IrcMessage *message) if (TwitchChannel *twitchChannel = dynamic_cast(channel.get())) { - twitchChannel->addPartedUser(message->nick()); + if (message->nick() != + getApp()->accounts->twitch.getCurrent()->getUserName() && + getSettings()->showJoins.getValue()) + { + twitchChannel->addPartedUser(message->nick()); + } } } diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 97f3b6e0..d9c0417b 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -79,6 +79,7 @@ TwitchChannel::TwitchChannel(const QString &name, TwitchBadges &globalTwitchBadges, BttvEmotes &bttv, FfzEmotes &ffz) : Channel(name, Channel::Type::Twitch) + , ChannelChatters(*static_cast(this)) , subscriptionUrl_("https://www.twitch.tv/subs/" + name) , channelUrl_("https://twitch.tv/" + name) , popoutPlayerUrl_("https://player.twitch.tv/?channel=" + name) @@ -275,71 +276,6 @@ bool TwitchChannel::hasHighRateLimit() const return this->isMod() || this->isBroadcaster() || this->isVIP(); } -void TwitchChannel::addRecentChatter(const MessagePtr &message) -{ - this->chatters_.access()->insert(message->displayName); -} - -void TwitchChannel::addJoinedUser(const QString &user) -{ - auto app = getApp(); - if (user == app->accounts->twitch.getCurrent()->getUserName() || - !getSettings()->showJoins.getValue()) - { - return; - } - - auto joinedUsers = this->joinedUsers_.access(); - joinedUsers->append(user); - - if (!this->joinedUsersMergeQueued_) - { - this->joinedUsersMergeQueued_ = true; - - QTimer::singleShot(500, &this->lifetimeGuard_, [this] { - auto joinedUsers = this->joinedUsers_.access(); - - MessageBuilder builder(systemMessage, - "Users joined: " + joinedUsers->join(", ")); - builder->flags.set(MessageFlag::Collapsed); - joinedUsers->clear(); - this->addMessage(builder.release()); - this->joinedUsersMergeQueued_ = false; - }); - } -} - -void TwitchChannel::addPartedUser(const QString &user) -{ - auto app = getApp(); - - if (user == app->accounts->twitch.getCurrent()->getUserName() || - !getSettings()->showJoins.getValue()) - { - return; - } - - auto partedUsers = this->partedUsers_.access(); - partedUsers->append(user); - - if (!this->partedUsersMergeQueued_) - { - this->partedUsersMergeQueued_ = true; - - QTimer::singleShot(500, &this->lifetimeGuard_, [this] { - auto partedUsers = this->partedUsers_.access(); - - MessageBuilder builder(systemMessage, - "Users parted: " + partedUsers->join(", ")); - builder->flags.set(MessageFlag::Collapsed); - this->addMessage(builder.release()); - partedUsers->clear(); - - this->partedUsersMergeQueued_ = false; - }); - } -} - QString TwitchChannel::roomId() const { return *this->roomID_.access(); @@ -379,11 +315,6 @@ AccessGuard return this->streamStatus_.accessConst(); } -AccessGuard TwitchChannel::accessChatters() const -{ - return this->chatters_.accessConst(); -} - const TwitchBadges &TwitchChannel::globalTwitchBadges() const { return this->globalTwitchBadges_; @@ -686,7 +617,7 @@ void TwitchChannel::refreshChatters() auto pair = parseChatters(result.parseJson()); if (pair.first) { - *this->chatters_.access() = std::move(pair.second); + this->setChatters(std::move(pair.second)); } return pair.first; diff --git a/src/providers/twitch/TwitchChannel.hpp b/src/providers/twitch/TwitchChannel.hpp index c74f67cc..933e7ab9 100644 --- a/src/providers/twitch/TwitchChannel.hpp +++ b/src/providers/twitch/TwitchChannel.hpp @@ -3,9 +3,9 @@ #include "common/Aliases.hpp" #include "common/Atomic.hpp" #include "common/Channel.hpp" +#include "common/ChannelChatters.hpp" #include "common/Outcome.hpp" #include "common/UniqueAccess.hpp" -#include "common/UsernameSet.hpp" #include "providers/ffz/FfzModBadge.hpp" #include "providers/twitch/TwitchEmotes.hpp" @@ -32,7 +32,9 @@ class BttvEmotes; class TwitchIrcServer; -class TwitchChannel : public Channel, pajlada::Signals::SignalHolder +class TwitchChannel : public Channel, + public ChannelChatters, + pajlada::Signals::SignalHolder { public: struct StreamStatus { @@ -74,7 +76,6 @@ public: QString roomId() const; AccessGuard accessRoomModes() const; AccessGuard accessStreamStatus() const; - AccessGuard accessChatters() const; // Emotes const TwitchBadges &globalTwitchBadges() const; @@ -99,9 +100,6 @@ public: pajlada::Signals::NoArgSignal liveStatusChanged; pajlada::Signals::NoArgSignal roomModesChanged; -protected: - void addRecentChatter(const MessagePtr &message) override; - private: struct NameOptions { QString displayName; @@ -123,8 +121,6 @@ private: void refreshCheerEmotes(); void loadRecentMessages(); - void addJoinedUser(const QString &user); - void addPartedUser(const QString &user); void setLive(bool newLiveStatus); void setMod(bool value); void setVIP(bool value); @@ -138,7 +134,6 @@ private: const QString popoutPlayerUrl_; UniqueAccess streamStatus_; UniqueAccess roomModes_; - UniqueAccess chatters_; // maps 2 char prefix to set of names // Emotes TwitchBadges &globalTwitchBadges_; @@ -161,11 +156,6 @@ private: bool staff_ = false; UniqueAccess roomID_; - UniqueAccess joinedUsers_; - bool joinedUsersMergeQueued_ = false; - UniqueAccess partedUsers_; - bool partedUsersMergeQueued_ = false; - // -- QString lastSentMessage_; QObject lifetimeGuard_;