using Content.Server.Administration; using Content.Shared.Administration; using Content.Shared.Language; using Content.Shared.Language.Components; using Content.Shared.Language.Systems; using Robust.Shared.Prototypes; using Robust.Shared.Toolshed; using Robust.Shared.Toolshed.Syntax; using Robust.Shared.Toolshed.TypeParsers; namespace Content.Server.Language.Commands; [ToolshedCommand(Name = "language"), AdminCommand(AdminFlags.Admin)] public sealed class AdminLanguageCommand : ToolshedCommand { private LanguageSystem? _languagesField; private LanguageSystem Languages => _languagesField ??= GetSys(); [CommandImplementation("add")] public EntityUid AddLanguage( [CommandInvocationContext] IInvocationContext ctx, [PipedArgument] EntityUid input, [CommandArgument] ProtoId language, [CommandArgument] bool canSpeak = true, [CommandArgument] bool canUnderstand = true ) { if (language == SharedLanguageSystem.UniversalPrototype) { EnsureComp(input); Languages.UpdateEntityLanguages(input); } else { EnsureComp(input); Languages.AddLanguage(input, language, canSpeak, canUnderstand); } return input; } [CommandImplementation("rm")] public EntityUid RemoveLanguage( [CommandInvocationContext] IInvocationContext ctx, [PipedArgument] EntityUid input, [CommandArgument] ProtoId language, [CommandArgument] bool removeSpeak = true, [CommandArgument] bool removeUnderstand = true ) { if (language == SharedLanguageSystem.UniversalPrototype && HasComp(input)) { RemComp(input); EnsureComp(input); } // We execute this branch even in case of universal so that it gets removed if it was added manually to the LanguageKnowledge Languages.RemoveLanguage(input, language, removeSpeak, removeUnderstand); return input; } [CommandImplementation("lsspoken")] public IEnumerable> ListSpoken([PipedArgument] EntityUid input) { return Languages.GetSpokenLanguages(input); } [CommandImplementation("lsunderstood")] public IEnumerable> ListUnderstood([PipedArgument] EntityUid input) { return Languages.GetUnderstoodLanguages(input); } }