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()); } } } } }