mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
feat: make raid entry username clickable (#5651)
This commit is contained in:
parent
dab97b3235
commit
fb787b5226
4 changed files with 113 additions and 1 deletions
|
@ -36,6 +36,7 @@
|
||||||
- Minor: Added `--login <username>` CLI argument to specify which account to start logged in as. (#5626)
|
- Minor: Added `--login <username>` CLI argument to specify which account to start logged in as. (#5626)
|
||||||
- Minor: Indicate when subscriptions and resubscriptions are for multiple months. (#5642)
|
- Minor: Indicate when subscriptions and resubscriptions are for multiple months. (#5642)
|
||||||
- Minor: Proxy URL information is now included in the `/debug-env` command. (#5648)
|
- Minor: Proxy URL information is now included in the `/debug-env` command. (#5648)
|
||||||
|
- Minor: Make raid entry message usernames clickable. (#5651)
|
||||||
- Bugfix: Fixed tab move animation occasionally failing to start after closing a tab. (#5426, #5612)
|
- Bugfix: Fixed tab move animation occasionally failing to start after closing a tab. (#5426, #5612)
|
||||||
- Bugfix: If a network request errors with 200 OK, Qt's error code is now reported instead of the HTTP status. (#5378)
|
- Bugfix: If a network request errors with 200 OK, Qt's error code is now reported instead of the HTTP status. (#5378)
|
||||||
- Bugfix: Fixed restricted users usernames not being clickable. (#5405)
|
- Bugfix: Fixed restricted users usernames not being clickable. (#5405)
|
||||||
|
|
|
@ -461,6 +461,35 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text,
|
||||||
this->message().searchText = text;
|
this->message().searchText = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MessageBuilder::MessageBuilder(RaidEntryMessageTag, const QString &text,
|
||||||
|
const QString &loginName,
|
||||||
|
const QString &displayName,
|
||||||
|
const MessageColor &userColor, const QTime &time)
|
||||||
|
: MessageBuilder()
|
||||||
|
{
|
||||||
|
this->emplace<TimestampElement>(time);
|
||||||
|
|
||||||
|
const QStringList textFragments =
|
||||||
|
text.split(QRegularExpression("\\s"), Qt::SkipEmptyParts);
|
||||||
|
for (const auto &word : textFragments)
|
||||||
|
{
|
||||||
|
if (word == displayName)
|
||||||
|
{
|
||||||
|
this->emplace<MentionElement>(displayName, loginName,
|
||||||
|
MessageColor::System, userColor);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->emplace<TextElement>(word, MessageElementFlag::Text,
|
||||||
|
MessageColor::System);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->message().flags.set(MessageFlag::System);
|
||||||
|
this->message().flags.set(MessageFlag::DoNotTriggerNotification);
|
||||||
|
this->message().messageText = text;
|
||||||
|
this->message().searchText = text;
|
||||||
|
}
|
||||||
|
|
||||||
MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &timeoutUser,
|
MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &timeoutUser,
|
||||||
const QString &sourceUser,
|
const QString &sourceUser,
|
||||||
const QString &systemMessageText, int times,
|
const QString &systemMessageText, int times,
|
||||||
|
|
|
@ -53,6 +53,8 @@ namespace linkparser {
|
||||||
|
|
||||||
struct SystemMessageTag {
|
struct SystemMessageTag {
|
||||||
};
|
};
|
||||||
|
struct RaidEntryMessageTag {
|
||||||
|
};
|
||||||
struct TimeoutMessageTag {
|
struct TimeoutMessageTag {
|
||||||
};
|
};
|
||||||
struct LiveUpdatesUpdateEmoteMessageTag {
|
struct LiveUpdatesUpdateEmoteMessageTag {
|
||||||
|
@ -67,6 +69,7 @@ struct ImageUploaderResultTag {
|
||||||
};
|
};
|
||||||
|
|
||||||
const SystemMessageTag systemMessage{};
|
const SystemMessageTag systemMessage{};
|
||||||
|
const RaidEntryMessageTag raidEntryMessage{};
|
||||||
const TimeoutMessageTag timeoutMessage{};
|
const TimeoutMessageTag timeoutMessage{};
|
||||||
const LiveUpdatesUpdateEmoteMessageTag liveUpdatesUpdateEmoteMessage{};
|
const LiveUpdatesUpdateEmoteMessageTag liveUpdatesUpdateEmoteMessage{};
|
||||||
const LiveUpdatesRemoveEmoteMessageTag liveUpdatesRemoveEmoteMessage{};
|
const LiveUpdatesRemoveEmoteMessageTag liveUpdatesRemoveEmoteMessage{};
|
||||||
|
@ -109,6 +112,9 @@ public:
|
||||||
|
|
||||||
MessageBuilder(SystemMessageTag, const QString &text,
|
MessageBuilder(SystemMessageTag, const QString &text,
|
||||||
const QTime &time = QTime::currentTime());
|
const QTime &time = QTime::currentTime());
|
||||||
|
MessageBuilder(RaidEntryMessageTag, const QString &text,
|
||||||
|
const QString &loginName, const QString &displayName,
|
||||||
|
const MessageColor &userColor, const QTime &time);
|
||||||
MessageBuilder(TimeoutMessageTag, const QString &timeoutUser,
|
MessageBuilder(TimeoutMessageTag, const QString &timeoutUser,
|
||||||
const QString &sourceUser, const QString &systemMessageText,
|
const QString &sourceUser, const QString &systemMessageText,
|
||||||
int times, const QTime &time = QTime::currentTime());
|
int times, const QTime &time = QTime::currentTime());
|
||||||
|
|
|
@ -531,6 +531,35 @@ std::vector<MessagePtr> parseUserNoticeMessage(Channel *channel,
|
||||||
{
|
{
|
||||||
messageText = "Announcement";
|
messageText = "Announcement";
|
||||||
}
|
}
|
||||||
|
else if (msgType == "raid")
|
||||||
|
{
|
||||||
|
auto login = tags.value("login").toString();
|
||||||
|
auto displayName = tags.value("msg-param-displayName").toString();
|
||||||
|
|
||||||
|
if (!login.isEmpty() && !displayName.isEmpty())
|
||||||
|
{
|
||||||
|
MessageColor color = MessageColor::System;
|
||||||
|
if (auto colorTag = tags.value("color").value<QColor>();
|
||||||
|
colorTag.isValid())
|
||||||
|
{
|
||||||
|
color = MessageColor(colorTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto b = MessageBuilder(
|
||||||
|
raidEntryMessage, parseTagString(messageText), login,
|
||||||
|
displayName, color, calculateMessageTime(message).time());
|
||||||
|
|
||||||
|
b->flags.set(MessageFlag::Subscription);
|
||||||
|
if (mirrored)
|
||||||
|
{
|
||||||
|
b->flags.set(MessageFlag::SharedMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto newMessage = b.release();
|
||||||
|
builtMessages.emplace_back(newMessage);
|
||||||
|
return builtMessages;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (msgType == "subgift")
|
else if (msgType == "subgift")
|
||||||
{
|
{
|
||||||
if (auto monthsIt = tags.find("msg-param-gift-months");
|
if (auto monthsIt = tags.find("msg-param-gift-months");
|
||||||
|
@ -600,12 +629,12 @@ std::vector<MessagePtr> parseUserNoticeMessage(Channel *channel,
|
||||||
|
|
||||||
auto b = MessageBuilder(systemMessage, parseTagString(messageText),
|
auto b = MessageBuilder(systemMessage, parseTagString(messageText),
|
||||||
calculateMessageTime(message).time());
|
calculateMessageTime(message).time());
|
||||||
|
|
||||||
b->flags.set(MessageFlag::Subscription);
|
b->flags.set(MessageFlag::Subscription);
|
||||||
if (mirrored)
|
if (mirrored)
|
||||||
{
|
{
|
||||||
b->flags.set(MessageFlag::SharedMessage);
|
b->flags.set(MessageFlag::SharedMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto newMessage = b.release();
|
auto newMessage = b.release();
|
||||||
builtMessages.emplace_back(newMessage);
|
builtMessages.emplace_back(newMessage);
|
||||||
}
|
}
|
||||||
|
@ -1085,6 +1114,53 @@ void IrcMessageHandler::handleUserNoticeMessage(Communi::IrcMessage *message,
|
||||||
{
|
{
|
||||||
messageText = "Announcement";
|
messageText = "Announcement";
|
||||||
}
|
}
|
||||||
|
else if (msgType == "raid")
|
||||||
|
{
|
||||||
|
auto login = tags.value("login").toString();
|
||||||
|
auto displayName = tags.value("msg-param-displayName").toString();
|
||||||
|
|
||||||
|
if (!login.isEmpty() && !displayName.isEmpty())
|
||||||
|
{
|
||||||
|
MessageColor color = MessageColor::System;
|
||||||
|
if (auto colorTag = tags.value("color").value<QColor>();
|
||||||
|
colorTag.isValid())
|
||||||
|
{
|
||||||
|
color = MessageColor(colorTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto b = MessageBuilder(
|
||||||
|
raidEntryMessage, parseTagString(messageText), login,
|
||||||
|
displayName, color, calculateMessageTime(message).time());
|
||||||
|
|
||||||
|
b->flags.set(MessageFlag::Subscription);
|
||||||
|
if (mirrored)
|
||||||
|
{
|
||||||
|
b->flags.set(MessageFlag::SharedMessage);
|
||||||
|
}
|
||||||
|
auto newMessage = b.release();
|
||||||
|
|
||||||
|
QString channelName;
|
||||||
|
|
||||||
|
if (message->parameters().size() < 1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!trimChannelName(message->parameter(0), channelName))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto chan = twitchServer.getChannelOrEmpty(channelName);
|
||||||
|
|
||||||
|
if (!chan->isEmpty())
|
||||||
|
{
|
||||||
|
chan->addMessage(newMessage, MessageContext::Original);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (msgType == "subgift")
|
else if (msgType == "subgift")
|
||||||
{
|
{
|
||||||
if (auto monthsIt = tags.find("msg-param-gift-months");
|
if (auto monthsIt = tags.find("msg-param-gift-months");
|
||||||
|
|
Loading…
Reference in a new issue