diff --git a/CHANGELOG.md b/CHANGELOG.md index 83ba4bd89b3..63a699619d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Minor: The account switcher is now styled to match your theme. (#4817) - Minor: Add an invisible resize handle to the bottom of frameless user info popups and reply thread popups. (#4795) - Minor: The installer now checks for the VC Runtime version and shows more info when it's outdated. (#4847) +- Minor: The `/usercard` command now accepts user ids. (#4934) - Minor: Add menu actions to reply directly to a message or the original thread root. (#4923) - Minor: The `/reply` command now replies to the latest message of the user. (#4919) - Bugfix: Fixed an issue where certain emojis did not send to Twitch chat correctly. (#4840) diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index 2e38431afa8..de04141cbb1 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -856,7 +856,8 @@ void CommandController::initialize(Settings &, Paths &paths) if (words.size() < 2) { channel->addMessage( - makeSystemMessage("Usage: /usercard [channel]")); + makeSystemMessage("Usage: /usercard [channel] or " + "/usercard id: [channel]")); return ""; } diff --git a/src/widgets/dialogs/UserInfoPopup.cpp b/src/widgets/dialogs/UserInfoPopup.cpp index 2c48b134eef..4045ed33de2 100644 --- a/src/widgets/dialogs/UserInfoPopup.cpp +++ b/src/widgets/dialogs/UserInfoPopup.cpp @@ -701,7 +701,18 @@ void UserInfoPopup::setData(const QString &name, const ChannelPtr &contextChannel, const ChannelPtr &openingChannel) { - this->userName_ = name; + const QStringView idPrefix = u"id:"; + bool isId = name.startsWith(idPrefix); + if (isId) + { + this->userId_ = name.mid(idPrefix.size()); + this->userName_ = ""; + } + else + { + this->userName_ = name; + } + this->channel_ = openingChannel; if (!contextChannel->isEmpty()) @@ -723,7 +734,11 @@ void UserInfoPopup::setData(const QString &name, this->userStateChanged_.invoke(); - this->updateLatestMessages(); + if (!isId) + { + this->updateLatestMessages(); + } + // If we're opening by ID, this will be called as soon as we get the information from twitch } void UserInfoPopup::updateLatestMessages() @@ -792,6 +807,14 @@ void UserInfoPopup::updateUserData() return; } + // Correct for when being opened with ID + if (this->userName_.isEmpty()) + { + this->userName_ = user.login; + // Ensure recent messages are shown + this->updateLatestMessages(); + } + this->userId_ = user.id; this->avatarUrl_ = user.profileImageUrl; @@ -909,8 +932,16 @@ void UserInfoPopup::updateUserData() [] {}); }; - getHelix()->getUserByName(this->userName_, onUserFetched, - onUserFetchFailed); + if (!this->userId_.isEmpty()) + { + getHelix()->getUserById(this->userId_, onUserFetched, + onUserFetchFailed); + } + else + { + getHelix()->getUserByName(this->userName_, onUserFetched, + onUserFetchFailed); + } this->ui_.block->setEnabled(false); this->ui_.ignoreHighlights->setEnabled(false);