Administration tools: commands and non gameplay server configuration
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

133 lines
4.5 KiB

/**
* Command for changing nickname of the player.
* Copyright 2021-2022 Anton Tarasenko
*------------------------------------------------------------------------------
* This file is part of Acedia.
*
* Acedia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License, or
* (at your option) any later version.
*
* Acedia is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
*/
class ACommandNick extends Command;
var private bool foundErrors;
var private MutableText newName;
var private ACommandNick_Announcer announcer;
protected function Finalizer()
{
_.memory.Free(announcer);
_.memory.Free(newName);
newName = none;
super.Finalizer();
}
protected function BuildData(CommandDataBuilder builder)
{
builder.Group(P("gameplay"));
builder.Summary(P("Changes nickname."));
builder.RequireTarget();
builder.ParamRemainder(P("nick"));
builder.Describe(P("Changes nickname of targeted players to <nick>."));
builder.Option(P("plain"));
builder.Describe(P("Take nickname exactly as typed, without attempting to"
@ "treat it like formatted string."));
builder.Option(P("fix"), P("f"));
builder.Describe(P("In case of a nickname with erroroneous formatting or"
@ "invalid default color (specified with `--color`),"
@ "try to fix/ignore it instead of simply rejecting it."));
builder.Option(P("color"));
builder.Describe(P("Color to use for the nickname. In case nickname is already"
@ "colored, this flag will only affects uncolored parts."));
builder.ParamText(P("default_color"));
announcer = ACommandNick_Announcer(
_.memory.Allocate(class'ACommandNick_Announcer'));
}
protected function Executed(
CallData arguments,
EPlayer callerPlayer,
CommandPermissions permissions
) {
local Text givenName;
local array<FormattingErrorsReport.FormattedStringError> errors;
givenName = arguments.parameters.GetText(P("nick"));
// `newName`'s reference persists between different command calls and
// only deallocated when we need this variable for the next execution.
// "Leaking" a single `Text` like that is insignificant.
_.memory.Free(newName);
newName = _.text.Empty();
if (arguments.options.HasKey(P("plain"))) {
newName = givenName.MutableCopy();
}
else
{
errors = class'FormattingStringParser'.static
.ParseFormatted(givenName, newName, true);
}
foundErrors = false;
if (arguments.options.HasKey(P("color")))
{
foundErrors = !TryChangeDefaultColor(
arguments.options.GetTextBy(P("/color/default_color")));
}
foundErrors = foundErrors || (errors.length > 0);
class'FormattingReportTool'.static.Report(callerConsole, errors);
class'FormattingReportTool'.static.FreeErrors(errors);
}
protected function ExecutedFor(
EPlayer target,
CallData arguments,
EPlayer instigator,
CommandPermissions permissions
) {
local Text alteredVersion;
if (!foundErrors || arguments.options.HasKey(P("fix")))
{
announcer.Setup(target, instigator, othersConsole);
target.SetName(newName);
alteredVersion = target.GetName();
if (newName.Compare(alteredVersion, SCASE_SENSITIVE, SFORM_SENSITIVE)) {
announcer.AnnounceChangedNickname(newName);
}
else {
announcer.AnnounceChangedAlteredNickname(newName, alteredVersion);
}
_.memory.Free(alteredVersion);
}
}
protected function bool TryChangeDefaultColor(BaseText specifiedColor)
{
local Color defaultColor;
if (newName == none) return false;
if (specifiedColor == none) return false;
if (_.color.Parse(specifiedColor, defaultColor))
{
newName.ChangeDefaultColor(defaultColor);
return true;
}
callerConsole
.Write(F("Specified {$TextFailure invalid} color: "))
.WriteLine(specifiedColor);
return false;
}
defaultproperties {
preferredName = "nick"
}