mirror of
https://github.com/RPCS3/discord-bot.git
synced 2025-04-13 02:10:22 +00:00
105 lines
5.4 KiB
C#
105 lines
5.4 KiB
C#
using CompatBot.Database.Providers;
|
||
|
||
namespace CompatBot.Commands;
|
||
|
||
internal static partial class Sudo
|
||
{
|
||
[Command("mod"), RequiresBotSudoerRole]
|
||
[Description("Used to manage bot moderators")]
|
||
internal static class Mod
|
||
{
|
||
[Command("add")]
|
||
public static async ValueTask Add(SlashCommandContext ctx, DiscordUser user)
|
||
{
|
||
if (await ModProvider.AddAsync(user.Id).ConfigureAwait(false))
|
||
{
|
||
var response = new DiscordInteractionResponseBuilder()
|
||
.WithContent($"{Config.Reactions.Success} {user.Mention} was successfully added as moderator!")
|
||
.AddMention(UserMention.All);
|
||
await ctx.RespondAsync(response).ConfigureAwait(false);
|
||
}
|
||
else
|
||
await ctx.RespondAsync($"{Config.Reactions.Failure} {user.Mention} is already a moderator", ephemeral: true).ConfigureAwait(false);
|
||
}
|
||
|
||
[Command("remove")]
|
||
public static async ValueTask Remove(SlashCommandContext ctx, DiscordUser user)
|
||
{
|
||
if (ctx.Client.CurrentApplication.Owners?.Any(u => u.Id == user.Id) ?? false)
|
||
{
|
||
await ctx.RespondAsync($"{Config.Reactions.Denied} Why would you even try this?! Alerting {user.Mention}").ConfigureAwait(false);
|
||
var dm = await user.CreateDmChannelAsync().ConfigureAwait(false);
|
||
await dm.SendMessageAsync($@"Just letting you know that {ctx.User.Mention} just tried to strip you off of your mod role ¯\\\_(ツ)\_/¯").ConfigureAwait(false);
|
||
}
|
||
else if (await ModProvider.RemoveAsync(user.Id).ConfigureAwait(false))
|
||
await ctx.RespondAsync($"{Config.Reactions.Success} {user.Mention} removed as bot moderator", ephemeral: true).ConfigureAwait(false);
|
||
else
|
||
await ctx.RespondAsync($"{Config.Reactions.Failure} {user.Mention} is not a bot moderator", ephemeral: true).ConfigureAwait(false);
|
||
}
|
||
|
||
[Command("sudo")]
|
||
public static async ValueTask Sudo(SlashCommandContext ctx, DiscordUser moderator)
|
||
{
|
||
if (ModProvider.IsMod(moderator.Id))
|
||
{
|
||
if (await ModProvider.MakeSudoerAsync(moderator.Id).ConfigureAwait(false))
|
||
await ctx.RespondAsync($"{Config.Reactions.Success} {moderator.Mention} is now a sudoer").ConfigureAwait(false);
|
||
else
|
||
await ctx.RespondAsync($"{Config.Reactions.Failure} {moderator.Mention} is already a sudoer", ephemeral: true).ConfigureAwait(false);
|
||
}
|
||
else
|
||
await ctx.RespondAsync($"{Config.Reactions.Failure} {moderator.Mention} is not a moderator (yet)", ephemeral: true).ConfigureAwait(false);
|
||
}
|
||
|
||
[Command("unsudo")]
|
||
public static async ValueTask Unsudo(SlashCommandContext ctx, DiscordUser sudoer)
|
||
{
|
||
if (ctx.Client.CurrentApplication.Owners?.Any(u => u.Id == sudoer.Id) ?? false)
|
||
{
|
||
await ctx.RespondAsync($"{Config.Reactions.Denied} Why would you even try this?! Alerting {sudoer.Mention}").ConfigureAwait(false);
|
||
var dm = await sudoer.CreateDmChannelAsync().ConfigureAwait(false);
|
||
await dm.SendMessageAsync($@"Just letting you know that {ctx.User.Mention} just tried to strip you off of your bot admin permissions ¯\\_(ツ)_/¯").ConfigureAwait(false);
|
||
}
|
||
else if (ModProvider.IsMod(sudoer.Id))
|
||
{
|
||
if (await ModProvider.UnmakeSudoerAsync(sudoer.Id).ConfigureAwait(false))
|
||
await ctx.RespondAsync($"{Config.Reactions.Success} {sudoer.Mention} is no longer a bot admin", ephemeral: true).ConfigureAwait(false);
|
||
else
|
||
await ctx.RespondAsync($"{Config.Reactions.Failure} {sudoer.Mention} is not a bot admin", ephemeral: true).ConfigureAwait(false);
|
||
}
|
||
else
|
||
await ctx.RespondAsync($"{Config.Reactions.Failure} {sudoer.Mention} is not even a bot mod!", ephemeral: true).ConfigureAwait(false);
|
||
}
|
||
|
||
[Command("list")]
|
||
[Description("List all bot moderators")]
|
||
public static async ValueTask List(SlashCommandContext ctx)
|
||
{
|
||
var ephemeral = !ctx.Channel.IsPrivate;
|
||
await ctx.DeferResponseAsync(ephemeral).ConfigureAwait(false);
|
||
var modList = ModProvider.Mods
|
||
.Values
|
||
.ToAsyncEnumerable()
|
||
.SelectAwait(async m =>(m: m, u: await ctx.Client.GetUserAsync(m.DiscordId).ConfigureAwait(false)))
|
||
.OrderByDescending(i => i.m.Sudoer)
|
||
.ThenBy(i => i.u.Username)
|
||
.ToList();
|
||
|
||
var table = new AsciiTable(
|
||
new AsciiColumn( "Username", maxWidth: 32),
|
||
new AsciiColumn( "User ID", alignToRight: true),
|
||
new AsciiColumn("Sudo")
|
||
);
|
||
foreach (var (mod, user) in modList)
|
||
table.Add(
|
||
user.Username,
|
||
user.Id.ToString(),
|
||
mod.Sudoer ? "✅" :"➖"
|
||
);
|
||
var pages = AutosplitResponseHelper.AutosplitMessage(table.ToString());
|
||
await ctx.RespondAsync(pages[0], ephemeral: ephemeral).ConfigureAwait(false);
|
||
foreach (var page in pages.Skip(1).Take(EmbedPager.MaxFollowupMessages))
|
||
await ctx.FollowupAsync(page, ephemeral: ephemeral).ConfigureAwait(false);
|
||
}
|
||
}
|
||
} |