2
0
mirror of synced 2025-01-09 16:15:51 +00:00

79 lines
2.4 KiB
C#
Raw Normal View History

2023-10-20 09:49:23 +02:00
using Discord.WebSocket;
2023-10-24 15:25:45 +02:00
using BiblioTech.Options;
2023-10-25 11:25:27 +02:00
using Discord;
2023-10-20 09:49:23 +02:00
namespace BiblioTech
{
public abstract class BaseCommand
{
public abstract string Name { get; }
public abstract string StartingMessage { get; }
2023-10-20 09:49:23 +02:00
public abstract string Description { get; }
public virtual CommandOption[] Options => Array.Empty<CommandOption>();
2023-10-20 09:49:23 +02:00
public async Task SlashCommandHandler(SocketSlashCommand command)
{
if (command.CommandName != Name) return;
try
{
2023-12-18 11:27:28 +01:00
Program.Log.Log($"Responding to '{Name}'");
var context = new CommandContext(command, command.Data.Options);
await command.RespondAsync(StartingMessage, ephemeral: IsEphemeral(context));
await Invoke(context);
}
catch (Exception ex)
{
2023-12-18 11:27:28 +01:00
var msg = "Failed with exception: " + ex;
Program.Log.Error(msg);
if (!IsInAdminChannel(command))
2023-11-09 10:13:34 +01:00
{
await command.FollowupAsync("Something failed while trying to do that... (error details posted in admin channel)", ephemeral: true);
2023-11-09 10:13:34 +01:00
}
await Program.AdminChecker.SendInAdminChannel(msg);
}
2023-10-20 09:49:23 +02:00
}
private bool IsEphemeral(CommandContext context)
{
if (IsSenderAdmin(context.Command) && IsInAdminChannel(context.Command)) return false;
return true;
}
2023-10-24 15:25:45 +02:00
protected abstract Task Invoke(CommandContext context);
2023-10-22 10:10:52 +02:00
protected bool IsSenderAdmin(SocketSlashCommand command)
{
2023-10-22 10:38:46 +02:00
return Program.AdminChecker.IsUserAdmin(command.User.Id);
2023-10-22 10:10:52 +02:00
}
protected bool IsInAdminChannel(SocketSlashCommand command)
{
return Program.AdminChecker.IsAdminChannel(command.Channel);
}
2023-10-25 11:25:27 +02:00
protected IUser GetUserFromCommand(UserOption userOption, CommandContext context)
2023-10-22 10:10:52 +02:00
{
2023-10-25 11:25:27 +02:00
var targetUser = userOption.GetUser(context);
if (IsSenderAdmin(context.Command) && targetUser != null) return targetUser;
return context.Command.User;
2023-10-24 14:07:15 +02:00
}
protected string Mention(SocketUser user)
{
return Mention(user.Id);
}
protected string Mention(IUser user)
{
return Mention(user.Id);
}
protected string Mention(ulong userId)
{
return $"<@{userId}>";
}
2023-10-20 09:49:23 +02:00
}
}