115 lines
4.1 KiB
C#
Raw Normal View History

2023-10-20 09:49:23 +02:00
using Discord.Net;
using Discord.WebSocket;
using Discord;
using Newtonsoft.Json;
2023-12-20 15:56:03 +01:00
using BiblioTech.Rewards;
using Logging;
using BiblioTech.CodexChecking;
using Nethereum.Model;
2023-10-20 09:49:23 +02:00
namespace BiblioTech
{
public class CommandHandler
{
private readonly DiscordSocketClient client;
private readonly CustomReplacement replacement;
private readonly ActiveP2pRoleRemover roleRemover;
2023-10-20 09:49:23 +02:00
private readonly BaseCommand[] commands;
private readonly ILog log;
2023-10-20 09:49:23 +02:00
public CommandHandler(ILog log, DiscordSocketClient client, CustomReplacement replacement, ActiveP2pRoleRemover roleRemover, params BaseCommand[] commands)
2023-10-20 09:49:23 +02:00
{
this.client = client;
this.replacement = replacement;
this.roleRemover = roleRemover;
2023-10-20 09:49:23 +02:00
this.commands = commands;
this.log = log;
2023-10-20 09:49:23 +02:00
client.Ready += Client_Ready;
client.SlashCommandExecuted += SlashCommandHandler;
}
private async Task Client_Ready()
{
var guild = client.Guilds.Single(g => g.Id == Program.Config.ServerId);
2023-10-22 10:38:46 +02:00
Program.AdminChecker.SetGuild(guild);
log.Log($"Initializing for guild: '{guild.Name}'");
2023-12-18 11:27:28 +01:00
var adminChannel = GetChannel(guild, Program.Config.AdminChannelId);
if (adminChannel == null) throw new Exception("No admin message channel");
var chainEventsChannel = GetChannel(guild, Program.Config.ChainEventsChannelId);
var rewardsChannel = GetChannel(guild, Program.Config.RewardsChannelId);
Program.AdminChecker.SetAdminChannel(adminChannel);
Program.RoleDriver = new RoleDriver(client, Program.UserRepo, log, rewardsChannel);
Program.ChainActivityHandler = new ChainActivityHandler(log, Program.UserRepo);
Program.EventsSender = new ChainEventsSender(log, replacement, chainEventsChannel);
2023-10-20 09:49:23 +02:00
var builders = commands.Select(c =>
{
2023-12-18 11:27:28 +01:00
var msg = $"Building command '{c.Name}' with options: ";
2023-10-20 09:49:23 +02:00
var builder = new SlashCommandBuilder()
.WithName(c.Name)
.WithDescription(c.Description);
foreach (var option in c.Options)
{
2023-12-18 11:27:28 +01:00
msg += option.Name + " ";
2023-10-24 14:07:15 +02:00
builder.AddOption(option.Build());
2023-10-20 09:49:23 +02:00
}
log.Log(msg);
2023-10-20 09:49:23 +02:00
return builder;
});
try
{
2024-07-02 10:08:13 +02:00
log.Log("Building application commands...");
var commands = builders.Select(b => b.Build()).ToArray();
log.Log("Submitting application commands...");
var response = await guild.BulkOverwriteApplicationCommandAsync(commands);
log.Log("Commands in response:");
foreach (var cmd in response)
2023-10-20 09:49:23 +02:00
{
2024-07-02 10:08:13 +02:00
log.Log($"{cmd.Name} ({cmd.Description}) [{DescribOptions(cmd.Options)}]");
2023-10-20 09:49:23 +02:00
}
roleRemover.Start();
2023-10-20 09:49:23 +02:00
}
catch (HttpException exception)
{
var json = JsonConvert.SerializeObject(exception.Errors, Formatting.Indented);
log.Error(json);
2024-07-02 10:37:32 +02:00
throw;
2023-10-20 09:49:23 +02:00
}
Program.Dispatcher.Start();
2024-07-02 10:08:13 +02:00
log.Log("Initialized.");
}
private SocketTextChannel? GetChannel(SocketGuild guild, ulong id)
{
if (id == 0) return null;
return guild.TextChannels.SingleOrDefault(c => c.Id == id);
}
2024-07-02 10:08:13 +02:00
private string DescribOptions(IReadOnlyCollection<SocketApplicationCommandOption> options)
{
return string.Join(",", options.Select(DescribeOption).ToArray());
}
private string DescribeOption(SocketApplicationCommandOption option)
{
return $"({option.Name}[{DescribOptions(option.Options)}])";
2023-10-20 09:49:23 +02:00
}
private async Task SlashCommandHandler(SocketSlashCommand command)
{
foreach (var cmd in commands)
{
await cmd.SlashCommandHandler(command);
}
}
}
}