using Content.Server._DV.Administration.Components; using Content.Server.Administration; using Content.Server.Administration.Logs; using Content.Server.Chat.Managers; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Players; using Robust.Server.Player; using Robust.Shared.Console; namespace Content.Server._DV.Administration.Commands; /// /// Command for muting/unmuting specific players in specific OOC channels. /// Mutes are not persisted to storage. /// /// /// After adding/removing a channel in , don't forget to: /// - Update /// - Document behavior in "cmd-mute-help" in Resources/Locale/en-US/_DV/administration/commands/mute.ftl [AdminCommand(AdminFlags.Ban)] public sealed class MuteCommand : LocalizedEntityCommands { [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly IAdminLogManager _adminLogs = default!; private static readonly string[] ChannelCompletionOptions = ["OOC", "LOOC", "DEADCHAT"]; private static readonly string ChannelListText = string.Join(", ", ChannelCompletionOptions); public override string Command => "mute"; public override string Help => Loc.GetString("cmd-mute-help", ("channels", ChannelListText), ("command", Command)); public override void Execute(IConsoleShell shell, string argStr, string[] args) { if (args.Length != 2) { shell.WriteLine(Help); return; } if (!_player.TryGetSessionByUsername(args[1], out var session)) { shell.WriteLine(Loc.GetString("shell-target-player-does-not-exist")); return; } bool isMuted; switch (args[0].ToLower()) { case "deadchat": { if (session.GetMind() is not { } mind) { shell.WriteLine(Loc.GetString("cmd-mute-err-missing-mind")); return; } var mute = EntityManager.EnsureComponent(mind); mute.MuteDeadchat = !mute.MuteDeadchat; isMuted = mute.MuteDeadchat; } break; case "looc": { if (session.GetMind() is not { } mind) { shell.WriteLine(Loc.GetString("cmd-mute-err-missing-mind")); return; } var mute = EntityManager.EnsureComponent(mind); mute.MuteLooc = !mute.MuteLooc; isMuted = mute.MuteLooc; } break; case "ooc": if (session.ContentData() is not { } playerData) { shell.WriteLine(Loc.GetString("cmd-mute-err-no-data")); return; } playerData.OocMuted = !playerData.OocMuted; isMuted = playerData.OocMuted; break; default: shell.WriteLine(Loc.GetString("cmd-mute-err-unknown-channel", ("channels", ChannelListText))); return; } var channelName = args[0].ToUpper(); _adminLogs.Add(LogType.AdminCommands, LogImpact.Extreme, $"{session:player} has been {(isMuted ? "muted" : "unmuted")} in {channelName} by {shell.Player?.Name ?? ""}"); var locArgs = ("chat", channelName); _chat.DispatchServerMessage(session, isMuted ? Loc.GetString("cmd-mute-player-notif-muted", locArgs) : Loc.GetString("cmd-mute-player-notif-unmuted", locArgs), true); shell.WriteLine(Loc.GetString("shell-command-success")); } public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) { switch (args.Length) { case 1: return CompletionResult.FromHintOptions(ChannelCompletionOptions, "channel"); case 2: return CompletionResult.FromOptions(CompletionHelper.SessionNames()); default: return CompletionResult.Empty; } } }