feat: Live Emote Updates for 7TV (#4090)
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
@@ -23,6 +23,45 @@ QRegularExpression IRC_COLOR_PARSE_REGEX(
|
||||
"(\u0003(\\d{1,2})?(,(\\d{1,2}))?|\u000f)",
|
||||
QRegularExpression::UseUnicodePropertiesOption);
|
||||
|
||||
QString formatUpdatedEmoteList(const QString &platform,
|
||||
const std::vector<QString> &emoteNames,
|
||||
bool isAdd, bool isFirstWord)
|
||||
{
|
||||
QString text = "";
|
||||
if (isAdd)
|
||||
{
|
||||
text += isFirstWord ? "Added" : "added";
|
||||
}
|
||||
else
|
||||
{
|
||||
text += isFirstWord ? "Removed" : "removed";
|
||||
}
|
||||
|
||||
if (emoteNames.size() == 1)
|
||||
{
|
||||
text += QString(" %1 emote ").arg(platform);
|
||||
}
|
||||
else
|
||||
{
|
||||
text += QString(" %1 %2 emotes ").arg(emoteNames.size()).arg(platform);
|
||||
}
|
||||
|
||||
auto i = 0;
|
||||
for (const auto &emoteName : emoteNames)
|
||||
{
|
||||
i++;
|
||||
if (i > 1)
|
||||
{
|
||||
text += i == emoteNames.size() ? " and " : ", ";
|
||||
}
|
||||
text += emoteName;
|
||||
}
|
||||
|
||||
text += ".";
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace chatterino {
|
||||
@@ -473,6 +512,133 @@ MessageBuilder::MessageBuilder(const AutomodUserAction &action)
|
||||
MessageColor::System);
|
||||
}
|
||||
|
||||
MessageBuilder::MessageBuilder(LiveUpdatesAddEmoteMessageTag /*unused*/,
|
||||
const QString &platform, const QString &actor,
|
||||
const std::vector<QString> &emoteNames)
|
||||
: MessageBuilder()
|
||||
{
|
||||
auto text =
|
||||
formatUpdatedEmoteList(platform, emoteNames, true, actor.isEmpty());
|
||||
|
||||
this->emplace<TimestampElement>();
|
||||
if (!actor.isEmpty())
|
||||
{
|
||||
this->emplace<TextElement>(actor, MessageElementFlag::Username,
|
||||
MessageColor::System)
|
||||
->setLink({Link::UserInfo, actor});
|
||||
}
|
||||
this->emplace<TextElement>(text, MessageElementFlag::Text,
|
||||
MessageColor::System);
|
||||
|
||||
QString finalText;
|
||||
if (actor.isEmpty())
|
||||
{
|
||||
finalText = text;
|
||||
}
|
||||
else
|
||||
{
|
||||
finalText = QString("%1 %2").arg(actor, text);
|
||||
}
|
||||
|
||||
this->message().loginName = actor;
|
||||
this->message().messageText = finalText;
|
||||
this->message().searchText = finalText;
|
||||
|
||||
this->message().flags.set(MessageFlag::System);
|
||||
this->message().flags.set(MessageFlag::LiveUpdatesAdd);
|
||||
this->message().flags.set(MessageFlag::DoNotTriggerNotification);
|
||||
}
|
||||
|
||||
MessageBuilder::MessageBuilder(LiveUpdatesRemoveEmoteMessageTag /*unused*/,
|
||||
const QString &platform, const QString &actor,
|
||||
const std::vector<QString> &emoteNames)
|
||||
: MessageBuilder()
|
||||
{
|
||||
auto text =
|
||||
formatUpdatedEmoteList(platform, emoteNames, false, actor.isEmpty());
|
||||
|
||||
this->emplace<TimestampElement>();
|
||||
if (!actor.isEmpty())
|
||||
{
|
||||
this->emplace<TextElement>(actor, MessageElementFlag::Username,
|
||||
MessageColor::System)
|
||||
->setLink({Link::UserInfo, actor});
|
||||
}
|
||||
this->emplace<TextElement>(text, MessageElementFlag::Text,
|
||||
MessageColor::System);
|
||||
|
||||
QString finalText;
|
||||
if (actor.isEmpty())
|
||||
{
|
||||
finalText = text;
|
||||
}
|
||||
else
|
||||
{
|
||||
finalText = QString("%1 %2").arg(actor, text);
|
||||
}
|
||||
|
||||
this->message().loginName = actor;
|
||||
this->message().messageText = finalText;
|
||||
this->message().searchText = finalText;
|
||||
|
||||
this->message().flags.set(MessageFlag::System);
|
||||
this->message().flags.set(MessageFlag::LiveUpdatesRemove);
|
||||
this->message().flags.set(MessageFlag::DoNotTriggerNotification);
|
||||
}
|
||||
|
||||
MessageBuilder::MessageBuilder(LiveUpdatesUpdateEmoteMessageTag /*unused*/,
|
||||
const QString &platform, const QString &actor,
|
||||
const QString &emoteName,
|
||||
const QString &oldEmoteName)
|
||||
: MessageBuilder()
|
||||
{
|
||||
auto text = QString("renamed %1 emote %2 to %3.")
|
||||
.arg(platform, oldEmoteName, emoteName);
|
||||
|
||||
this->emplace<TimestampElement>();
|
||||
this->emplace<TextElement>(actor, MessageElementFlag::Username,
|
||||
MessageColor::System)
|
||||
->setLink({Link::UserInfo, actor});
|
||||
this->emplace<TextElement>(text, MessageElementFlag::Text,
|
||||
MessageColor::System);
|
||||
|
||||
auto finalText = QString("%1 %2").arg(actor, text);
|
||||
|
||||
this->message().loginName = actor;
|
||||
this->message().messageText = finalText;
|
||||
this->message().searchText = finalText;
|
||||
|
||||
this->message().flags.set(MessageFlag::System);
|
||||
this->message().flags.set(MessageFlag::LiveUpdatesUpdate);
|
||||
this->message().flags.set(MessageFlag::DoNotTriggerNotification);
|
||||
}
|
||||
|
||||
MessageBuilder::MessageBuilder(LiveUpdatesUpdateEmoteSetMessageTag /*unused*/,
|
||||
const QString &platform, const QString &actor,
|
||||
const QString &emoteSetName)
|
||||
: MessageBuilder()
|
||||
{
|
||||
auto text = QString("switched the active %1 Emote Set to \"%2\".")
|
||||
.arg(platform, emoteSetName);
|
||||
|
||||
this->emplace<TimestampElement>();
|
||||
this->emplace<TextElement>(actor, MessageElementFlag::Username,
|
||||
MessageColor::System)
|
||||
->setLink({Link::UserInfo, actor});
|
||||
this->emplace<TextElement>(text, MessageElementFlag::Text,
|
||||
MessageColor::System);
|
||||
|
||||
auto finalText = QString("%1 %2").arg(actor, text);
|
||||
|
||||
this->message().loginName = actor;
|
||||
this->message().messageText = finalText;
|
||||
this->message().searchText = finalText;
|
||||
|
||||
this->message().flags.set(MessageFlag::System);
|
||||
this->message().flags.set(MessageFlag::LiveUpdatesUpdate);
|
||||
this->message().flags.set(MessageFlag::DoNotTriggerNotification);
|
||||
}
|
||||
|
||||
Message *MessageBuilder::operator->()
|
||||
{
|
||||
return this->message_.get();
|
||||
|
||||
Reference in New Issue
Block a user