From 0c89f5e07f3aa429cb54277c9bfbca4d7bf5ce90 Mon Sep 17 00:00:00 2001 From: linmeideli <2558527373@qq.com> Date: Tue, 6 Oct 2026 19:27:04 +0800 Subject: [PATCH] fusion --- marketplace/Empostor.Plugins.Maintenance.dll | Bin 19968 -> 20480 bytes .../MaintenanceAdminExtension.cs | 27 +++++------ .../MaintenanceListener.cs | 8 ++-- .../MaintenanceStore.cs | 42 ++++++++---------- 4 files changed, 35 insertions(+), 42 deletions(-) diff --git a/marketplace/Empostor.Plugins.Maintenance.dll b/marketplace/Empostor.Plugins.Maintenance.dll index 07f54211fb882c957ad27d01a34df86a2d8ca3d4..26e57e053ed9ae1fa558f2ecbfd6eff914caaeb9 100644 GIT binary patch literal 20480 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 EFJ?pmYXATM literal 19968 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 "shield"; + // The textbox holds a half-typed message most of the time, so the panel must not refetch itself. + public bool AutoRefresh => false; + public void Build(AdminPanelBuilder b) { b.RegisterText( @@ -41,18 +44,10 @@ public sealed class MaintenanceAdminExtension : IAdminExtension b.RegisterTextbox(textbox => { - textbox.Label = "Kick message (Chinese)"; - textbox.Value = _store.MessageZh; + textbox.Label = "Kick message"; + textbox.Value = _store.Message; textbox.Multiline = true; - textbox.OnSubmit(async ctx => await SaveMessageAsync(ctx, zh: ctx.Value, en: null)); - }); - - b.RegisterTextbox(textbox => - { - textbox.Label = "Kick message (English)"; - textbox.Value = _store.MessageEn; - textbox.Multiline = true; - textbox.OnSubmit(async ctx => await SaveMessageAsync(ctx, zh: null, en: ctx.Value)); + textbox.OnSubmit(async ctx => await SaveMessageAsync(ctx)); }); } @@ -66,12 +61,14 @@ public sealed class MaintenanceAdminExtension : IAdminExtension : "Maintenance mode OFF. The server is accepting players again."); } - private async ValueTask SaveMessageAsync(AdminActionContext ctx, string? zh, string? en) + private async ValueTask SaveMessageAsync(AdminActionContext ctx) { - _store.SetMessages( - string.IsNullOrWhiteSpace(zh) ? _store.MessageZh : zh.Trim(), - string.IsNullOrWhiteSpace(en) ? _store.MessageEn : en.Trim()); + if (string.IsNullOrWhiteSpace(ctx.Value)) + { + return AdminActionResult.Ok("Kick message left unchanged, the box was empty."); + } + _store.SetMessage(ctx.Value.Trim()); await _store.SaveAsync(); return AdminActionResult.Ok("Kick message saved."); } diff --git a/src/Empostor.Plugins.Maintenance/MaintenanceListener.cs b/src/Empostor.Plugins.Maintenance/MaintenanceListener.cs index a73f2bb..e5a2693 100644 --- a/src/Empostor.Plugins.Maintenance/MaintenanceListener.cs +++ b/src/Empostor.Plugins.Maintenance/MaintenanceListener.cs @@ -62,7 +62,7 @@ public sealed class MaintenanceListener : IEventListener try { - await client.DisconnectAsync(DisconnectReason.Custom, _store.MessageFor(client.Language)); + await client.DisconnectAsync(DisconnectReason.Custom, _store.Message); } catch (Exception ex) { @@ -78,7 +78,7 @@ public sealed class MaintenanceListener : IEventListener // A client that never reaches a lobby would otherwise sit connected forever. if (_store.Enabled) { - await e.Client.DisconnectAsync(DisconnectReason.Custom, _store.MessageFor(e.Client.Language)); + await e.Client.DisconnectAsync(DisconnectReason.Custom, _store.Message); } } @@ -87,7 +87,7 @@ public sealed class MaintenanceListener : IEventListener { if (_store.Enabled && e.Client != null) { - await e.Client.DisconnectAsync(DisconnectReason.Custom, _store.MessageFor(e.Client.Language)); + await e.Client.DisconnectAsync(DisconnectReason.Custom, _store.Message); } } @@ -96,7 +96,7 @@ public sealed class MaintenanceListener : IEventListener { if (_store.Enabled) { - e.JoinResult = GameJoinResult.CreateCustomError(_store.MessageFor(e.Player.Client.Language)); + e.JoinResult = GameJoinResult.CreateCustomError(_store.Message); } } } diff --git a/src/Empostor.Plugins.Maintenance/MaintenanceStore.cs b/src/Empostor.Plugins.Maintenance/MaintenanceStore.cs index 39c48aa..c1af064 100644 --- a/src/Empostor.Plugins.Maintenance/MaintenanceStore.cs +++ b/src/Empostor.Plugins.Maintenance/MaintenanceStore.cs @@ -1,5 +1,5 @@ +using System.Linq; using System.Threading.Tasks; -using Empostor.Api.Innersloth; using Empostor.Api.Service; using Microsoft.Extensions.Logging; @@ -7,15 +7,22 @@ namespace Empostor.Plugins.Maintenance; public sealed class MaintenanceConfig { + private const string FallbackMessage = "服务器正在维护中,请联系管理员获取支持。"; + public bool Enabled { get; set; } - public string MessageZh { get; set; } = "服务器正在维护中,请联系管理员获取支持。"; + public string? Message { get; set; } - public string MessageEn { get; set; } = "The server is under maintenance. Please contact the administrator for support."; + // Kept so a config written before the two languages were merged still loads its text. + public string? MessageZh { get; set; } + + public string? MessageEn { get; set; } + + public string MessageOrDefault => Message ?? MessageZh ?? MessageEn ?? FallbackMessage; } /// -/// Holds the maintenance flag and the two kick messages. Persisted so a restart does not +/// Holds the maintenance flag and the kick message. Persisted so a restart does not /// silently drop the server back into service while an operator is mid-update. /// public sealed class MaintenanceStore : JsonDataStore @@ -28,38 +35,27 @@ public sealed class MaintenanceStore : JsonDataStore public bool Enabled { get; private set; } - public string MessageZh { get; private set; } = new MaintenanceConfig().MessageZh; - - public string MessageEn { get; private set; } = new MaintenanceConfig().MessageEn; - - /// The message shown to a client speaking the given language. - public string MessageFor(Language language) => language switch - { - Language.SChinese or Language.TChinese => MessageZh, - _ => MessageEn, - }; + public string Message { get; private set; } = new MaintenanceConfig().MessageOrDefault; public void SetEnabled(bool enabled) => Enabled = enabled; - public void SetMessages(string zh, string en) - { - MessageZh = zh; - MessageEn = en; - } + public void SetMessage(string message) => Message = message; public new async ValueTask SaveAsync() => await base.SaveAsync(); protected override MaintenanceConfig GetSnapshot() => new() { Enabled = Enabled, - MessageZh = MessageZh, - MessageEn = MessageEn, + Message = Message, }; protected override void ApplySnapshot(MaintenanceConfig data) { Enabled = data.Enabled; - MessageZh = data.MessageZh; - MessageEn = data.MessageEn; + Message = FirstNonBlank(data.Message, data.MessageZh, data.MessageEn) + ?? new MaintenanceConfig().MessageOrDefault; } + + private static string? FirstNonBlank(params string?[] candidates) + => candidates.FirstOrDefault(candidate => !string.IsNullOrWhiteSpace(candidate)); }