mirror of
https://github.com/Empostor/Empostor.git
synced 2026-10-20 01:46:07 +00:00
fusion
This commit is contained in:
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));
|
||||
}
|
||||
Reference in new issue
Block a user