diff --git a/Content.Server/Announcements/AnnounceCommand.cs b/Content.Server/Announcements/AnnounceCommand.cs index 3249fcc95d..55a0498aa0 100644 --- a/Content.Server/Announcements/AnnounceCommand.cs +++ b/Content.Server/Announcements/AnnounceCommand.cs @@ -1,38 +1,79 @@ using Content.Server.Administration; -using Content.Server.Chat; using Content.Server.Chat.Systems; using Content.Shared.Administration; +using Robust.Shared.Audio; using Robust.Shared.Console; +using Robust.Shared.ContentPack; +using Robust.Shared.Prototypes; -namespace Content.Server.Announcements +namespace Content.Server.Announcements; + +[AdminCommand(AdminFlags.Moderator)] +public sealed class AnnounceCommand : LocalizedEntityCommands { - [AdminCommand(AdminFlags.Moderator)] - public sealed class AnnounceCommand : IConsoleCommand - { - public string Command => "announce"; - public string Description => "Send an in-game announcement."; - public string Help => $"{Command} or {Command} to send announcement as CentCom."; - public void Execute(IConsoleShell shell, string argStr, string[] args) - { - var chat = IoCManager.Resolve().GetEntitySystem(); + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IResourceManager _res = default!; - if (args.Length == 0) + public override string Command => "announce"; + public override string Description => Loc.GetString("cmd-announce-desc"); + public override string Help => Loc.GetString("cmd-announce-help", ("command", Command)); + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + switch (args.Length) + { + case 0: + shell.WriteError(Loc.GetString("shell-need-minimum-one-argument")); + return; + case > 4: + shell.WriteError(Loc.GetString("shell-wrong-arguments-number")); + return; + } + + var message = args[0]; + var sender = Loc.GetString("cmd-announce-sender"); + var color = Color.Gold; + var sound = new SoundPathSpecifier("/Audio/Announcements/announce.ogg"); + + // Optional sender argument + if (args.Length >= 2) + sender = args[1]; + + // Optional color argument + if (args.Length >= 3) + { + try { - shell.WriteError("Not enough arguments! Need at least 1."); + color = Color.FromHex(args[2]); + } + catch + { + shell.WriteError(Loc.GetString("shell-invalid-color-hex")); return; } - - if (args.Length == 1) - { - chat.DispatchGlobalAnnouncement(args[0], colorOverride: Color.Gold); - } - else - { - // Explicit IEnumerable due to overload ambiguity on .NET 9 - var message = string.Join(' ', (IEnumerable)new ArraySegment(args, 1, args.Length-1)); - chat.DispatchGlobalAnnouncement(message, args[0], colorOverride: Color.Gold); - } - shell.WriteLine("Sent!"); } + + // Optional sound argument + if (args.Length >= 4) + sound = new SoundPathSpecifier(args[3]); + + _chat.DispatchGlobalAnnouncement(message, sender, true, sound, color); + shell.WriteLine(Loc.GetString("shell-command-success")); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + return args.Length switch + { + 1 => CompletionResult.FromHint(Loc.GetString("cmd-announce-arg-message")), + 2 => CompletionResult.FromHint(Loc.GetString("cmd-announce-arg-sender")), + 3 => CompletionResult.FromHint(Loc.GetString("cmd-announce-arg-color")), + 4 => CompletionResult.FromHintOptions( + CompletionHelper.AudioFilePath(args[3], _proto, _res), + Loc.GetString("cmd-announce-arg-sound") + ), + _ => CompletionResult.Empty + }; } } diff --git a/Resources/Locale/en-US/administration/commands/announce-command.ftl b/Resources/Locale/en-US/administration/commands/announce-command.ftl new file mode 100644 index 0000000000..8cdc045f8a --- /dev/null +++ b/Resources/Locale/en-US/administration/commands/announce-command.ftl @@ -0,0 +1,11 @@ +cmd-announce-desc = Send an in-game announcement with custom color and sound. +cmd-announce-help = {$command} [sender] [color] [sound] - Send announcement. Sender defaults to CentCom, color to Gold, sound to announce.ogg. The color should be in a #RRGGBB format. + +# The default sender for the announcement +cmd-announce-sender = Central Command + +# Completion hints +cmd-announce-arg-message = +cmd-announce-arg-sender = [sender] +cmd-announce-arg-color = [color] +cmd-announce-arg-sound = [sound]