move pubsub stuff to the providers/twitch namespace and folder

This commit is contained in:
Rasmus Karlsson
2018-04-28 15:48:40 +02:00
parent ebbe8dcfae
commit 0f22d9d002
12 changed files with 104 additions and 81 deletions
+6 -5
View File
@@ -104,6 +104,7 @@ SOURCES += \
src/providers/twitch/twitchchannel.cpp \ src/providers/twitch/twitchchannel.cpp \
src/providers/twitch/twitchmessagebuilder.cpp \ src/providers/twitch/twitchmessagebuilder.cpp \
src/providers/twitch/twitchserver.cpp \ src/providers/twitch/twitchserver.cpp \
src/providers/twitch/pubsub.cpp \
src/singletons/accountmanager.cpp \ src/singletons/accountmanager.cpp \
src/singletons/commandmanager.cpp \ src/singletons/commandmanager.cpp \
src/singletons/emotemanager.cpp \ src/singletons/emotemanager.cpp \
@@ -175,10 +176,9 @@ SOURCES += \
src/widgets/helper/debugpopup.cpp \ src/widgets/helper/debugpopup.cpp \
src/util/debugcount.cpp \ src/util/debugcount.cpp \
src/singletons/nativemessagingmanager.cpp \ src/singletons/nativemessagingmanager.cpp \
src/singletons/pubsubmanager.cpp \
src/util/rapidjson-helpers.cpp \ src/util/rapidjson-helpers.cpp \
src/singletons/helper/pubsubhelpers.cpp \ src/providers/twitch/pubsubhelpers.cpp \
src/singletons/helper/pubsubactions.cpp \ src/providers/twitch/pubsubactions.cpp \
src/widgets/selectchanneldialog.cpp \ src/widgets/selectchanneldialog.cpp \
src/singletons/updatemanager.cpp \ src/singletons/updatemanager.cpp \
src/widgets/lastruncrashdialog.cpp \ src/widgets/lastruncrashdialog.cpp \
@@ -213,6 +213,7 @@ HEADERS += \
src/providers/twitch/twitchchannel.hpp \ src/providers/twitch/twitchchannel.hpp \
src/providers/twitch/twitchmessagebuilder.hpp \ src/providers/twitch/twitchmessagebuilder.hpp \
src/providers/twitch/twitchserver.hpp \ src/providers/twitch/twitchserver.hpp \
src/providers/twitch/pubsub.hpp \
src/singletons/accountmanager.hpp \ src/singletons/accountmanager.hpp \
src/singletons/commandmanager.hpp \ src/singletons/commandmanager.hpp \
src/singletons/emotemanager.hpp \ src/singletons/emotemanager.hpp \
@@ -304,8 +305,8 @@ HEADERS += \
src/singletons/nativemessagingmanager.hpp \ src/singletons/nativemessagingmanager.hpp \
src/singletons/pubsubmanager.hpp \ src/singletons/pubsubmanager.hpp \
src/util/rapidjson-helpers.hpp \ src/util/rapidjson-helpers.hpp \
src/singletons/helper/pubsubhelpers.hpp \ src/providers/twitch/pubsubhelpers.hpp \
src/singletons/helper/pubsubactions.hpp \ src/providers/twitch/pubsubactions.hpp \
src/widgets/selectchanneldialog.hpp \ src/widgets/selectchanneldialog.hpp \
src/singletons/updatemanager.hpp \ src/singletons/updatemanager.hpp \
src/widgets/lastruncrashdialog.hpp \ src/widgets/lastruncrashdialog.hpp \
+13 -13
View File
@@ -1,5 +1,6 @@
#include "application.hpp" #include "application.hpp"
#include "providers/twitch/pubsub.hpp"
#include "providers/twitch/twitchserver.hpp" #include "providers/twitch/twitchserver.hpp"
#include "singletons/accountmanager.hpp" #include "singletons/accountmanager.hpp"
#include "singletons/commandmanager.hpp" #include "singletons/commandmanager.hpp"
@@ -8,7 +9,6 @@
#include "singletons/loggingmanager.hpp" #include "singletons/loggingmanager.hpp"
#include "singletons/nativemessagingmanager.hpp" #include "singletons/nativemessagingmanager.hpp"
#include "singletons/pathmanager.hpp" #include "singletons/pathmanager.hpp"
#include "singletons/pubsubmanager.hpp"
#include "singletons/resourcemanager.hpp" #include "singletons/resourcemanager.hpp"
#include "singletons/settingsmanager.hpp" #include "singletons/settingsmanager.hpp"
#include "singletons/thememanager.hpp" #include "singletons/thememanager.hpp"
@@ -66,12 +66,12 @@ void Application::construct()
this->commands = new singletons::CommandManager; this->commands = new singletons::CommandManager;
this->accounts = new singletons::AccountManager; this->accounts = new singletons::AccountManager;
this->emotes = new singletons::EmoteManager; this->emotes = new singletons::EmoteManager;
this->pubsub = new singletons::PubSubManager;
this->settings = new singletons::SettingManager; this->settings = new singletons::SettingManager;
this->fonts = new singletons::FontManager; this->fonts = new singletons::FontManager;
this->resources = new singletons::ResourceManager; this->resources = new singletons::ResourceManager;
this->twitch.server = new providers::twitch::TwitchServer; this->twitch.server = new providers::twitch::TwitchServer;
this->twitch.pubsub = new providers::twitch::PubSub;
} }
void Application::instantiate(int argc, char **argv) void Application::instantiate(int argc, char **argv)
@@ -106,29 +106,29 @@ void Application::initialize()
this->nativeMessaging->openGuiMessageQueue(); this->nativeMessaging->openGuiMessageQueue();
this->pubsub->sig.whisper.sent.connect([](const auto &msg) { this->twitch.pubsub->sig.whisper.sent.connect([](const auto &msg) {
debug::Log("WHISPER SENT LOL"); // debug::Log("WHISPER SENT LOL"); //
}); });
this->pubsub->sig.whisper.received.connect([](const auto &msg) { this->twitch.pubsub->sig.whisper.received.connect([](const auto &msg) {
debug::Log("WHISPER RECEIVED LOL"); // debug::Log("WHISPER RECEIVED LOL"); //
}); });
this->pubsub->sig.moderation.chatCleared.connect([&](const auto &action) { this->twitch.pubsub->sig.moderation.chatCleared.connect([&](const auto &action) {
debug::Log("Chat cleared by {}", action.source.name); // debug::Log("Chat cleared by {}", action.source.name); //
}); });
this->pubsub->sig.moderation.modeChanged.connect([&](const auto &action) { this->twitch.pubsub->sig.moderation.modeChanged.connect([&](const auto &action) {
debug::Log("Mode {} was turned {} by {} (duration {})", (int &)action.mode, debug::Log("Mode {} was turned {} by {} (duration {})", (int &)action.mode,
(bool &)action.state, action.source.name, action.args.duration); (bool &)action.state, action.source.name, action.args.duration);
}); });
this->pubsub->sig.moderation.moderationStateChanged.connect([&](const auto &action) { this->twitch.pubsub->sig.moderation.moderationStateChanged.connect([&](const auto &action) {
debug::Log("User {} was {} by {}", action.target.id, action.modded ? "modded" : "unmodded", debug::Log("User {} was {} by {}", action.target.id, action.modded ? "modded" : "unmodded",
action.source.name); action.source.name);
}); });
this->pubsub->sig.moderation.userBanned.connect([&](const auto &action) { this->twitch.pubsub->sig.moderation.userBanned.connect([&](const auto &action) {
auto chan = this->twitch.server->getChannelOrEmptyByID(action.roomID); auto chan = this->twitch.server->getChannelOrEmptyByID(action.roomID);
if (chan->isEmpty()) { if (chan->isEmpty()) {
@@ -140,7 +140,7 @@ void Application::initialize()
util::postToThread([chan, msg] { chan->addMessage(msg); }); util::postToThread([chan, msg] { chan->addMessage(msg); });
}); });
this->pubsub->sig.moderation.userUnbanned.connect([&](const auto &action) { this->twitch.pubsub->sig.moderation.userUnbanned.connect([&](const auto &action) {
auto chan = this->twitch.server->getChannelOrEmptyByID(action.roomID); auto chan = this->twitch.server->getChannelOrEmptyByID(action.roomID);
if (chan->isEmpty()) { if (chan->isEmpty()) {
@@ -152,14 +152,14 @@ void Application::initialize()
util::postToThread([chan, msg] { chan->addMessage(msg); }); util::postToThread([chan, msg] { chan->addMessage(msg); });
}); });
this->pubsub->Start(); this->twitch.pubsub->Start();
auto RequestModerationActions = [=]() { auto RequestModerationActions = [=]() {
this->pubsub->UnlistenAllModerationActions(); this->twitch.pubsub->UnlistenAllModerationActions();
// TODO(pajlada): Unlisten to all authed topics instead of only moderation topics // TODO(pajlada): Unlisten to all authed topics instead of only moderation topics
// this->pubsub->UnlistenAllAuthedTopics(); // this->twitch.pubsub->UnlistenAllAuthedTopics();
this->pubsub->ListenToWhispers(this->accounts->Twitch.getCurrent()); // this->twitch.pubsub->ListenToWhispers(this->accounts->Twitch.getCurrent()); //
}; };
this->accounts->Twitch.userChanged.connect(RequestModerationActions); this->accounts->Twitch.userChanged.connect(RequestModerationActions);
+3 -3
View File
@@ -11,6 +11,7 @@ namespace providers {
namespace twitch { namespace twitch {
class TwitchServer; class TwitchServer;
class PubSub;
} // namespace twitch } // namespace twitch
} // namespace providers } // namespace providers
@@ -24,7 +25,6 @@ class PathManager;
class CommandManager; class CommandManager;
class AccountManager; class AccountManager;
class EmoteManager; class EmoteManager;
class PubSubManager;
class NativeMessagingManager; class NativeMessagingManager;
class SettingManager; class SettingManager;
class FontManager; class FontManager;
@@ -56,7 +56,6 @@ public:
singletons::CommandManager *commands = nullptr; singletons::CommandManager *commands = nullptr;
singletons::AccountManager *accounts = nullptr; singletons::AccountManager *accounts = nullptr;
singletons::EmoteManager *emotes = nullptr; singletons::EmoteManager *emotes = nullptr;
singletons::PubSubManager *pubsub = nullptr;
singletons::NativeMessagingManager *nativeMessaging = nullptr; singletons::NativeMessagingManager *nativeMessaging = nullptr;
singletons::SettingManager *settings = nullptr; singletons::SettingManager *settings = nullptr;
singletons::FontManager *fonts = nullptr; singletons::FontManager *fonts = nullptr;
@@ -64,7 +63,8 @@ public:
/// Provider-specific /// Provider-specific
struct { struct {
providers::twitch::TwitchServer *server; providers::twitch::TwitchServer *server = nullptr;
providers::twitch::PubSub *pubsub = nullptr;
} twitch; } twitch;
void save(); void save();
+4 -4
View File
@@ -1,6 +1,6 @@
#include "messages/message.hpp" #include "messages/message.hpp"
#include "messageelement.hpp" #include "messageelement.hpp"
#include "singletons/helper/pubsubactions.hpp" #include "providers/twitch/pubsubactions.hpp"
#include "util/irchelpers.hpp" #include "util/irchelpers.hpp"
using SBHighlight = chatterino::widgets::ScrollbarHighlight; using SBHighlight = chatterino::widgets::ScrollbarHighlight;
@@ -79,7 +79,7 @@ MessagePtr Message::createTimeoutMessage(const QString &username, const QString
return message; return message;
} }
MessagePtr Message::createTimeoutMessage(const singletons::BanAction &action, uint32_t count) MessagePtr Message::createTimeoutMessage(const providers::twitch::BanAction &action, uint32_t count)
{ {
MessagePtr msg(new Message); MessagePtr msg(new Message);
@@ -89,7 +89,7 @@ MessagePtr Message::createTimeoutMessage(const singletons::BanAction &action, ui
msg->timeoutUser = action.target.name; msg->timeoutUser = action.target.name;
msg->count = count; msg->count = count;
msg->banAction.reset(new singletons::BanAction(action)); msg->banAction.reset(new providers::twitch::BanAction(action));
QString text; QString text;
@@ -130,7 +130,7 @@ MessagePtr Message::createTimeoutMessage(const singletons::BanAction &action, ui
return msg; return msg;
} }
MessagePtr Message::createUntimeoutMessage(const singletons::UnbanAction &action) MessagePtr Message::createUntimeoutMessage(const providers::twitch::UnbanAction &action)
{ {
MessagePtr msg(new Message); MessagePtr msg(new Message);
+5 -4
View File
@@ -1,7 +1,7 @@
#pragma once #pragma once
#include "messages/messageelement.hpp" #include "messages/messageelement.hpp"
#include "singletons/helper/pubsubactions.hpp" #include "providers/twitch/pubsubactions.hpp"
#include "util/flagsenum.hpp" #include "util/flagsenum.hpp"
#include "widgets/helper/scrollbarhighlight.hpp" #include "widgets/helper/scrollbarhighlight.hpp"
@@ -50,7 +50,7 @@ struct Message {
QString localizedName; QString localizedName;
QString timeoutUser; QString timeoutUser;
std::unique_ptr<singletons::BanAction> banAction; std::unique_ptr<providers::twitch::BanAction> banAction;
uint32_t count = 1; uint32_t count = 1;
// Messages should not be added after the message is done initializing. // Messages should not be added after the message is done initializing.
@@ -70,9 +70,10 @@ public:
const QString &durationInSeconds, const QString &durationInSeconds,
const QString &reason, bool multipleTimes); const QString &reason, bool multipleTimes);
static std::shared_ptr<Message> createTimeoutMessage(const singletons::BanAction &action, static std::shared_ptr<Message> createTimeoutMessage(const providers::twitch::BanAction &action,
uint32_t count = 1); uint32_t count = 1);
static std::shared_ptr<Message> createUntimeoutMessage(const singletons::UnbanAction &action); static std::shared_ptr<Message> createUntimeoutMessage(
const providers::twitch::UnbanAction &action);
}; };
using MessagePtr = std::shared_ptr<Message>; using MessagePtr = std::shared_ptr<Message>;
@@ -1,9 +1,9 @@
#include "singletons/pubsubmanager.hpp" #include "providers/twitch/pubsub.hpp"
#include "debug/log.hpp" #include "debug/log.hpp"
#include "providers/twitch/pubsubactions.hpp"
#include "providers/twitch/pubsubhelpers.hpp"
#include "singletons/accountmanager.hpp" #include "singletons/accountmanager.hpp"
#include "singletons/helper/pubsubactions.hpp"
#include "singletons/helper/pubsubhelpers.hpp"
#include "util/rapidjson-helpers.hpp" #include "util/rapidjson-helpers.hpp"
#include <rapidjson/error/en.h> #include <rapidjson/error/en.h>
@@ -18,12 +18,15 @@ using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2; using websocketpp::lib::placeholders::_2;
namespace chatterino { namespace chatterino {
namespace singletons { namespace providers {
namespace twitch {
static const char *pingPayload = "{\"type\":\"PING\"}"; static const char *pingPayload = "{\"type\":\"PING\"}";
static std::map<std::string, std::string> sentMessages; static std::map<std::string, std::string> sentMessages;
namespace detail {
PubSubClient::PubSubClient(WebsocketClient &_websocketClient, WebsocketHandle _handle) PubSubClient::PubSubClient(WebsocketClient &_websocketClient, WebsocketHandle _handle)
: websocketClient(_websocketClient) : websocketClient(_websocketClient)
, handle(_handle) , handle(_handle)
@@ -170,9 +173,11 @@ bool PubSubClient::Send(const char *payload)
return true; return true;
} }
PubSubManager::PubSubManager() } // namespace detail
PubSub::PubSub()
{ {
qDebug() << "init PubSubManager"; qDebug() << "init PubSub";
this->moderationActionHandlers["clear"] = [this](const auto &data, const auto &roomID) { this->moderationActionHandlers["clear"] = [this](const auto &data, const auto &roomID) {
ClearChatAction action(data, roomID); ClearChatAction action(data, roomID);
@@ -420,17 +425,17 @@ PubSubManager::PubSubManager()
this->websocketClient.init_asio(); this->websocketClient.init_asio();
// SSL Handshake // SSL Handshake
this->websocketClient.set_tls_init_handler(bind(&PubSubManager::OnTLSInit, this, ::_1)); this->websocketClient.set_tls_init_handler(bind(&PubSub::OnTLSInit, this, ::_1));
this->websocketClient.set_message_handler(bind(&PubSubManager::OnMessage, this, ::_1, ::_2)); this->websocketClient.set_message_handler(bind(&PubSub::OnMessage, this, ::_1, ::_2));
this->websocketClient.set_open_handler(bind(&PubSubManager::OnConnectionOpen, this, ::_1)); this->websocketClient.set_open_handler(bind(&PubSub::OnConnectionOpen, this, ::_1));
this->websocketClient.set_close_handler(bind(&PubSubManager::OnConnectionClose, this, ::_1)); this->websocketClient.set_close_handler(bind(&PubSub::OnConnectionClose, this, ::_1));
// Add an initial client // Add an initial client
this->AddClient(); this->AddClient();
} }
void PubSubManager::AddClient() void PubSub::AddClient()
{ {
websocketpp::lib::error_code ec; websocketpp::lib::error_code ec;
auto con = this->websocketClient.get_connection(TWITCH_PUBSUB_URL, ec); auto con = this->websocketClient.get_connection(TWITCH_PUBSUB_URL, ec);
@@ -443,12 +448,12 @@ void PubSubManager::AddClient()
this->websocketClient.connect(con); this->websocketClient.connect(con);
} }
void PubSubManager::Start() void PubSub::Start()
{ {
this->mainThread.reset(new std::thread(std::bind(&PubSubManager::RunThread, this))); this->mainThread.reset(new std::thread(std::bind(&PubSub::RunThread, this)));
} }
void PubSubManager::ListenToWhispers(std::shared_ptr<providers::twitch::TwitchAccount> account) void PubSub::ListenToWhispers(std::shared_ptr<providers::twitch::TwitchAccount> account)
{ {
assert(account != nullptr); assert(account != nullptr);
@@ -467,7 +472,7 @@ void PubSubManager::ListenToWhispers(std::shared_ptr<providers::twitch::TwitchAc
} }
} }
void PubSubManager::UnlistenAllModerationActions() void PubSub::UnlistenAllModerationActions()
{ {
for (const auto &p : this->clients) { for (const auto &p : this->clients) {
const auto &client = p.second; const auto &client = p.second;
@@ -475,7 +480,7 @@ void PubSubManager::UnlistenAllModerationActions()
} }
} }
void PubSubManager::ListenToChannelModerationActions( void PubSub::ListenToChannelModerationActions(
const QString &channelID, std::shared_ptr<providers::twitch::TwitchAccount> account) const QString &channelID, std::shared_ptr<providers::twitch::TwitchAccount> account)
{ {
assert(!channelID.isEmpty()); assert(!channelID.isEmpty());
@@ -495,15 +500,15 @@ void PubSubManager::ListenToChannelModerationActions(
this->listenToTopic(topic, account); this->listenToTopic(topic, account);
} }
void PubSubManager::listenToTopic(const std::string &topic, void PubSub::listenToTopic(const std::string &topic,
std::shared_ptr<providers::twitch::TwitchAccount> account) std::shared_ptr<providers::twitch::TwitchAccount> account)
{ {
auto message = CreateListenMessage({topic}, account); auto message = CreateListenMessage({topic}, account);
this->Listen(std::move(message)); this->Listen(std::move(message));
} }
void PubSubManager::Listen(rapidjson::Document &&msg) void PubSub::Listen(rapidjson::Document &&msg)
{ {
if (this->TryListen(msg)) { if (this->TryListen(msg)) {
debug::Log("Successfully listened!"); debug::Log("Successfully listened!");
@@ -514,7 +519,7 @@ void PubSubManager::Listen(rapidjson::Document &&msg)
this->requests.emplace_back(std::make_unique<rapidjson::Document>(std::move(msg))); this->requests.emplace_back(std::make_unique<rapidjson::Document>(std::move(msg)));
} }
bool PubSubManager::TryListen(rapidjson::Document &msg) bool PubSub::TryListen(rapidjson::Document &msg)
{ {
debug::Log("TryListen with {} clients", this->clients.size()); debug::Log("TryListen with {} clients", this->clients.size());
for (const auto &p : this->clients) { for (const auto &p : this->clients) {
@@ -527,7 +532,7 @@ bool PubSubManager::TryListen(rapidjson::Document &msg)
return false; return false;
} }
bool PubSubManager::isListeningToTopic(const std::string &topic) bool PubSub::isListeningToTopic(const std::string &topic)
{ {
for (const auto &p : this->clients) { for (const auto &p : this->clients) {
const auto &client = p.second; const auto &client = p.second;
@@ -539,7 +544,7 @@ bool PubSubManager::isListeningToTopic(const std::string &topic)
return false; return false;
} }
void PubSubManager::OnMessage(websocketpp::connection_hdl hdl, WebsocketMessagePtr websocketMessage) void PubSub::OnMessage(websocketpp::connection_hdl hdl, WebsocketMessagePtr websocketMessage)
{ {
const std::string &payload = websocketMessage->get_payload(); const std::string &payload = websocketMessage->get_payload();
@@ -596,9 +601,9 @@ void PubSubManager::OnMessage(websocketpp::connection_hdl hdl, WebsocketMessageP
} }
} }
void PubSubManager::OnConnectionOpen(WebsocketHandle hdl) void PubSub::OnConnectionOpen(WebsocketHandle hdl)
{ {
auto client = std::make_shared<PubSubClient>(this->websocketClient, hdl); auto client = std::make_shared<detail::PubSubClient>(this->websocketClient, hdl);
// We separate the starting from the constructor because we will want to use shared_from_this // We separate the starting from the constructor because we will want to use shared_from_this
client->Start(); client->Start();
@@ -608,7 +613,7 @@ void PubSubManager::OnConnectionOpen(WebsocketHandle hdl)
this->connected.invoke(); this->connected.invoke();
} }
void PubSubManager::OnConnectionClose(WebsocketHandle hdl) void PubSub::OnConnectionClose(WebsocketHandle hdl)
{ {
auto clientIt = this->clients.find(hdl); auto clientIt = this->clients.find(hdl);
@@ -625,7 +630,7 @@ void PubSubManager::OnConnectionClose(WebsocketHandle hdl)
this->connected.invoke(); this->connected.invoke();
} }
PubSubManager::WebsocketContextPtr PubSubManager::OnTLSInit(websocketpp::connection_hdl hdl) PubSub::WebsocketContextPtr PubSub::OnTLSInit(websocketpp::connection_hdl hdl)
{ {
WebsocketContextPtr ctx(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1)); WebsocketContextPtr ctx(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1));
@@ -640,7 +645,7 @@ PubSubManager::WebsocketContextPtr PubSubManager::OnTLSInit(websocketpp::connect
return ctx; return ctx;
} }
void PubSubManager::HandleListenResponse(const rapidjson::Document &msg) void PubSub::HandleListenResponse(const rapidjson::Document &msg)
{ {
std::string error; std::string error;
@@ -661,7 +666,7 @@ void PubSubManager::HandleListenResponse(const rapidjson::Document &msg)
} }
} }
void PubSubManager::HandleMessageResponse(const rapidjson::Value &outerData) void PubSub::HandleMessageResponse(const rapidjson::Value &outerData)
{ {
QString topic; QString topic;
@@ -733,12 +738,13 @@ void PubSubManager::HandleMessageResponse(const rapidjson::Value &outerData)
} }
} }
void PubSubManager::RunThread() void PubSub::RunThread()
{ {
debug::Log("Start pubsub manager thread"); debug::Log("Start pubsub manager thread");
this->websocketClient.run(); this->websocketClient.run();
debug::Log("Done with pubsub manager thread"); debug::Log("Done with pubsub manager thread");
} }
} // namespace singletons } // namespace twitch
} // namespace providers
} // namespace chatterino } // namespace chatterino
@@ -1,8 +1,8 @@
#pragma once #pragma once
#include "providers/twitch/pubsubactions.hpp"
#include "providers/twitch/twitchaccount.hpp" #include "providers/twitch/twitchaccount.hpp"
#include "providers/twitch/twitchserver.hpp" #include "providers/twitch/twitchserver.hpp"
#include "singletons/helper/pubsubactions.hpp"
#include <rapidjson/document.h> #include <rapidjson/document.h>
#include <QString> #include <QString>
@@ -21,7 +21,8 @@
#include <vector> #include <vector>
namespace chatterino { namespace chatterino {
namespace singletons { namespace providers {
namespace twitch {
using WebsocketClient = websocketpp::client<websocketpp::config::asio_tls_client>; using WebsocketClient = websocketpp::client<websocketpp::config::asio_tls_client>;
using WebsocketHandle = websocketpp::connection_hdl; using WebsocketHandle = websocketpp::connection_hdl;
@@ -30,6 +31,8 @@ using WebsocketErrorCode = websocketpp::lib::error_code;
#define MAX_PUBSUB_LISTENS 50 #define MAX_PUBSUB_LISTENS 50
#define MAX_PUBSUB_CONNECTIONS 10 #define MAX_PUBSUB_CONNECTIONS 10
namespace detail {
struct Listener { struct Listener {
std::string topic; std::string topic;
bool authed; bool authed;
@@ -66,7 +69,9 @@ private:
bool Send(const char *payload); bool Send(const char *payload);
}; };
class PubSubManager } // namespace detail
class PubSub
{ {
using WebsocketMessagePtr = websocketpp::config::asio_tls_client::message_type::ptr; using WebsocketMessagePtr = websocketpp::config::asio_tls_client::message_type::ptr;
using WebsocketContextPtr = websocketpp::lib::shared_ptr<boost::asio::ssl::context>; using WebsocketContextPtr = websocketpp::lib::shared_ptr<boost::asio::ssl::context>;
@@ -78,9 +83,9 @@ class PubSubManager
std::unique_ptr<std::thread> mainThread; std::unique_ptr<std::thread> mainThread;
public: public:
PubSubManager(); PubSub();
~PubSubManager() = delete; ~PubSub() = delete;
enum class State { enum class State {
Connected, Connected,
@@ -136,7 +141,8 @@ private:
State state = State::Connected; State state = State::Connected;
std::map<WebsocketHandle, std::shared_ptr<PubSubClient>, std::owner_less<WebsocketHandle>> std::map<WebsocketHandle, std::shared_ptr<detail::PubSubClient>,
std::owner_less<WebsocketHandle>>
clients; clients;
std::unordered_map<std::string, std::function<void(const rapidjson::Value &, const QString &)>> std::unordered_map<std::string, std::function<void(const rapidjson::Value &, const QString &)>>
@@ -153,5 +159,6 @@ private:
void RunThread(); void RunThread();
}; };
} // namespace singletons } // namespace twitch
} // namespace providers
} // namespace chatterino } // namespace chatterino
@@ -1,9 +1,10 @@
#include "singletons/helper/pubsubactions.hpp" #include "providers/twitch/pubsubactions.hpp"
#include "singletons/helper/pubsubhelpers.hpp" #include "providers/twitch/pubsubhelpers.hpp"
namespace chatterino { namespace chatterino {
namespace singletons { namespace providers {
namespace twitch {
PubSubAction::PubSubAction(const rapidjson::Value &data, const QString &_roomID) PubSubAction::PubSubAction(const rapidjson::Value &data, const QString &_roomID)
: timestamp(std::chrono::steady_clock::now()) : timestamp(std::chrono::steady_clock::now())
@@ -12,5 +13,6 @@ PubSubAction::PubSubAction(const rapidjson::Value &data, const QString &_roomID)
getCreatedByUser(data, this->source); getCreatedByUser(data, this->source);
} }
} // namespace singletons } // namespace twitch
} // namespace providers
} // namespace chatterino } // namespace chatterino
@@ -1,14 +1,14 @@
#pragma once #pragma once
#include <rapidjson/document.h> #include <rapidjson/document.h>
#include <QString> #include <QString>
#include <chrono> #include <chrono>
#include <cinttypes> #include <cinttypes>
namespace chatterino { namespace chatterino {
namespace singletons { namespace providers {
namespace twitch {
struct ActionUser { struct ActionUser {
QString id; QString id;
@@ -91,5 +91,6 @@ struct ModerationStateAction : PubSubAction {
bool modded; bool modded;
}; };
} // namespace singletons } // namespace twitch
} // namespace providers
} // namespace chatterino } // namespace chatterino
@@ -1,11 +1,12 @@
#include "singletons/helper/pubsubhelpers.hpp" #include "providers/twitch/pubsubhelpers.hpp"
#include "providers/twitch/pubsubactions.hpp"
#include "singletons/accountmanager.hpp" #include "singletons/accountmanager.hpp"
#include "singletons/helper/pubsubactions.hpp"
#include "util/rapidjson-helpers.hpp" #include "util/rapidjson-helpers.hpp"
namespace chatterino { namespace chatterino {
namespace singletons { namespace providers {
namespace twitch {
const rapidjson::Value &getArgs(const rapidjson::Value &data) const rapidjson::Value &getArgs(const rapidjson::Value &data)
{ {
@@ -85,5 +86,6 @@ rapidjson::Document CreateUnlistenMessage(const std::vector<std::string> &topics
return msg; return msg;
} }
} // namespace singletons } // namespace twitch
} // namespace providers
} // namespace chatterino } // namespace chatterino
@@ -10,7 +10,8 @@
#include <memory> #include <memory>
namespace chatterino { namespace chatterino {
namespace singletons { namespace providers {
namespace twitch {
struct ActionUser; struct ActionUser;
@@ -59,5 +60,6 @@ void RunAfter(std::shared_ptr<boost::asio::steady_timer> timer, Duration duratio
}); });
} }
} // namespace singletons } // namespace twitch
} // namespace providers
} // namespace chatterino } // namespace chatterino
+3 -2
View File
@@ -1,12 +1,13 @@
#include "providers/twitch/twitchchannel.hpp" #include "providers/twitch/twitchchannel.hpp"
#include "common.hpp" #include "common.hpp"
#include "debug/log.hpp" #include "debug/log.hpp"
#include "messages/message.hpp" #include "messages/message.hpp"
#include "providers/twitch/pubsub.hpp"
#include "providers/twitch/twitchmessagebuilder.hpp" #include "providers/twitch/twitchmessagebuilder.hpp"
#include "singletons/accountmanager.hpp" #include "singletons/accountmanager.hpp"
#include "singletons/emotemanager.hpp" #include "singletons/emotemanager.hpp"
#include "singletons/ircmanager.hpp" #include "singletons/ircmanager.hpp"
#include "singletons/pubsubmanager.hpp"
#include "singletons/settingsmanager.hpp" #include "singletons/settingsmanager.hpp"
#include "util/posttothread.hpp" #include "util/posttothread.hpp"
#include "util/urlfetch.hpp" #include "util/urlfetch.hpp"
@@ -57,7 +58,7 @@ TwitchChannel::TwitchChannel(const QString &channelName, Communi::IrcConnection
auto account = app->accounts->Twitch.getCurrent(); auto account = app->accounts->Twitch.getCurrent();
if (account && !account->getUserId().isEmpty()) { if (account && !account->getUserId().isEmpty()) {
app->pubsub->ListenToChannelModerationActions(this->roomID, account); app->twitch.pubsub->ListenToChannelModerationActions(this->roomID, account);
} }
}; };