Files
chatterino2/src/controllers/commands/builtin/twitch/Raid.cpp

217 lines
5.7 KiB
C++

#include "controllers/commands/builtin/twitch/Raid.hpp"
#include "Application.hpp"
#include "controllers/accounts/AccountController.hpp"
#include "controllers/commands/CommandContext.hpp"
#include "providers/twitch/api/Helix.hpp"
#include "providers/twitch/TwitchAccount.hpp"
#include "providers/twitch/TwitchChannel.hpp"
#include "util/Twitch.hpp"
namespace {
using namespace chatterino;
QString formatStartRaidError(HelixStartRaidError error, const QString &message)
{
QString errorMessage = QString("Failed to start a raid - ");
using Error = HelixStartRaidError;
switch (error)
{
case Error::UserMissingScope: {
// TODO(pajlada): Phrase MISSING_REQUIRED_SCOPE
errorMessage += "Missing required scope. "
"Re-login with your "
"account and try again.";
}
break;
case Error::UserNotAuthorized: {
errorMessage += "You must be the broadcaster "
"to start a raid.";
}
break;
case Error::CantRaidYourself: {
errorMessage += "A channel cannot raid itself.";
}
break;
case Error::Ratelimited: {
errorMessage += "You are being ratelimited "
"by Twitch. Try "
"again in a few seconds.";
}
break;
case Error::Forwarded: {
errorMessage += message;
}
break;
case Error::Unknown:
default: {
errorMessage += "An unknown error has occurred.";
}
break;
}
return errorMessage;
}
QString formatCancelRaidError(HelixCancelRaidError error,
const QString &message)
{
QString errorMessage = QString("Failed to cancel the raid - ");
using Error = HelixCancelRaidError;
switch (error)
{
case Error::UserMissingScope: {
// TODO(pajlada): Phrase MISSING_REQUIRED_SCOPE
errorMessage += "Missing required scope. "
"Re-login with your "
"account and try again.";
}
break;
case Error::UserNotAuthorized: {
errorMessage += "You must be the broadcaster "
"to cancel the raid.";
}
break;
case Error::NoRaidPending: {
errorMessage += "You don't have an active raid.";
}
break;
case Error::Ratelimited: {
errorMessage += "You are being ratelimited by Twitch. Try "
"again in a few seconds.";
}
break;
case Error::Forwarded: {
errorMessage += message;
}
break;
case Error::Unknown:
default: {
errorMessage += "An unknown error has occurred.";
}
break;
}
return errorMessage;
}
} // namespace
namespace chatterino::commands {
QString startRaid(const CommandContext &ctx)
{
if (ctx.channel == nullptr)
{
return "";
}
if (ctx.twitchChannel == nullptr)
{
ctx.channel->addSystemMessage(
"The /raid command only works in Twitch channels.");
return "";
}
if (ctx.words.size() < 2)
{
ctx.channel->addSystemMessage(
"Usage: \"/raid <username>\" - Raid a user. "
"Only the broadcaster can start a raid.");
return "";
}
auto currentUser = getIApp()->getAccounts()->twitch.getCurrent();
if (currentUser->isAnon())
{
ctx.channel->addSystemMessage("You must be logged in to start a raid!");
return "";
}
auto target = ctx.words.at(1);
stripChannelName(target);
getHelix()->getUserByName(
target,
[twitchChannel{ctx.twitchChannel},
channel{ctx.channel}](const HelixUser &targetUser) {
getHelix()->startRaid(
twitchChannel->roomId(), targetUser.id,
[channel, targetUser] {
channel->addSystemMessage(QString("You started to raid %1.")
.arg(targetUser.displayName));
},
[channel, targetUser](auto error, auto message) {
auto errorMessage = formatStartRaidError(error, message);
channel->addSystemMessage(errorMessage);
});
},
[channel{ctx.channel}, target] {
// Equivalent error from IRC
channel->addSystemMessage(
QString("Invalid username: %1").arg(target));
});
return "";
}
QString cancelRaid(const CommandContext &ctx)
{
if (ctx.channel == nullptr)
{
return "";
}
if (ctx.twitchChannel == nullptr)
{
ctx.channel->addSystemMessage(
"The /unraid command only works in Twitch channels.");
return "";
}
if (ctx.words.size() != 1)
{
ctx.channel->addSystemMessage(
"Usage: \"/unraid\" - Cancel the current raid. "
"Only the broadcaster can cancel the raid.");
return "";
}
auto currentUser = getIApp()->getAccounts()->twitch.getCurrent();
if (currentUser->isAnon())
{
ctx.channel->addSystemMessage(
"You must be logged in to cancel the raid!");
return "";
}
getHelix()->cancelRaid(
ctx.twitchChannel->roomId(),
[channel{ctx.channel}] {
channel->addSystemMessage("You cancelled the raid.");
},
[channel{ctx.channel}](auto error, auto message) {
auto errorMessage = formatCancelRaidError(error, message);
channel->addSystemMessage(errorMessage);
});
return "";
}
} // namespace chatterino::commands