From f56e3f6fe970eec681d452d2d7dde3e4d8d5011b Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Mon, 12 Aug 2024 01:57:30 +0200 Subject: [PATCH] Warns - last? - Warn list + unwarn --- CS2-SimpleAdmin.cs | 4 +- CS2-SimpleAdmin.csproj | 4 +- Commands/basebans.cs | 115 --------------------------------------- Commands/basecommands.cs | 58 ++++++++++++++++++++ Config.cs | 6 +- Managers/WarnManager.cs | 50 +++++++++++++++++ VERSION | 2 +- lang/ar.json | 2 + lang/de.json | 2 + lang/en.json | 2 + lang/es.json | 2 + lang/fa.json | 2 + lang/fr.json | 2 + lang/lv.json | 2 + lang/pl.json | 2 + lang/pt-BR.json | 2 + lang/ru.json | 2 + lang/tr.json | 2 + lang/zh-Hans.json | 2 + 19 files changed, 139 insertions(+), 124 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 9d347b1..d7f1786 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -11,7 +11,7 @@ using System.Collections.Concurrent; namespace CS2_SimpleAdmin; -[MinimumApiVersion(246)] +[MinimumApiVersion(253)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static CS2_SimpleAdmin Instance { get; private set; } = new(); @@ -41,7 +41,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.5.1a"; + public override string ModuleVersion => "1.5.2a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index 9c3b0ad..150ed26 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -10,9 +10,9 @@ - + - + diff --git a/Commands/basebans.cs b/Commands/basebans.cs index 15f2e5e..fa39976 100644 --- a/Commands/basebans.cs +++ b/Commands/basebans.cs @@ -572,119 +572,4 @@ public partial class CS2_SimpleAdmin Helper.LogCommand(caller, $"css_warn {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}"); Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Warn, _localizer); } - - /*[ConsoleCommand("css_addwarn")] - [RequiresPermissions("@css/ban")] - [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnAddWarnCommand(CCSPlayerController? caller, CommandInfo command) - { - if (_database == null) return; - - var callerName = caller == null ? "Console" : caller.PlayerName; - - if (command.ArgCount < 2) - return; - if (string.IsNullOrEmpty(command.GetArg(1))) return; - - if (!Helper.ValidateSteamId(command.GetArg(1), out var steamId) || steamId == null) - { - command.ReplyToCommand($"Invalid SteamID64."); - return; - } - - var steamid = steamId.SteamId64.ToString(); - - var reason = _localizer?["sa_unknown"] ?? "Unknown"; - - int.TryParse(command.GetArg(2), out var time); - - if (CheckValidBan(caller, time) == false) - return; - - if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) - reason = command.GetArg(3); - - var adminInfo = new PlayerInfo - { - SteamId = caller?.SteamID.ToString(), - Name = caller?.PlayerName, - IpAddress = caller?.IpAddress?.Split(":")[0] - }; - - var matches = Helper.GetPlayerFromSteamid64(steamid); - if (matches.Count == 1) - { - var player = matches.FirstOrDefault(); - if (player != null && player.IsValid) - { - if (!caller!.CanTarget(player)) - { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); - return; - } - - player.Pawn.Value!.Freeze(); - if (player.UserId.HasValue) - AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - - if (time == 0) - { - if (!player.IsBot && !player.IsHLTV) - using (new WithTemporaryCulture(player.GetLanguage())) - { - player.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - } - if (caller == null || !SilentPlayers.Contains(caller.Slot)) - { - foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) - { - if (_localizer != null) - controller.SendLocalizedMessage(_localizer, - "sa_admin_ban_message_perm", - callerName, - player.PlayerName ?? string.Empty, - reason); - } - } - } - else - { - if (player is { IsBot: false, IsHLTV: false }) - using (new WithTemporaryCulture(player.GetLanguage())) - { - player.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - } - - if (caller == null || !SilentPlayers.Contains(caller.Slot)) - { - foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) - { - if (_localizer != null) - controller.SendLocalizedMessage(_localizer, - "sa_admin_ban_message_time", - callerName, - player.PlayerName ?? string.Empty, - reason, - time); - } - } - } - } - - Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer); - } - - Task.Run(async () => - { - BanManager banManager = new(_database, Config); - await banManager.AddBanBySteamid(steamid, adminInfo, reason, time); - }); - - Helper.LogCommand(caller, command); - //Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); - if (UnlockedCommands) - Server.ExecuteCommand($"banid 2 {steamId.SteamId3}"); - - command.ReplyToCommand($"Banned player with steamid {steamid}."); - }*/ } \ No newline at end of file diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index b6ff098..d49c744 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -6,6 +6,7 @@ using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using CS2_SimpleAdmin.Menus; using Microsoft.Extensions.Logging; @@ -425,6 +426,63 @@ namespace CS2_SimpleAdmin }); }); } + + [ConsoleCommand("css_warns")] + [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [RequiresPermissions("@css/kick")] + public void OnWarnsCommand(CCSPlayerController? caller, CommandInfo command) + { + if (_database == null) return; + + var targets = GetTarget(command); + if (targets == null) return; + + Helper.LogCommand(caller, command); + + var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList(); + + if (playersToTarget.Count > 1) + return; + + Database.Database database = new(_dbConnectionString); + WarnManager warnManager = new(database); + + playersToTarget.ForEach(player => + { + if (!player.UserId.HasValue) return; + if (!caller!.CanTarget(player)) return; + + var steamid = player.SteamID.ToString(); + + BaseMenu warnsMenu = Config.UseChatMenu + ? new ChatMenu(_localizer!["sa_admin_warns_menu_title", player.PlayerName]) + : new CenterHtmlMenu(_localizer!["sa_admin_warns_menu_title", player.PlayerName], Instance); + + Task.Run(async () => + { + var warnsList = await warnManager.GetPlayerWarns(steamid, false); + var sortedWarns = warnsList + .OrderBy(warn => (string)warn.status == "ACTIVE" ? 0 : 1) + .ThenByDescending(warn => (int)warn.id) + .ToList(); + + sortedWarns.ForEach(w => + { + warnsMenu.AddMenuOption($"[{((string)w.status == "ACTIVE" ? $"{ChatColors.LightRed}X" : $"{ChatColors.Lime}✔️")}{ChatColors.Default}] {(string)w.reason}", + (controller, option) => + { + _ = warnManager.UnwarnPlayer(steamid, (int)w.id); + player.PrintToChat(_localizer["sa_admin_warns_unwarn", player.PlayerName, (string)w.reason]); + }); + }); + + await Server.NextFrameAsync(() => + { + warnsMenu.Open(player); + }); + }); + }); + } [ConsoleCommand("css_players")] [CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] diff --git a/Config.cs b/Config.cs index 999b837..bf3d8a5 100644 --- a/Config.cs +++ b/Config.cs @@ -211,10 +211,8 @@ namespace CS2_SimpleAdmin [JsonPropertyName("WarnThreshold")] public Dictionary WarnThreshold { get; set; } = new() { - { 1, "" }, - { 2, "" }, - { 3, "" }, - { 4, "css_ban USERID 120 \"4/4 Warn\"" }, + { 998, "css_addban STEAMID64 60 \"3/4 Warn\"" }, + { 999, "css_ban #USERID 120 \"4/4 Warn\"" }, }; [JsonPropertyName("DisableDangerousCommands")] diff --git a/Managers/WarnManager.cs b/Managers/WarnManager.cs index 28c9d8c..b12ddc5 100644 --- a/Managers/WarnManager.cs +++ b/Managers/WarnManager.cs @@ -63,6 +63,38 @@ internal class WarnManager(Database.Database database) } catch { }; } + + public async Task> GetPlayerWarns(string steamId, bool active = true) + { + try + { + await using var connection = await database.GetConnectionAsync(); + + string sql; + + if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) + { + sql = active + ? "SELECT * FROM sa_warns WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' ORDER BY id DESC" + : "SELECT * FROM sa_warns WHERE player_steamid = @PlayerSteamID ORDER BY id DESC"; + } + else + { + sql = active + ? "SELECT * FROM sa_warns WHERE player_steamid = @PlayerSteamID AND server_id = @serverid AND status = 'ACTIVE' ORDER BY id DESC" + : "SELECT * FROM sa_warns WHERE player_steamid = @PlayerSteamID AND server_id = @serverid ORDER BY id DESC"; + } + + var parameters = new { PlayerSteamID = steamId, serverid = CS2_SimpleAdmin.ServerId }; + var warns = await connection.QueryAsync(sql, parameters); + + return warns; + } + catch (Exception) + { + return []; + } + } public async Task GetPlayerWarnsCount(string steamId, bool active = true) { @@ -87,6 +119,24 @@ internal class WarnManager(Database.Database database) } } + public async Task UnwarnPlayer(string steamid, int warnId) + { + try + { + await using var connection = await database.GetConnectionAsync(); + + var sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode + ? "UPDATE sa_warns SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND player_steamid = @steamid AND id = @warnId" + : "UPDATE sa_warns SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND player_steamid = @steamid AND id = @warnId AND server_id = @serverid"; + + await connection.ExecuteAsync(sql, new { steamid, warnId, serverid = CS2_SimpleAdmin.ServerId }); + } + catch (Exception ex) + { + CS2_SimpleAdmin._logger?.LogCritical($"Unable to remove warn + {ex}"); + } + } + public async Task ExpireOldWarns() { try diff --git a/VERSION b/VERSION index 6dcb824..a7409fc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.1a \ No newline at end of file +1.5.2a \ No newline at end of file diff --git a/lang/ar.json b/lang/ar.json index 06bea32..39ad0b7 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "المسؤول {lightred}{0}{default} قام بالانتقال إلى {lightred}{1}{default}!", "sa_admin_bring_message": "المسؤول {lightred}{0}{default} قام بنقل نفسه إلى {lightred}{1}{default}!", "sa_admin_team_message": "المسؤول {lightred}{0}{default} قام بنقل {lightred}{1}{default} إلى {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}التحذيرات", + "sa_admin_warns_unwarn": "{lime}تم بنجاح{default} إزالة التحذير عن {gold}{0} {default}من {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}التصويت على {gold}{0}", "sa_admin_vote_message": "المسؤول {lightred}{0}{default} بدأ التصويت على {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}نتائج التصويت على {gold}{0}", diff --git a/lang/de.json b/lang/de.json index 56cb5e3..1475310 100644 --- a/lang/de.json +++ b/lang/de.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "Admin {lightred}{0}{default} hat sich zu {lightred}{1}{default} teleportiert!", "sa_admin_bring_message": "Admin {lightred}{0}{default} hat zu sich {lightred}{1}{default} teleportiert!", "sa_admin_team_message": "Admin {lightred}{0}{default} hat {lightred}{1}{default} zu {lightred}{2}{default} gewechselt!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}WARNUNGEN", + "sa_admin_warns_unwarn": "{lime}Erfolgreich{default} Warnung von {gold}{0} {default}von {gold}{1}{default} entfernt!", "sa_admin_vote_menu_title": "{lime}ABSTIMMUNG FÜR {gold}{0}", "sa_admin_vote_message": "Admin {lightred}{0}{default} hat eine Abstimmung für {lightred}{1}{default} gestartet", "sa_admin_vote_message_results": "{lime}ABSTIMMUNGS ERGEBNISSE FÜR {gold}{0}", diff --git a/lang/en.json b/lang/en.json index 4e1a91b..ec32f0d 100644 --- a/lang/en.json +++ b/lang/en.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "Admin {lightred}{0}{default} teleported to {lightred}{1}{default}!", "sa_admin_bring_message": "Admin {lightred}{0}{default} teleported to himself {lightred}{1}{default}!", "sa_admin_team_message": "Admin {lightred}{0}{default} transfered {lightred}{1}{default} to {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}WARNS", + "sa_admin_warns_unwarn": "{lime}Successfully{default} unwarned {gold}{0} {default}for {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}VOTING FOR {gold}{0}", "sa_admin_vote_message": "Admin {lightred}{0}{default} started voting for {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}VOTING RESULTS FOR {gold}{0}", diff --git a/lang/es.json b/lang/es.json index a520e14..4991a03 100644 --- a/lang/es.json +++ b/lang/es.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "El administrador {lightred}{0}{default} se ha teletransportado a {lightred}{1}{default}!", "sa_admin_bring_message": "El administrador {lightred}{0}{default} se ha teletransportado a sí mismo a {lightred}{1}{default}!", "sa_admin_team_message": "El administrador {lightred}{0}{default} ha transferido a {lightred}{1}{default} a {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}ADVERTENCIAS", + "sa_admin_warns_unwarn": "{lime}Exitosamente{default} advertencia eliminada de {gold}{0} {default}de {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}VOTACIÓN PARA {gold}{0}", "sa_admin_vote_message": "El administrador {lightred}{0}{default} ha iniciado una votación para {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}RESULTADOS DE LA VOTACIÓN PARA {gold}{0}", diff --git a/lang/fa.json b/lang/fa.json index dc7250f..5d8cd32 100644 --- a/lang/fa.json +++ b/lang/fa.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "مدیر {lightred}{0}{default} به {lightred}{1}{default} جابجا شد!", "sa_admin_bring_message": "مدیر {lightred}{0}{default} خودش به {lightred}{1}{default} جابجا شد!", "sa_admin_team_message": "مدیر {lightred}{0}{default} {lightred}{1}{default} را به {lightred}{2}{default} منتقل کرد!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}اخطارها", + "sa_admin_warns_unwarn": "{lime}با موفقیت{default} اخطار {gold}{0} {default}از {gold}{1}{default} حذف شد!", "sa_admin_vote_menu_title": "{lime}رأی گیری برای {gold}{0}", "sa_admin_vote_message": "مدیر {lightred}{0}{default} رأی گیری برای {lightred}{1}{default} را شروع کرد", "sa_admin_vote_message_results": "{lime}نتایج رأی گیری برای {gold}{0}", diff --git a/lang/fr.json b/lang/fr.json index 5d9f00e..a9de380 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "Admin {lightred}{0}{default} s'est téléporté à {lightred}{1}{default}!", "sa_admin_bring_message": "Admin {lightred}{0}{default} s'est téléporté à lui-même à {lightred}{1}{default}!", "sa_admin_team_message": "Admin {lightred}{0}{default} a transféré {lightred}{1}{default} à {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}AVERTISSEMENTS", + "sa_admin_warns_unwarn": "{lime}Réussi{default} à enlever l'avertissement de {gold}{0} {default}de {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}VOTE POUR {gold}{0}", "sa_admin_vote_message": "Admin {lightred}{0}{default} a lancé un vote pour {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}RÉSULTATS DU VOTE POUR {gold}{0}", diff --git a/lang/lv.json b/lang/lv.json index 649727c..f8be316 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "Admins {lightred}{0}{default} teleported uz {lightred}{1}{default}!", "sa_admin_bring_message": "Admins {lightred}{0}{default} teleportēja sevi uz {lightred}{1}{default}!", "sa_admin_team_message": "Admins {lightred}{0}{default} pārveidoja {lightred}{1}{default} uz {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}BRĪDINĀJUMI", + "sa_admin_warns_unwarn": "{lime}Veiksmīgi{default} noņemts brīdinājums no {gold}{0} {default}no {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}BALSOŠANA PAR {gold}{0}", "sa_admin_vote_message": "Admins {lightred}{0}{default} sāka balsošanu par {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}BALSOŠANAS REZULTĀTI PAR {gold}{0}", diff --git a/lang/pl.json b/lang/pl.json index 8248087..f2d1048 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "Admin {lightred}{0}{default} teleportował się do {lightred}{1}{default}!", "sa_admin_bring_message": "Admin {lightred}{0}{default} teleportował do siebie {lightred}{1}{default}!", "sa_admin_team_message": "Admin {lightred}{0}{default} przerzucił {lightred}{1}{default} do {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{lime}OSTRZEŻENIA {gold}{0}", + "sa_admin_warns_unwarn": "{lime}Pomyślnie{default} usunięto ostrzeżenie dla {gold}{0} {default}za {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}GŁOSOWANIE NA {gold}{0}", "sa_admin_vote_message": "Admin {lightred}{0}{default} rozpoczął głosowanie na {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}WYNIKI GŁOSOWANIA {gold}{0}", diff --git a/lang/pt-BR.json b/lang/pt-BR.json index a8a8230..1b3ed8c 100644 --- a/lang/pt-BR.json +++ b/lang/pt-BR.json @@ -100,6 +100,8 @@ "sa_admin_tp_message": "Admin {lightred}{0}{default} teleportou para {lightred}{1}{default}!", "sa_admin_bring_message": "Admin {lightred}{0}{default} teleportou {lightred}{1}{default} para si mesmo!", "sa_admin_team_message": "Admin {lightred}{0}{default} transferiu {lightred}{1}{default} para o time {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}ADVERTÊNCIAS", + "sa_admin_warns_unwarn": "{lime}Removido com sucesso{default} o aviso de {gold}{0} {default}de {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}VOTAÇÃO PARA {gold}{0}", "sa_admin_vote_message": "Admin {lightred}{0}{default} iniciou uma votação para {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}RESULTADOS DA VOTAÇÃO PARA {gold}{0}", diff --git a/lang/ru.json b/lang/ru.json index 0b70ea7..5423323 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -99,6 +99,8 @@ "sa_admin_tp_message": "Администратор {lightred}{0}{default} телепортировался к {lightred}{1}{default}!", "sa_admin_bring_message": "Администратор {lightred}{0}{default} телепортировал {lightred}{1}{default} к себе!", "sa_admin_team_message": "Администратор {lightred}{0}{default} переместил {lightred}{1}{default} в команду {lightred}{2}{default}!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}ПРЕДУПРЕЖДЕНИЯ", + "sa_admin_warns_unwarn": "{lime}Успешно{default} удалено предупреждение у {gold}{0} {default}от {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}ГОЛОСОВАНИЕ ЗА {gold}{0}", "sa_admin_vote_message": "Администратор {lightred}{0}{default} начал голосование за {lightred}{1}{default}", "sa_admin_vote_message_results": "{lime}РЕЗУЛЬТАТЫ ГОЛОСОВАНИЯ ЗА {gold}{0}", diff --git a/lang/tr.json b/lang/tr.json index 8190f4f..22a9618 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -99,6 +99,8 @@ "sa_admin_tp_message": "Yönetici {lightred}{0}{default}, {lightred}{1}{default}'e teleport edildi!", "sa_admin_bring_message": "Yönetici {lightred}{0}{default}, {lightred}{1}{default}'yi kendine teleport etti!", "sa_admin_team_message": "Yönetici {lightred}{0}{default}, {lightred}{1}{default} {lightred}{2}{default} takımına transfer edildi!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}UYARILAR", + "sa_admin_warns_unwarn": "{lime}Başarıyla{default} uyarı {gold}{0} {default}şu adresten {gold}{1}{default} kaldırıldı!", "sa_admin_vote_menu_title": "{lime}{0} için OYLAMA", "sa_admin_vote_message": "Yönetici {lightred}{0}{default}, {lightred}{1}{default} için oy vermeye başladı", "sa_admin_vote_message_results": "{lime}{0} için OYLAMA SONUÇLARI", diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json index 38d6f39..f7367a3 100644 --- a/lang/zh-Hans.json +++ b/lang/zh-Hans.json @@ -99,6 +99,8 @@ "sa_admin_tp_message": "管理员{lightred}{0}{default}传送到了{lightred}{1}{default}!", "sa_admin_bring_message": "管理员{lightred}{0}{default}将自己传送到了{lightred}{1}{default}!", "sa_admin_team_message": "管理员{lightred}{0}{default}将{lightred}{1}{default}转移到了{lightred}{2}{default}队伍!", + "sa_admin_warns_menu_title": "{gold}{0} {lime}警告", + "sa_admin_warns_unwarn": "{lime}成功{default} 取消了 {gold}{0} {default}的警告,来自 {gold}{1}{default}!", "sa_admin_vote_menu_title": "{lime}投票选举{gold}{0}", "sa_admin_vote_message": "管理员{lightred}{0}{default}开始对{lightred}{1}{default}进行投票", "sa_admin_vote_message_results": "{lime}投票结果{gold}{0}",