Files
wwdpublic/Content.Server/Language/Commands/AdminLanguageCommand.cs
Mnemotechnican 81ad859c46 Admeme Language Commands (Attempt 2) (#565)
# Description
#562 but using commands instead of tricks.

Less user-friendly but makes you look like a hacker when you use them
:trollface:


<details><summary><h1>Media</h1></summary><p>


![image](https://github.com/user-attachments/assets/818b6226-aea8-4f9a-b30d-5df39b8041e6)

![image](https://github.com/user-attachments/assets/f3c40feb-f84d-4083-bc9a-44f7b1dfb30d)

![image](https://github.com/user-attachments/assets/31827207-4903-4df1-9074-eb060d0cf63c)

(ignore the missing locale, I fixes)

</p></details>

# Changelog

🆑
- add: Admin tooling: added several admin commands to help manipulate
entities' languages.

---------

Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>
Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com>
2024-08-06 17:22:11 -04:00

76 lines
2.6 KiB
C#

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.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<LanguageSystem>();
[CommandImplementation("add")]
public EntityUid AddLanguage(
[CommandInvocationContext] IInvocationContext ctx,
[PipedArgument] EntityUid input,
[CommandArgument] ValueRef<string, Prototype<LanguagePrototype>> @ref,
[CommandArgument] bool canSpeak = true,
[CommandArgument] bool canUnderstand = true
)
{
var language = @ref.Evaluate(ctx)!;
if (language == SharedLanguageSystem.UniversalPrototype)
{
EnsureComp<UniversalLanguageSpeakerComponent>(input);
Languages.UpdateEntityLanguages(input);
}
else
{
EnsureComp<LanguageSpeakerComponent>(input);
Languages.AddLanguage(input, language, canSpeak, canUnderstand);
}
return input;
}
[CommandImplementation("rm")]
public EntityUid RemoveLanguage(
[CommandInvocationContext] IInvocationContext ctx,
[PipedArgument] EntityUid input,
[CommandArgument] ValueRef<string, Prototype<LanguagePrototype>> @ref,
[CommandArgument] bool removeSpeak = true,
[CommandArgument] bool removeUnderstand = true
)
{
var language = @ref.Evaluate(ctx)!;
if (language == SharedLanguageSystem.UniversalPrototype && HasComp<UniversalLanguageSpeakerComponent>(input))
{
RemComp<UniversalLanguageSpeakerComponent>(input);
EnsureComp<LanguageSpeakerComponent>(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<string> ListSpoken([PipedArgument] EntityUid input)
{
return Languages.GetSpokenLanguages(input);
}
[CommandImplementation("lsunderstood")]
public IEnumerable<string> ListUnderstood([PipedArgument] EntityUid input)
{
return Languages.GetUnderstoodLanguages(input);
}
}