diff --git a/Content.Server/Administration/Commands/CorvaxSetBalanceCommand.cs b/Content.Server/Administration/Commands/CorvaxSetBalanceCommand.cs new file mode 100644 index 00000000000..edb7fb27c8f --- /dev/null +++ b/Content.Server/Administration/Commands/CorvaxSetBalanceCommand.cs @@ -0,0 +1,95 @@ +using Content.Shared.Administration; +using Robust.Shared.Console; +using Content.Server.Database; +using System.Threading; +using Content.Shared.Preferences; +using Content.Shared.Preferences.Loadouts; + +namespace Content.Server.Administration.Commands; + +[AdminCommand(AdminFlags.Host)] +public sealed class SetAllBalanceCommand : IConsoleCommand +{ + [Dependency] private readonly IServerDbManager _dbManager = default!; + + public string Command => "setallbalance"; + public string Description => Loc.GetString("set-all-balance-command-description"); + public string Help => Loc.GetString("set-all-balance-command-help-text", ("command",Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + var loc = IoCManager.Resolve(); + + if (args.Length == 1 && int.TryParse(args[0], out var set_balance)) + { + _dbManager.SetAllBalance(set_balance); + return; + } + else if (args.Length == 1) + { + shell.WriteLine(Loc.GetString("shell-argument-number-invalid", ("index", "1"))); + return; + } + else + { + _dbManager.SetAllBalance(25000); + return; + } + } +} + +[AdminCommand(AdminFlags.Host)] +public sealed class SetZeroBalanceCommand : IConsoleCommand +{ + [Dependency] private readonly IServerDbManager _dbManager = default!; + + public string Command => "setzerobalance"; + public string Description => Loc.GetString("set-balance-command-description"); + public string Help => Loc.GetString("set-balance-command-help-text", ("command", Command)); + + public async void Execute(IConsoleShell shell, string argStr, string[] args) + { + var loc = IoCManager.Resolve(); + if (args.Length == 1) + { + var _userId = await _dbManager.GetPlayerRecordByUserName(args[0], new CancellationToken()); + if (_userId is not null) { + var userId = _userId.UserId; + var _profile = await _dbManager.GetPlayerPreferencesAsync(userId, new CancellationToken()); + if (_profile is not null) { + foreach (var item in _profile.Characters) + { + if (item.Value is HumanoidCharacterProfile profile) + { + var newProfile = new HumanoidCharacterProfile( + profile.Name, + profile.FlavorText, + profile.Species, + profile.Age, + profile.Sex, + profile.Gender, + 0, + profile.Appearance, + profile.SpawnPriority, + profile.JobPriorities, + profile.PreferenceUnavailable, + profile.AntagPreferences, + profile.TraitPreferences, + new Dictionary(profile.Loadouts)); + await _dbManager.SaveCharacterSlotAsync(userId, newProfile, item.Key); + } + } + } + return; + } else { + shell.WriteLine(Loc.GetString("shell-target-player-does-not-exist ")); + return; + } + } + else + { + shell.WriteLine(Loc.GetString("shell-need-exactly-one-argument")); + return; + } + } +} diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index a35c3847fc0..8f4959b0525 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -262,6 +262,13 @@ private static HumanoidCharacterProfile ConvertProfiles(Profile profile) ); } + public async Task SetAllBalance(int set_balance) + { + await using var db = await GetDb(); + await db.DbContext.Database.ExecuteSqlAsync($"""UPDATE profile SET bank_balance = {set_balance}"""); + await db.DbContext.SaveChangesAsync(); + } + private static Profile ConvertProfiles(HumanoidCharacterProfile humanoid, int slot, Profile? profile = null) { profile ??= new Profile(); diff --git a/Content.Server/Database/ServerDbManager.cs b/Content.Server/Database/ServerDbManager.cs index 01d15267274..11b0013907f 100644 --- a/Content.Server/Database/ServerDbManager.cs +++ b/Content.Server/Database/ServerDbManager.cs @@ -171,6 +171,12 @@ public Task EditServerRoleBan( /// The list of all updates to apply to the database. Task UpdatePlayTimes(IReadOnlyCollection updates); + /// + /// Change balance in db + /// + /// The list of all updates to apply to the database. + Task SetAllBalance(int set_balance); + #endregion #region Player Records @@ -519,6 +525,11 @@ public Task UpdatePlayerRecordAsync( return RunDbCommand(() => _db.UpdatePlayerRecord(userId, userName, address, hwId)); } + public Task SetAllBalance(int set_balance) { + DbWriteOpsMetric.Inc(); + return RunDbCommand(() => _db.SetAllBalance(set_balance)); + } + public Task GetPlayerRecordByUserName(string userName, CancellationToken cancel = default) { DbReadOpsMetric.Inc(); diff --git a/Resources/Locale/ru-RU/administration/commands/corvaxsetbalance.ftl b/Resources/Locale/ru-RU/administration/commands/corvaxsetbalance.ftl new file mode 100644 index 00000000000..7e1c34a7268 --- /dev/null +++ b/Resources/Locale/ru-RU/administration/commands/corvaxsetbalance.ftl @@ -0,0 +1,5 @@ +set-all-balance-command-description = Комманда которая ставит баланс у всех. +set-all-balance-command-help-text = Записывает данные в базу данных напрямую. ИСПОЛЬЗОВАТЬ ТОЛЬКО В ЛОББИ И ПОСЛЕ ЧЕГО ПЕРЕЗАПУСТИТЬ СЕРВЕР. + +set-balance-command-description = Команда которая устанавливает баланс по ckey/username. +set-balance-command-help-text = Записывает данные в базу данных напрямую. Первый аргумент - username, Второй не обязательный - значение баланса, если ничего нет ставит 0. ИСПОЛЬЗОВАТЬ ТОЛЬКО В ЛОББИ И ПОСЛЕ ЧЕГО ПЕРЕЗАПУСТИТЬ СЕРВЕР.