diff --git a/CHANGELOG.md b/CHANGELOG.md index b254bc6b..41bb85ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,7 @@ - Minor: Made join and part message have links to usercards. (#3358) - Minor: Show picked outcome in prediction badges. (#3357) - Minor: Add support for Emoji in IRC (#3354) +- Minor: Added logging to experimental IRC (#2996) - Minor: Moved `/live` logs to its own subdirectory. (Logs from before this change will still be available in `Channels -> live`). (#3393) - Minor: Added clear button to settings search bar. (#3403) - Minor: Added autocompletion for default Twitch commands starting with the dot (e.g. `.mods` which does the same as `/mods`). (#3144) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index fda32f4f..374035e2 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -3,6 +3,8 @@ #include "Application.hpp" #include "messages/Message.hpp" #include "messages/MessageBuilder.hpp" +#include "providers/irc/IrcChannel2.hpp" +#include "providers/irc/IrcServer.hpp" #include "providers/twitch/IrcMessageHandler.hpp" #include "singletons/Emotes.hpp" #include "singletons/Logging.hpp" @@ -81,11 +83,20 @@ void Channel::addMessage(MessagePtr message, auto app = getApp(); MessagePtr deleted; - // FOURTF: change this when adding more providers - if (this->isTwitchChannel() && - (!overridingFlags || !overridingFlags->has(MessageFlag::DoNotLog))) + if (!overridingFlags || !overridingFlags->has(MessageFlag::DoNotLog)) { - app->logging->addMessage(this->name_, message); + QString channelPlatform("other"); + if (this->type_ == Type::Irc) + { + auto irc = static_cast(this); + channelPlatform = + QString("irc-%1").arg(irc->server()->userFriendlyIdentifier()); + } + else if (this->isTwitchChannel()) + { + channelPlatform = "twitch"; + } + app->logging->addMessage(this->name_, message, channelPlatform); } if (this->messages_.pushBack(message, deleted)) diff --git a/src/providers/irc/IrcServer.cpp b/src/providers/irc/IrcServer.cpp index 91c1bfda..a6fc8efd 100644 --- a/src/providers/irc/IrcServer.cpp +++ b/src/providers/irc/IrcServer.cpp @@ -58,6 +58,11 @@ const QString &IrcServer::nick() return this->data_->nick.isEmpty() ? this->data_->user : this->data_->nick; } +const QString &IrcServer::userFriendlyIdentifier() +{ + return this->data_->host; +} + void IrcServer::initializeConnectionSignals(IrcConnection *connection, ConnectionType type) { diff --git a/src/providers/irc/IrcServer.hpp b/src/providers/irc/IrcServer.hpp index 6c1251fa..9ebc8b90 100644 --- a/src/providers/irc/IrcServer.hpp +++ b/src/providers/irc/IrcServer.hpp @@ -18,6 +18,7 @@ public: int id(); const QString &user(); const QString &nick(); + const QString &userFriendlyIdentifier(); // AbstractIrcServer interface protected: diff --git a/src/singletons/Logging.cpp b/src/singletons/Logging.cpp index d78241f0..372c5820 100644 --- a/src/singletons/Logging.cpp +++ b/src/singletons/Logging.cpp @@ -3,11 +3,14 @@ #include "Application.hpp" #include "singletons/Paths.hpp" #include "singletons/Settings.hpp" +#include "singletons/helper/LoggingChannel.hpp" #include #include +#include #include +#include namespace chatterino { @@ -15,24 +18,35 @@ void Logging::initialize(Settings &settings, Paths &paths) { } -void Logging::addMessage(const QString &channelName, MessagePtr message) +void Logging::addMessage(const QString &channelName, MessagePtr message, + const QString &platformName) { if (!getSettings()->enableLogging) { return; } - auto it = this->loggingChannels_.find(channelName); - if (it == this->loggingChannels_.end()) + auto platIt = this->loggingChannels_.find(platformName); + if (platIt == this->loggingChannels_.end()) { - auto channel = new LoggingChannel(channelName); + auto channel = new LoggingChannel(channelName, platformName); channel->addMessage(message); - this->loggingChannels_.emplace( - channelName, std::unique_ptr(std::move(channel))); + auto map = std::map>(); + this->loggingChannels_[platformName] = std::move(map); + auto &ref = this->loggingChannels_.at(platformName); + ref.emplace(channelName, std::move(channel)); + return; + } + auto chanIt = platIt->second.find(channelName); + if (chanIt == platIt->second.end()) + { + auto channel = new LoggingChannel(channelName, platformName); + channel->addMessage(message); + platIt->second.emplace(channelName, std::move(channel)); } else { - it->second->addMessage(message); + chanIt->second->addMessage(message); } } diff --git a/src/singletons/Logging.hpp b/src/singletons/Logging.hpp index 98c6c835..5cca957e 100644 --- a/src/singletons/Logging.hpp +++ b/src/singletons/Logging.hpp @@ -20,10 +20,15 @@ public: virtual void initialize(Settings &settings, Paths &paths) override; - void addMessage(const QString &channelName, MessagePtr message); + void addMessage(const QString &channelName, MessagePtr message, + const QString &platformName); private: - std::map> loggingChannels_; + using PlatformName = QString; + using ChannelName = QString; + std::map>> + loggingChannels_; }; } // namespace chatterino diff --git a/src/singletons/helper/LoggingChannel.cpp b/src/singletons/helper/LoggingChannel.cpp index 43ca5774..54dac7f7 100644 --- a/src/singletons/helper/LoggingChannel.cpp +++ b/src/singletons/helper/LoggingChannel.cpp @@ -13,8 +13,10 @@ namespace chatterino { QByteArray endline("\n"); -LoggingChannel::LoggingChannel(const QString &_channelName) +LoggingChannel::LoggingChannel(const QString &_channelName, + const QString &_platform) : channelName(_channelName) + , platform(_platform) { if (this->channelName.startsWith("/whispers")) { @@ -34,8 +36,9 @@ LoggingChannel::LoggingChannel(const QString &_channelName) QStringLiteral("Channels") + QDir::separator() + channelName; } - // FOURTF: change this when adding more providers - this->subDirectory = "Twitch/" + this->subDirectory; + // enforce capitalized platform names + this->subDirectory = platform[0].toUpper() + platform.mid(1).toLower() + + QDir::separator() + this->subDirectory; getSettings()->logPath.connect([this](const QString &logPath, auto) { this->baseDirectory = diff --git a/src/singletons/helper/LoggingChannel.hpp b/src/singletons/helper/LoggingChannel.hpp index 1a29a0c6..e189995d 100644 --- a/src/singletons/helper/LoggingChannel.hpp +++ b/src/singletons/helper/LoggingChannel.hpp @@ -15,7 +15,8 @@ class Logging; class LoggingChannel : boost::noncopyable { - explicit LoggingChannel(const QString &_channelName); + explicit LoggingChannel(const QString &_channelName, + const QString &platform); public: ~LoggingChannel(); @@ -34,6 +35,7 @@ private: QString generateDateString(const QDateTime &now); const QString channelName; + const QString platform; QString baseDirectory; QString subDirectory;