Flux-Systems-Assistant/Flux_System_Assistant/Services/InteractionHandlingService.cs

80 lines
No EOL
2.7 KiB
C#

using Discord;
using Discord.Interactions;
using Discord.WebSocket;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Reflection;
using Flux_System_Assistant.Utility;
using ILogger = Serilog.ILogger;
namespace Flux_System_Assistant.Services
{
public class InteractionHandlingService : IHostedService
{
private readonly DiscordSocketClient _discord;
private readonly InteractionService _interactions;
private readonly IServiceProvider _services;
private readonly IConfiguration _config;
private readonly ILogger _logger;
public InteractionHandlingService(
DiscordSocketClient discord,
InteractionService interactions,
IServiceProvider services,
IConfiguration config,
ILogger logger)
{
_discord = discord;
_interactions = interactions;
_services = services;
_config = config;
_logger = logger;
_interactions.Log += msg => LoggerService.OnLogAsync(logger, msg);
}
public async Task StartAsync(CancellationToken cancellationToken)
{
_discord.Ready += () => _interactions.RegisterCommandsGloballyAsync(true);
_discord.InteractionCreated += OnInteractionAsync;
await _interactions.AddModulesAsync(Assembly.GetEntryAssembly(), _services);
}
public Task StopAsync(CancellationToken cancellationToken)
{
_interactions.Dispose();
return Task.CompletedTask;
}
private async Task OnInteractionAsync(SocketInteraction interaction)
{
try
{
var context = new SocketInteractionContext(_discord, interaction);
if (context.User is SocketGuildUser user && user.Roles.Select(x => x.Name).Any(x => x == "GM's" || x == "Flux Stellar Corporation"))
{
var result = await _interactions.ExecuteCommandAsync(context, _services);
if (!result.IsSuccess)
await context.Channel.SendMessageAsync(result.ToString());
}
else
{
await interaction.RespondAsync(ephemeral: true,
text: "This is currently a dev only bot. Please do not use it yet");
}
}
catch
{
if (interaction.Type == InteractionType.ApplicationCommand)
{
await interaction.GetOriginalResponseAsync()
.ContinueWith(msg => msg.Result.DeleteAsync());
}
}
}
}
}