using Discord; using Discord.Interactions; using Discord.WebSocket; using MediatR; using Microsoft.Extensions.DependencyInjection; using Serilog; using Serilog.Events; namespace MediatRSample; public class Bot { private static ServiceProvider ConfigureServices() { return new ServiceCollection() .AddMediatR(typeof(Bot)) .AddSingleton(new DiscordSocketClient(new DiscordSocketConfig { AlwaysDownloadUsers = true, MessageCacheSize = 100, GatewayIntents = GatewayIntents.AllUnprivileged, LogLevel = LogSeverity.Info })) .AddSingleton() .AddSingleton(x => new InteractionService(x.GetRequiredService())) .BuildServiceProvider(); } public static async Task Main() { await new Bot().RunAsync(); } private async Task RunAsync() { Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); await using var services = ConfigureServices(); var client = services.GetRequiredService(); client.Log += LogAsync; var listener = services.GetRequiredService(); await listener.StartAsync(); await client.LoginAsync(TokenType.Bot, "YOUR_TOKEN_HERE"); await client.StartAsync(); await Task.Delay(Timeout.Infinite); } private static Task LogAsync(LogMessage message) { var severity = message.Severity switch { LogSeverity.Critical => LogEventLevel.Fatal, LogSeverity.Error => LogEventLevel.Error, LogSeverity.Warning => LogEventLevel.Warning, LogSeverity.Info => LogEventLevel.Information, LogSeverity.Verbose => LogEventLevel.Verbose, LogSeverity.Debug => LogEventLevel.Debug, _ => LogEventLevel.Information }; Log.Write(severity, message.Exception, "[{Source}] {Message}", message.Source, message.Message); return Task.CompletedTask; } }