feat: stack /clear messages (#5806)
This commit is contained in:
@@ -53,6 +53,7 @@
|
||||
#include <QDateTime>
|
||||
#include <QDebug>
|
||||
#include <QFileInfo>
|
||||
#include <QStringBuilder>
|
||||
#include <QTimeZone>
|
||||
|
||||
#include <algorithm>
|
||||
@@ -1986,6 +1987,46 @@ MessagePtr MessageBuilder::makeLowTrustUpdateMessage(
|
||||
return builder.release();
|
||||
}
|
||||
|
||||
MessagePtrMut MessageBuilder::makeClearChatMessage(QTime now,
|
||||
const QString &actor,
|
||||
uint32_t count)
|
||||
{
|
||||
MessageBuilder builder;
|
||||
builder.emplace<TimestampElement>(now);
|
||||
builder->count = count;
|
||||
builder->parseTime = now;
|
||||
builder.message().flags.set(MessageFlag::System,
|
||||
MessageFlag::DoNotTriggerNotification,
|
||||
MessageFlag::ClearChat);
|
||||
|
||||
QString messageText;
|
||||
if (actor.isEmpty())
|
||||
{
|
||||
builder.emplaceSystemTextAndUpdate(
|
||||
"Chat has been cleared by a moderator.", messageText);
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.message().flags.set(MessageFlag::PubSub);
|
||||
builder.emplace<MentionElement>(actor, actor, MessageColor::System,
|
||||
MessageColor::System);
|
||||
messageText = actor + ' ';
|
||||
builder.emplaceSystemTextAndUpdate("cleared the chat.", messageText);
|
||||
builder->timeoutUser = actor;
|
||||
}
|
||||
|
||||
if (count > 1)
|
||||
{
|
||||
builder.emplaceSystemTextAndUpdate(
|
||||
'(' % QString::number(count) % u" times)", messageText);
|
||||
}
|
||||
|
||||
builder->messageText = messageText;
|
||||
builder->searchText = messageText;
|
||||
|
||||
return builder.release();
|
||||
}
|
||||
|
||||
std::pair<MessagePtrMut, HighlightAlert> MessageBuilder::makeIrcMessage(
|
||||
/* mutable */ Channel *channel, const Communi::IrcMessage *ircMessage,
|
||||
const MessageParseArgs &args, /* mutable */ QString content,
|
||||
|
||||
@@ -258,6 +258,12 @@ public:
|
||||
const QVariantMap &tags,
|
||||
const QTime &time);
|
||||
|
||||
/// "Chat has been cleared by a moderator." or "{actor} cleared the chat."
|
||||
/// @param actor The user who cleared the chat (empty if unknown)
|
||||
/// @param count How many times this message has been received already
|
||||
static MessagePtrMut makeClearChatMessage(QTime now, const QString &actor,
|
||||
uint32_t count = 1);
|
||||
|
||||
private:
|
||||
struct TextState {
|
||||
TwitchChannel *twitchChannel = nullptr;
|
||||
|
||||
@@ -54,6 +54,8 @@ enum class MessageFlag : std::int64_t {
|
||||
SharedMessage = (1LL << 37),
|
||||
/// AutoMod message that showed up due to containing a blocked term in the channel
|
||||
AutoModBlockedTerm = (1LL << 38),
|
||||
/// The message is a full clear chat message (/clear)
|
||||
ClearChat = (1LL << 39),
|
||||
};
|
||||
using MessageFlags = FlagsEnum<MessageFlag>;
|
||||
|
||||
|
||||
@@ -48,6 +48,11 @@ public:
|
||||
virtual void addOrReplaceTimeout(MessagePtr clearchatMessage,
|
||||
QTime now) = 0;
|
||||
|
||||
/// Adds a clear chat message (for the entire chat) or merges it into an
|
||||
/// existing one
|
||||
virtual void addOrReplaceClearChat(MessagePtr clearchatMessage,
|
||||
QTime now) = 0;
|
||||
|
||||
/// Flags all messages as `Disabled`
|
||||
virtual void disableAllMessages() = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user