Show historic timeouts and bans in usercard (#4760)

Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
nerix
2023-08-13 12:00:52 +02:00
committed by GitHub
parent 1e35391075
commit e7281b033e
8 changed files with 221 additions and 175 deletions
+79 -28
View File
@@ -1,4 +1,4 @@
#include "IrcMessageHandler.hpp"
#include "providers/twitch/IrcMessageHandler.hpp"
#include "Application.hpp"
#include "common/Literals.hpp"
@@ -22,6 +22,7 @@
#include "singletons/Resources.hpp"
#include "singletons/Settings.hpp"
#include "singletons/WindowManager.hpp"
#include "util/ChannelHelpers.hpp"
#include "util/FormatTime.hpp"
#include "util/Helpers.hpp"
#include "util/IrcHelpers.hpp"
@@ -377,7 +378,7 @@ void IrcMessageHandler::handlePrivMessage(Communi::IrcPrivateMessage *message,
std::vector<MessagePtr> IrcMessageHandler::parseMessageWithReply(
Channel *channel, Communi::IrcMessage *message,
const std::vector<MessagePtr> &otherLoaded)
std::vector<MessagePtr> &otherLoaded)
{
std::vector<MessagePtr> builtMessages;
@@ -416,6 +417,33 @@ std::vector<MessagePtr> IrcMessageHandler::parseMessageWithReply(
return this->parseNoticeMessage(
static_cast<Communi::IrcNoticeMessage *>(message));
}
else if (command == u"CLEARCHAT"_s)
{
auto cc = this->parseClearChatMessage(message);
if (!cc)
{
return builtMessages;
}
auto &clearChat = *cc;
if (clearChat.disableAllMessages)
{
builtMessages.emplace_back(std::move(clearChat.message));
}
else
{
addOrReplaceChannelTimeout(
otherLoaded, std::move(clearChat.message),
calculateMessageTime(message).time(),
[&](auto idx, auto /*msg*/, auto &&replacement) {
replacement->flags.set(MessageFlag::RecentMessage);
otherLoaded[idx] = replacement;
},
[&](auto &&msg) {
builtMessages.emplace_back(msg);
},
false);
}
}
return builtMessages;
}
@@ -662,40 +690,24 @@ void IrcMessageHandler::handleRoomStateMessage(Communi::IrcMessage *message)
twitchChannel->roomModesChanged.invoke();
}
void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message)
std::optional<ClearChatMessage> IrcMessageHandler::parseClearChatMessage(
Communi::IrcMessage *message)
{
// check parameter count
if (message->parameters().length() < 1)
{
return;
}
QString chanName;
if (!trimChannelName(message->parameter(0), chanName))
{
return;
}
// get channel
auto chan = getApp()->twitch->getChannelOrEmpty(chanName);
if (chan->isEmpty())
{
qCDebug(chatterinoTwitch)
<< "[IrcMessageHandler:handleClearChatMessage] Twitch channel"
<< chanName << "not found";
return;
return std::nullopt;
}
// check if the chat has been cleared by a moderator
if (message->parameters().length() == 1)
{
chan->disableAllMessages();
chan->addMessage(
makeSystemMessage("Chat has been cleared by a moderator.",
calculateMessageTime(message).time()));
return;
return ClearChatMessage{
.message =
makeSystemMessage("Chat has been cleared by a moderator.",
calculateMessageTime(message).time()),
.disableAllMessages = true,
};
}
// get username, duration and message of the timed out user
@@ -711,7 +723,46 @@ void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message)
MessageBuilder(timeoutMessage, username, durationInSeconds, false,
calculateMessageTime(message).time())
.release();
chan->addOrReplaceTimeout(timeoutMsg);
return ClearChatMessage{.message = timeoutMsg, .disableAllMessages = false};
}
void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message)
{
auto cc = this->parseClearChatMessage(message);
if (!cc)
{
return;
}
auto &clearChat = *cc;
QString chanName;
if (!trimChannelName(message->parameter(0), chanName))
{
return;
}
// get channel
auto chan = getApp()->twitch->getChannelOrEmpty(chanName);
if (chan->isEmpty())
{
qCDebug(chatterinoTwitch)
<< "[IrcMessageHandler::handleClearChatMessage] Twitch channel"
<< chanName << "not found";
return;
}
// chat has been cleared by a moderator
if (clearChat.disableAllMessages)
{
chan->disableAllMessages();
chan->addMessage(std::move(clearChat.message));
return;
}
chan->addOrReplaceTimeout(std::move(clearChat.message));
// refresh all
getApp()->windows->repaintVisibleChatWidgets(chan.get());