]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
update the announce command (#34889)
authorMilon <milonpl.git@proton.me>
Wed, 12 Feb 2025 08:58:05 +0000 (09:58 +0100)
committerGitHub <noreply@github.com>
Wed, 12 Feb 2025 08:58:05 +0000 (19:58 +1100)
Content.Server/Announcements/AnnounceCommand.cs
Resources/Locale/en-US/administration/commands/announce-command.ftl [new file with mode: 0644]

index 3249fcc95d2a3a793b511a30c35532a0f7142c7b..55a0498aa05da86dbcc8077d5c6dc8dc11fa6d0f 100644 (file)
@@ -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
+    [Dependency] private readonly ChatSystem _chat = default!;
+    [Dependency] private readonly IPrototypeManager _proto = default!;
+    [Dependency] private readonly IResourceManager _res = default!;
+
+    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)
     {
-        public string Command => "announce";
-        public string Description => "Send an in-game announcement.";
-        public string Help => $"{Command} <sender> <message> or {Command} <message> to send announcement as CentCom.";
-        public void Execute(IConsoleShell shell, string argStr, string[] args)
+        switch (args.Length)
         {
-            var chat = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<ChatSystem>();
-
-            if (args.Length == 0)
-            {
-                shell.WriteError("Not enough arguments! Need at least 1.");
+            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");
 
-            if (args.Length == 1)
+        // Optional sender argument
+        if (args.Length >= 2)
+            sender = args[1];
+
+        // Optional color argument
+        if (args.Length >= 3)
+        {
+            try
             {
-                chat.DispatchGlobalAnnouncement(args[0], colorOverride: Color.Gold);
+                color = Color.FromHex(args[2]);
             }
-            else
+            catch
             {
-                // Explicit IEnumerable<string> due to overload ambiguity on .NET 9
-                var message = string.Join(' ', (IEnumerable<string>)new ArraySegment<string>(args, 1, args.Length-1));
-                chat.DispatchGlobalAnnouncement(message, args[0], colorOverride: Color.Gold);
+                shell.WriteError(Loc.GetString("shell-invalid-color-hex"));
+                return;
             }
-            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 (file)
index 0000000..8cdc045
--- /dev/null
@@ -0,0 +1,11 @@
+cmd-announce-desc = Send an in-game announcement with custom color and sound.
+cmd-announce-help = {$command} <message> [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 = <message>
+cmd-announce-arg-sender = [sender]
+cmd-announce-arg-color = [color]
+cmd-announce-arg-sound = [sound]