mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
Fix: make AutoRelog retries single-owner (#3186)
Login rejections could schedule and execute multiple restarts for one failure while leaving no usable console route during reconnect delays. Changes: - Bind failure and restart work to immutable connection attempts - Coalesce automatic retries while allowing explicit settings replacement until commit - Preserve held bots and offline command routing across failed logins - Add deterministic retry, ownership, and routing regression tests Fixes #3186
This commit is contained in:
parent
92212d2b95
commit
456a548cbc
11 changed files with 645 additions and 114 deletions
|
|
@ -1,4 +1,5 @@
|
|||
using Brigadier.NET;
|
||||
using System;
|
||||
using Brigadier.NET;
|
||||
using Brigadier.NET.Builder;
|
||||
using MinecraftClient.CommandHandler;
|
||||
using static MinecraftClient.CommandHandler.CmdResult;
|
||||
|
|
@ -42,35 +43,55 @@ namespace MinecraftClient.Commands
|
|||
|
||||
private int DoConnect(CmdResult r, string server, string account)
|
||||
{
|
||||
RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings();
|
||||
if (!string.IsNullOrWhiteSpace(account) && !Settings.Config.Main.Advanced.SetAccount(account))
|
||||
return r.SetAndReturn(Status.Fail, string.Format(Translations.cmd_connect_unknown, account));
|
||||
|
||||
if (Settings.Config.Main.SetServerIP(new Settings.MainConfigHelper.MainConfig.ServerInfoConfig(server), true))
|
||||
{
|
||||
return r.SetAndReturn(Program.TryRestart(keepAccountAndServerSettings: true)
|
||||
? Status.Done
|
||||
: Status.Fail);
|
||||
if (Program.TryRestart(
|
||||
Program.CurrentConnectionAttempt,
|
||||
TimeSpan.Zero,
|
||||
keepAccountAndServerSettings: true,
|
||||
replaceUntilCommit: true))
|
||||
{
|
||||
return r.SetAndReturn(Status.Done);
|
||||
}
|
||||
|
||||
Program.RestoreRestartSettings(previousSettings);
|
||||
return r.SetAndReturn(Status.Fail);
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.RestoreRestartSettings(previousSettings);
|
||||
return r.SetAndReturn(Status.Fail, string.Format(Translations.cmd_connect_invalid_ip, server));
|
||||
}
|
||||
}
|
||||
|
||||
internal static string DoConnect(string command)
|
||||
{
|
||||
RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings();
|
||||
string[] args = GetArgs(command);
|
||||
if (args.Length > 1 && !Settings.Config.Main.Advanced.SetAccount(args[1]))
|
||||
return string.Format(Translations.cmd_connect_unknown, args[1]);
|
||||
|
||||
if (Settings.Config.Main.SetServerIP(new Settings.MainConfigHelper.MainConfig.ServerInfoConfig(args[0]), true))
|
||||
{
|
||||
return Program.TryRestart(keepAccountAndServerSettings: true)
|
||||
? string.Empty
|
||||
: Translations.general_fail;
|
||||
if (Program.TryRestart(
|
||||
Program.CurrentConnectionAttempt,
|
||||
TimeSpan.Zero,
|
||||
keepAccountAndServerSettings: true,
|
||||
replaceUntilCommit: true))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
Program.RestoreRestartSettings(previousSettings);
|
||||
return Translations.general_fail;
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.RestoreRestartSettings(previousSettings);
|
||||
return string.Format(Translations.cmd_connect_invalid_ip, args[0]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,19 +41,30 @@ namespace MinecraftClient.Commands
|
|||
|
||||
private int DoReconnect(CmdResult r, string account)
|
||||
{
|
||||
RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings();
|
||||
if (!string.IsNullOrWhiteSpace(account))
|
||||
{
|
||||
account = account.Trim();
|
||||
if (!Settings.Config.Main.Advanced.SetAccount(account))
|
||||
return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_connect_unknown, account));
|
||||
}
|
||||
return r.SetAndReturn(Program.TryRestart(keepAccountAndServerSettings: true)
|
||||
? CmdResult.Status.Done
|
||||
: CmdResult.Status.Fail);
|
||||
|
||||
if (Program.TryRestart(
|
||||
Program.CurrentConnectionAttempt,
|
||||
TimeSpan.Zero,
|
||||
keepAccountAndServerSettings: true,
|
||||
replaceUntilCommit: true))
|
||||
{
|
||||
return r.SetAndReturn(CmdResult.Status.Done);
|
||||
}
|
||||
|
||||
Program.RestoreRestartSettings(previousSettings);
|
||||
return r.SetAndReturn(CmdResult.Status.Fail);
|
||||
}
|
||||
|
||||
internal static string DoReconnect(string command)
|
||||
{
|
||||
RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings();
|
||||
string[] args = GetArgs(command);
|
||||
if (args.Length > 0)
|
||||
{
|
||||
|
|
@ -63,9 +74,18 @@ namespace MinecraftClient.Commands
|
|||
return string.Format(Translations.cmd_connect_unknown, account);
|
||||
}
|
||||
}
|
||||
return Program.TryRestart(keepAccountAndServerSettings: true)
|
||||
? String.Empty
|
||||
: Translations.general_fail;
|
||||
|
||||
if (Program.TryRestart(
|
||||
Program.CurrentConnectionAttempt,
|
||||
TimeSpan.Zero,
|
||||
keepAccountAndServerSettings: true,
|
||||
replaceUntilCommit: true))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
Program.RestoreRestartSettings(previousSettings);
|
||||
return Translations.general_fail;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue