diff --git a/MinecraftClient/ChatBots/AutoRelog.cs b/MinecraftClient/ChatBots/AutoRelog.cs index c384eb7c9f..24e6570ac6 100644 --- a/MinecraftClient/ChatBots/AutoRelog.cs +++ b/MinecraftClient/ChatBots/AutoRelog.cs @@ -137,9 +137,10 @@ private void LaunchDelayedReconnection(string? msg) { double delay = random.NextDouble() * (Config.Delay.max - Config.Delay.min) + Config.Delay.min; LogDebugToConsole(string.Format(string.IsNullOrEmpty(msg) ? Translations.bot_autoRelog_reconnect_always : Translations.bot_autoRelog_reconnect, msg)); - LogToConsole(string.Format(Translations.bot_autoRelog_wait, delay)); - System.Threading.Thread.Sleep((int)Math.Floor(delay * 1000)); - ReconnectToTheServer(); + + // TODO: Change this translation string to add the retries left text + LogToConsole(string.Format(Translations.bot_autoRelog_wait, delay) + $" ({Config.Retries - Configs._BotRecoAttempts} retries left)"); + ReconnectToTheServer(Config.Retries - Configs._BotRecoAttempts, (int)Math.Floor(delay), true); } public static bool OnDisconnectStatic(DisconnectReason reason, string message) diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs index 294c3a9711..48f1cbaaea 100644 --- a/MinecraftClient/McClient.cs +++ b/MinecraftClient/McClient.cs @@ -153,6 +153,7 @@ public enum MovementType { Sneak, Walk, Sprint } private static IMinecraftComHandler? instance; public static IMinecraftComHandler? Instance => instance; + /// /// Starts the main chat client, wich will login to the server using the MinecraftCom class. /// @@ -245,28 +246,48 @@ public McClient(SessionToken session, PlayerKeyPair? playerKeyPair, string serve return; - Retry: + Retry: if (timeoutdetector != null) { timeoutdetector.Item2.Cancel(); timeoutdetector = null; } - if (ReconnectionAttemptsLeft > 0) + + if (!Config.ChatBot.AutoRelog.Enabled) { - Log.Info(string.Format(Translations.mcc_reconnect, ReconnectionAttemptsLeft)); - Thread.Sleep(5000); - ReconnectionAttemptsLeft--; - Program.Restart(); - } - else if (InternalConfig.InteractiveMode) + if (ReconnectionAttemptsLeft > 0) + { + Log.Info(string.Format(Translations.mcc_reconnect, ReconnectionAttemptsLeft)); + Thread.Sleep(5000); + ReconnectionAttemptsLeft--; + Program.Restart(); + } + else if (InternalConfig.InteractiveMode) + { + ConsoleInteractive.ConsoleReader.StopReadThread(); + ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived; + ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler; + Program.HandleFailure(); + } + + throw new Exception("Initialization failed."); + } + else { - ConsoleInteractive.ConsoleReader.StopReadThread(); - ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived; - ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler; - Program.HandleFailure(); - } + // The AutoRelog ChatBot will handle reconnection at this point. + // This is important, or else we'll have multiple instances of the client running at the same time. - throw new Exception("Initialization failed."); + if (ReconnectionAttemptsLeft == 0) + { + if (InternalConfig.InteractiveMode) + { + ConsoleInteractive.ConsoleReader.StopReadThread(); + ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived; + ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler; + Program.HandleFailure(); + } + } + } } /// @@ -572,7 +593,7 @@ public void OnConnectionLost(ChatBot.DisconnectReason reason, string message) ConsoleInteractive.ConsoleReader.StopReadThread(); ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived; ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler; - Program.HandleFailure(); + Program.HandleFailure(message, false, reason); } } diff --git a/MinecraftClient/Program.cs b/MinecraftClient/Program.cs index 9c126bee32..599ee7229f 100644 --- a/MinecraftClient/Program.cs +++ b/MinecraftClient/Program.cs @@ -398,7 +398,12 @@ private static void RequestPassword() /// private static void InitializeClient() { - InternalConfig.MinecraftVersion = Config.Main.Advanced.MinecraftVersion; + // Ensure that we use the provided Minecraft version if we can't connect automatically. + // + // useMcVersionOnce is set to true on HandleFailure() + // whenever we are unable to connect to the server and the user provides a version number. + if (!useMcVersionOnce) + InternalConfig.MinecraftVersion = Config.Main.Advanced.MinecraftVersion; SessionToken session = new(); PlayerKeyPair? playerKeyPair = null; @@ -406,7 +411,7 @@ private static void InitializeClient() ProtocolHandler.LoginResult result = ProtocolHandler.LoginResult.LoginRequired; string loginLower = ToLowerIfNeed(InternalConfig.Account.Login); - if (InternalConfig.Account.Password == "-") + if (InternalConfig.Account.Password == "-" || InternalConfig.Account.Password == string.Empty) { ConsoleIO.WriteLineFormatted("ยง8" + Translations.mcc_offline, acceptnewlines: true); result = ProtocolHandler.LoginResult.Success; @@ -749,7 +754,7 @@ public static void HandleFailure(string? errorMessage = null, bool versionError if (InternalConfig.MinecraftVersion != "") { useMcVersionOnce = true; - Restart(); + Restart(0, true); return; } }