/** * 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 . */ class ACommandNick extends Command; protected function BuildData(CommandDataBuilder builder) { builder.Name(P("nick")).Summary(P("Changes nickname.")); builder.RequireTarget(); builder.ParamText(P("nick")) .Describe(P("Changes nickname of targeted players to .")); builder.Option(P("plain")) .Describe(P("Take nickname exactly as typed, without attempting to" @ "treat it like formatted string.")); builder.Option(P("fix"), P("F")) .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")) .Describe(P("Color to use for the nickname. In case nickname is already" @ "colored, this flag will only affects uncolored parts.")) .ParamText(P("default_color")); } protected function ExecutedFor( EPlayer player, CallData result, EPlayer callerPlayer) { local bool foundErrors, selfChange; local Text givenName, oldName, callerName; local MutableText newName; local array errors; oldName = player.GetName(); givenName = result.parameters.GetText(P("nick")); callerName = callerPlayer.GetName(); selfChange = callerPlayer.SameAs(player); if (result.options.HasKey(P("plain"))) { player.SetName(givenName); AnnounceNicknameChange(callerName, oldName, givenName, selfChange); _.memory.Free(oldName); _.memory.Free(callerName); return; } newName = _.text.Empty(); errors = class'FormattingStringParser'.static .ParseFormatted(givenName, newName, true); if (result.options.HasKey(P("color"))) { foundErrors = !TryChangeDefaultColor( newName, result.options.GetTextBy(P("/color/default_color"))); } foundErrors = foundErrors || (errors.length > 0); if (!foundErrors || result.options.HasKey(P("fix"))) { player.SetName(newName); AnnounceNicknameChange(callerName, oldName, newName, selfChange); } class'FormattingReportTool'.static.Report(callerConsole, errors); class'FormattingReportTool'.static.FreeErrors(errors); _.memory.Free(newName); _.memory.Free(oldName); _.memory.Free(callerName); } protected function bool TryChangeDefaultColor( MutableText newName, BaseText specifiedColor) { local Color defaultColor; if (newName == none) return false; if (specifiedColor == none) return false; if (_.color.Parse(specifiedColor, defaultColor)) { newName.ChangeDefaultFormatting( _.text.FormattingFromColor(defaultColor)); return true; } callerConsole .Write(F("Specified {$TextFailure invalid} color: ")) .WriteLine(specifiedColor); return false; } protected function AnnounceNicknameChange( BaseText callerName, BaseText oldName, BaseText newName, bool selfChange) { if (selfChange) { callerConsole .Write(F("Your nickname was {$TextPositive changed} to ")) .WriteLine(newName); othersConsole .Write(callerName) .Write(F(" {$TextEmphasis changed} thier own nickname to ")) .WriteLine(newName); return; } callerConsole .Write(P("Nickname for player ")).Write(oldName) .Write(F(" was {$TextPositive changed} to ")).WriteLine(newName); targetConsole .Write(F("Your nickname was {$TextEmphasis changed} to ")) .Write(newName) .Write(P(" by ")) .WriteLine(callerName); othersConsole .Write(callerName) .Write(F(" {$TextEmphasis changed} nickname for player ")) .Write(oldName) .Write(P(" to ")) .WriteLine(newName); } defaultproperties { }