Add ban user by id command /banid (#4411)

Co-authored-by: Felanbird <41973452+Felanbird@users.noreply.github.com>
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
This commit is contained in:
iProdigy 2023-02-26 12:03:14 -08:00 committed by GitHub
parent f9b23882f4
commit b5b85501ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 4 deletions

View file

@ -3,6 +3,7 @@
## Unversioned ## Unversioned
- Minor: Delete all but the last 5 crashdumps on application start. (#4392) - Minor: Delete all but the last 5 crashdumps on application start. (#4392)
- Minor: Added `/banid` command that allows banning by user ID. (#4411)
- Bugfix: Fixed uploaded AppImage not being able most web requests. (#4400) - Bugfix: Fixed uploaded AppImage not being able most web requests. (#4400)
- Bugfix: Fixed a potential race condition due to using the wrong lock when loading 7TV badges. (#4402) - Bugfix: Fixed a potential race condition due to using the wrong lock when loading 7TV badges. (#4402)
- Dev: Add capability to build Chatterino with Qt6. (#4393) - Dev: Add capability to build Chatterino with Qt6. (#4393)

View file

@ -2632,7 +2632,7 @@ void CommandController::initialize(Settings &, Paths &paths)
auto formatBanTimeoutError = auto formatBanTimeoutError =
[](const char *operation, HelixBanUserError error, [](const char *operation, HelixBanUserError error,
const QString &message, const QString &userDisplayName) -> QString { const QString &message, const QString &userTarget) -> QString {
using Error = HelixBanUserError; using Error = HelixBanUserError;
QString errorMessage = QString("Failed to %1 user - ").arg(operation); QString errorMessage = QString("Failed to %1 user - ").arg(operation);
@ -2659,7 +2659,7 @@ void CommandController::initialize(Settings &, Paths &paths)
case Error::TargetBanned: { case Error::TargetBanned: {
// Equivalent IRC error // Equivalent IRC error
errorMessage += QString("%1 is already banned in this channel.") errorMessage += QString("%1 is already banned in this channel.")
.arg(userDisplayName); .arg(userTarget);
} }
break; break;
@ -2669,8 +2669,8 @@ void CommandController::initialize(Settings &, Paths &paths)
// The messages from IRC are formatted like this: // The messages from IRC are formatted like this:
// "You cannot {op} moderator {mod} unless you are the owner of this channel." // "You cannot {op} moderator {mod} unless you are the owner of this channel."
// "You cannot {op} the broadcaster." // "You cannot {op} the broadcaster."
errorMessage += QString("You cannot %1 %2.") errorMessage +=
.arg(operation, userDisplayName); QString("You cannot %1 %2.").arg(operation, userTarget);
} }
break; break;
@ -2829,6 +2829,53 @@ void CommandController::initialize(Settings &, Paths &paths)
return ""; return "";
}); });
this->registerCommand("/banid", [formatBanTimeoutError](
const QStringList &words,
auto channel) {
auto *twitchChannel = dynamic_cast<TwitchChannel *>(channel.get());
if (twitchChannel == nullptr)
{
channel->addMessage(makeSystemMessage(
QString("The /banid command only works in Twitch channels")));
return "";
}
const auto *usageStr =
"Usage: \"/banid <userID> [reason]\" - Permanently prevent a user "
"from chatting via their user ID. Reason is optional and will be "
"shown to the target user and other moderators.";
if (words.size() < 2)
{
channel->addMessage(makeSystemMessage(usageStr));
return "";
}
auto currentUser = getApp()->accounts->twitch.getCurrent();
if (currentUser->isAnon())
{
channel->addMessage(
makeSystemMessage("You must be logged in to ban someone!"));
return "";
}
auto target = words.at(1);
auto reason = words.mid(2).join(' ');
getHelix()->banUser(
twitchChannel->roomId(), currentUser->getUserId(), target,
boost::none, reason,
[] {
// No response for bans, they're emitted over pubsub/IRC instead
},
[channel, target, formatBanTimeoutError](auto error, auto message) {
auto errorMessage =
formatBanTimeoutError("ban", error, message, "#" + target);
channel->addMessage(makeSystemMessage(errorMessage));
});
return "";
});
for (const auto &cmd : TWITCH_WHISPER_COMMANDS) for (const auto &cmd : TWITCH_WHISPER_COMMANDS)
{ {
this->registerCommand(cmd, [](const QStringList &words, auto channel) { this->registerCommand(cmd, [](const QStringList &words, auto channel) {