Add stealthmins (#26263)

* Add stealthmin command.

* Update Content.Server/Administration/Commands/AdminWhoCommand.cs

As suggested by CE.

Co-authored-by: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com>

* Add admin notifications for admins toggling stealthmin.

* Localize stealthmin command

---------

Co-authored-by: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com>
This commit is contained in:
nikthechampiongr
2024-03-24 17:39:53 +02:00
committed by GitHub
parent 3731cc3c50
commit dca0c6694b
11 changed files with 197 additions and 10 deletions

View File

@@ -19,6 +19,16 @@ public sealed class AdminWhoCommand : IConsoleCommand
var adminMgr = IoCManager.Resolve<IAdminManager>();
var afk = IoCManager.Resolve<IAfkManager>();
var seeStealth = true;
// If null it (hopefully) means it is being called from the console.
if (shell.Player != null)
{
var playerData = adminMgr.GetAdminData(shell.Player);
seeStealth = playerData != null && playerData.CanStealth();
}
var sb = new StringBuilder();
var first = true;
foreach (var admin in adminMgr.ActiveAdmins)
@@ -30,10 +40,16 @@ public sealed class AdminWhoCommand : IConsoleCommand
var adminData = adminMgr.GetAdminData(admin)!;
DebugTools.AssertNotNull(adminData);
if (adminData.Stealth && !seeStealth)
continue;
sb.Append(admin.Name);
if (adminData.Title is { } title)
sb.Append($": [{title}]");
if (adminData.Stealth)
sb.Append(" (S)");
if (shell.Player is { } player && adminMgr.HasAdminFlag(player, AdminFlags.Admin))
{
if (afk.IsAfk(admin))

View File

@@ -0,0 +1,39 @@
using Content.Server.Administration.Managers;
using Content.Shared.Administration;
using JetBrains.Annotations;
using Robust.Shared.Console;
using Robust.Shared.Utility;
namespace Content.Server.Administration.Commands;
[UsedImplicitly]
[AdminCommand(AdminFlags.Stealth)]
public sealed class StealthminCommand : LocalizedCommands
{
public override string Command => "stealthmin";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var player = shell.Player;
if (player == null)
{
shell.WriteLine(Loc.GetString("cmd-stealthmin-no-console"));
return;
}
var mgr = IoCManager.Resolve<IAdminManager>();
var adminData = mgr.GetAdminData(player);
DebugTools.AssertNotNull(adminData);
if (!adminData!.Stealth)
{
mgr.Stealth(player);
}
else
{
mgr.UnStealth(player);
}
}
}

View File

@@ -98,6 +98,44 @@ namespace Content.Server.Administration.Managers
UpdateAdminStatus(session);
}
public void Stealth(ICommonSession session)
{
if (!_admins.TryGetValue(session, out var reg))
{
throw new ArgumentException($"Player {session} is not an admin");
}
if (reg.Data.Stealth)
return;
var playerData = session.ContentData()!;
playerData.Stealthed = true;
reg.Data.Stealth = true;
_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)), AdminFlags.Stealth);
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-enable-stealth", ("stealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
}
public void UnStealth(ICommonSession session)
{
if (!_admins.TryGetValue(session, out var reg))
{
throw new ArgumentException($"Player {session} is not an admin");
}
if (!reg.Data.Stealth)
return;
var playerData = session.ContentData()!;
playerData.Stealthed = false;
reg.Data.Stealth = false;
_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-unstealthed-message"));
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", ("newAdminName", session.Name)), flagBlacklist: AdminFlags.Stealth);
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-disable-stealth", ("exStealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
}
public void ReAdmin(ICommonSession session)
{
if (!_admins.TryGetValue(session, out var reg))
@@ -116,7 +154,16 @@ namespace Content.Server.Administration.Managers
plyData.ExplicitlyDeadminned = false;
reg.Data.Active = true;
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", ("newAdminName", session.Name)));
if (reg.Data.Stealth)
{
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", ("newAdminName", session.Name)));
}
else
{
_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message",
("newAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
}
SendPermsChangedEvent(session);
UpdateAdminStatus(session);
@@ -168,6 +215,11 @@ namespace Content.Server.Administration.Managers
_chat.DispatchServerMessage(player, Loc.GetString("admin-manager-admin-permissions-updated-message"));
}
if (player.ContentData()!.Stealthed)
{
aData.Stealth = true;
}
}
SendPermsChangedEvent(player);
@@ -290,9 +342,19 @@ namespace Content.Server.Administration.Managers
}
else if (e.NewStatus == SessionStatus.Disconnected)
{
if (_admins.Remove(e.Session) && _cfg.GetCVar(CCVars.AdminAnnounceLogout))
if (_admins.Remove(e.Session, out var reg ) && _cfg.GetCVar(CCVars.AdminAnnounceLogout))
{
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-logout-message", ("name", e.Session.Name)));
if (reg.Data.Stealth)
{
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-logout-message",
("name", e.Session.Name)), flagWhitelist: AdminFlags.Stealth);
}
else
{
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-logout-message",
("name", e.Session.Name)));
}
}
}
}
@@ -315,13 +377,27 @@ namespace Content.Server.Administration.Managers
_admins.Add(session, reg);
if (session.ContentData()!.Stealthed)
reg.Data.Stealth = true;
if (!session.ContentData()!.ExplicitlyDeadminned)
{
reg.Data.Active = true;
if (_cfg.GetCVar(CCVars.AdminAnnounceLogin))
{
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-login-message", ("name", session.Name)));
if (reg.Data.Stealth)
{
_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-login-message",
("name", session.Name)), flagWhitelist: AdminFlags.Stealth);
}
else
{
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-admin-login-message",
("name", session.Name)));
}
}
SendPermsChangedEvent(session);

View File

@@ -41,6 +41,16 @@ namespace Content.Server.Administration.Managers
/// </summary>
void ReAdmin(ICommonSession session);
/// <summary>
/// Make admin hidden from adminwho.
/// </summary>
void Stealth(ICommonSession session);
/// <summary>
/// Unhide admin from adminwho.
/// </summary>
void UnStealth(ICommonSession session);
/// <summary>
/// Re-loads the permissions of an player in case their admin data changed DB-side.
/// </summary>