From 0674b7e49259ace644d184844ee05707b9dfabe1 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sun, 11 Aug 2024 22:54:54 +0200 Subject: [PATCH] Warns - first -WarnManager - css_warn - Warn config - Warn languages ~ Warn menu ~ Warn table ~ *css_unwarn ~ css_addwarn --- CS2-SimpleAdmin.cs | 4 - Commands/basebans.cs | 1043 ++++++++++++++++++++++++--------------- Config.cs | 24 +- Events.cs | 8 +- Helper.cs | 13 +- Managers/WarnManager.cs | 107 ++++ PlayerInfo.cs | 2 +- lang/ar.json | 7 +- lang/de.json | 8 +- lang/en.json | 7 +- lang/es.json | 7 +- lang/fa.json | 7 +- lang/fr.json | 7 +- lang/lv.json | 7 +- lang/pl.json | 7 +- lang/pt-BR.json | 7 +- lang/ru.json | 7 +- lang/tr.json | 7 +- lang/zh-Hans.json | 7 +- 19 files changed, 870 insertions(+), 416 deletions(-) create mode 100644 Managers/WarnManager.cs diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 2ee4efe..37d2b0c 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -120,10 +120,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnBanCommand(CCSPlayerController? caller, CommandInfo command) { - [ConsoleCommand("css_ban")] - [RequiresPermissions("@css/ban")] - [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnBanCommand(CCSPlayerController? caller, CommandInfo command) + var callerName = caller == null ? "Console" : caller.PlayerName; + if (command.ArgCount < 2) + return; + + var reason = _localizer?["sa_unknown"] ?? "Unknown"; + + var targets = GetTarget(command); + if (targets == null) return; + var playersToTarget = targets.Players.Where(player => player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && !player.IsHLTV).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) { - var callerName = caller == null ? "Console" : caller.PlayerName; - if (command.ArgCount < 2) - return; - - var reason = _localizer?["sa_unknown"] ?? "Unknown"; - - var targets = GetTarget(command); - if (targets == null) return; - var playersToTarget = targets.Players.Where(player => player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && !player.IsHLTV).ToList(); - - if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) - { - return; - } - - Database.Database database = new(_dbConnectionString); - BanManager banManager = new(database, Config); - - int.TryParse(command.GetArg(2), out var time); - - if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) - reason = command.GetArg(3); - - playersToTarget.ForEach(player => - { - if (caller!.CanTarget(player)) - { - Ban(caller, player, time, reason, callerName, banManager, command); - } - }); + return; } - internal void Ban(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, BanManager? banManager = null, CommandInfo? command = null) + Database.Database database = new(_dbConnectionString); + BanManager banManager = new(database, Config); + + int.TryParse(command.GetArg(2), out var time); + + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) + reason = command.GetArg(3); + + playersToTarget.ForEach(player => { - if (_database == null || player is null || !player.IsValid) return; - if (!caller.CanTarget(player)) return; - - if (CheckValidBan(caller, time) == false) - return; - - callerName ??= caller == null ? "Console" : caller.PlayerName; - - if (player.PawnIsAlive) + if (caller!.CanTarget(player)) { + Ban(caller, player, time, reason, callerName, banManager, command); + } + }); + } + + internal void Ban(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, BanManager? banManager = null, CommandInfo? command = null) + { + if (_database == null || player is null || !player.IsValid) return; + if (!caller.CanTarget(player)) return; + + if (CheckValidBan(caller, time) == false) + return; + + callerName ??= caller == null ? "Console" : caller.PlayerName; + + if (player.PawnIsAlive) + { + player.Pawn.Value!.Freeze(); + } + + PlayerInfo playerInfo = new() + { + SteamId = player.SteamID.ToString(), + Name = player.PlayerName, + IpAddress = player.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new() + { + SteamId = caller?.SteamID.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + banManager ??= new BanManager(_database, Config); + await banManager.BanPlayer(playerInfo, adminInfo, reason, time); + }); + + if (player.UserId.HasValue) + AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), + CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + if (playerInfo.IpAddress != null && !BannedPlayers.Contains(playerInfo.IpAddress)) + BannedPlayers.Add(playerInfo.IpAddress); + if (!BannedPlayers.Contains(player.SteamID.ToString())) + BannedPlayers.Add(player.SteamID.ToString()); + + if (time == 0) + { + if (player is { IsBot: false }) + 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.IsBot) + 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); + } + } + } + + if (UnlockedCommands) + Server.ExecuteCommand($"banid 2 {new SteamID(player.SteamID).SteamId3}"); + + Helper.LogCommand(caller, $"css_ban {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}"); + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer); + } + + [ConsoleCommand("css_addban")] + [RequiresPermissions("@css/ban")] + [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnAddBanCommand(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); - PlayerInfo playerInfo = new() - { - SteamId = player.SteamID.ToString(), - Name = player.PlayerName, - IpAddress = player.IpAddress?.Split(":")[0] - }; - - PlayerInfo adminInfo = new() - { - SteamId = caller?.SteamID.ToString(), - Name = caller?.PlayerName, - IpAddress = caller?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - banManager ??= new BanManager(_database, Config); - await banManager.BanPlayer(playerInfo, adminInfo, reason, time); - }); - - if (player.UserId.HasValue) - AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), - CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - - if (playerInfo.IpAddress != null && !BannedPlayers.Contains(playerInfo.IpAddress)) - BannedPlayers.Add(playerInfo.IpAddress); - if (!BannedPlayers.Contains(player.SteamID.ToString())) - BannedPlayers.Add(player.SteamID.ToString()); - - if (time == 0) - { - if (player is { IsBot: false }) - 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)) + if (time == 0) { - foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) + 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)) { - if (_localizer != null) - controller.SendLocalizedMessage(_localizer, - "sa_admin_ban_message_perm", - callerName, - player.PlayerName ?? string.Empty, - reason); + 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.IsBot) - 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)) + else { - foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) + 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)) { - if (_localizer != null) - controller.SendLocalizedMessage(_localizer, - "sa_admin_ban_message_time", - callerName, - player.PlayerName ?? string.Empty, - reason, - time); + 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); + } } } } - if (UnlockedCommands) - Server.ExecuteCommand($"banid 2 {new SteamID(player.SteamID).SteamId3}"); - - if (command != null) - Helper.LogCommand(caller, command); - - Helper.LogCommand(caller, $"css_ban {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}"); Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer); } - [ConsoleCommand("css_addban")] - [RequiresPermissions("@css/ban")] - [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnAddBanCommand(CCSPlayerController? caller, CommandInfo command) + Task.Run(async () => { - 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}."); - } - - [ConsoleCommand("css_banip")] - [RequiresPermissions("@css/ban")] - [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnBanIp(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; - - var ipAddress = command.GetArg(1); - - if (!Helper.IsValidIp(ipAddress)) - { - command.ReplyToCommand($"Invalid IP address."); - return; - } - - var reason = _localizer?["sa_unknown"] ?? "Unknown"; - - var adminInfo = new PlayerInfo - { - SteamId = caller?.SteamID.ToString(), - Name = caller?.PlayerName, - IpAddress = caller?.IpAddress?.Split(":")[0] - }; - - 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 matches = Helper.GetPlayerFromIp(ipAddress); - 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 (time == 0) - { - if (player is { IsBot: false, IsHLTV: false }) - 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); - } - } - } - - if (player.UserId.HasValue) - { - AddTimer(Config.KickTime, () => - { - Helper.KickPlayer(player.UserId.Value, "Banned"); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - } - - Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer); - } - - Task.Run(async () => - { - BanManager banManager = new(_database, Config); - await banManager.AddBanByIp(ipAddress, adminInfo, reason, time); - }); - - Helper.LogCommand(caller, command); - - command.ReplyToCommand($"Banned player with IP address {ipAddress}."); - } - - private bool CheckValidBan(CCSPlayerController? caller, int duration) - { - if (caller == null) return true; - - bool canPermBan = AdminManager.PlayerHasPermissions(caller, "@css/permban"); - - if (duration == 0 && canPermBan == false) - { - caller.PrintToChat($"{_localizer!["sa_prefix"]} {_localizer["sa_ban_perm_restricted"]}"); - return false; - } - - if (duration > Config.MaxBanDuration && canPermBan == false) - { - caller.PrintToChat($"{_localizer!["sa_prefix"]} {_localizer["sa_ban_max_duration_exceeded", Config.MaxBanDuration]}"); - return false; - } - - return true; - } - - [ConsoleCommand("css_unban")] - [RequiresPermissions("@css/unban")] - [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command) - { - if (_database == null) return; - - var callerSteamId = caller?.SteamID.ToString() ?? "Console"; - - if (command.GetArg(1).Length <= 1) - { - command.ReplyToCommand($"Too short pattern to search."); - return; - } - - var pattern = command.GetArg(1); - var reason = command.GetArg(2); - BanManager banManager = new(_database, Config); - Task.Run(async () => await banManager.UnbanPlayer(pattern, callerSteamId, reason)); + await banManager.AddBanBySteamid(steamid, adminInfo, reason, time); + }); - Helper.LogCommand(caller, command); + 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($"Unbanned player with pattern {pattern}."); - } + command.ReplyToCommand($"Banned player with steamid {steamid}."); } + + [ConsoleCommand("css_banip")] + [RequiresPermissions("@css/ban")] + [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnBanIp(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; + + var ipAddress = command.GetArg(1); + + if (!Helper.IsValidIp(ipAddress)) + { + command.ReplyToCommand($"Invalid IP address."); + return; + } + + var reason = _localizer?["sa_unknown"] ?? "Unknown"; + + var adminInfo = new PlayerInfo + { + SteamId = caller?.SteamID.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + 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 matches = Helper.GetPlayerFromIp(ipAddress); + 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 (time == 0) + { + if (player is { IsBot: false, IsHLTV: false }) + 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); + } + } + } + + if (player.UserId.HasValue) + { + AddTimer(Config.KickTime, () => + { + Helper.KickPlayer(player.UserId.Value, "Banned"); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + } + + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer); + } + + Task.Run(async () => + { + BanManager banManager = new(_database, Config); + await banManager.AddBanByIp(ipAddress, adminInfo, reason, time); + }); + + Helper.LogCommand(caller, command); + + command.ReplyToCommand($"Banned player with IP address {ipAddress}."); + } + + private bool CheckValidBan(CCSPlayerController? caller, int duration) + { + if (caller == null) return true; + + bool canPermBan = AdminManager.PlayerHasPermissions(caller, "@css/permban"); + + if (duration == 0 && canPermBan == false) + { + caller.PrintToChat($"{_localizer!["sa_prefix"]} {_localizer["sa_ban_perm_restricted"]}"); + return false; + } + + if (duration > Config.MaxBanDuration && canPermBan == false) + { + caller.PrintToChat($"{_localizer!["sa_prefix"]} {_localizer["sa_ban_max_duration_exceeded", Config.MaxBanDuration]}"); + return false; + } + + return true; + } + + [ConsoleCommand("css_unban")] + [RequiresPermissions("@css/unban")] + [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command) + { + if (_database == null) return; + + var callerSteamId = caller?.SteamID.ToString() ?? "Console"; + + if (command.GetArg(1).Length <= 1) + { + command.ReplyToCommand($"Too short pattern to search."); + return; + } + + var pattern = command.GetArg(1); + var reason = command.GetArg(2); + + BanManager banManager = new(_database, Config); + Task.Run(async () => await banManager.UnbanPlayer(pattern, callerSteamId, reason)); + + Helper.LogCommand(caller, command); + + command.ReplyToCommand($"Unbanned player with pattern {pattern}."); + } + + [ConsoleCommand("css_warn")] + [RequiresPermissions("@css/kick")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnWarnCommand(CCSPlayerController? caller, CommandInfo command) + { + var callerName = caller == null ? "Console" : caller.PlayerName; + if (command.ArgCount < 2) + return; + + var reason = _localizer?["sa_unknown"] ?? "Unknown"; + + var targets = GetTarget(command); + if (targets == null) return; + var playersToTarget = targets.Players.Where(player => player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && !player.IsHLTV).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) + { + return; + } + + Database.Database database = new(_dbConnectionString); + WarnManager warnManager = new(database); + + int.TryParse(command.GetArg(2), out var time); + + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) + reason = command.GetArg(3); + + playersToTarget.ForEach(player => + { + if (caller!.CanTarget(player)) + { + Warn(caller, player, time, reason, callerName, warnManager, command); + } + }); + } + + internal void Warn(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, WarnManager? warnManager = null, CommandInfo? command = null) + { + if (_database == null || player is null || !player.IsValid) return; + if (!caller.CanTarget(player)) return; + + /* + if (CheckValidBan(caller, time) == false) + return; + */ + + callerName ??= caller == null ? "Console" : caller.PlayerName; + + if (player.PawnIsAlive) + { + player.Pawn.Value?.Freeze(); + + AddTimer(5.0f, () => + { + player.Pawn.Value?.Unfreeze(); + }); + } + + PlayerInfo playerInfo = new() + { + SteamId = player.SteamID.ToString(), + UserId = player.UserId, + Name = player.PlayerName, + IpAddress = player.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new() + { + SteamId = caller?.SteamID.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + warnManager ??= new WarnManager(_database); + await warnManager.WarnPlayer(playerInfo, adminInfo, reason, time); + }); + + if (time == 0) + { + if (player is { IsBot: false }) + using (new WithTemporaryCulture(player.GetLanguage())) + { + player.PrintToCenter(_localizer!["sa_player_warn_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_warn_message_perm", + callerName, + player.PlayerName ?? string.Empty, + reason); + } + } + } + else + { + if (!player.IsBot) + using (new WithTemporaryCulture(player.GetLanguage())) + { + player.PrintToCenter(_localizer!["sa_player_warn_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_warn_message_time", + callerName, + player.PlayerName ?? string.Empty, + reason, + time); + } + } + } + + Task.Run(async () => + { + if (warnManager == null) return; + var totalWarns = await warnManager.GetPlayerWarnsCount(player.SteamID.ToString()); + + if (Config.WarnThreshold.Count != 0) + { + var punishCommand = string.Empty; + + var lastKey = Config.WarnThreshold.Keys.MaxBy(key => key); + + if (totalWarns >= lastKey) + punishCommand = Config.WarnThreshold[lastKey]; + else if (Config.WarnThreshold.TryGetValue(totalWarns, out var value)) + punishCommand = value; + + if (!string.IsNullOrEmpty(punishCommand)) + { + await Server.NextFrameAsync(() => + { + Server.PrintToChatAll(totalWarns.ToString()); + Server.ExecuteCommand(punishCommand.Replace("USERID", playerInfo.UserId?.ToString()).Replace("STEAMID64", playerInfo.SteamId)); + }); + } + } + }); + + 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/Config.cs b/Config.cs index 41136f6..4f4f100 100644 --- a/Config.cs +++ b/Config.cs @@ -67,6 +67,16 @@ namespace CS2_SimpleAdmin [JsonPropertyName("DiscordPenaltySilenceSettings")] public DiscordPenaltySetting[] DiscordPenaltySilenceSettings { get; set; } = + [ + new DiscordPenaltySetting { Name = "Color", Value = "" }, + new DiscordPenaltySetting { Name = "Webhook", Value = "" }, + new DiscordPenaltySetting { Name = "ThumbnailUrl", Value = "" }, + new DiscordPenaltySetting { Name = "ImageUrl", Value = "" }, + new DiscordPenaltySetting { Name = "Footer", Value = "" }, + ]; + + [JsonPropertyName("DiscordPenaltyWarnSettings")] + public DiscordPenaltySetting[] DiscordPenaltyWarnSettings { get; set; } = [ new DiscordPenaltySetting { Name = "Color", Value = "" }, new DiscordPenaltySetting { Name = "Webhook", Value = "" }, @@ -157,7 +167,7 @@ namespace CS2_SimpleAdmin public class CS2_SimpleAdminConfig : BasePluginConfig { - [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 17; + [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 18; [JsonPropertyName("DatabaseHost")] public string DatabaseHost { get; set; } = ""; @@ -188,7 +198,16 @@ namespace CS2_SimpleAdmin [JsonPropertyName("KickTime")] public int KickTime { get; set; } = 5; - + + [JsonPropertyName("WarnThreshold")] + public Dictionary WarnThreshold { get; set; } = new() + { + { 1, "" }, + { 2, "" }, + { 3, "" }, + { 4, "css_ban USERID 120 \"4/4 Warn\"" }, + }; + [JsonPropertyName("DisableDangerousCommands")] public bool DisableDangerousCommands { get; set; } = true; @@ -200,6 +219,7 @@ namespace CS2_SimpleAdmin [JsonPropertyName("MaxBanDuration")] public int MaxBanDuration { get; set; } = 60 * 24 * 7; + [JsonPropertyName("MultiServerMode")] public bool MultiServerMode { get; set; } = true; diff --git a/Events.cs b/Events.cs index b72344d..2117e3d 100644 --- a/Events.cs +++ b/Events.cs @@ -229,7 +229,7 @@ public partial class CS2_SimpleAdmin // Kick the player if banned await Server.NextFrameAsync(() => { - var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId); + var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId.Value); if (victim?.UserId != null) { @@ -411,8 +411,11 @@ public partial class CS2_SimpleAdmin PermissionManager adminManager = new(_database); BanManager banManager = new(_database, Config); MuteManager muteManager = new(_database); - + WarnManager warnManager = new(_database); + + await muteManager.ExpireOldMutes(); await banManager.ExpireOldBans(); + await warnManager.ExpireOldWarns(); await adminManager.DeleteOldAdmins(); BannedPlayers.Clear(); @@ -435,7 +438,6 @@ public partial class CS2_SimpleAdmin } } - await muteManager.ExpireOldMutes(); await Server.NextFrameAsync(() => { diff --git a/Helper.cs b/Helper.cs index 8568c64..3ba6b37 100644 --- a/Helper.cs +++ b/Helper.cs @@ -254,6 +254,7 @@ namespace CS2_SimpleAdmin Mute, Gag, Silence, + Warn } private static string ConvertMinutesToTime(int minutes) @@ -273,6 +274,7 @@ namespace CS2_SimpleAdmin PenaltyType.Mute => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltyMuteSettings, PenaltyType.Gag => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltyGagSettings, PenaltyType.Silence => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltySilenceSettings, + PenaltyType.Warn => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltyWarnSettings, _ => throw new ArgumentOutOfRangeException(nameof(penalty), penalty, null) }; @@ -286,8 +288,8 @@ namespace CS2_SimpleAdmin var targetName = target != null ? target.PlayerName : localizer["sa_unknown"]; var targetSteamId = target != null ? new SteamID(target.SteamID).SteamId64.ToString() : localizer["sa_unknown"]; - DateTime futureTime = DateTime.Now.AddMinutes(duration); - long futureUnixTimestamp = new DateTimeOffset(futureTime).ToUnixTimeSeconds(); + var futureTime = DateTime.Now.AddMinutes(duration); + var futureUnixTimestamp = new DateTimeOffset(futureTime).ToUnixTimeSeconds(); //var time = duration != 0 ? ConvertMinutesToTime(duration) : localizer["sa_permanent"]; var time = duration != 0 ? $"": localizer["sa_permanent"]; @@ -319,6 +321,7 @@ namespace CS2_SimpleAdmin PenaltyType.Mute => localizer["sa_discord_penalty_mute"], PenaltyType.Gag => localizer["sa_discord_penalty_gag"], PenaltyType.Silence => localizer["sa_discord_penalty_silence"], + PenaltyType.Warn => localizer["sa_discord_penalty_warn"], _ => throw new ArgumentOutOfRangeException(nameof(penalty), penalty, null) }, ThumbnailUrl = penaltySetting.FirstOrDefault(s => s.Name.Equals("ThumbnailUrl"))?.Value, @@ -357,13 +360,13 @@ namespace CS2_SimpleAdmin public static string GetServerIp() { - var network_system = NativeAPI.GetValveInterface(0, "NetworkSystemVersion001"); + var networkSystem = NativeAPI.GetValveInterface(0, "NetworkSystemVersion001"); unsafe { if (_networkSystemUpdatePublicIp == null) { - var funcPtr = *(nint*)(*(nint*)(network_system) + 256); + var funcPtr = *(nint*)(*(nint*)(networkSystem) + 256); _networkSystemUpdatePublicIp = Marshal.GetDelegateForFunctionPointer(funcPtr); } /* @@ -375,7 +378,7 @@ namespace CS2_SimpleAdmin } */ // + 4 to skip type, because the size of uint32_t is 4 bytes - var ipBytes = (byte*)(_networkSystemUpdatePublicIp(network_system) + 4); + var ipBytes = (byte*)(_networkSystemUpdatePublicIp(networkSystem) + 4); // port is always 0, use the one from convar "hostport" return $"{ipBytes[0]}.{ipBytes[1]}.{ipBytes[2]}.{ipBytes[3]}"; } diff --git a/Managers/WarnManager.cs b/Managers/WarnManager.cs new file mode 100644 index 0000000..28c9d8c --- /dev/null +++ b/Managers/WarnManager.cs @@ -0,0 +1,107 @@ +using Dapper; +using Microsoft.Extensions.Logging; + +namespace CS2_SimpleAdmin; + +internal class WarnManager(Database.Database database) +{ + public async Task WarnPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0) + { + if (player.SteamId == null) return; + + var now = DateTime.UtcNow.ToLocalTime(); + var futureTime = now.AddMinutes(time); + + try + { + await using var connection = await database.GetConnectionAsync(); + const string sql = + "INSERT INTO `sa_warns` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @serverid)"; + + await connection.ExecuteAsync(sql, new + { + playerSteamid = player.SteamId, + playerName = player.Name, + adminSteamid = issuer.SteamId ?? "Console", + adminName = issuer.SteamId == null ? "Console" : issuer.Name, + muteReason = reason, + duration = time, + ends = futureTime, + created = now, + serverid = CS2_SimpleAdmin.ServerId + }); + } + catch { }; + } + + public async Task AddWarnBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0) + { + if (string.IsNullOrEmpty(playerSteamId)) return; + + + var now = DateTime.UtcNow.ToLocalTime(); + var futureTime = now.AddMinutes(time); + + try + { + await using var connection = await database.GetConnectionAsync(); + const string sql = "INSERT INTO `sa_warns` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + + "VALUES (@playerSteamid, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @serverid)"; + + await connection.ExecuteAsync(sql, new + { + playerSteamid = playerSteamId, + adminSteamid = issuer.SteamId ?? "Console", + adminName = issuer.Name ?? "Console", + muteReason = reason, + duration = time, + ends = futureTime, + created = now, + serverid = CS2_SimpleAdmin.ServerId + }); + } + catch { }; + } + + public async Task GetPlayerWarnsCount(string steamId, bool active = true) + { + try + { + await using var connection = await database.GetConnectionAsync(); + + var sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode + ? active + ? "SELECT COUNT(*) FROM sa_warns WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE'" + : "SELECT COUNT(*) FROM sa_warns WHERE player_steamid = @PlayerSteamID" + : active + ? "SELECT COUNT(*) FROM sa_warns WHERE player_steamid = @PlayerSteamID AND server_id = @serverid AND status = 'ACTIVE'" + : "SELECT COUNT(*) FROM sa_warns WHERE player_steamid = @PlayerSteamID'"; + + var muteCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId, serverid = CS2_SimpleAdmin.ServerId }); + return muteCount; + } + catch (Exception) + { + return 0; + } + } + + public async Task ExpireOldWarns() + { + 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 `duration` > 0 AND ends <= @CurrentTime" + : "UPDATE sa_warns SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime AND server_id = @serverid"; + + await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.UtcNow.ToLocalTime(), serverid = CS2_SimpleAdmin.ServerId }); + } + catch (Exception ex) + { + CS2_SimpleAdmin._logger?.LogCritical($"Unable to remove expired warns + {ex}"); + } + } +} \ No newline at end of file diff --git a/PlayerInfo.cs b/PlayerInfo.cs index b8c0b41..440ee5b 100644 --- a/PlayerInfo.cs +++ b/PlayerInfo.cs @@ -2,7 +2,7 @@ { public class PlayerInfo { - public int UserId { get; init; } + public int? UserId { get; init; } public int Slot { get; init; } public string? SteamId { get; init; } public string? Name { get; init; } diff --git a/lang/ar.json b/lang/ar.json index 481e961..5a86a88 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "الكتم مسجل", "sa_discord_penalty_gag": "الصمت مسجل", "sa_discord_penalty_silence": "الصمت مسجل", + "sa_discord_warn_silence": "التحذير مسجل", "sa_discord_penalty_unknown": "غير معروف مسجل", "sa_player_ban_message_time": "تم حظرك لمدة {lightred}{0}{default} لمدة {lightred}{1}{default} دقيقة من قبل {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "تم كتم صوتك بشكل دائم لمدة {lightred}{0}{default} من قبل {lightred}{1}{default}!", "sa_player_silence_message_time": "تم إسكاتك لمدة {lightred}{0}{default} لمدة {lightred}{1}{default} دقيقة من قبل {lightred}{2}{default}!", "sa_player_silence_message_perm": "تم إسكاتك بشكل دائم لمدة {lightred}{0}{default} من قبل {lightred}{1}{default}!", + "sa_player_warn_message_time": "لقد تم تحذيرك بسبب {lightred}{0}{default} لمدة {lightred}{1}{default} دقيقة بواسطة {lightred}{2}{default}!", + "sa_player_warn_message_perm": "لقد تم تحذيرك بشكل دائم بسبب {lightred}{0}{default} بواسطة {lightred}{1}{default}!", "sa_admin_ban_message_time": "المسؤول {lightred}{0}{default} حظر {lightred}{1}{default} لمدة {lightred}{2}{default} لمدة {lightred}{3}{default} دقيقة!", "sa_admin_ban_message_perm": "المسؤول {lightred}{0}{default} حظر {lightred}{1}{default} بشكل دائم لمدة {lightred}{2}{default}!", "sa_admin_kick_message": "المسؤول {lightred}{0}{default} طرد {lightred}{1}{default} لمدة {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "المسؤول {lightred}{0}{default} قام بكتم صوت {lightred}{1}{default} بشكل دائم لمدة {lightred}{2}{default}!", "sa_admin_silence_message_time": "المسؤول {lightred}{0}{default} قام بإسكات {lightred}{1}{default} لمدة {lightred}{2}{default} لمدة {lightred}{3}{default} دقيقة!", "sa_admin_silence_message_perm": "المسؤول {lightred}{0}{default} قام بإسكات {lightred}{1}{default} بشكل دائم لمدة {lightred}{2}{default}!", + "sa_admin_warn_message_time": "الإداري {lightred}{0}{default} حذر {lightred}{1}{default} بسبب {lightred}{2}{default} لمدة {lightred}{3}{default} دقيقة!", + "sa_admin_warn_message_perm": "الإداري {lightred}{0}{default} حذر {lightred}{1}{default} بشكل دائم بسبب {lightred}{2}{default}!", "sa_admin_give_message": "المسؤول {lightred}{0}{default} قام بإعطاء {lightred}{1}{default} {lightred}{2}{default}!", "sa_admin_strip_message": "المسؤول {lightred}{0}{default} قام بسحب كل أسلحة {lightred}{1}{default}!", "sa_admin_hp_message": "المسؤول {lightred}{0}{default} قام بتغيير كمية نقاط الصحة لـ {lightred}{1}{default}!", @@ -102,5 +107,5 @@ "sa_adminchat_template_admin": "{LIME}(مسؤول) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(لاعب) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** أصدر الأمر `{1}` على الخادم `HOSTNAME`", + "sa_discord_log_command": "**{0}** أصدر الأمر `{1}` على الخادم `HOSTNAME`" } \ No newline at end of file diff --git a/lang/de.json b/lang/de.json index 941ce28..ba0607f 100644 --- a/lang/de.json +++ b/lang/de.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Chat-Stummschaltung registriert", "sa_discord_penalty_gag": "Sprachchat-Stummschaltung registriert", "sa_discord_penalty_silence": "Komplett-Stummschaltung registriert", + "sa_discord_penalty_warn": "Warnung registriert", "sa_discord_penalty_unknown": "Unbekanntes registriert", "sa_player_ban_message_time": "Du wurdest wegen {lightred}{0}{default} für {lightred}{1}{default} Minuten von {lightred}{2}{default} gebannt!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Du wurdest wegen {lightred}{0}{default} von {lightred}{1}{default} permanent im Sprachchat stummgeschaltet!", "sa_player_silence_message_time": "Du wurdest wegen {lightred}{0}{default} für {lightred}{1}{default} Minuten von {lightred}{2}{default} vollständig stummgeschaltet!", "sa_player_silence_message_perm": "Du wurdest wegen {lightred}{0}{default} von {lightred}{1}{default} permanent vollständig stummgeschaltet!", + "sa_player_warn_message_time": "Du wurdest wegen {lightred}{0}{default} für {lightred}{1}{default} Minuten von {lightred}{2}{default} gewarnt!", + "sa_player_warn_message_perm": "Du wurdest dauerhaft wegen {lightred}{0}{default} von {lightred}{1}{default} gewarnt!", "sa_admin_ban_message_time": "Admin {lightred}{0}{default} hat {lightred}{1}{default} wegen {lightred}{2}{default} für {lightred}{3}{default} Minuten gebannt!", "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} hat {lightred}{1}{default} wegen {lightred}{2}{default} permanent gebannt!", "sa_admin_kick_message": "Admin {lightred}{0}{default} hat {lightred}{1}{default} wegen {lightred}{2}{default} gekickt!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} hat {lightred}{1}{default} wegen {lightred}{2}{default} permanent im Sprachchat stummgeschaltet!", "sa_admin_silence_message_time": "Admin {lightred}{0}{default} hat {lightred}{1}{default} wegen {lightred}{2}{default} für {lightred}{3}{default} Minuten vollständig stummgeschaltet!", "sa_admin_silence_message_perm": "Admin {lightred}{0}{default} hat {lightred}{1}{default} wegen {lightred}{2}{default} permanent vollständig stummgeschaltet!", + "sa_admin_warn_message_time": "Admin {lightred}{0}{default} hat {lightred}{1}{default} wegen {lightred}{2}{default} für {lightred}{3}{default} Minuten gewarnt!", + "sa_admin_warn_message_perm": "Admin {lightred}{0}{default} hat {lightred}{1}{default} dauerhaft wegen {lightred}{2}{default} gewarnt!", "sa_admin_give_message": "Admin {lightred}{0}{default} hat {lightred}{1}{default} eine {lightred}{2}{default} gegeben!", "sa_admin_strip_message": "Admin {lightred}{0}{default} hat {lightred}{1}{default} alle Waffen abgenommen!", "sa_admin_hp_message": "Admin {lightred}{0}{default} hat {lightred}{1}{default} Lp geändert{default}!", @@ -101,5 +106,6 @@ "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(PLAYER) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** hat den Befehl `{1}` auf dem Server `HOSTNAME` ausgeführt", + + "sa_discord_log_command": "**{0}** hat den Befehl `{1}` auf dem Server `HOSTNAME` ausgeführt" } diff --git a/lang/en.json b/lang/en.json index 9524a43..1eb3088 100644 --- a/lang/en.json +++ b/lang/en.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Mute registered", "sa_discord_penalty_gag": "Gag registered", "sa_discord_penalty_silence": "Silence registered", + "sa_discord_warn_silence": "Warn registered", "sa_discord_penalty_unknown": "Unknown registered", "sa_player_ban_message_time": "You have been banned for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "You have been muted permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_player_silence_message_time": "You have been silenced for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", "sa_player_silence_message_perm": "You have been silenced permanently for {lightred}{0}{default} by {lightred}{1}{default}!", + "sa_player_warn_message_time": "You have been warned for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", + "sa_player_warn_message_perm": "You have been warned permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_admin_ban_message_time": "Admin {lightred}{0}{default} banned {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} banned {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_kick_message": "Admin {lightred}{0}{default} kicked {lightred}{1}{default} for {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} muted {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_silence_message_time": "Admin {lightred}{0}{default} silenced {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", "sa_admin_silence_message_perm": "Admin {lightred}{0}{default} silenced {lightred}{1}{default} permanently for {lightred}{2}{default}!", + "sa_admin_warn_message_time": "Admin {lightred}{0}{default} warned {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", + "sa_admin_warn_message_perm": "Admin {lightred}{0}{default} warned {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{2}{default}!", "sa_admin_strip_message": "Admin {lightred}{0}{default} took all of player {lightred}{1}{default} weapons!", "sa_admin_hp_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} hp amount{default}!", @@ -101,5 +106,5 @@ "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(PLAYER) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** issued command `{1}` on server `HOSTNAME`", + "sa_discord_log_command": "**{0}** issued command `{1}` on server `HOSTNAME`" } \ No newline at end of file diff --git a/lang/es.json b/lang/es.json index 044c1e0..3900d39 100644 --- a/lang/es.json +++ b/lang/es.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Silencio registrado", "sa_discord_penalty_gag": "Mordaza registrada", "sa_discord_penalty_silence": "Silencio registrado", + "sa_discord_penalty_warn": "Advertencia registrada", "sa_discord_penalty_unknown": "Registro desconocido", "sa_player_ban_message_time": "Has sido baneado por {lightred}{0}{default} durante {lightred}{1}{default} minutos por {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Has sido muteado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", "sa_player_silence_message_time": "Has sido silenciado por {lightred}{0}{default} durante {lightred}{1}{default} minutos por {lightred}{2}{default}!", "sa_player_silence_message_perm": "Has sido silenciado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", + "sa_player_warn_message_time": "¡Has sido advertido por {lightred}{0}{default} durante {lightred}{1}{default} minutos por {lightred}{2}{default}!", + "sa_player_warn_message_perm": "¡Has sido advertido permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", "sa_admin_ban_message_time": "El administrador {lightred}{0}{default} ha baneado a {lightred}{1}{default} por {lightred}{2}{default} durante {lightred}{3}{default} minutos!", "sa_admin_ban_message_perm": "El administrador {lightred}{0}{default} ha baneado permanentemente a {lightred}{1}{default} por {lightred}{2}{default}!", "sa_admin_kick_message": "El administrador {lightred}{0}{default} ha expulsado a {lightred}{1}{default} por {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "El administrador {lightred}{0}{default} ha muteado permanentemente a {lightred}{1}{default} por {lightred}{2}{default}!", "sa_admin_silence_message_time": "El administrador {lightred}{0}{default} ha silenciado a {lightred}{1}{default} por {lightred}{2}{default} durante {lightred}{3}{default} minutos!", "sa_admin_silence_message_perm": "El administrador {lightred}{0}{default} ha silenciado permanentemente a {lightred}{1}{default} por {lightred}{2}{default}!", + "sa_admin_warn_message_time": "¡El administrador {lightred}{0}{default} advirtió a {lightred}{1}{default} por {lightred}{2}{default} durante {lightred}{3}{default} minutos!", + "sa_admin_warn_message_perm": "¡El administrador {lightred}{0}{default} advirtió a {lightred}{1}{default} permanentemente por {lightred}{2}{default}!", "sa_admin_give_message": "El administrador {lightred}{0}{default} ha dado a {lightred}{1}{default} un {lightred}{2}{default}!", "sa_admin_strip_message": "El administrador {lightred}{0}{default} ha quitado todas las armas de {lightred}{1}{default}!", "sa_admin_hp_message": "El administrador {lightred}{0}{default} ha cambiado la cantidad de puntos de vida de {lightred}{1}{default}!", @@ -102,5 +107,5 @@ "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(JUGADOR) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** emitió el comando `{1}` en el servidor `HOSTNAME`", + "sa_discord_log_command": "**{0}** emitió el comando `{1}` en el servidor `HOSTNAME`" } \ No newline at end of file diff --git a/lang/fa.json b/lang/fa.json index 228fa53..7d8aa0f 100644 --- a/lang/fa.json +++ b/lang/fa.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "سکوت انجام شده", "sa_discord_penalty_gag": "بند زدن انجام شده", "sa_discord_penalty_silence": "سکوت انجام شده", + "sa_discord_penalty_warn": "هشدار ثبت شد", "sa_discord_penalty_unknown": "ناشناخته انجام شده", "sa_player_ban_message_time": "شما توسط {lightred}{2}{default} برای {lightred}{1}{default} دقیقه به دلیل {lightred}{0}{default} مسدود شده‌اید!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "شما توسط {lightred}{1}{default} به دلیل {lightred}{0}{default} برای همیشه بی‌صدا شده‌اید!", "sa_player_silence_message_time": "شما توسط {lightred}{2}{default} برای {lightred}{1}{default} دقیقه به دلیل {lightred}{0}{default} ساکت شده‌اید!", "sa_player_silence_message_perm": "شما توسط {lightred}{1}{default} به دلیل {lightred}{0}{default} برای همیشه ساکت شده‌اید!", + "sa_player_warn_message_time": "شما به خاطر {lightred}{0}{default} به مدت {lightred}{1}{default} دقیقه توسط {lightred}{2}{default} هشدار داده شده\u200Cاید!", + "sa_player_warn_message_perm": "شما به طور دائم به خاطر {lightred}{0}{default} توسط {lightred}{1}{default} هشدار داده شده\u200Cاید!", "sa_admin_ban_message_time": "مدیر {lightred}{0}{default} {lightred}{3}{default} توسط {lightred}{2}{default} برای {lightred}{1}{default} دقیقه برای {lightred}{3}{default} مسدود کرد!", "sa_admin_ban_message_perm": "مدیر {lightred}{0}{default} {lightred}{2}{default} را به دلیل {lightred}{1}{default} برای همیشه مسدود کرد!", "sa_admin_kick_message": "مدیر {lightred}{0}{default} {lightred}{1}{default} را به دلیل {lightred}{2}{default} اخراج کرد!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "مدیر {lightred}{0}{default} {lightred}{1}{default} را به دلیل {lightred}{2}{default} برای همیشه بی‌صدا کرد!", "sa_admin_silence_message_time": "مدیر {lightred}{0}{default} {lightred}{1}{default} را برای {lightred}{3}{default} دقیقه به دلیل {lightred}{2}{default} ساکت کرد!", "sa_admin_silence_message_perm": "مدیر {lightred}{0}{default} {lightred}{1}{default} را به دلیل {lightred}{2}{default} برای همیشه ساکت کرد!", + "sa_admin_warn_message_time": "مدیر {lightred}{0}{default} به دلیل {lightred}{2}{default} به مدت {lightred}{3}{default} دقیقه به {lightred}{1}{default} هشدار داد!", + "sa_admin_warn_message_perm": "مدیر {lightred}{0}{default} به طور دائم به {lightred}{1}{default} به خاطر {lightred}{2}{default} هشدار داد!", "sa_admin_give_message": "مدیر {lightred}{0}{default} {lightred}{2}{default} به {lightred}{1}{default} داد!", "sa_admin_strip_message": "مدیر {lightred}{0}{default} تمام اسلحه‌های {lightred}{1}{default} را گرفت!", "sa_admin_hp_message": "مدیر {lightred}{0}{default} مقدار اچ‌پی {lightred}{1}{default} را تغییر داد!", @@ -102,5 +107,5 @@ "sa_adminchat_template_admin": "{LIME}(مدیر) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(بازیکن) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** دستور `{1}` را در سرور `HOSTNAME` اجرا کرد", + "sa_discord_log_command": "**{0}** دستور `{1}` را در سرور `HOSTNAME` اجرا کرد" } \ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json index f1af48f..e48db1d 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Mute enregistré", "sa_discord_penalty_gag": "Gag enregistré", "sa_discord_penalty_silence": "Silence enregistré", + "sa_discord_penalty_warn": "Avertissement enregistré", "sa_discord_penalty_unknown": "Inconnu enregistré", "sa_player_ban_message_time": "Vous avez été banni pour {lightred}{0}{default} pendant {lightred}{1}{default} minutes par {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Vous avez été réduit au silence définitivement pour {lightred}{0}{default} par {lightred}{1}{default}!", "sa_player_silence_message_time": "Vous avez été mis en sourdine pour {lightred}{0}{default} pendant {lightred}{1}{default} minutes par {lightred}{2}{default}!", "sa_player_silence_message_perm": "Vous avez été mis en sourdine définitivement pour {lightred}{0}{default} par {lightred}{1}{default}!", + "sa_player_warn_message_time": "Vous avez été averti pour {lightred}{0}{default} pendant {lightred}{1}{default} minutes par {lightred}{2}{default}!", + "sa_player_warn_message_perm": "Vous avez été averti définitivement pour {lightred}{0}{default} par {lightred}{1}{default}!", "sa_admin_ban_message_time": "Admin {lightred}{0}{default} a banni {lightred}{1}{default} pour {lightred}{2}{default} pendant {lightred}{3}{default} minutes!", "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} a banni {lightred}{1}{default} définitivement pour {lightred}{2}{default}!", "sa_admin_kick_message": "Admin {lightred}{0}{default} a expulsé {lightred}{1}{default} pour {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} a réduit au silence {lightred}{1}{default} définitivement pour {lightred}{2}{default}!", "sa_admin_silence_message_time": "Admin {lightred}{0}{default} a mis en sourdine {lightred}{1}{default} pour {lightred}{2}{default} pendant {lightred}{3}{default} minutes!", "sa_admin_silence_message_perm": "Admin {lightred}{0}{default} a mis en sourdine {lightred}{1}{default} définitivement pour {lightred}{2}{default}!", + "sa_admin_warn_message_time": "Admin {lightred}{0}{default} a averti {lightred}{1}{default} pour {lightred}{2}{default} pendant {lightred}{3}{default} minutes!", + "sa_admin_warn_message_perm": "Admin {lightred}{0}{default} a averti {lightred}{1}{default} définitivement pour {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} a donné à {lightred}{1}{default} un {lightred}{2}{default}!", "sa_admin_strip_message": "Admin {lightred}{0}{default} a retiré toutes les armes de {lightred}{1}{default}!", "sa_admin_hp_message": "Admin {lightred}{0}{default} a changé la quantité de points de vie de {lightred}{1}{default}!", @@ -102,5 +107,5 @@ "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default} : {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(JOUEUR) {lightred}{0}{default} : {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** a exécuté la commande `{1}` sur le serveur `HOSTNAME`", + "sa_discord_log_command": "**{0}** a exécuté la commande `{1}` sur le serveur `HOSTNAME`" } \ No newline at end of file diff --git a/lang/lv.json b/lang/lv.json index 1adaea5..ddb7a99 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Mute reģistrēts", "sa_discord_penalty_gag": "Gag reģistrēts", "sa_discord_penalty_silence": "Klusums reģistrēts", + "sa_discord_penalty_warn": "Brīdinājums reģistrēts", "sa_discord_penalty_unknown": "Nezināms reģistrēts", "sa_player_ban_message_time": "Tu esi nobanots uz {lightred}{0}{default} uz {lightred}{1}{default} minūtēm, iemesls: {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Tev ir izliegta balsu rakstīšana uz mūžu, iemesls: {lightred}{0}{default}, Admins: {lightred}{1}{default}!", "sa_player_silence_message_time": "Tevis balss ir izslēgta uz {lightred}{0}{default} uz {lightred}{1}{default} minūtēm, iemesls: {lightred}{2}{default}, Admins: {lightred}{3}{default}!", "sa_player_silence_message_perm": "Tevis balss ir izslēgta uz mūžu, iemesls: {lightred}{0}{default}, Admins: {lightred}{1}{default}!", + "sa_player_warn_message_time": "Jums ir izteikts brīdinājums par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm no {lightred}{2}{default}!", + "sa_player_warn_message_perm": "Jums ir izteikts pastāvīgs brīdinājums par {lightred}{0}{default} no {lightred}{1}{default}!", "sa_admin_ban_message_time": "Admins {lightred}{0}{default} nobanoja {lightred}{1}{default} uz {lightred}{2}{default} uz {lightred}{3}{default} minūtēm, iemesls: {lightred}{4}{default}!", "sa_admin_ban_message_perm": "Admins {lightred}{0}{default} nobanoja {lightred}{1}{default} uz mūžu, iemesls: {lightred}{2}{default}!", "sa_admin_kick_message": "Admins {lightred}{0}{default} izmeta {lightred}{1}{default}, iemesls: {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Admins {lightred}{0}{default} izliega balsu rakstīšanu {lightred}{1}{default} uz mūžu, iemesls: {lightred}{2}{default}!", "sa_admin_silence_message_time": "Admins {lightred}{0}{default} izslēdza balss iespēju {lightred}{1}{default} uz {lightred}{2}{default} uz {lightred}{3}{default} minūtēm, iemesls: {lightred}{4}{default}!", "sa_admin_silence_message_perm": "Admins {lightred}{0}{default} izslēdza balss iespēju {lightred}{1}{default} uz mūžu, iemesls: {lightred}{2}{default}!", + "sa_admin_warn_message_time": "Admins {lightred}{0}{default} brīdināja {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", + "sa_admin_warn_message_perm": "Admins {lightred}{0}{default} brīdināja {lightred}{1}{default} pastāvīgi par {lightred}{2}{default}!", "sa_admin_give_message": "Admins {lightred}{0}{default} deva {lightred}{1}{default} {lightred}{2}{default}!", "sa_admin_strip_message": "Admins {lightred}{0}{default} paņēma visus spēlētāja {lightred}{1}{default} ieročus!", "sa_admin_hp_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} HP daudzumu!", @@ -102,5 +107,5 @@ "sa_adminchat_template_admin": "{LIME}(Admins) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(SPĒLĒTĀJS) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** izmantoja komandu `{1}` uz servera `HOSTNAME`", + "sa_discord_log_command": "**{0}** izmantoja komandu `{1}` uz servera `HOSTNAME`" } \ No newline at end of file diff --git a/lang/pl.json b/lang/pl.json index f50881c..f5ff6ac 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Nowe wyciszenie", "sa_discord_penalty_gag": "Nowe zakneblowanie", "sa_discord_penalty_silence": "Nowe uciszenie", + "sa_discord_penalty_warn": "Nowe ostrzeżenie", "sa_discord_penalty_unknown": "Nowa nieznana blokada", "sa_player_ban_message_time": "Zostałeś zbanowany za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Zostałeś uciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", "sa_player_silence_message_time": "Zostałeś wyciszony za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", "sa_player_silence_message_perm": "Zostałeś wyciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", + "sa_player_warn_message_time": "Otrzymałeś ostrzeżenie za {lightred}{0}{default} na {lightred}{1}{default} minut od {lightred}{2}{default}!", + "sa_player_warn_message_perm": "Otrzymałeś ostrzeżenie za {lightred}{0}{default} od {lightred}{1}{default}!", "sa_admin_ban_message_time": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_kick_message": "Admin {lightred}{0}{default} wyrzucił {lightred}{1}{default} za {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_silence_message_time": "Admin {lightred}{0}{default} wyciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", "sa_admin_silence_message_perm": "Admin {lightred}{0}{default} wyciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", + "sa_admin_warn_message_time": "Admin {lightred}{0}{default} ostrzegł {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", + "sa_admin_warn_message_perm": "Admin {lightred}{0}{default} ostrzegł {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{2}{default}!", "sa_admin_strip_message": "Admin {lightred}{0}{default} zabrał wszystkie bronie {lightred}{1}{default}!", "sa_admin_hp_message": "Admin {lightred}{0}{default} zmienił ilość hp dla {lightred}{1}{default}!", @@ -102,5 +107,5 @@ "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(GRACZ) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** użył komendy `{1}` na serwerze `HOSTNAME`", + "sa_discord_log_command": "**{0}** użył komendy `{1}` na serwerze `HOSTNAME`" } \ No newline at end of file diff --git a/lang/pt-BR.json b/lang/pt-BR.json index 6adf0c9..2b9c3de 100644 --- a/lang/pt-BR.json +++ b/lang/pt-BR.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Mute registrado", "sa_discord_penalty_gag": "Gag registrado", "sa_discord_penalty_silence": "Silêncio registrado", + "sa_discord_penalty_warn": "Aviso registrado", "sa_discord_penalty_unknown": "Desconhecido registrado", "sa_player_ban_message_time": "Você foi banido por {lightred}{0}{default} por {lightred}{1}{default} minutos por {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Você foi mutado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", "sa_player_silence_message_time": "Você foi silenciado por {lightred}{0}{default} por {lightred}{1}{default} minutos por {lightred}{2}{default}!", "sa_player_silence_message_perm": "Você foi silenciado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", + "sa_player_warn_message_time": "Você foi advertido por {lightred}{0}{default} por {lightred}{1}{default} minutos por {lightred}{2}{default}!", + "sa_player_warn_message_perm": "Você foi advertido permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", "sa_admin_ban_message_time": "Admin {lightred}{0}{default} baniu {lightred}{1}{default} por {lightred}{2}{default} por {lightred}{3}{default} minutos!", "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} baniu {lightred}{1}{default} permanentemente por {lightred}{2}{default}!", "sa_admin_kick_message": "Admin {lightred}{0}{default} expulsou {lightred}{1}{default} por {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} mutou {lightred}{1}{default} permanentemente por {lightred}{2}{default}!", "sa_admin_silence_message_time": "Admin {lightred}{0}{default} silenciou {lightred}{1}{default} por {lightred}{2}{default} por {lightred}{3}{default} minutos!", "sa_admin_silence_message_perm": "Admin {lightred}{0}{default} silenciou {lightred}{1}{default} permanentemente por {lightred}{2}{default}!", + "sa_admin_warn_message_time": "Admin {lightred}{0}{default} advertiu {lightred}{1}{default} por {lightred}{2}{default} durante {lightred}{3}{default} minutos!", + "sa_admin_warn_message_perm": "Admin {lightred}{0}{default} advertiu {lightred}{1}{default} permanentemente por {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} deu {lightred}{1}{default} um {lightred}{2}{default}!", "sa_admin_strip_message": "Admin {lightred}{0}{default} removeu todas as armas do jogador {lightred}{1}{default}!", "sa_admin_hp_message": "Admin {lightred}{0}{default} alterou a quantidade de HP para {lightred}{1}{default}!", @@ -102,5 +107,5 @@ "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(JOGADOR) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** emitiu o comando `{1}` no servidor `HOSTNAME`", + "sa_discord_log_command": "**{0}** emitiu o comando `{1}` no servidor `HOSTNAME`" } \ No newline at end of file diff --git a/lang/ru.json b/lang/ru.json index 2d69ee8..32ca79d 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Мут зарегистрирован", "sa_discord_penalty_gag": "Запрет зарегистрирован", "sa_discord_penalty_silence": "Молчание зарегистрировано", + "sa_discord_penalty_warn": "Предупреждение зарегистрировано", "sa_discord_penalty_unknown": "Неизвестно зарегистрировано", "sa_player_ban_message_time": "Вы были забанены по причине {lightred}{0}{default} на {lightred}{1}{default} минут(ы) администратором {lightred}{2}{default}!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Вам навсегда запрещено использовать голосовой чат по причине {lightred}{0}{default} администратором {lightred}{1}{default}!", "sa_player_silence_message_time": "Вам запрещено общаться по причине {lightred}{0}{default} на {lightred}{1}{default} минут(ы) администратором {lightred}{2}{default}!", "sa_player_silence_message_perm": "Вам навсегда запрещено общаться по причине {lightred}{0}{default} администратором {lightred}{1}{default}!", + "sa_player_warn_message_time": "Вы получили предупреждение за {lightred}{0}{default} на {lightred}{1}{default} минут от {lightred}{2}{default}!", + "sa_player_warn_message_perm": "Вы получили постоянное предупреждение за {lightred}{0}{default} от {lightred}{1}{default}!", "sa_admin_ban_message_time": "Администратор {lightred}{0}{default} забанил {lightred}{1}{default} по причине {lightred}{2}{default} на {lightred}{3}{default} минут(ы)!", "sa_admin_ban_message_perm": "Администратор {lightred}{0}{default} забанил {lightred}{1}{default} навсегда по причине {lightred}{2}{default}!", "sa_admin_kick_message": "Администратор {lightred}{0}{default} выгнал {lightred}{1}{default} по причине {lightred}{2}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Администратор {lightred}{0}{default} запретил использовать голосовой чат {lightred}{1}{default} навсегда по причине {lightred}{2}{default}!", "sa_admin_silence_message_time": "Администратор {lightred}{0}{default} запретил общаться {lightred}{1}{default} по причине {lightred}{2}{default} на {lightred}{3}{default} минут(ы)!", "sa_admin_silence_message_perm": "Администратор {lightred}{0}{default} запретил общаться {lightred}{1}{default} навсегда по причине {lightred}{2}{default}!", + "sa_admin_warn_message_time": "Администратор {lightred}{0}{default} предупредил {lightred}{1}{default} за {lightred}{2}{default} на {lightred}{3}{default} минут!", + "sa_admin_warn_message_perm": "Администратор {lightred}{0}{default} предупредил {lightred}{1}{default} навсегда за {lightred}{2}{default}!", "sa_admin_give_message": "Администратор {lightred}{0}{default} выдал {lightred}{1}{default} {lightred}{2}{default}!", "sa_admin_strip_message": "Администратор {lightred}{0}{default} забрал все оружия у игрока {lightred}{1}{default}!", "sa_admin_hp_message": "Администратор {lightred}{0}{default} изменил количество HP на {lightred}{1}{default}!", @@ -101,5 +106,5 @@ "sa_adminchat_template_admin": "{LIME}(АДМИНИСТРАТОР) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(ИГРОК) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** выполнил команду `{1}` на сервере `HOSTNAME`", + "sa_discord_log_command": "**{0}** выполнил команду `{1}` на сервере `HOSTNAME`" } \ No newline at end of file diff --git a/lang/tr.json b/lang/tr.json index 233bea8..672119d 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "Susturma kaydedildi", "sa_discord_penalty_gag": "Susturma kaydedildi", "sa_discord_penalty_silence": "Sessizlik kaydedildi", + "sa_discord_penalty_warn": "Uyarı kaydedildi", "sa_discord_penalty_unknown": "Bilinmeyen kaydedildi", "sa_player_ban_message_time": "Senaryo nedeniyle {lightred}{0}{default} dakika boyunca {lightred}{1}{default} tarafından yasaklandınız!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "Senaryo nedeniyle kalıcı olarak {lightred}{0}{default} tarafından sessize alındınız!", "sa_player_silence_message_time": "Senaryo nedeniyle {lightred}{0}{default} dakika boyunca {lightred}{1}{default} tarafından susturuldunuz!", "sa_player_silence_message_perm": "Senaryo nedeniyle kalıcı olarak {lightred}{0}{default} tarafından susturuldunuz!", + "sa_player_warn_message_time": "{lightred}{0}{default} nedeniyle {lightred}{1}{default} dakika boyunca {lightred}{2}{default} tarafından uyarıldınız!", + "sa_player_warn_message_perm": "{lightred}{0}{default} nedeniyle {lightred}{1}{default} tarafından kalıcı olarak uyarıldınız!", "sa_admin_ban_message_time": "Yönetici {lightred}{0}{default}, senaryo nedeniyle {lightred}{1}{default} {lightred}{2}{default} için {lightred}{3}{default} dakika boyunca yasakladı!", "sa_admin_ban_message_perm": "Yönetici {lightred}{0}{default}, senaryo nedeniyle {lightred}{1}{default} {lightred}{2}{default} kalıcı olarak yasakladı!", "sa_admin_kick_message": "Yönetici {lightred}{0}{default}, senaryo nedeniyle {lightred}{1}{default} tarafından atıldınız!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "Yönetici {lightred}{0}{default}, senaryo nedeniyle {lightred}{1}{default} kalıcı olarak {lightred}{2}{default} sessize aldı!", "sa_admin_silence_message_time": "Yönetici {lightred}{0}{default}, senaryo nedeniyle {lightred}{1}{default} {lightred}{2}{default} için {lightred}{3}{default} dakika boyunca susturdu!", "sa_admin_silence_message_perm": "Yönetici {lightred}{0}{default}, senaryo nedeniyle {lightred}{1}{default} kalıcı olarak {lightred}{2}{default} susturdu!", + "sa_admin_warn_message_time": "Yönetici {lightred}{0}{default} {lightred}{1}{default} kişiyi {lightred}{2}{default} nedeniyle {lightred}{3}{default} dakika boyunca uyardı!", + "sa_admin_warn_message_perm": "Yönetici {lightred}{0}{default} {lightred}{1}{default} kişiyi kalıcı olarak {lightred}{2}{default} nedeniyle uyardı!", "sa_admin_give_message": "Yönetici {lightred}{0}{default}, {lightred}{1}{default} adlı oyuncuya {lightred}{2}{default} verdi!", "sa_admin_strip_message": "Yönetici {lightred}{0}{default}, tüm {lightred}{1}{default} silahlarını aldı!", "sa_admin_hp_message": "Yönetici {lightred}{0}{default}, {lightred}{1}{default} HP miktarını değiştirdi!", @@ -101,5 +106,5 @@ "sa_adminchat_template_admin": "{LIME}(YÖNETİCİ) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(OYUNCU) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}**, sunucuda `HOSTNAME` üzerinde `{1}` komutunu gerçekleştirdi!", + "sa_discord_log_command": "**{0}**, sunucuda `HOSTNAME` üzerinde `{1}` komutunu gerçekleştirdi!" } \ No newline at end of file diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json index ae91229..d7a3ae7 100644 --- a/lang/zh-Hans.json +++ b/lang/zh-Hans.json @@ -56,6 +56,7 @@ "sa_discord_penalty_mute": "禁言已记录", "sa_discord_penalty_gag": "禁言已记录", "sa_discord_penalty_silence": "禁声已记录", + "sa_discord_penalty_warn": "警告已注册", "sa_discord_penalty_unknown": "未知已记录", "sa_player_ban_message_time": "你因为{lightred}{0}{default}的原因被{lightred}{1}{default}禁止{lightred}{2}{default}分钟!", @@ -67,6 +68,8 @@ "sa_player_mute_message_perm": "你因为{lightred}{0}{default}的原因被{lightred}{1}{default}永久禁声!", "sa_player_silence_message_time": "你因为{lightred}{0}{default}的原因被{lightred}{2}{default}禁止发言{lightred}{1}{default}分钟!", "sa_player_silence_message_perm": "你因为{lightred}{0}{default}的原因被{lightred}{1}{default}永久禁止发言!", + "sa_player_warn_message_time": "您因 {lightred}{0}{default} 被 {lightred}{1}{default} 分钟内由 {lightred}{2}{default} 警告!", + "sa_player_warn_message_perm": "您因 {lightred}{0}{default} 被 {lightred}{1}{default} 永久警告!", "sa_admin_ban_message_time": "管理员{lightred}{0}{default}因为{lightred}{2}{default}的原因禁止了{lightred}{1}{default} {lightred}{3}{default}分钟!", "sa_admin_ban_message_perm": "管理员{lightred}{0}{default}因为{lightred}{2}{default}的原因永久禁止了{lightred}{1}{default}!", "sa_admin_kick_message": "管理员{lightred}{0}{default}因为{lightred}{2}{default}的原因踢出了{lightred}{1}{default}!", @@ -76,6 +79,8 @@ "sa_admin_mute_message_perm": "管理员{lightred}{0}{default}因为{lightred}{2}{default}的原因永久禁声了{lightred}{1}{default}!", "sa_admin_silence_message_time": "管理员{lightred}{0}{default}因为{lightred}{2}{default}的原因禁止了{lightred}{1}{default} {lightred}{3}{default}分钟的发言!", "sa_admin_silence_message_perm": "管理员{lightred}{0}{default}因为{lightred}{2}{default}的原因永久禁止了{lightred}{1}{default}的发言!", + "sa_admin_warn_message_time": "管理员 {lightred}{0}{default} 警告了 {lightred}{1}{default} {lightred}{2}{default} 因为 {lightred}{3}{default} 分钟!", + "sa_admin_warn_message_perm": "管理员 {lightred}{0}{default} 永久警告了 {lightred}{1}{default} 因为 {lightred}{2}{default}!", "sa_admin_give_message": "管理员{lightred}{0}{default}给了{lightred}{1}{default} {lightred}{2}{default}!", "sa_admin_strip_message": "管理员{lightred}{0}{default}拿走了玩家{lightred}{1}{default}的所有武器!", "sa_admin_hp_message": "管理员{lightred}{0}{default}改变了{lightred}{1}{default}的HP数值!", @@ -101,5 +106,5 @@ "sa_adminchat_template_admin": "{LIME}(管理员) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(玩家) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_discord_log_command": "**{0}** 在服务器 `HOSTNAME` 上执行了命令 `{1}`!", + "sa_discord_log_command": "**{0}** 在服务器 `HOSTNAME` 上执行了命令 `{1}`!" } \ No newline at end of file