move pubsub stuff to the providers/twitch namespace and folder
This commit is contained in:
+6
-5
@@ -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
@@ -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
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user