From f58ee01cf5aff2d1cc63f91d32c44f00d2307f93 Mon Sep 17 00:00:00 2001 From: fourtf Date: Sat, 21 Apr 2018 00:40:17 +0200 Subject: [PATCH] channels now PART when they are destroyed --- src/providers/irc/abstractircserver.cpp | 20 ++++++++++----- src/providers/irc/abstractircserver.hpp | 6 ++--- src/providers/twitch/ircmessagehandler.cpp | 27 +++++++++++++++----- src/providers/twitch/twitchserver.cpp | 6 ++--- src/providers/twitch/twitchserver.hpp | 2 +- src/singletons/nativemessagingmanager.cpp | 2 +- src/singletons/windowmanager.cpp | 2 +- src/widgets/selectchanneldialog.cpp | 2 +- src/widgets/settingspages/appearancepage.cpp | 5 +++- 9 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/providers/irc/abstractircserver.cpp b/src/providers/irc/abstractircserver.cpp index 30372f4b7..266279cc3 100644 --- a/src/providers/irc/abstractircserver.cpp +++ b/src/providers/irc/abstractircserver.cpp @@ -95,12 +95,12 @@ void AbstractIrcServer::writeConnectionMessageReceived(Communi::IrcMessage *mess { } -std::shared_ptr AbstractIrcServer::addChannel(const QString &dirtyChannelName) +std::shared_ptr AbstractIrcServer::getOrAddChannel(const QString &dirtyChannelName) { - auto channelName = this->CleanChannelName(dirtyChannelName); + auto channelName = this->cleanChannelName(dirtyChannelName); // try get channel - ChannelPtr chan = this->getChannel(channelName); + ChannelPtr chan = this->getChannelOrEmpty(channelName); if (chan != Channel::getEmpty()) { return chan; } @@ -121,6 +121,14 @@ std::shared_ptr AbstractIrcServer::addChannel(const QString &dirtyChann debug::Log("[AbstractIrcServer::addChannel] {} was destroyed", clojuresInCppAreShit); this->channels.remove(clojuresInCppAreShit); + + if (this->readConnection) { + this->readConnection->sendRaw("PART #" + clojuresInCppAreShit); + } + + if (this->writeConnection) { + this->writeConnection->sendRaw("PART #" + clojuresInCppAreShit); + } }); // join irc channel @@ -139,9 +147,9 @@ std::shared_ptr AbstractIrcServer::addChannel(const QString &dirtyChann return chan; } -std::shared_ptr AbstractIrcServer::getChannel(const QString &dirtyChannelName) +std::shared_ptr AbstractIrcServer::getChannelOrEmpty(const QString &dirtyChannelName) { - auto channelName = this->CleanChannelName(dirtyChannelName); + auto channelName = this->cleanChannelName(dirtyChannelName); std::lock_guard lock(this->channelMutex); @@ -214,7 +222,7 @@ std::shared_ptr AbstractIrcServer::getCustomChannel(const QString &chan return nullptr; } -QString AbstractIrcServer::CleanChannelName(const QString &dirtyChannelName) +QString AbstractIrcServer::cleanChannelName(const QString &dirtyChannelName) { return dirtyChannelName; } diff --git a/src/providers/irc/abstractircserver.hpp b/src/providers/irc/abstractircserver.hpp index 277e9b566..ac4b0274b 100644 --- a/src/providers/irc/abstractircserver.hpp +++ b/src/providers/irc/abstractircserver.hpp @@ -27,8 +27,8 @@ public: void sendMessage(const QString &channelName, const QString &message); // channels - std::shared_ptr addChannel(const QString &dirtyChannelName); - std::shared_ptr getChannel(const QString &dirtyChannelName); + std::shared_ptr getOrAddChannel(const QString &dirtyChannelName); + std::shared_ptr getChannelOrEmpty(const QString &dirtyChannelName); // signals pajlada::Signals::NoArgSignal connected; @@ -56,7 +56,7 @@ protected: virtual std::shared_ptr getCustomChannel(const QString &channelName); - virtual QString CleanChannelName(const QString &dirtyChannelName); + virtual QString cleanChannelName(const QString &dirtyChannelName); QMap> channels; std::mutex channelMutex; diff --git a/src/providers/twitch/ircmessagehandler.cpp b/src/providers/twitch/ircmessagehandler.cpp index 27ba627c9..4d62cdce2 100644 --- a/src/providers/twitch/ircmessagehandler.cpp +++ b/src/providers/twitch/ircmessagehandler.cpp @@ -39,7 +39,11 @@ void IrcMessageHandler::handleRoomStateMessage(Communi::IrcMessage *message) QString channelName = words.at(1); - auto channel = TwitchServer::getInstance().getChannel(channelName); + auto channel = TwitchServer::getInstance().getChannelOrEmpty(channelName); + + if (channel->isEmpty()) { + return; + } if (auto twitchChannel = dynamic_cast(channel.get())) { // set the room id of the channel @@ -63,9 +67,9 @@ void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message) } // get channel - auto chan = TwitchServer::getInstance().getChannel(chanName); + auto chan = TwitchServer::getInstance().getChannelOrEmpty(chanName); - if (!chan) { + if (chan->isEmpty()) { debug::Log("[IrcMessageHandler:handleClearChatMessage] Twitch channel {} not found", chanName); return; @@ -133,7 +137,11 @@ void IrcMessageHandler::handleUserStateMessage(Communi::IrcMessage *message) return; } - auto c = TwitchServer::getInstance().getChannel(channelName); + auto c = TwitchServer::getInstance().getChannelOrEmpty(channelName); + if (c->isEmpty()) { + return; + } + twitch::TwitchChannel *tc = dynamic_cast(c.get()); if (tc != nullptr) { tc->setMod(_mod == "1"); @@ -177,7 +185,12 @@ void IrcMessageHandler::handleUserNoticeMessage(Communi::IrcMessage *message) void IrcMessageHandler::handleModeMessage(Communi::IrcMessage *message) { - auto channel = TwitchServer::getInstance().getChannel(message->parameter(0).remove(0, 1)); + auto channel = + TwitchServer::getInstance().getChannelOrEmpty(message->parameter(0).remove(0, 1)); + + if (channel->isEmpty()) { + return; + } if (message->parameter(1) == "+o") { channel->modList.append(message->parameter(2)); @@ -200,9 +213,9 @@ void IrcMessageHandler::handleNoticeMessage(Communi::IrcNoticeMessage *message) return; } - auto channel = TwitchServer::getInstance().getChannel(channelName); + auto channel = TwitchServer::getInstance().getChannelOrEmpty(channelName); - if (!channel) { + if (channel->isEmpty()) { debug::Log("[IrcManager:handleNoticeMessage] Channel {} not found in channel manager", channelName); return; diff --git a/src/providers/twitch/twitchserver.cpp b/src/providers/twitch/twitchserver.cpp index fb808af6f..a013481ed 100644 --- a/src/providers/twitch/twitchserver.cpp +++ b/src/providers/twitch/twitchserver.cpp @@ -81,9 +81,9 @@ void TwitchServer::privateMessageReceived(IrcPrivateMessage *message) } this->onPrivateMessage.invoke(message); - auto chan = TwitchServer::getInstance().getChannel(channelName); + auto chan = TwitchServer::getInstance().getChannelOrEmpty(channelName); - if (!chan) { + if (chan->isEmpty()) { return; } @@ -169,7 +169,7 @@ void TwitchServer::forEachChannelAndSpecialChannels(std::functionmentionsChannel); } -QString TwitchServer::CleanChannelName(const QString &dirtyChannelName) +QString TwitchServer::cleanChannelName(const QString &dirtyChannelName) { return dirtyChannelName.toLower(); } diff --git a/src/providers/twitch/twitchserver.hpp b/src/providers/twitch/twitchserver.hpp index d29ed847a..c529fc610 100644 --- a/src/providers/twitch/twitchserver.hpp +++ b/src/providers/twitch/twitchserver.hpp @@ -35,7 +35,7 @@ protected: std::shared_ptr getCustomChannel(const QString &channelname) override; - QString CleanChannelName(const QString &dirtyChannelName) override; + QString cleanChannelName(const QString &dirtyChannelName) override; }; } // namespace twitch diff --git a/src/singletons/nativemessagingmanager.cpp b/src/singletons/nativemessagingmanager.cpp index f827e3060..369d41ec8 100644 --- a/src/singletons/nativemessagingmanager.cpp +++ b/src/singletons/nativemessagingmanager.cpp @@ -146,7 +146,7 @@ void NativeMessagingManager::ReceiverThread::handleMessage(const QJsonObject &ro util::postToThread([name] { auto &ts = providers::twitch::TwitchServer::getInstance(); - ts.watchingChannel.update(ts.addChannel(name)); + ts.watchingChannel.update(ts.getOrAddChannel(name)); }); } else { qDebug() << "NM unknown channel type"; diff --git a/src/singletons/windowmanager.cpp b/src/singletons/windowmanager.cpp index af4e59741..50d66e503 100644 --- a/src/singletons/windowmanager.cpp +++ b/src/singletons/windowmanager.cpp @@ -317,7 +317,7 @@ IndirectChannel WindowManager::decodeChannel(const QJsonObject &obj) { QString type = obj.value("type").toString(); if (type == "twitch") { - return providers::twitch::TwitchServer::getInstance().addChannel( + return providers::twitch::TwitchServer::getInstance().getOrAddChannel( obj.value("name").toString()); } else if (type == "mentions") { return providers::twitch::TwitchServer::getInstance().mentionsChannel; diff --git a/src/widgets/selectchanneldialog.cpp b/src/widgets/selectchanneldialog.cpp index 580a02469..7bce0fe4f 100644 --- a/src/widgets/selectchanneldialog.cpp +++ b/src/widgets/selectchanneldialog.cpp @@ -182,7 +182,7 @@ IndirectChannel SelectChannelDialog::getSelectedChannel() const switch (this->ui.notebook->getSelectedIndex()) { case TAB_TWITCH: { if (this->ui.twitch.channel->isChecked()) { - return providers::twitch::TwitchServer::getInstance().addChannel( + return providers::twitch::TwitchServer::getInstance().getOrAddChannel( this->ui.twitch.channelName->text()); } else if (this->ui.twitch.watching->isChecked()) { return providers::twitch::TwitchServer::getInstance().watchingChannel; diff --git a/src/widgets/settingspages/appearancepage.cpp b/src/widgets/settingspages/appearancepage.cpp index 997167ddb..d2db2c749 100644 --- a/src/widgets/settingspages/appearancepage.cpp +++ b/src/widgets/settingspages/appearancepage.cpp @@ -64,7 +64,10 @@ AppearancePage::AppearancePage() tbox.append(this->createComboBox({TIMESTAMP_FORMATS}, settings.timestampFormat)); tbox->addStretch(1); } - messages.append(this->createCheckBox("Show badges", settings.showBadges)); + + auto checkbox = this->createCheckBox("Show badges", settings.showBadges); + checkbox->setEnabled(false); + messages.append(checkbox); messages.append(this->createCheckBox("Seperate messages", settings.seperateMessages)); messages.append( this->createCheckBox("Show message length while typing", settings.showMessageLength));