Add load balancer marker for inbound country flag
Reserved CountryCode "XX" (Inbound.BalancerCountryCode) marks an inbound behind a load balancer whose exit country is unknown: the site shows a Shuffle icon with a tooltip instead of a flag, the bot shows 🔀. Admin can pick it in the publish dialog. Fits the existing column, no migration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
81562b5c56
commit
e979adca57
9 files changed
+48
-6
No files matched your search
@@ -1,3 +1,5 @@
|
||||
using PnvPanel.Domain.Inbounds;
|
||||
|
||||
namespace PnvPanel.Api.Telegram;
|
||||
|
||||
/// <summary>Emoji-флаг страны по ISO 3166-1 alpha-2 (пара regional indicator symbols). В Telegram
|
||||
@@ -5,13 +7,17 @@ namespace PnvPanel.Api.Telegram;
|
||||
/// не рисует).</summary>
|
||||
internal static class CountryFlag
|
||||
{
|
||||
/// <summary>"DE" → "🇩🇪 " (с пробелом, для префикса к имени); пусто, если кода нет или он кривой.</summary>
|
||||
/// <summary>"DE" → "🇩🇪 " (с пробелом, для префикса к имени); балансировщик
|
||||
/// (Inbound.BalancerCountryCode) → "🔀 "; пусто, если кода нет или он кривой.</summary>
|
||||
public static string Prefix(string? countryCode)
|
||||
{
|
||||
if (countryCode is not { Length: 2 } || !countryCode.All(char.IsAsciiLetter))
|
||||
return string.Empty;
|
||||
|
||||
var upper = countryCode.ToUpperInvariant();
|
||||
if (upper == Inbound.BalancerCountryCode)
|
||||
return "🔀 ";
|
||||
|
||||
return char.ConvertFromUtf32(0x1F1E6 + upper[0] - 'A')
|
||||
+ char.ConvertFromUtf32(0x1F1E6 + upper[1] - 'A')
|
||||
+ " ";
|
||||
|
||||
@@ -19,8 +19,13 @@ public sealed class Inbound : Entity
|
||||
public bool IsAvailable { get; private set; } = true;
|
||||
public string? DisplayName { get; private set; }
|
||||
|
||||
/// <summary>Зарезервированный CountryCode: инбаунд за балансировщиком, страна выхода заранее
|
||||
/// неизвестна — вместо флага показывается значок балансира. "XX" — из пользовательского диапазона
|
||||
/// ISO 3166-1 (реальной стране не присвоен), поэтому влезает в то же поле без миграции.</summary>
|
||||
public const string BalancerCountryCode = "XX";
|
||||
|
||||
/// <summary>ISO 3166-1 alpha-2 (верхний регистр) — страна, флаг которой пользователь видит перед
|
||||
/// именем инбаунда. Только для отображения, на подключение не влияет.</summary>
|
||||
/// именем инбаунда, либо BalancerCountryCode. Только для отображения, на подключение не влияет.</summary>
|
||||
public string? CountryCode { get; private set; }
|
||||
public IReadOnlyList<Guid> AllowedRoleIds { get; private set; } = [];
|
||||
public DateTimeOffset? LastSyncAt { get; private set; }
|
||||
|
||||
@@ -51,6 +51,7 @@ public class InboundTests
|
||||
[Theory]
|
||||
[InlineData("de", "DE")]
|
||||
[InlineData(" NL ", "NL")]
|
||||
[InlineData("xx", Inbound.BalancerCountryCode)]
|
||||
[InlineData("", null)]
|
||||
[InlineData(null, null)]
|
||||
public void Publish_NormalizesCountryCode(string? input, string? expected)
|
||||
|
||||
Reference in new issue
Block a user