CatStation/Content.Server/Corvax/Administration/BwoinkMetadataSystem.cs
KloopRE 8235c568c2
Merge pull request #3602 from KloopRE/ahelp
отображение префиксов ролей администратора и антагониста в UI Ahelp
2026-06-08 19:34:52 +07:00

91 lines
3 KiB
C#

using System.Linq;
using System.Text.RegularExpressions;
using Content.Server.Administration.Managers;
using Content.Server.Preferences.Managers;
using Content.Shared.Administration;
using Content.Shared.Mind;
using Content.Shared.Roles;
using Robust.Shared.Player;
namespace Content.Server.Corvax.Administration;
public sealed partial class BwoinkMetadataSystem : EntitySystem
{
[Dependency] private IAdminManager _adminManager = default!;
[Dependency] private IServerPreferencesManager _preferencesManager = default!;
[Dependency] private SharedMindSystem _mind = default!;
[Dependency] private SharedRoleSystem _role = default!;
private static readonly Regex AdminColorRegex = new(@"\[color=(red|purple)\]", RegexOptions.Compiled);
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TransformBwoinkTextEvent>(OnTransformBwoinkText);
}
private void OnTransformBwoinkText(ref TransformBwoinkTextEvent ev)
{
var adminData = _adminManager.GetAdminData(ev.SenderSession);
if (adminData is not null)
{
if (_adminManager.HasAdminFlag(ev.SenderSession, AdminFlags.NameColor))
{
var prefs = _preferencesManager.GetPreferencesOrNull(ev.SenderSession.UserId);
if (prefs != null)
{
var hex = prefs.AdminOOCColor.ToHex();
ev.Text = AdminColorRegex.Replace(ev.Text, $"[color={hex}]");
}
}
}
else
{
var prefix = GetAntagPrefix(ev.SenderSession);
if (prefix != null)
ev.Text = InsertPrefix(ev.Text, ev.SenderSession.Name, prefix);
}
}
private string? GetAntagPrefix(ICommonSession session)
{
var mindId = _mind.GetMind(session.UserId);
if (mindId is not { } mind)
return null;
var roles = _role.MindGetAllRoleInfo(mind);
var antagRoles = roles.Where(r => r.Antagonist).ToList();
if (antagRoles.Count == 0)
return null;
var color = AntagPrototype.GroupColor.ToHex();
var names = string.Join(", ", antagRoles.Select(r => Loc.GetString(r.Name)));
return $"[color={color}]\\[{names}\\][/color]";
}
private static string InsertPrefix(string text, string playerName, string prefix)
{
var index = text.IndexOf(playerName, StringComparison.Ordinal);
if (index < 0)
return text;
// Вставляем префикс перед первым вхождением имени игрока: [текст до имени] + [префикс] + " " + [имя] + [текст после имени]
return text[..index] + prefix + " " + playerName + text[(index + playerName.Length)..];
}
}
[ByRefEvent]
public struct TransformBwoinkTextEvent
{
public string Text;
public ICommonSession SenderSession;
public TransformBwoinkTextEvent(string text, ICommonSession senderSession)
{
Text = text;
SenderSession = senderSession;
}
}