This commit is contained in:
linmeideli committed 2026-10-06 19:27:04 +08:00
1 parent 9dcd7c529c
commit 0c89f5e07f
4 files changed
+35 -42

No files matched your search

Binary file not shown.
@@ -21,6 +21,9 @@ public sealed class MaintenanceAdminExtension : IAdminExtension
public string Icon => "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<AdminActionResult> SaveMessageAsync(AdminActionContext ctx, string? zh, string? en)
private async ValueTask<AdminActionResult> 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.");
}
@@ -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);
}
}
}
@@ -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;
}
/// <summary>
/// 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.
/// </summary>
public sealed class MaintenanceStore : JsonDataStore<MaintenanceConfig>
@@ -28,38 +35,27 @@ public sealed class MaintenanceStore : JsonDataStore<MaintenanceConfig>
public bool Enabled { get; private set; }
public string MessageZh { get; private set; } = new MaintenanceConfig().MessageZh;
public string MessageEn { get; private set; } = new MaintenanceConfig().MessageEn;
/// <summary>The message shown to a client speaking the given language.</summary>
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));
}