From 8ea5b49c52ed726b6a1f258a94ea5d1fb1a38ae1 Mon Sep 17 00:00:00 2001 From: nerix Date: Sun, 14 Aug 2022 15:34:32 +0200 Subject: [PATCH] fix: Mentions of "You" in timeouts will link to your own user now instead of the user "You" (#3922) * fix: link to the current user in timeouts * fix: `readability-suspicious-call-argument` * docs: add changelog entry * fix: link both users when replacing timeout * Update changelog entry Co-authored-by: Rasmus Karlsson --- CHANGELOG.md | 1 + src/common/Channel.cpp | 3 ++- src/messages/MessageBuilder.cpp | 48 ++++++++++++++++++++++++--------- src/messages/MessageBuilder.hpp | 3 ++- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52357d11..61c9df0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ - Bugfix: Always refresh tab when a contained split's channel is set. (#3849) - Bugfix: Drop trailing whitespace from Twitch system messages. (#3888) - Bugfix: Fix crash related to logging IRC channels (#3918) +- Bugfix: Mentions of "You" in timeouts will link to your own user now instead of the user "You". (#3922) - Dev: Remove official support for QMake. (#3839, #3883) - Dev: Rewrite LimitedQueue (#3798) - Dev: Overhaul highlight system by moving all checks into a Controller allowing for easier tests. (#3399, #3801, #3835) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index a74f0b53..68cc2987 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -168,7 +168,8 @@ void Channel::addOrReplaceTimeout(MessagePtr message) int count = s->count + 1; - MessageBuilder replacement(timeoutMessage, message->searchText, + MessageBuilder replacement(timeoutMessage, message->timeoutUser, + message->loginName, message->searchText, count); replacement->timeoutUser = message->timeoutUser; diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index c74615b4..d76b8b4a 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -206,24 +206,45 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text, this->message().searchText = text; } -MessageBuilder::MessageBuilder(TimeoutMessageTag, +MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &timeoutUser, + const QString &sourceUser, const QString &systemMessageText, int times, const QTime &time) : MessageBuilder() { - QString username = systemMessageText.split(" ").at(0); - QString remainder = systemMessageText.mid(username.length() + 1); - - QString text; + QString usernameText = systemMessageText.split(" ").at(0); + QString remainder = systemMessageText.mid(usernameText.length() + 1); + bool timeoutUserIsFirst = + usernameText == "You" || timeoutUser == usernameText; + QString messageText; this->emplace(time); - this->emplaceSystemTextAndUpdate(username, text) - ->setLink({Link::UserInfo, username}); - this->emplaceSystemTextAndUpdate( - QString("%1 (%2 times)").arg(remainder.trimmed()).arg(times), text); + this->emplaceSystemTextAndUpdate(usernameText, messageText) + ->setLink( + {Link::UserInfo, timeoutUserIsFirst ? timeoutUser : sourceUser}); - this->message().messageText = text; - this->message().searchText = text; + if (!sourceUser.isEmpty()) + { + // the second username in the message + const auto &targetUsername = + timeoutUserIsFirst ? sourceUser : timeoutUser; + int userPos = remainder.indexOf(targetUsername); + + QString mid = remainder.mid(0, userPos - 1); + QString username = remainder.mid(userPos, targetUsername.length()); + remainder = remainder.mid(userPos + targetUsername.length() + 1); + + this->emplaceSystemTextAndUpdate(mid, messageText); + this->emplaceSystemTextAndUpdate(username, messageText) + ->setLink({Link::UserInfo, username}); + } + + this->emplaceSystemTextAndUpdate( + QString("%1 (%2 times)").arg(remainder.trimmed()).arg(times), + messageText); + + this->message().messageText = messageText; + this->message().searchText = messageText; } MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &username, @@ -284,13 +305,16 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count) this->message().flags.set(MessageFlag::System); this->message().flags.set(MessageFlag::Timeout); this->message().timeoutUser = action.target.login; + this->message().loginName = action.source.login; this->message().count = count; QString text; if (action.target.id == current->getUserId()) { - this->emplaceSystemTextAndUpdate("You were", text); + this->emplaceSystemTextAndUpdate("You", text) + ->setLink({Link::UserInfo, current->getUserName()}); + this->emplaceSystemTextAndUpdate("were", text); if (action.isBan()) { this->emplaceSystemTextAndUpdate("banned", text); diff --git a/src/messages/MessageBuilder.hpp b/src/messages/MessageBuilder.hpp index ebbb4943..c217cf1e 100644 --- a/src/messages/MessageBuilder.hpp +++ b/src/messages/MessageBuilder.hpp @@ -44,7 +44,8 @@ public: MessageBuilder(); MessageBuilder(SystemMessageTag, const QString &text, const QTime &time = QTime::currentTime()); - MessageBuilder(TimeoutMessageTag, const QString &systemMessageText, + MessageBuilder(TimeoutMessageTag, const QString &timeoutUser, + const QString &sourceUser, const QString &systemMessageText, int times, const QTime &time = QTime::currentTime()); MessageBuilder(TimeoutMessageTag, const QString &username, const QString &durationInSeconds, bool multipleTimes,