From b5825b537fa6aee322be18daae8796cab8ce83b5 Mon Sep 17 00:00:00 2001 From: Sanae Date: Mon, 20 Jun 2022 12:55:01 -0600 Subject: [PATCH] Implements Added Bot Reconnect Command (#1) Add dscrestart command Update Program.cs --- Server/DiscordBot.cs | 28 +++++++++++++++++++++++++--- Server/Program.cs | 11 ++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Server/DiscordBot.cs b/Server/DiscordBot.cs index 0022b80..e11813a 100644 --- a/Server/DiscordBot.cs +++ b/Server/DiscordBot.cs @@ -12,18 +12,31 @@ public class DiscordBot { private string Prefix => Config.Prefix; private readonly Logger Logger = new Logger("Discord"); private DiscordChannel? LogChannel; + private bool Reconnecting; public DiscordBot() { Token = Config.Token; Logger.AddLogHandler(Log); + CommandHandler.RegisterCommand("dscrestart", _ => { + // this should be async'ed but i'm lazy + Reconnecting = true; + Task.Run(Reconnect); + return "Restarting Discord bot"; + }); if (Config.Token == null) return; Settings.LoadHandler += SettingsLoadHandler; } + private async Task Reconnect() { + if (DiscordClient != null) // usually null prop works, not here though...` + await DiscordClient.DisconnectAsync(); + await Run(); + } + private async void SettingsLoadHandler() { try { if (DiscordClient == null || Token != Config.Token) - Run(); + await Run(); if (Config.LogChannel != null) LogChannel = await (DiscordClient?.GetChannelAsync(ulong.Parse(Config.LogChannel)) ?? throw new NullReferenceException("Discord client not setup yet!")); @@ -41,12 +54,13 @@ public class DiscordBot { } } catch (Exception e) { // don't log again, it'll just stack overflow the server! + if (Reconnecting) return; // skip if reconnecting await Console.Error.WriteLineAsync("Exception in discord logger"); await Console.Error.WriteLineAsync(e.ToString()); } } - public async void Run() { + public async Task Run() { Token = Config.Token; DiscordClient?.Dispose(); if (Config.Token == null) { @@ -61,11 +75,19 @@ public class DiscordBot { }); await DiscordClient.ConnectAsync(new DiscordActivity("Hide and Seek", ActivityType.Competing)); SettingsLoadHandler(); + Logger.Info( + $"Discord bot logged in as {DiscordClient.CurrentUser.Username}#{DiscordClient.CurrentUser.Discriminator}"); + Reconnecting = false; string mentionPrefix = $"{DiscordClient.CurrentUser.Mention} "; DiscordClient.MessageCreated += async (_, args) => { + if (args.Author.IsCurrent) return; try { DiscordMessage msg = args.Message; - if (msg.Content.StartsWith(Prefix)) { + if (string.IsNullOrEmpty(Prefix)) { + await msg.Channel.TriggerTypingAsync(); + await msg.RespondAsync(string.Join('\n', + CommandHandler.GetResult(msg.Content).ReturnStrings)); + } else if (msg.Content.StartsWith(Prefix)) { await msg.Channel.TriggerTypingAsync(); await msg.RespondAsync(string.Join('\n', CommandHandler.GetResult(msg.Content[Prefix.Length..]).ReturnStrings)); diff --git a/Server/Program.cs b/Server/Program.cs index 499c031..1167b9b 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -13,7 +13,7 @@ CancellationTokenSource cts = new CancellationTokenSource(); Task listenTask = server.Listen(cts.Token); Logger consoleLogger = new Logger("Console"); DiscordBot bot = new DiscordBot(); -bot.Run(); +await bot.Run(); server.ClientJoined += (c, _) => { if (Settings.Instance.BanList.Enabled && (Settings.Instance.BanList.Players.Contains(c.Id) || @@ -475,6 +475,15 @@ CommandHandler.RegisterCommand("loadsettings", _ => { return "Loaded settings.json"; }); +async CommandHandler.RegisterCommand("reconnect", _ => { + // this should be async'ed but i'm lazy + await bot.DisconnectAsync(); + Task.Delay(2500); + await bot.ConnectAsync(); + Task.Delay(1000); + return "reconnected successful"; +}); + Console.CancelKeyPress += (_, e) => { e.Cancel = true; consoleLogger.Info("Received Ctrl+C");