From e1ed3553b5846a85e96e3b3c4b228fc872cdc1f4 Mon Sep 17 00:00:00 2001 From: hemirt Date: Tue, 26 Feb 2019 21:00:57 +0100 Subject: [PATCH 1/4] chatroom emotes --- chatterino.pro | 4 ++- src/providers/twitch/ChatroomChannel.cpp | 44 ++++++++++++++++++++++++ src/providers/twitch/ChatroomChannel.hpp | 25 ++++++++++++++ src/providers/twitch/TwitchApi.cpp | 27 +++++++++++++++ src/providers/twitch/TwitchApi.hpp | 2 ++ src/providers/twitch/TwitchChannel.hpp | 9 +++-- src/providers/twitch/TwitchServer.cpp | 15 ++++++-- 7 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 src/providers/twitch/ChatroomChannel.cpp create mode 100644 src/providers/twitch/ChatroomChannel.hpp diff --git a/chatterino.pro b/chatterino.pro index 63cd4c90f..dafca10d3 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -206,6 +206,7 @@ SOURCES += \ src/widgets/splits/ClosedSplits.cpp \ src/providers/ffz/FfzModBadge.cpp \ src/widgets/settingspages/GeneralPage.cpp \ + src/providers/twitch/ChatroomChannel.cpp HEADERS += \ src/Application.hpp \ @@ -385,7 +386,8 @@ HEADERS += \ src/widgets/splits/ClosedSplits.hpp \ src/providers/ffz/FfzModBadge.hpp \ src/widgets/settingspages/GeneralPage.hpp \ - src/messages/HistoricMessageAppearance.hpp + src/messages/HistoricMessageAppearance.hpp \ + src/providers/twitch/ChatroomChannel.hpp RESOURCES += \ resources/resources.qrc \ diff --git a/src/providers/twitch/ChatroomChannel.cpp b/src/providers/twitch/ChatroomChannel.cpp new file mode 100644 index 000000000..d3d43f96d --- /dev/null +++ b/src/providers/twitch/ChatroomChannel.cpp @@ -0,0 +1,44 @@ +#include "ChatroomChannel.hpp" + +#include +#include "TwitchApi.hpp" +#include "common/Common.hpp" +#include "messages\Emote.hpp" +#include "providers/bttv/BttvEmotes.hpp" +#include "providers/bttv/LoadBttvChannelEmote.hpp" +#include "singletons/Emotes.hpp" + +namespace chatterino { + +ChatroomChannel::ChatroomChannel(const QString &channelName, + TwitchBadges &globalTwitchBadges, + BttvEmotes &globalBttv, FfzEmotes &globalFfz) + : TwitchChannel(channelName, globalTwitchBadges, globalBttv, globalFfz) +{ + auto list = channelName.split(":"); + if (list.size() > 2) + { + this->chatroomOwnerId = list[1]; + } +} + +void ChatroomChannel::refreshChannelEmotes() +{ + TwitchApi::findUserName( + this->chatroomOwnerId, + [this, weak = weakOf(this)](QString username) { + qDebug() << username; + BttvEmotes::loadChannel(username, [this, weak](auto &&emoteMap) { + if (auto shared = weak.lock()) + this->bttvEmotes_.set( + std::make_shared(std::move(emoteMap))); + }); + FfzEmotes::loadChannel(username, [this, weak](auto &&emoteMap) { + if (auto shared = weak.lock()) + this->ffzEmotes_.set( + std::make_shared(std::move(emoteMap))); + }); + }); +} + +} // namespace chatterino diff --git a/src/providers/twitch/ChatroomChannel.hpp b/src/providers/twitch/ChatroomChannel.hpp new file mode 100644 index 000000000..c3d6cff67 --- /dev/null +++ b/src/providers/twitch/ChatroomChannel.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include "TwitchChannel.hpp" + +#include +#include + +namespace chatterino { + +class ChatroomChannel : public TwitchChannel +{ +protected: + explicit ChatroomChannel(const QString &channelName, + TwitchBadges &globalTwitchBadges, + BttvEmotes &globalBttv, FfzEmotes &globalFfz); + virtual void refreshChannelEmotes() override; + + QString chatroomOwnerId; + + friend class TwitchServer; + friend class TwitchMessageBuilder; + friend class IrcMessageHandler; +}; + +} // namespace chatterino diff --git a/src/providers/twitch/TwitchApi.cpp b/src/providers/twitch/TwitchApi.cpp index f06cb1173..81ecbb6e9 100644 --- a/src/providers/twitch/TwitchApi.cpp +++ b/src/providers/twitch/TwitchApi.cpp @@ -57,4 +57,31 @@ void TwitchApi::findUserId(const QString user, request.execute(); } +void TwitchApi::findUserName(const QString userid, + std::function successCallback) +{ + QString requestUrl("https://api.twitch.tv/kraken/users/" + userid); + + NetworkRequest request(requestUrl); + request.setCaller(QThread::currentThread()); + request.makeAuthorizedV5(getDefaultClientID()); + request.setTimeout(30000); + request.onSuccess([successCallback](auto result) mutable -> Outcome { + auto root = result.parseJson(); + auto name = root.value("name"); + if (!name.isString()) + { + log("API Error: while getting user id, first user object `_id` key " + "is not a " + "string"); + successCallback(""); + return Failure; + } + successCallback(name.toString()); + return Success; + }); + + request.execute(); +} + } // namespace chatterino diff --git a/src/providers/twitch/TwitchApi.hpp b/src/providers/twitch/TwitchApi.hpp index fd7ad599c..8b1b85c13 100644 --- a/src/providers/twitch/TwitchApi.hpp +++ b/src/providers/twitch/TwitchApi.hpp @@ -10,6 +10,8 @@ class TwitchApi public: static void findUserId(const QString user, std::function callback); + static void findUserName(const QString userid, + std::function callback); private: }; diff --git a/src/providers/twitch/TwitchChannel.hpp b/src/providers/twitch/TwitchChannel.hpp index 15ec0c476..0383cd43d 100644 --- a/src/providers/twitch/TwitchChannel.hpp +++ b/src/providers/twitch/TwitchChannel.hpp @@ -32,7 +32,7 @@ class BttvEmotes; class TwitchServer; -class TwitchChannel final : public Channel, pajlada::Signals::SignalHolder +class TwitchChannel : public Channel, pajlada::Signals::SignalHolder { public: struct StreamStatus { @@ -82,7 +82,7 @@ public: std::shared_ptr bttvEmotes() const; std::shared_ptr ffzEmotes() const; - void refreshChannelEmotes(); + virtual void refreshChannelEmotes(); // Badges boost::optional ffzCustomModBadge() const; @@ -104,10 +104,12 @@ private: QString localizedName; }; +protected: explicit TwitchChannel(const QString &channelName, TwitchBadges &globalTwitchBadges, BttvEmotes &globalBttv, FfzEmotes &globalFfz); +private: // Methods void refreshLiveStatus(); Outcome parseLiveStatus(const rapidjson::Document &document); @@ -134,11 +136,14 @@ private: // Emotes TwitchBadges &globalTwitchBadges_; + +protected: BttvEmotes &globalBttv_; FfzEmotes &globalFfz_; Atomic> bttvEmotes_; Atomic> ffzEmotes_; +private: // Badges UniqueAccess>> badgeSets_; // "subscribers": { "0": ... "3": ... "6": ... diff --git a/src/providers/twitch/TwitchServer.cpp b/src/providers/twitch/TwitchServer.cpp index d10c4d367..86b4cf931 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -6,6 +6,7 @@ #include "controllers/highlights/HighlightController.hpp" #include "messages/Message.hpp" #include "messages/MessageBuilder.hpp" +#include "providers/twitch/ChatroomChannel.hpp" #include "providers/twitch/IrcMessageHandler.hpp" #include "providers/twitch/PubsubClient.hpp" #include "providers/twitch/TwitchAccount.hpp" @@ -92,8 +93,18 @@ void TwitchServer::initializeConnection(IrcConnection *connection, bool isRead, std::shared_ptr TwitchServer::createChannel(const QString &channelName) { - auto channel = std::shared_ptr(new TwitchChannel( - channelName, this->twitchBadges, this->bttv, this->ffz)); + std::shared_ptr channel; + if (channelName.left(9).toLower() == "chatrooms") + { + channel = std::static_pointer_cast( + std::shared_ptr(new ChatroomChannel( + channelName, this->twitchBadges, this->bttv, this->ffz))); + } + else + { + channel = std::shared_ptr(new TwitchChannel( + channelName, this->twitchBadges, this->bttv, this->ffz)); + } channel->initialize(); channel->sendMessageSignal.connect( From aef5f6bfd78b1e40686e5f5fcc966b5b4762162a Mon Sep 17 00:00:00 2001 From: hemirt Date: Tue, 26 Feb 2019 21:02:53 +0100 Subject: [PATCH 2/4] add : character to chatrooms --- 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 86b4cf931..822db879f 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -94,7 +94,7 @@ void TwitchServer::initializeConnection(IrcConnection *connection, bool isRead, std::shared_ptr TwitchServer::createChannel(const QString &channelName) { std::shared_ptr channel; - if (channelName.left(9).toLower() == "chatrooms") + if (channelName.left(10).toLower() == "chatrooms:") { channel = std::static_pointer_cast( std::shared_ptr(new ChatroomChannel( From ec6b26cd2393c816af6c23d1171a69c4b56d82fb Mon Sep 17 00:00:00 2001 From: hemirt Date: Thu, 28 Feb 2019 19:26:32 +0100 Subject: [PATCH 3/4] fix log message --- src/providers/twitch/TwitchApi.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/providers/twitch/TwitchApi.cpp b/src/providers/twitch/TwitchApi.cpp index 81ecbb6e9..495ac9929 100644 --- a/src/providers/twitch/TwitchApi.cpp +++ b/src/providers/twitch/TwitchApi.cpp @@ -71,9 +71,7 @@ void TwitchApi::findUserName(const QString userid, auto name = root.value("name"); if (!name.isString()) { - log("API Error: while getting user id, first user object `_id` key " - "is not a " - "string"); + log("API Error: while getting user name, `name` is not a string"); successCallback(""); return Failure; } From 3c01af980579db1e97c9393446a257a412cf70af Mon Sep 17 00:00:00 2001 From: hemirt Date: Fri, 1 Mar 2019 21:18:32 +0100 Subject: [PATCH 4/4] changes and fix displayname of 'is live' message --- src/common/Channel.cpp | 5 +++++ src/common/Channel.hpp | 1 + src/providers/twitch/ChatroomChannel.cpp | 22 +++++++++++++++++----- src/providers/twitch/ChatroomChannel.hpp | 2 ++ src/providers/twitch/TwitchChannel.cpp | 3 ++- src/providers/twitch/TwitchServer.cpp | 17 ++++++++++++++++- 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index f8d9f501f..92a9dd330 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -43,6 +43,11 @@ const QString &Channel::getName() const return this->name_; } +const QString &Channel::getDisplayName() const +{ + return this->getName(); +} + bool Channel::isTwitchChannel() const { return this->type_ >= Type::Twitch && this->type_ < Type::TwitchEnd; diff --git a/src/common/Channel.hpp b/src/common/Channel.hpp index 9f4d0c2e0..9e111aa46 100644 --- a/src/common/Channel.hpp +++ b/src/common/Channel.hpp @@ -47,6 +47,7 @@ public: Type getType() const; const QString &getName() const; + virtual const QString &getDisplayName() const; bool isTwitchChannel() const; virtual bool isEmpty() const; LimitedQueueSnapshot getMessageSnapshot(); diff --git a/src/providers/twitch/ChatroomChannel.cpp b/src/providers/twitch/ChatroomChannel.cpp index d3d43f96d..fdccdb19c 100644 --- a/src/providers/twitch/ChatroomChannel.cpp +++ b/src/providers/twitch/ChatroomChannel.cpp @@ -3,7 +3,7 @@ #include #include "TwitchApi.hpp" #include "common/Common.hpp" -#include "messages\Emote.hpp" +#include "messages/Emote.hpp" #include "providers/bttv/BttvEmotes.hpp" #include "providers/bttv/LoadBttvChannelEmote.hpp" #include "singletons/Emotes.hpp" @@ -15,19 +15,22 @@ ChatroomChannel::ChatroomChannel(const QString &channelName, BttvEmotes &globalBttv, FfzEmotes &globalFfz) : TwitchChannel(channelName, globalTwitchBadges, globalBttv, globalFfz) { - auto list = channelName.split(":"); - if (list.size() > 2) + auto listRef = channelName.splitRef(":"); + if (listRef.size() > 2) { - this->chatroomOwnerId = list[1]; + this->chatroomOwnerId = listRef[1].toString(); } } void ChatroomChannel::refreshChannelEmotes() { + if (this->chatroomOwnerId.isEmpty()) + { + return; + } TwitchApi::findUserName( this->chatroomOwnerId, [this, weak = weakOf(this)](QString username) { - qDebug() << username; BttvEmotes::loadChannel(username, [this, weak](auto &&emoteMap) { if (auto shared = weak.lock()) this->bttvEmotes_.set( @@ -38,7 +41,16 @@ void ChatroomChannel::refreshChannelEmotes() this->ffzEmotes_.set( std::make_shared(std::move(emoteMap))); }); + if (auto shared = weak.lock()) + { + this->chatroomOwnerName = username; + } }); } +const QString &ChatroomChannel::getDisplayName() const +{ + return this->chatroomOwnerName; +} + } // namespace chatterino diff --git a/src/providers/twitch/ChatroomChannel.hpp b/src/providers/twitch/ChatroomChannel.hpp index c3d6cff67..55606e915 100644 --- a/src/providers/twitch/ChatroomChannel.hpp +++ b/src/providers/twitch/ChatroomChannel.hpp @@ -14,8 +14,10 @@ protected: TwitchBadges &globalTwitchBadges, BttvEmotes &globalBttv, FfzEmotes &globalFfz); virtual void refreshChannelEmotes() override; + virtual const QString &getDisplayName() const override; QString chatroomOwnerId; + QString chatroomOwnerName; friend class TwitchServer; friend class TwitchMessageBuilder; diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 4992e3b61..a569de5ae 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -438,7 +438,8 @@ void TwitchChannel::setLive(bool newLiveStatus) getApp()->windows->sendAlert(); } } - auto live = makeSystemMessage(this->getName() + " is live"); + auto live = + makeSystemMessage(this->getDisplayName() + " is live"); this->addMessage(live); } else diff --git a/src/providers/twitch/TwitchServer.cpp b/src/providers/twitch/TwitchServer.cpp index 822db879f..b12a46190 100644 --- a/src/providers/twitch/TwitchServer.cpp +++ b/src/providers/twitch/TwitchServer.cpp @@ -23,6 +23,21 @@ using namespace std::chrono_literals; namespace chatterino { +namespace { + bool isChatroom(const QString &channel) + { + if (channel.left(10) == "chatrooms:") + { + auto reflist = channel.splitRef(':'); + if (reflist.size() == 3) + { + return true; + } + } + return false; + } +} // namespace + TwitchServer::TwitchServer() : whispersChannel(new Channel("/whispers", Channel::Type::TwitchWhispers)) , mentionsChannel(new Channel("/mentions", Channel::Type::TwitchMentions)) @@ -94,7 +109,7 @@ void TwitchServer::initializeConnection(IrcConnection *connection, bool isRead, std::shared_ptr TwitchServer::createChannel(const QString &channelName) { std::shared_ptr channel; - if (channelName.left(10).toLower() == "chatrooms:") + if (isChatroom(channelName)) { channel = std::static_pointer_cast( std::shared_ptr(new ChatroomChannel(