using Content.Server.Administration.Managers; using Content.Server.Afk; using Content.Shared.Administration; using Robust.Shared.Utility; namespace Content.Server.Administration.Systems; /// /// Server system for handling admin who requests /// public sealed class AdminWhoSystem : EntitySystem { [Dependency] private readonly IAfkManager _afkManager = default!; [Dependency] private readonly IAdminManager _adminManager = default!; public override void Initialize() { base.Initialize(); SubscribeNetworkEvent(OnRequestAdminWho); } private void OnRequestAdminWho(RequestAdminWhoEvent args, EntitySessionEventArgs session) { if (session.SenderSession == null) return; var seeStealth = false; var seeAfk = false; // Check if the requesting player can see stealth admins and AFK status if (session.SenderSession.AttachedEntity != null) { var playerData = _adminManager.GetAdminData(session.SenderSession); if (playerData != null) { seeStealth = playerData.CanStealth(); seeAfk = _adminManager.HasAdminFlag(session.SenderSession, AdminFlags.Admin); } } var adminList = new List(); foreach (var admin in _adminManager.ActiveAdmins) { var adminData = _adminManager.GetAdminData(admin); DebugTools.AssertNotNull(adminData); if (adminData!.Stealth && !seeStealth) continue; var isAfk = seeAfk && _afkManager.IsAfk(admin); adminList.Add(new AdminWhoEntry( admin.Name, adminData.Title, adminData.Stealth, isAfk )); } RaiseNetworkEvent(new AdminWhoResponseEvent(adminList), session.SenderSession); } }