diff --git a/MinecraftClient/ChatBots/DiscordBridge.cs b/MinecraftClient/ChatBots/DiscordBridge.cs index 77e9df99..ae8f38bf 100644 --- a/MinecraftClient/ChatBots/DiscordBridge.cs +++ b/MinecraftClient/ChatBots/DiscordBridge.cs @@ -14,6 +14,7 @@ namespace MinecraftClient.ChatBots public class DiscordBridge : ChatBot { private static DiscordBridge? instance = null; + public bool IsConnected { get; private set; } private DiscordClient? _client; private DiscordChannel? _channel; @@ -80,6 +81,7 @@ namespace MinecraftClient.ChatBots }).Wait(); _client.DisconnectAsync().Wait(); + IsConnected = false; } } @@ -280,6 +282,7 @@ namespace MinecraftClient.ChatBots Color = new DiscordColor(0x00FF00) }); + IsConnected = true; await Task.Delay(-1); } catch (Exception e) diff --git a/MinecraftClient/ChatBots/Map.cs b/MinecraftClient/ChatBots/Map.cs index 1c2b8786..ae612e42 100644 --- a/MinecraftClient/ChatBots/Map.cs +++ b/MinecraftClient/ChatBots/Map.cs @@ -13,6 +13,12 @@ namespace MinecraftClient.ChatBots { public static Configs Config = new(); + public struct DiscordMap + { + public string FileName; + public int MapId; + } + [TomlDoNotInlineObject] public class Configs { @@ -56,6 +62,8 @@ namespace MinecraftClient.ChatBots private readonly Dictionary cachedMaps = new(); + private readonly Queue discordQueue = new(); + public override void Initialize() { if (!Directory.Exists(baseDirectory)) @@ -238,28 +246,43 @@ namespace MinecraftClient.ChatBots if (Config.Send_Rendered_To_Discord) { + // We need to queue up images because Discord Bridge is not ready immediatelly if (DiscordBridge.Config.Enabled) + discordQueue.Enqueue(new DiscordMap { FileName = fileName, MapId = map.MapId }); + } + } + + public override void Update() + { + if (!DiscordBridge.Config.Enabled) + return; + + DiscordBridge? discordBridge = DiscordBridge.GetInstance(); + + if (discordBridge == null) + return; + + if (!discordBridge.IsConnected) + return; + + if (discordQueue.Count > 0) + { + DiscordMap discordMap = discordQueue.Dequeue(); + string fileName = discordMap.FileName; + + // We must convert to a PNG in order to send to Discord, BMP does not work + string newFileName = fileName.Replace(".bmp", ".png"); + using (var image = new MagickImage(fileName)) { - DiscordBridge? discordBridge = DiscordBridge.GetInstance(); + image.Write(newFileName); + discordBridge.SendImage(newFileName, $"> A render of the map with an id: **{discordMap.MapId}**"); + newFileName = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + newFileName; - if (discordBridge == null) - return; + // Delete the temporary file + if (File.Exists(newFileName)) + File.Delete(newFileName); - // We must convert to a PNG in order to send to Discord, BMP does not work - string newFileName = fileName.Replace(".bmp", ".png"); - using (var image = new MagickImage(fileName)) - { - image.Write(newFileName); - discordBridge.SendImage(newFileName, $"> A render of the map with an id: **{map.MapId}**"); - - newFileName = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + newFileName; - - // Delete the temporary file - if (File.Exists(newFileName)) - File.Delete(newFileName); - - LogToConsole(Translations.TryGet("bot.map.sent_to_discord", map.MapId)); - } + LogToConsole(Translations.TryGet("bot.map.sent_to_discord", discordMap.MapId)); } } }