- Minor changes
This commit is contained in:
Dawid Bepierszcz
2024-04-28 02:14:50 +02:00
parent 806b5038ca
commit aefa6c6355
28 changed files with 1268 additions and 1351 deletions

13
.idea/.idea.CS2-SimpleAdmin/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/modules.xml
/projectSettingsUpdater.xml
/.idea.CS2-SimpleAdmin.iml
/contentModel.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/Managers/BanManager.cs" dialect="GenericSQL" />
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -18,10 +18,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
public static IStringLocalizer? _localizer; public static IStringLocalizer? _localizer;
public static Dictionary<string, int> voteAnswers = []; public static Dictionary<string, int> voteAnswers = [];
public static ConcurrentBag<int> godPlayers = []; private static ConcurrentBag<int> godPlayers = [];
public static ConcurrentBag<int> silentPlayers = []; private static ConcurrentBag<int> silentPlayers = [];
public static ConcurrentBag<string> bannedPlayers = []; private static ConcurrentBag<string> bannedPlayers = [];
public static bool TagsDetected = false; private static bool TagsDetected = false;
public static bool voteInProgress = false; public static bool voteInProgress = false;
public static int? ServerId = null; public static int? ServerId = null;
@@ -52,7 +52,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
OnMapStart(string.Empty); OnMapStart(string.Empty);
} }
CBasePlayerController_SetPawnFunc = new(GameData.GetSignature("CBasePlayerController_SetPawn")); CBasePlayerController_SetPawnFunc = new MemoryFunctionVoid<CBasePlayerController, CCSPlayerPawn, bool, bool>(GameData.GetSignature("CBasePlayerController_SetPawn"));
} }
public void OnConfigParsed(CS2_SimpleAdminConfig config) public void OnConfigParsed(CS2_SimpleAdminConfig config)
@@ -132,14 +132,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
_localizer = Localizer; _localizer = Localizer;
if (!string.IsNullOrEmpty(Config.Discord.DiscordLogWebhook)) if (!string.IsNullOrEmpty(Config.Discord.DiscordLogWebhook))
_discordWebhookClientLog = new(Config.Discord.DiscordLogWebhook); _discordWebhookClientLog = new DiscordWebhookClient(Config.Discord.DiscordLogWebhook);
if (!string.IsNullOrEmpty(Config.Discord.DiscordPenaltyWebhook)) if (!string.IsNullOrEmpty(Config.Discord.DiscordPenaltyWebhook))
_discordWebhookClientPenalty = new(Config.Discord.DiscordPenaltyWebhook); _discordWebhookClientPenalty = new DiscordWebhookClient(Config.Discord.DiscordPenaltyWebhook);
} }
private static TargetResult? GetTarget(CommandInfo command) private static TargetResult? GetTarget(CommandInfo command)
{ {
TargetResult matches = command.GetArgTargetResult(1); var matches = command.GetArgTargetResult(1);
if (!matches.Any()) if (!matches.Any())
{ {
@@ -162,13 +162,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
List<int> tempList = []; List<int> tempList = [];
while (!bag.IsEmpty) while (!bag.IsEmpty)
{ {
if (bag.TryTake(out int item) && item != playerSlot) if (bag.TryTake(out var item) && item != playerSlot)
{ {
tempList.Add(item); tempList.Add(item);
} }
} }
foreach (int item in tempList) foreach (var item in tempList)
{ {
bag.Add(item); bag.Add(item);
} }

View File

@@ -15,15 +15,15 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [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) public void OnBanCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (command.ArgCount < 2) if (command.ArgCount < 2)
return; return;
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList();
if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
{ {
@@ -33,7 +33,7 @@ namespace CS2_SimpleAdmin
Database database = new(dbConnectionString); Database database = new(dbConnectionString);
BanManager _banManager = new(database, Config); BanManager _banManager = new(database, Config);
int.TryParse(command.GetArg(2), out int time); int.TryParse(command.GetArg(2), out var time);
if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
reason = command.GetArg(3); reason = command.GetArg(3);
@@ -47,7 +47,7 @@ namespace CS2_SimpleAdmin
}); });
} }
internal void Ban(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, BanManager? banManager = null, CommandInfo? command = null) 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 (_database == null || player is null || !player.IsValid) return;
@@ -95,15 +95,15 @@ namespace CS2_SimpleAdmin
player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_ban_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_ban_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -115,15 +115,15 @@ namespace CS2_SimpleAdmin
{ {
player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_ban_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_ban_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -143,40 +143,39 @@ namespace CS2_SimpleAdmin
public void OnAddBanCommand(CCSPlayerController? caller, CommandInfo command) public void OnAddBanCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (command.ArgCount < 2) if (command.ArgCount < 2)
return; return;
if (string.IsNullOrEmpty(command.GetArg(1))) return; if (string.IsNullOrEmpty(command.GetArg(1))) return;
string steamid = command.GetArg(1); var steamid = command.GetArg(1);
if (!Helper.IsValidSteamID64(steamid)) if (!Helper.IsValidSteamId64(steamid))
{ {
command.ReplyToCommand($"Invalid SteamID64."); command.ReplyToCommand($"Invalid SteamID64.");
return; return;
} }
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
Database database = new(dbConnectionString); Database database = new(dbConnectionString);
BanManager _banManager = new(database, Config);
int.TryParse(command.GetArg(2), out int time); int.TryParse(command.GetArg(2), out var time);
if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
reason = command.GetArg(3); reason = command.GetArg(3);
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
IpAddress = caller?.IpAddress?.Split(":")[0] IpAddress = caller?.IpAddress?.Split(":")[0]
}; };
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(steamid); var matches = Helper.GetPlayerFromSteamid64(steamid);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
if (!caller!.CanTarget(player)) if (!caller!.CanTarget(player))
@@ -196,36 +195,36 @@ namespace CS2_SimpleAdmin
{ {
player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_ban_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_ban_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
} }
else else
{ {
if (!player.IsBot && !player.IsHLTV) if (player is { IsBot: false, IsHLTV: false })
using (new WithTemporaryCulture(player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_ban_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_ban_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -241,11 +240,8 @@ namespace CS2_SimpleAdmin
await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time);
}); });
if (command != null)
{
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
}
//Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); //Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer);
command?.ReplyToCommand($"Banned player with steamid {steamid}."); command?.ReplyToCommand($"Banned player with steamid {steamid}.");
@@ -257,15 +253,15 @@ namespace CS2_SimpleAdmin
public void OnBanIp(CCSPlayerController? caller, CommandInfo command) public void OnBanIp(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (command.ArgCount < 2) if (command.ArgCount < 2)
return; return;
if (string.IsNullOrEmpty(command.GetArg(1))) return; if (string.IsNullOrEmpty(command.GetArg(1))) return;
string ipAddress = command.GetArg(1); var ipAddress = command.GetArg(1);
if (!Helper.IsValidIP(ipAddress)) if (!Helper.IsValidIp(ipAddress))
{ {
command.ReplyToCommand($"Invalid IP address."); command.ReplyToCommand($"Invalid IP address.");
return; return;
@@ -273,24 +269,24 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
IpAddress = caller?.IpAddress?.Split(":")[0] IpAddress = caller?.IpAddress?.Split(":")[0]
}; };
int.TryParse(command.GetArg(2), out int time); int.TryParse(command.GetArg(2), out var time);
if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
reason = command.GetArg(3); reason = command.GetArg(3);
List<CCSPlayerController> matches = Helper.GetPlayerFromIp(ipAddress); var matches = Helper.GetPlayerFromIp(ipAddress);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
if (!caller!.CanTarget(player)) if (!caller!.CanTarget(player))
@@ -303,21 +299,21 @@ namespace CS2_SimpleAdmin
if (time == 0) if (time == 0)
{ {
if (!player.IsBot && !player.IsHLTV) if (player is { IsBot: false, IsHLTV: false })
using (new WithTemporaryCulture(player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_ban_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_ban_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -329,15 +325,15 @@ namespace CS2_SimpleAdmin
{ {
player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_ban_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_ban_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -360,11 +356,8 @@ namespace CS2_SimpleAdmin
await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time);
}); });
if (command != null)
{
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
}
command?.ReplyToCommand($"Banned player with IP address {ipAddress}."); command?.ReplyToCommand($"Banned player with IP address {ipAddress}.");
} }
@@ -376,8 +369,7 @@ namespace CS2_SimpleAdmin
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller?.PlayerName ?? "Console"; var callerSteamId = caller?.SteamID.ToString() ?? "Console";
string callerSteamId = caller?.SteamID.ToString() ?? "Console";
if (command.GetArg(1).Length <= 1) if (command.GetArg(1).Length <= 1)
{ {
@@ -385,8 +377,8 @@ namespace CS2_SimpleAdmin
return; return;
} }
string pattern = command.GetArg(1); var pattern = command.GetArg(1);
string reason = command.GetArg(2); var reason = command.GetArg(2);
BanManager _banManager = new(_database, Config); BanManager _banManager = new(_database, Config);
Task.Run(async () => await _banManager.UnbanPlayer(pattern, callerSteamId, reason)); Task.Run(async () => await _banManager.UnbanPlayer(pattern, callerSteamId, reason));

View File

@@ -18,21 +18,22 @@ namespace CS2_SimpleAdmin
public void OnAdminToAdminSayCommand(CCSPlayerController? caller, CommandInfo command) public void OnAdminToAdminSayCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (caller == null || !caller.IsValid || command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return; if (caller == null || !caller.IsValid || command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller.PlayerName;
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
string utf8String = Encoding.UTF8.GetString(utf8BytesString); var utf8String = Encoding.UTF8.GetString(utf8BytesString);
foreach (CCSPlayerController _player in Helper.GetValidPlayers().Where(p => AdminManager.PlayerHasPermissions(p, "@css/chat"))) foreach (var player in Helper.GetValidPlayers()
.Where(p => AdminManager.PlayerHasPermissions(p, "@css/chat")))
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append(_localizer!["sa_adminchat_template_admin", caller == null ? "Console" : caller.PlayerName, utf8String]); sb.Append(_localizer!["sa_adminchat_template_admin", caller == null ? "Console" : caller.PlayerName, utf8String]);
_player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
} }
} }
} }
@@ -44,20 +45,20 @@ namespace CS2_SimpleAdmin
{ {
if (command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return; if (command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
string utf8String = Encoding.UTF8.GetString(utf8BytesString); var utf8String = Encoding.UTF8.GetString(utf8BytesString);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var player in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append(_localizer!["sa_adminsay_prefix", utf8String]); sb.Append(_localizer!["sa_adminsay_prefix", utf8String]);
_player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
} }
} }
} }
@@ -67,26 +68,26 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/chat")] [RequiresPermissions("@css/chat")]
public void OnAdminPrivateSayCommand(CCSPlayerController? caller, CommandInfo command) public void OnAdminPrivateSayCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList();
//Helper.LogCommand(caller, command); //Helper.LogCommand(caller, command);
int range = command.GetArg(0).Length + command.GetArg(1).Length + 2; var range = command.GetArg(0).Length + command.GetArg(1).Length + 2;
string message = command.GetCommandString[range..]; var message = command.GetCommandString[range..];
byte[] utf8BytesString = Encoding.UTF8.GetBytes(message); var utf8BytesString = Encoding.UTF8.GetBytes(message);
string utf8String = Encoding.UTF8.GetString(utf8BytesString); var utf8String = Encoding.UTF8.GetString(utf8BytesString);
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
player.PrintToChat(StringExtensions.ReplaceColorTags($"({callerName}) {utf8String}")); player.PrintToChat($"({callerName}) {utf8String}".ReplaceColorTags());
}); });
command.ReplyToCommand(StringExtensions.ReplaceColorTags($" Private message sent!")); command.ReplyToCommand($" Private message sent!".ReplaceColorTags());
} }
[ConsoleCommand("css_csay", "Say to all players (in center).")] [ConsoleCommand("css_csay", "Say to all players (in center).")]
@@ -94,14 +95,14 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/chat")] [RequiresPermissions("@css/chat")]
public void OnAdminCenterSayCommand(CCSPlayerController? caller, CommandInfo command) public void OnAdminCenterSayCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
string utf8String = Encoding.UTF8.GetString(utf8BytesString); var utf8String = Encoding.UTF8.GetString(utf8BytesString);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
Helper.PrintToCenterAll(StringExtensions.ReplaceColorTags(utf8String)); Helper.PrintToCenterAll(utf8String.ReplaceColorTags());
} }
[ConsoleCommand("css_hsay", "Say to all players (in hud).")] [ConsoleCommand("css_hsay", "Say to all players (in hud).")]
@@ -109,16 +110,16 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/chat")] [RequiresPermissions("@css/chat")]
public void OnAdminHudSayCommand(CCSPlayerController? caller, CommandInfo command) public void OnAdminHudSayCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
string utf8String = Encoding.UTF8.GetString(utf8BytesString); var utf8String = Encoding.UTF8.GetString(utf8BytesString);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
VirtualFunctions.ClientPrintAll( VirtualFunctions.ClientPrintAll(
HudDestination.Alert, HudDestination.Alert,
StringExtensions.ReplaceColorTags(utf8String), utf8String.ReplaceColorTags(),
0, 0, 0, 0); 0, 0, 0, 0);
} }
} }

View File

@@ -26,24 +26,24 @@ namespace CS2_SimpleAdmin
{ {
try try
{ {
using var connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
var commandText = "ALTER TABLE `sa_mutes` CHANGE `type` `type` ENUM('GAG','MUTE', 'SILENCE', '') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'GAG';"; var commandText = "ALTER TABLE `sa_mutes` CHANGE `type` `type` ENUM('GAG','MUTE', 'SILENCE', '') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'GAG';";
using var commandSql = connection.CreateCommand(); await using var commandSql = connection.CreateCommand();
commandSql.CommandText = commandText; commandSql.CommandText = commandText;
await commandSql.ExecuteNonQueryAsync(); await commandSql.ExecuteNonQueryAsync();
commandText = "ALTER TABLE `sa_servers` MODIFY COLUMN `hostname` varchar(128);"; commandText = "ALTER TABLE `sa_servers` MODIFY COLUMN `hostname` varchar(128);";
using var commandSql1 = connection.CreateCommand(); await using var commandSql1 = connection.CreateCommand();
commandSql1.CommandText = commandText; commandSql1.CommandText = commandText;
await commandSql1.ExecuteNonQueryAsync(); await commandSql1.ExecuteNonQueryAsync();
commandText = "ALTER TABLE `sa_bans` MODIFY `ends` TIMESTAMP NULL DEFAULT NULL;"; commandText = "ALTER TABLE `sa_bans` MODIFY `ends` TIMESTAMP NULL DEFAULT NULL;";
using var commandSql2 = connection.CreateCommand(); await using var commandSql2 = connection.CreateCommand();
commandSql2.CommandText = commandText; commandSql2.CommandText = commandText;
await commandSql2.ExecuteNonQueryAsync(); await commandSql2.ExecuteNonQueryAsync();
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
command.ReplyToCommand($"Successfully updated the database - {ModuleVersion}"); command.ReplyToCommand($"Successfully updated the database - {ModuleVersion}");
}); });
@@ -83,18 +83,11 @@ namespace CS2_SimpleAdmin
} }
} */ } */
string[] lines = File.ReadAllLines(ModuleDirectory + "/admin_help.txt"); var lines = File.ReadAllLines(ModuleDirectory + "/admin_help.txt");
foreach (string line in lines) foreach (var line in lines)
{ {
if (string.IsNullOrWhiteSpace(line)) command.ReplyToCommand(string.IsNullOrWhiteSpace(line) ? " " : line.ReplaceColorTags());
{
command.ReplyToCommand(" ");
}
else
{
command.ReplyToCommand(StringExtensions.ReplaceColorTags(line));
}
} }
} }
@@ -104,9 +97,9 @@ namespace CS2_SimpleAdmin
public void OnAddAdminCommand(CCSPlayerController? caller, CommandInfo command) public void OnAddAdminCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (!Helper.IsValidSteamID64(command.GetArg(1))) if (!Helper.IsValidSteamId64(command.GetArg(1)))
{ {
command.ReplyToCommand($"Invalid SteamID64."); command.ReplyToCommand($"Invalid SteamID64.");
return; return;
@@ -116,19 +109,20 @@ namespace CS2_SimpleAdmin
command.ReplyToCommand($"Invalid player name."); command.ReplyToCommand($"Invalid player name.");
return; return;
} }
if (!command.GetArg(3).Contains("@") && !command.GetArg(3).Contains("#")) if (!command.GetArg(3).Contains('@') && !command.GetArg(3).Contains('#'))
{ {
command.ReplyToCommand($"Invalid flag or group."); command.ReplyToCommand($"Invalid flag or group.");
return; return;
} }
string steamid = command.GetArg(1); var steamid = command.GetArg(1);
string name = command.GetArg(2); var name = command.GetArg(2);
string flags = command.GetArg(3); var flags = command.GetArg(3);
bool globalAdmin = command.GetArg(4).ToLower().Equals("-g") || command.GetArg(5).ToLower().Equals("-g") || command.GetArg(6).ToLower().Equals("-g"); var globalAdmin = command.GetArg(4).ToLower().Equals("-g") || command.GetArg(5).ToLower().Equals("-g") ||
int immunity = 0; command.GetArg(6).ToLower().Equals("-g");
var immunity = 0;
int.TryParse(command.GetArg(4), out immunity); int.TryParse(command.GetArg(4), out immunity);
int time = 0; var time = 0;
int.TryParse(command.GetArg(5), out time); int.TryParse(command.GetArg(5), out time);
AddAdmin(caller, steamid, name, flags, immunity, time, globalAdmin, command); AddAdmin(caller, steamid, name, flags, immunity, time, globalAdmin, command);
@@ -139,14 +133,14 @@ namespace CS2_SimpleAdmin
if (_database == null) return; if (_database == null) return;
AdminSQLManager _adminManager = new(_database); AdminSQLManager _adminManager = new(_database);
List<string> flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList(); var flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList();
_ = _adminManager.AddAdminBySteamId(steamid, name, flagsList, immunity, time, globalAdmin); _ = _adminManager.AddAdminBySteamId(steamid, name, flagsList, immunity, time, globalAdmin);
if (command != null) if (command != null)
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, $"css_addadmin {steamid} {name} {flags} {immunity} {time}"); Helper.LogCommand(caller, $"css_addadmin {steamid} {name} {flags} {immunity} {time}");
string msg = $"Added '{flags}' flags to '{name}' ({steamid})"; var msg = $"Added '{flags}' flags to '{name}' ({steamid})";
if (command != null) if (command != null)
command.ReplyToCommand(msg); command.ReplyToCommand(msg);
else if (caller != null && caller.IsValid) else if (caller != null && caller.IsValid)
@@ -161,16 +155,16 @@ namespace CS2_SimpleAdmin
public void OnDelAdminCommand(CCSPlayerController? caller, CommandInfo command) public void OnDelAdminCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (!Helper.IsValidSteamID64(command.GetArg(1))) if (!Helper.IsValidSteamId64(command.GetArg(1)))
{ {
command.ReplyToCommand($"Invalid SteamID64."); command.ReplyToCommand($"Invalid SteamID64.");
return; return;
} }
string steamid = command.GetArg(1); var steamid = command.GetArg(1);
bool globalDelete = command.GetArg(2).ToLower().Equals("-g"); var globalDelete = command.GetArg(2).ToLower().Equals("-g");
RemoveAdmin(caller, steamid, globalDelete, command); RemoveAdmin(caller, steamid, globalDelete, command);
} }
@@ -183,8 +177,8 @@ namespace CS2_SimpleAdmin
AddTimer(2, () => AddTimer(2, () =>
{ {
if (!string.IsNullOrEmpty(steamid) && SteamID.TryParse(steamid, out var steamId) && steamId != null) if (string.IsNullOrEmpty(steamid) || !SteamID.TryParse(steamid, out var steamId) ||
{ steamId == null) return;
if (AdminSQLManager._adminCache.ContainsKey(steamId)) if (AdminSQLManager._adminCache.ContainsKey(steamId))
{ {
AdminSQLManager._adminCache.TryRemove(steamId, out _); AdminSQLManager._adminCache.TryRemove(steamId, out _);
@@ -192,14 +186,13 @@ namespace CS2_SimpleAdmin
AdminManager.ClearPlayerPermissions(steamId); AdminManager.ClearPlayerPermissions(steamId);
AdminManager.RemovePlayerAdminData(steamId); AdminManager.RemovePlayerAdminData(steamId);
}
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
if (command != null) if (command != null)
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, $"css_deladmin {steamid}"); Helper.LogCommand(caller, $"css_deladmin {steamid}");
string msg = $"Removed flags from '{steamid}'"; var msg = $"Removed flags from '{steamid}'";
if (command != null) if (command != null)
command.ReplyToCommand(msg); command.ReplyToCommand(msg);
else if (caller != null && caller.IsValid) else if (caller != null && caller.IsValid)
@@ -221,15 +214,15 @@ namespace CS2_SimpleAdmin
return; return;
} }
if (!command.GetArg(2).StartsWith("@") && !command.GetArg(2).StartsWith("#")) if (!command.GetArg(2).StartsWith($"@") && !command.GetArg(2).StartsWith($"#"))
{ {
command.ReplyToCommand($"Invalid flag or group."); command.ReplyToCommand($"Invalid flag or group.");
return; return;
} }
string groupName = command.GetArg(1); var groupName = command.GetArg(1);
string flags = command.GetArg(2); var flags = command.GetArg(2);
int immunity = 0; var immunity = 0;
int.TryParse(command.GetArg(3), out immunity); int.TryParse(command.GetArg(3), out immunity);
AddGroup(caller, groupName, flags, immunity, command); AddGroup(caller, groupName, flags, immunity, command);
@@ -240,14 +233,14 @@ namespace CS2_SimpleAdmin
if (_database == null) return; if (_database == null) return;
AdminSQLManager _adminManager = new(_database); AdminSQLManager _adminManager = new(_database);
List<string> flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList(); var flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList();
_ = _adminManager.AddGroup(name, flagsList, immunity); _ = _adminManager.AddGroup(name, flagsList, immunity);
if (command != null) if (command != null)
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, $"css_addgroup {name} {flags} {immunity}"); Helper.LogCommand(caller, $"css_addgroup {name} {flags} {immunity}");
string msg = $"Created group '{name}' with flags '{flags}'"; var msg = $"Created group '{name}' with flags '{flags}'";
if (command != null) if (command != null)
command.ReplyToCommand(msg); command.ReplyToCommand(msg);
else if (caller != null && caller.IsValid) else if (caller != null && caller.IsValid)
@@ -263,18 +256,18 @@ namespace CS2_SimpleAdmin
{ {
if (_database == null) return; if (_database == null) return;
if (!command.GetArg(1).StartsWith("#")) if (!command.GetArg(1).StartsWith($"#"))
{ {
command.ReplyToCommand($"Group name must start with #."); command.ReplyToCommand($"Group name must start with #.");
return; return;
} }
string groupName = command.GetArg(1); var groupName = command.GetArg(1);
RemoveGroup(caller, groupName, command); RemoveGroup(caller, groupName, command);
} }
public void RemoveGroup(CCSPlayerController? caller, string name, CommandInfo? command = null) private void RemoveGroup(CCSPlayerController? caller, string name, CommandInfo? command = null)
{ {
if (_database == null) return; if (_database == null) return;
AdminSQLManager _adminManager = new(_database); AdminSQLManager _adminManager = new(_database);
@@ -289,7 +282,7 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, $"css_delgroup {name}"); Helper.LogCommand(caller, $"css_delgroup {name}");
string msg = $"Removed group '{name}'"; var msg = $"Removed group '{name}'";
if (command != null) if (command != null)
command.ReplyToCommand(msg); command.ReplyToCommand(msg);
else if (caller != null && caller.IsValid) else if (caller != null && caller.IsValid)
@@ -314,14 +307,14 @@ namespace CS2_SimpleAdmin
{ {
if (_database == null) return; if (_database == null) return;
foreach (SteamID steamId in AdminSQLManager._adminCache.Keys.ToList()) for (var index = 0; index < AdminSQLManager._adminCache.Keys.ToList().Count; index++)
{
if (AdminSQLManager._adminCache.TryRemove(steamId, out _))
{ {
var steamId = AdminSQLManager._adminCache.Keys.ToList()[index];
if (!AdminSQLManager._adminCache.TryRemove(steamId, out _)) continue;
AdminManager.ClearPlayerPermissions(steamId); AdminManager.ClearPlayerPermissions(steamId);
AdminManager.RemovePlayerAdminData(steamId); AdminManager.RemovePlayerAdminData(steamId);
} }
}
AdminSQLManager _adminManager = new(_database); AdminSQLManager _adminManager = new(_database);
@@ -376,15 +369,15 @@ namespace CS2_SimpleAdmin
public void OnWhoCommand(CCSPlayerController? caller, CommandInfo command) public void OnWhoCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
//Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); //Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList();
Database database = new(dbConnectionString); Database database = new(dbConnectionString);
BanManager _banManager = new(database, Config); BanManager _banManager = new(database, Config);
@@ -393,8 +386,7 @@ namespace CS2_SimpleAdmin
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
if (!player.UserId.HasValue) return; if (!player.UserId.HasValue) return;
if (caller!.CanTarget(player)) if (!caller!.CanTarget(player)) return;
{
PlayerInfo playerInfo = new() PlayerInfo playerInfo = new()
{ {
UserId = player.UserId.Value, UserId = player.UserId.Value,
@@ -406,13 +398,13 @@ namespace CS2_SimpleAdmin
Task.Run(async () => Task.Run(async () =>
{ {
int totalBans = 0; var totalBans = 0;
int totalMutes = 0; var totalMutes = 0;
totalBans = await _banManager.GetPlayerBans(playerInfo); totalBans = await _banManager.GetPlayerBans(playerInfo);
totalMutes = await _muteManager.GetPlayerMutes(playerInfo.SteamId!); totalMutes = await _muteManager.GetPlayerMutes(playerInfo.SteamId!);
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
Action<string> printMethod = caller == null ? Server.PrintToConsole : caller.PrintToConsole; Action<string> printMethod = caller == null ? Server.PrintToConsole : caller.PrintToConsole;
@@ -439,7 +431,6 @@ namespace CS2_SimpleAdmin
printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------");
}); });
}); });
}
}); });
} }
@@ -448,14 +439,15 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/generic")] [RequiresPermissions("@css/generic")]
public void OnPlayersCommand(CCSPlayerController? caller, CommandInfo command) public void OnPlayersCommand(CCSPlayerController? caller, CommandInfo command)
{ {
List<CCSPlayerController> playersToTarget = Helper.GetValidPlayers(); var playersToTarget = Helper.GetValidPlayers();
if (caller != null) if (caller != null)
{ {
caller!.PrintToConsole($"--------- PLAYER LIST ---------"); caller!.PrintToConsole($"--------- PLAYER LIST ---------");
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
caller!.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.SteamID}\")"); caller!.PrintToConsole(
$"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.SteamID}\")");
}); });
caller!.PrintToConsole($"--------- END PLAYER LIST ---------"); caller!.PrintToConsole($"--------- END PLAYER LIST ---------");
} }
@@ -475,15 +467,16 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name> [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name> [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnKickCommand(CCSPlayerController? caller, CommandInfo command) public void OnKickCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) if (targets == null)
return; return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players
.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
{ {
@@ -505,10 +498,10 @@ namespace CS2_SimpleAdmin
}); });
} }
public void Kick(CCSPlayerController? caller, CCSPlayerController player, string reason = "Unknown", string? callerName = null, CommandInfo? command = null) public void Kick(CCSPlayerController? caller, CCSPlayerController? player, string reason = "Unknown", string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
if (player.PawnIsAlive) if (player != null && player.PawnIsAlive)
{ {
player.Pawn.Value!.Freeze(); player.Pawn.Value!.Freeze();
} }
@@ -517,36 +510,35 @@ namespace CS2_SimpleAdmin
if (command != null) if (command != null)
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, $"css_kick {player.PlayerName} {reason}"); Helper.LogCommand(caller, $"css_kick {player?.PlayerName} {reason}");
if (string.IsNullOrEmpty(reason) == false) if (string.IsNullOrEmpty(reason) == false)
{ {
if (!player.IsBot && !player.IsHLTV) if (player != null && !player.IsBot && !player.IsHLTV)
using (new WithTemporaryCulture(player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (player.UserId.HasValue) if (player != null && player.UserId.HasValue)
AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason), AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason),
CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
} }
else else
{ {
if (player.UserId.HasValue) if (player != null && player.UserId.HasValue)
AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value),
CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
} }
if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && (caller.UserId == null || silentPlayers.Contains(caller.Slot))) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
{ using (new WithTemporaryCulture(controller.GetLanguage()))
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_kick_message", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_kick_message", callerName, player?.PlayerName ?? string.Empty, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -557,27 +549,22 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<mapname>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<mapname>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnMapCommand(CCSPlayerController? caller, CommandInfo command) public void OnMapCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string? map = command.GetCommandString.Split(" ")[1]; var map = command.GetCommandString.Split(" ")[1];
ChangeMap(caller, map, command); ChangeMap(caller, map, command);
} }
public void ChangeMap(CCSPlayerController? caller, string map, CommandInfo? command = null) public void ChangeMap(CCSPlayerController? caller, string map, CommandInfo? command = null)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string _command = string.Empty; string _command;
map = map.ToLower(); map = map.ToLower();
if (map.StartsWith("ws:")) if (map.StartsWith("ws:"))
{ {
if (long.TryParse(map.Replace("ws:", ""), out long mapId)) _command = long.TryParse(map.Replace("ws:", ""), out var mapId)
{ ? $"host_workshop_map {mapId}"
_command = $"host_workshop_map {mapId}"; : $"ds_workshop_changelevel {map.Replace("ws:", "")}";
}
else
{
_command = $"ds_workshop_changelevel {map.Replace("ws:", "")}";
}
AddTimer(3.0f, () => AddTimer(3.0f, () =>
{ {
@@ -588,7 +575,7 @@ namespace CS2_SimpleAdmin
{ {
if (!Server.IsMapValid(map)) if (!Server.IsMapValid(map))
{ {
string msg = $"Map {map} not found."; var msg = $"Map {map} not found.";
if (command != null) if (command != null)
command.ReplyToCommand(msg); command.ReplyToCommand(msg);
else if (caller != null && caller.IsValid) else if (caller != null && caller.IsValid)
@@ -604,25 +591,23 @@ namespace CS2_SimpleAdmin
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var player in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_changemap_message", caller == null ? "Console" : caller.PlayerName, map]); sb.Append(_localizer["sa_admin_changemap_message", caller == null ? "Console" : caller.PlayerName, map]);
_player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
} }
} }
} }
if (command != null) if (command == null) return;
{
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
} }
}
[ConsoleCommand("css_changewsmap", "Change workshop map.")] [ConsoleCommand("css_changewsmap", "Change workshop map.")]
[ConsoleCommand("css_wsmap", "Change workshop map.")] [ConsoleCommand("css_wsmap", "Change workshop map.")]
@@ -631,35 +616,28 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/changemap")] [RequiresPermissions("@css/changemap")]
public void OnWorkshopMapCommand(CCSPlayerController? caller, CommandInfo command) public void OnWorkshopMapCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string? map = command.GetArg(1); var map = command.GetArg(1);
ChangeWorkshopMap(caller, map, command); ChangeWorkshopMap(caller, map, command);
} }
public void ChangeWorkshopMap(CCSPlayerController? caller, string map, CommandInfo? command = null) public void ChangeWorkshopMap(CCSPlayerController? caller, string map, CommandInfo? command = null)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string _command = string.Empty; string _command;
map = map.ToLower(); map = map.ToLower();
if (long.TryParse(map, out long mapId)) _command = long.TryParse(map, out var mapId) ? $"host_workshop_map {mapId}" : $"ds_workshop_changelevel {map}";
{
_command = $"host_workshop_map {mapId}";
}
else
{
_command = $"ds_workshop_changelevel {map}";
}
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var player in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_changemap_message", caller == null ? "Console" : caller.PlayerName, map]); sb.Append(_localizer["sa_admin_changemap_message", caller == null ? "Console" : caller.PlayerName, map]);
_player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
} }
} }
} }
@@ -669,12 +647,10 @@ namespace CS2_SimpleAdmin
Server.ExecuteCommand(_command); Server.ExecuteCommand(_command);
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
if (command != null) if (command == null) return;
{
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
} }
}
[ConsoleCommand("css_cvar", "Change a cvar.")] [ConsoleCommand("css_cvar", "Change a cvar.")]
[CommandHelper(2, "<cvar> <value>")] [CommandHelper(2, "<cvar> <value>")]
@@ -682,7 +658,7 @@ namespace CS2_SimpleAdmin
public void OnCvarCommand(CCSPlayerController? caller, CommandInfo command) public void OnCvarCommand(CCSPlayerController? caller, CommandInfo command)
{ {
var cvar = ConVar.Find(command.GetArg(1)); var cvar = ConVar.Find(command.GetArg(1));
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (cvar == null) if (cvar == null)
{ {
@@ -712,7 +688,7 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/rcon")] [RequiresPermissions("@css/rcon")]
public void OnRconCommand(CCSPlayerController? caller, CommandInfo command) public void OnRconCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);

View File

@@ -17,14 +17,14 @@ namespace CS2_SimpleAdmin
public void OnGagCommand(CCSPlayerController? caller, CommandInfo command) public void OnGagCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
int time = 0; var time = 0;
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList();
if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
{ {
@@ -37,7 +37,7 @@ namespace CS2_SimpleAdmin
reason = command.GetArg(3); reason = command.GetArg(3);
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); var playerPenaltyManager = new PlayerPenaltyManager();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -48,21 +48,21 @@ namespace CS2_SimpleAdmin
}); });
} }
internal void Gag(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null) internal void Gag(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null)
{ {
if (_database == null) return; if (_database == null) return;
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
muteManager ??= new MuteManager(_database); muteManager ??= new MuteManager(_database);
playerPenaltyManager ??= new PlayerPenaltyManager(); playerPenaltyManager ??= new PlayerPenaltyManager();
PlayerInfo playerInfo = new PlayerInfo var playerInfo = new PlayerInfo
{ {
SteamId = player?.SteamID.ToString(), SteamId = player?.SteamID.ToString(),
Name = player?.PlayerName, Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0] IpAddress = player?.IpAddress?.Split(":")[0]
}; };
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
@@ -88,15 +88,15 @@ namespace CS2_SimpleAdmin
} }
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_gag_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_gag_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -111,27 +111,25 @@ namespace CS2_SimpleAdmin
} }
} }
if (caller == null || caller != null && caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_gag_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_gag_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
} }
if (command != null) if (command == null) return;
{
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _discordWebhookClientPenalty, _localizer); Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _discordWebhookClientPenalty, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
} }
}
[ConsoleCommand("css_addgag")] [ConsoleCommand("css_addgag")]
[RequiresPermissions("@css/chat")] [RequiresPermissions("@css/chat")]
@@ -139,43 +137,43 @@ namespace CS2_SimpleAdmin
public void OnAddGagCommand(CCSPlayerController? caller, CommandInfo command) public void OnAddGagCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (command.ArgCount < 2) if (command.ArgCount < 2)
return; return;
if (string.IsNullOrEmpty(command.GetArg(1))) return; if (string.IsNullOrEmpty(command.GetArg(1))) return;
string steamid = command.GetArg(1); var steamid = command.GetArg(1);
if (!Helper.IsValidSteamID64(steamid)) if (!Helper.IsValidSteamId64(steamid))
{ {
command.ReplyToCommand($"Invalid SteamID64."); command.ReplyToCommand($"Invalid SteamID64.");
return; return;
} }
int time = 0; var time = 0;
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); var playerPenaltyManager = new PlayerPenaltyManager();
int.TryParse(command.GetArg(2), out time); int.TryParse(command.GetArg(2), out time);
if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
reason = command.GetArg(3); reason = command.GetArg(3);
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
IpAddress = caller?.IpAddress?.Split(":")[0] IpAddress = caller?.IpAddress?.Split(":")[0]
}; };
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(steamid); var matches = Helper.GetPlayerFromSteamid64(steamid);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
if (!caller!.CanTarget(player)) if (!caller!.CanTarget(player))
@@ -192,36 +190,36 @@ namespace CS2_SimpleAdmin
player!.PrintToCenter(_localizer!["sa_player_gag_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_gag_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_gag_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_gag_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
} }
else else
{ {
if (!player.IsBot && !player.IsHLTV) if (player is { IsBot: false, IsHLTV: false })
using (new WithTemporaryCulture(player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
player!.PrintToCenter(_localizer!["sa_player_gag_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_gag_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_gag_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_gag_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -241,11 +239,8 @@ namespace CS2_SimpleAdmin
await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 0); await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 0);
}); });
if (command != null)
{
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
}
command?.ReplyToCommand($"Gagged player with steamid {steamid}."); command?.ReplyToCommand($"Gagged player with steamid {steamid}.");
} }
@@ -256,12 +251,12 @@ namespace CS2_SimpleAdmin
public void OnUngagCommand(CCSPlayerController? caller, CommandInfo command) public void OnUngagCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string callerSteamId = caller?.SteamID.ToString() ?? "Console"; var callerSteamId = caller?.SteamID.ToString() ?? "Console";
string foundPlayerName = string.Empty; var foundPlayerName = string.Empty;
string foundPlayerSteamId64 = string.Empty; var foundPlayerSteamId64 = string.Empty;
string reason = command.GetArg(2); var reason = command.GetArg(2);
if (command.GetArg(1).Length <= 1) if (command.GetArg(1).Length <= 1)
{ {
@@ -272,19 +267,19 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
bool found = false; var found = false;
string pattern = command.GetArg(1); var pattern = command.GetArg(1);
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); var playerPenaltyManager = new PlayerPenaltyManager();
if (Helper.IsValidSteamID64(pattern)) if (Helper.IsValidSteamId64(pattern))
{ {
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(pattern); var matches = Helper.GetPlayerFromSteamid64(pattern);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag);
@@ -300,10 +295,10 @@ namespace CS2_SimpleAdmin
} }
else else
{ {
List<CCSPlayerController> matches = Helper.GetPlayerFromName(pattern); var matches = Helper.GetPlayerFromName(pattern);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag);
@@ -368,14 +363,14 @@ namespace CS2_SimpleAdmin
public void OnMuteCommand(CCSPlayerController? caller, CommandInfo command) public void OnMuteCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
int time = 0; var time = 0;
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList();
if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
{ {
@@ -388,7 +383,7 @@ namespace CS2_SimpleAdmin
reason = command.GetArg(3); reason = command.GetArg(3);
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); var playerPenaltyManager = new PlayerPenaltyManager();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -399,21 +394,20 @@ namespace CS2_SimpleAdmin
}); });
} }
internal void Mute(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null) internal void Mute(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null)
{ {
if (_database == null) return; if (_database == null) return;
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
muteManager ??= new MuteManager(_database); muteManager ??= new MuteManager(_database);
playerPenaltyManager ??= new PlayerPenaltyManager();
PlayerInfo playerInfo = new PlayerInfo var playerInfo = new PlayerInfo
{ {
SteamId = player?.SteamID.ToString(), SteamId = player?.SteamID.ToString(),
Name = player?.PlayerName, Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0] IpAddress = player?.IpAddress?.Split(":")[0]
}; };
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
@@ -437,35 +431,35 @@ namespace CS2_SimpleAdmin
player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_mute_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_mute_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
} }
else else
{ {
if (!player.IsBot && !player.IsHLTV) if (player is { IsBot: false, IsHLTV: false })
using (new WithTemporaryCulture(player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_mute_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_mute_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -485,42 +479,42 @@ namespace CS2_SimpleAdmin
public void OnAddMuteCommand(CCSPlayerController? caller, CommandInfo command) public void OnAddMuteCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (command.ArgCount < 2) if (command.ArgCount < 2)
return; return;
if (string.IsNullOrEmpty(command.GetArg(1))) return; if (string.IsNullOrEmpty(command.GetArg(1))) return;
string steamid = command.GetArg(1); var steamid = command.GetArg(1);
if (!Helper.IsValidSteamID64(steamid)) if (!Helper.IsValidSteamId64(steamid))
{ {
command.ReplyToCommand($"Invalid SteamID64."); command.ReplyToCommand($"Invalid SteamID64.");
return; return;
} }
int time = 0; var time = 0;
string reason = _localizer?["sa_unknown"] ?? "Unknown"; var reason = _localizer?["sa_unknown"] ?? "Unknown";
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); var playerPenaltyManager = new PlayerPenaltyManager();
int.TryParse(command.GetArg(2), out time); int.TryParse(command.GetArg(2), out time);
if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
reason = command.GetArg(3); reason = command.GetArg(3);
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
IpAddress = caller?.IpAddress?.Split(":")[0] IpAddress = caller?.IpAddress?.Split(":")[0]
}; };
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(steamid); var matches = Helper.GetPlayerFromSteamid64(steamid);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
if (!caller!.CanTarget(player)) if (!caller!.CanTarget(player))
@@ -533,40 +527,40 @@ namespace CS2_SimpleAdmin
if (time == 0) if (time == 0)
{ {
if (!player.IsBot && !player.IsHLTV) if (player is { IsBot: false, IsHLTV: false })
using (new WithTemporaryCulture(player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_mute_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_mute_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
} }
else else
{ {
if (!player.IsBot && !player.IsHLTV) if (player is { IsBot: false, IsHLTV: false })
using (new WithTemporaryCulture(player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_mute_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_mute_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -581,11 +575,8 @@ namespace CS2_SimpleAdmin
await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 1); await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 1);
}); });
if (command != null)
{
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
}
command?.ReplyToCommand($"Muted player with steamid {steamid}."); command?.ReplyToCommand($"Muted player with steamid {steamid}.");
} }
@@ -596,12 +587,12 @@ namespace CS2_SimpleAdmin
public void OnUnmuteCommand(CCSPlayerController? caller, CommandInfo command) public void OnUnmuteCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string callerSteamId = caller?.SteamID.ToString() ?? "Console"; var callerSteamId = caller?.SteamID.ToString() ?? "Console";
string foundPlayerName = string.Empty; var foundPlayerName = string.Empty;
string foundPlayerSteamId64 = string.Empty; var foundPlayerSteamId64 = string.Empty;
string reason = command.GetArg(2); var reason = command.GetArg(2);
if (command.GetArg(1).Length <= 1) if (command.GetArg(1).Length <= 1)
{ {
@@ -612,17 +603,17 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
string pattern = command.GetArg(1); var pattern = command.GetArg(1);
bool found = false; var found = false;
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new(); PlayerPenaltyManager playerPenaltyManager = new();
if (Helper.IsValidSteamID64(pattern)) if (Helper.IsValidSteamId64(pattern))
{ {
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(pattern); var matches = Helper.GetPlayerFromSteamid64(pattern);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute); PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute);
@@ -635,10 +626,10 @@ namespace CS2_SimpleAdmin
} }
else else
{ {
List<CCSPlayerController> matches = Helper.GetPlayerFromName(pattern); var matches = Helper.GetPlayerFromName(pattern);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute); PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute);
@@ -694,14 +685,14 @@ namespace CS2_SimpleAdmin
public void OnSilenceCommand(CCSPlayerController? caller, CommandInfo command) public void OnSilenceCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
int time = 0; var time = 0;
string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; var reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown";
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList();
if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
{ {
@@ -714,7 +705,7 @@ namespace CS2_SimpleAdmin
reason = command.GetArg(3); reason = command.GetArg(3);
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); var playerPenaltyManager = new PlayerPenaltyManager();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -725,21 +716,21 @@ namespace CS2_SimpleAdmin
}); });
} }
internal void Silence(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null) internal void Silence(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null)
{ {
if (_database == null) return; if (_database == null) return;
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
muteManager ??= new MuteManager(_database); muteManager ??= new MuteManager(_database);
playerPenaltyManager ??= new PlayerPenaltyManager(); playerPenaltyManager ??= new PlayerPenaltyManager();
PlayerInfo playerInfo = new PlayerInfo var playerInfo = new PlayerInfo
{ {
SteamId = player?.SteamID.ToString(), SteamId = player?.SteamID.ToString(),
Name = player?.PlayerName, Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0] IpAddress = player?.IpAddress?.Split(":")[0]
}; };
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
@@ -767,15 +758,15 @@ namespace CS2_SimpleAdmin
} }
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_silence_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_silence_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -790,15 +781,15 @@ namespace CS2_SimpleAdmin
} }
} }
if (caller == null || caller != null && caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_silence_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_silence_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -818,42 +809,42 @@ namespace CS2_SimpleAdmin
public void OnAddSilenceCommand(CCSPlayerController? caller, CommandInfo command) public void OnAddSilenceCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (command.ArgCount < 2) if (command.ArgCount < 2)
return; return;
if (string.IsNullOrEmpty(command.GetArg(1))) return; if (string.IsNullOrEmpty(command.GetArg(1))) return;
string steamid = command.GetArg(1); var steamid = command.GetArg(1);
if (!Helper.IsValidSteamID64(steamid)) if (!Helper.IsValidSteamId64(steamid))
{ {
command.ReplyToCommand($"Invalid SteamID64."); command.ReplyToCommand($"Invalid SteamID64.");
return; return;
} }
int time = 0; var time = 0;
string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; var reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown";
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); var playerPenaltyManager = new PlayerPenaltyManager();
int.TryParse(command.GetArg(2), out time); int.TryParse(command.GetArg(2), out time);
if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
reason = command.GetArg(3); reason = command.GetArg(3);
PlayerInfo adminInfo = new PlayerInfo var adminInfo = new PlayerInfo
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
IpAddress = caller?.IpAddress?.Split(":")[0] IpAddress = caller?.IpAddress?.Split(":")[0]
}; };
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(steamid); var matches = Helper.GetPlayerFromSteamid64(steamid);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
if (!caller!.CanTarget(player)) if (!caller!.CanTarget(player))
@@ -874,15 +865,15 @@ namespace CS2_SimpleAdmin
{ {
player!.PrintToCenter(_localizer!["sa_player_silence_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_silence_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_silence_message_perm", callerName, player.PlayerName, reason]); sb.Append(_localizer["sa_admin_silence_message_perm", callerName, player.PlayerName, reason]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -894,15 +885,15 @@ namespace CS2_SimpleAdmin
{ {
player!.PrintToCenter(_localizer!["sa_player_silence_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); player!.PrintToCenter(_localizer!["sa_player_silence_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_silence_message_time", callerName, player.PlayerName, reason, time]); sb.Append(_localizer["sa_admin_silence_message_time", callerName, player.PlayerName, reason, time]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
@@ -916,11 +907,8 @@ namespace CS2_SimpleAdmin
await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 2); await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 2);
}); });
if (command != null)
{
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
}
command?.ReplyToCommand($"Silenced player with steamid {steamid}."); command?.ReplyToCommand($"Silenced player with steamid {steamid}.");
} }
@@ -931,12 +919,12 @@ namespace CS2_SimpleAdmin
public void OnUnsilenceCommand(CCSPlayerController? caller, CommandInfo command) public void OnUnsilenceCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (_database == null) return; if (_database == null) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string callerSteamId = caller?.SteamID.ToString() ?? "Console"; var callerSteamId = caller?.SteamID.ToString() ?? "Console";
string foundPlayerName = string.Empty; var foundPlayerName = string.Empty;
string foundPlayerSteamId64 = string.Empty; var foundPlayerSteamId64 = string.Empty;
string reason = command.GetArg(2); var reason = command.GetArg(2);
if (command.GetArg(1).Length <= 1) if (command.GetArg(1).Length <= 1)
{ {
@@ -947,17 +935,17 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
string pattern = command.GetArg(1); var pattern = command.GetArg(1);
bool found = false; var found = false;
MuteManager _muteManager = new(_database); MuteManager _muteManager = new(_database);
PlayerPenaltyManager playerPenaltyManager = new(); PlayerPenaltyManager playerPenaltyManager = new();
if (Helper.IsValidSteamID64(pattern)) if (Helper.IsValidSteamId64(pattern))
{ {
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(pattern); var matches = Helper.GetPlayerFromSteamid64(pattern);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
if (TagsDetected) if (TagsDetected)
@@ -973,10 +961,10 @@ namespace CS2_SimpleAdmin
} }
else else
{ {
List<CCSPlayerController> matches = Helper.GetPlayerFromName(pattern); var matches = Helper.GetPlayerFromName(pattern);
if (matches.Count == 1) if (matches.Count == 1)
{ {
CCSPlayerController? player = matches.FirstOrDefault(); var player = matches.FirstOrDefault();
if (player != null && player.IsValid) if (player != null && player.IsValid)
{ {
if (TagsDetected) if (TagsDetected)

View File

@@ -15,7 +15,7 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 2, usage: "<question> [... options ...]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 2, usage: "<question> [... options ...]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnVoteCommand(CCSPlayerController? caller, CommandInfo command) public void OnVoteCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
if (command.GetArg(1) == null || command.GetArg(1).Length < 0 || command.ArgCount < 2) if (command.GetArg(1) == null || command.GetArg(1).Length < 0 || command.ArgCount < 2)
return; return;
@@ -24,23 +24,23 @@ namespace CS2_SimpleAdmin
voteAnswers.Clear(); voteAnswers.Clear();
string question = command.GetArg(1); var question = command.GetArg(1);
int answersCount = command.ArgCount; var answersCount = command.ArgCount;
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
for (int i = 2; i <= answersCount - 1; i++) for (var i = 2; i <= answersCount - 1; i++)
{ {
voteAnswers.Add(command.GetArg(i), 0); voteAnswers.Add(command.GetArg(i), 0);
} }
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var player in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
ChatMenu voteMenu = new(_localizer!["sa_admin_vote_menu_title", question]); ChatMenu voteMenu = new(_localizer!["sa_admin_vote_menu_title", question]);
for (int i = 2; i <= answersCount - 1; i++) for (var i = 2; i <= answersCount - 1; i++)
{ {
voteMenu.AddMenuOption(command.GetArg(i), Helper.HandleVotes); voteMenu.AddMenuOption(command.GetArg(i), Helper.HandleVotes);
} }
@@ -50,9 +50,9 @@ namespace CS2_SimpleAdmin
Helper.PrintToCenterAll(_localizer!["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]); Helper.PrintToCenterAll(_localizer!["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]);
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]); sb.Append(_localizer["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]);
_player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
MenuManager.OpenChatMenu(_player, voteMenu); MenuManager.OpenChatMenu(player, voteMenu);
} }
} }
@@ -63,25 +63,25 @@ namespace CS2_SimpleAdmin
{ {
AddTimer(30, () => AddTimer(30, () =>
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var player in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_vote_message_results", question]); sb.Append(_localizer["sa_admin_vote_message_results", question]);
_player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
} }
} }
foreach (KeyValuePair<string, int> kvp in voteAnswers) foreach (var (key, value) in voteAnswers)
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var player in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_vote_message_results_answer", kvp.Key, kvp.Value]); sb.Append(_localizer["sa_admin_vote_message_results_answer", key, value]);
_player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
} }
} }
} }

View File

@@ -15,10 +15,12 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/cheats")] [RequiresPermissions("@css/cheats")]
public void OnNoclipCommand(CCSPlayerController? caller, CommandInfo command) public void OnNoclipCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player =>
player.IsValid && player.SteamID.ToString().Length == 17 &&
player is { PawnIsAlive: true, IsHLTV: false }).ToList();
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
@@ -31,23 +33,21 @@ namespace CS2_SimpleAdmin
}); });
} }
public void NoClip(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null) public void NoClip(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
player!.Pawn.Value!.ToggleNoclip(); player!.Pawn.Value!.ToggleNoclip();
Helper.LogCommand(caller, $"css_noclip {player.PlayerName}"); Helper.LogCommand(caller, $"css_noclip {player.PlayerName}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_noclip_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_noclip_message", callerName, player.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -57,11 +57,11 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/slay")] [RequiresPermissions("@css/slay")]
public void OnFreezeCommand(CCSPlayerController? caller, CommandInfo command) public void OnFreezeCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
int.TryParse(command.GetArg(2), out int time); int.TryParse(command.GetArg(2), out var time);
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player is { IsValid: true, PawnIsAlive: true, IsHLTV: false }).ToList();
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
@@ -77,27 +77,25 @@ namespace CS2_SimpleAdmin
}); });
} }
public void Freeze(CCSPlayerController? caller, CCSPlayerController player, int time, string? callerName = null) public void Freeze(CCSPlayerController? caller, CCSPlayerController? player, int time, string? callerName = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
player.Pawn.Value!.Freeze(); player?.Pawn.Value!.Freeze();
Helper.LogCommand(caller, $"css_freeze {player.PlayerName}"); Helper.LogCommand(caller, $"css_freeze {player?.PlayerName}");
if (time > 0) if (time > 0)
AddTimer(time, () => player.Pawn.Value!.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(time, () => player?.Pawn.Value!.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_freeze_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_freeze_message", callerName, player?.PlayerName ?? string.Empty]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -107,10 +105,10 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/slay")] [RequiresPermissions("@css/slay")]
public void OnUnfreezeCommand(CCSPlayerController? caller, CommandInfo command) public void OnUnfreezeCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player is { IsValid: true, PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -121,7 +119,7 @@ namespace CS2_SimpleAdmin
}); });
} }
public void Unfreeze(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) public void Unfreeze(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
@@ -133,16 +131,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_unfreeze_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_unfreeze_message", callerName, player.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }

View File

@@ -18,11 +18,11 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnSlayCommand(CCSPlayerController? caller, CommandInfo command) public void OnSlayCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -30,14 +30,14 @@ namespace CS2_SimpleAdmin
}); });
} }
public void Slay(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) public void Slay(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
{ {
if (!player.IsBot && player.SteamID.ToString().Length != 17) if (player != null && !player.IsBot && player.SteamID.ToString().Length != 17)
return; return;
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
player.CommitSuicide(false, true); player?.CommitSuicide(false, true);
if (command != null) if (command != null)
{ {
@@ -45,16 +45,14 @@ namespace CS2_SimpleAdmin
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_slay_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_slay_message", callerName, player?.PlayerName ?? string.Empty]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -64,15 +62,15 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 2, usage: "<#userid or name> <weapon>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 2, usage: "<#userid or name> <weapon>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnGiveCommand(CCSPlayerController? caller, CommandInfo command) public void OnGiveCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
string weaponName = command.GetArg(2); var weaponName = command.GetArg(2);
// check if item is typed // check if item is typed
if (weaponName == null || weaponName.Length < 5) if (weaponName.Length < 5)
{ {
command.ReplyToCommand($"No weapon typed."); command.ReplyToCommand($"No weapon typed.");
return; return;
@@ -112,7 +110,7 @@ namespace CS2_SimpleAdmin
SubGiveWeapon(caller, player!, weapon.ToString(), callerName); SubGiveWeapon(caller, player!, weapon.ToString(), callerName);
} }
public void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null, CommandInfo? command = null) private void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null, CommandInfo? command = null)
{ {
if (command != null) if (command != null)
{ {
@@ -124,20 +122,18 @@ namespace CS2_SimpleAdmin
SubGiveWeapon(caller, player!, weaponName, callerName); SubGiveWeapon(caller, player!, weaponName, callerName);
} }
public void SubGiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null) private void SubGiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && (silentPlayers.Contains(caller.Slot))) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_give_message", callerName, player.PlayerName, weaponName]); sb.Append(_localizer["sa_admin_give_message", callerName, player.PlayerName, weaponName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -147,11 +143,11 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnStripCommand(CCSPlayerController? caller, CommandInfo command) public void OnStripCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -162,14 +158,14 @@ namespace CS2_SimpleAdmin
}); });
} }
public void StripWeapons(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) public void StripWeapons(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
if (!player.IsBot && player.SteamID.ToString().Length != 17) if (player != null && !player.IsBot && player.SteamID.ToString().Length != 17)
return; return;
player.RemoveWeapons(); player?.RemoveWeapons();
if (command != null) if (command != null)
{ {
@@ -177,16 +173,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_strip_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_strip_message", callerName, player?.PlayerName ?? string.Empty]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -196,14 +190,13 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name> <health>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name> <health>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnHpCommand(CCSPlayerController? caller, CommandInfo command) public void OnHpCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
int health = 100; int.TryParse(command.GetArg(2), out var health);
int.TryParse(command.GetArg(2), out health);
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -214,9 +207,9 @@ namespace CS2_SimpleAdmin
}); });
} }
public void SetHp(CCSPlayerController? caller, CCSPlayerController player, int health, string? callerName = null, CommandInfo? command = null) public void SetHp(CCSPlayerController? caller, CCSPlayerController? player, int health, string? callerName = null, CommandInfo? command = null)
{ {
if (!player.IsBot && player.SteamID.ToString().Length != 17) if (player != null && !player.IsBot && player.SteamID.ToString().Length != 17)
return; return;
callerName = caller == null ? "Console" : caller.PlayerName; callerName = caller == null ? "Console" : caller.PlayerName;
@@ -229,16 +222,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_hp_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_hp_message", callerName, player?.PlayerName ?? string.Empty]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -248,14 +239,13 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name> <speed>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name> <speed>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnSpeedCommand(CCSPlayerController? caller, CommandInfo command) public void OnSpeedCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
double speed = 1.0; double.TryParse(command.GetArg(2), out var speed);
double.TryParse(command.GetArg(2), out speed);
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -269,7 +259,7 @@ namespace CS2_SimpleAdmin
}); });
} }
public void SetSpeed(CCSPlayerController? caller, CCSPlayerController player, double speed, string? callerName = null, CommandInfo? command = null) public void SetSpeed(CCSPlayerController? caller, CCSPlayerController? player, double speed, string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
@@ -281,16 +271,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_speed_message", callerName, player!.PlayerName]); sb.Append(_localizer["sa_admin_speed_message", callerName, player!.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -300,16 +288,16 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name> <gravity>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name> <gravity>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnGravityCommand(CCSPlayerController? caller, CommandInfo command) public void OnGravityCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
double gravity = 1.0; var gravity = 1.0;
double.TryParse(command.GetArg(2), out gravity); double.TryParse(command.GetArg(2), out gravity);
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -323,7 +311,7 @@ namespace CS2_SimpleAdmin
}); });
} }
public void SetGravity(CCSPlayerController? caller, CCSPlayerController player, double gravity, string? callerName = null, CommandInfo? command = null) public void SetGravity(CCSPlayerController? caller, CCSPlayerController? player, double gravity, string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
@@ -335,16 +323,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_gravity_message", callerName, player!.PlayerName]); sb.Append(_localizer["sa_admin_gravity_message", callerName, player!.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -354,14 +340,13 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name> <money>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name> <money>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnMoneyCommand(CCSPlayerController? caller, CommandInfo command) public void OnMoneyCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
int money = 0; int.TryParse(command.GetArg(2), out var money);
int.TryParse(command.GetArg(2), out money);
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -375,7 +360,7 @@ namespace CS2_SimpleAdmin
}); });
} }
public void SetMoney(CCSPlayerController? caller, CCSPlayerController player, int money, string? callerName = null, CommandInfo? command = null) public void SetMoney(CCSPlayerController? caller, CCSPlayerController? player, int money, string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
@@ -387,16 +372,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_money_message", callerName, player!.PlayerName]); sb.Append(_localizer["sa_admin_money_message", callerName, player!.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -406,11 +389,11 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnGodCommand(CCSPlayerController? caller, CommandInfo command) public void OnGodCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -424,12 +407,11 @@ namespace CS2_SimpleAdmin
}); });
} }
public void God(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) public void God(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
if (player != null) if (player == null) return;
{
if (command != null) if (command != null)
{ {
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
@@ -445,17 +427,14 @@ namespace CS2_SimpleAdmin
RemoveFromConcurrentBag(godPlayers, player.Slot); RemoveFromConcurrentBag(godPlayers, player.Slot);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_god_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_god_message", callerName, player.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
}
} }
} }
} }
@@ -465,13 +444,13 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 1, usage: "<#userid or name> [damage]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 1, usage: "<#userid or name> [damage]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnSlapCommand(CCSPlayerController? caller, CommandInfo command) public void OnSlapCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
int damage = 0; var damage = 0;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
if (command.ArgCount >= 2) if (command.ArgCount >= 2)
{ {
@@ -490,9 +469,9 @@ namespace CS2_SimpleAdmin
}); });
} }
public void Slap(CCSPlayerController? caller, CCSPlayerController player, int damage, CommandInfo? command = null) public void Slap(CCSPlayerController? caller, CCSPlayerController? player, int damage, CommandInfo? command = null)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
player!.Pawn.Value!.Slap(damage); player!.Pawn.Value!.Slap(damage);
if (command != null) if (command != null)
@@ -501,16 +480,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_slap_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_slap_message", callerName, player.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -520,15 +497,15 @@ namespace CS2_SimpleAdmin
[CommandHelper(minArgs: 2, usage: "<#userid or name> [<ct/tt/spec>] [-k]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 2, usage: "<#userid or name> [<ct/tt/spec>] [-k]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public void OnTeamCommand(CCSPlayerController? caller, CommandInfo command) public void OnTeamCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string teamName = command.GetArg(2).ToLower(); var teamName = command.GetArg(2).ToLower();
string _teamName = "SPEC"; var _teamName = "SPEC";
CsTeam teamNum = CsTeam.Spectator; var teamNum = CsTeam.Spectator;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
switch (teamName) switch (teamName)
{ {
@@ -555,7 +532,7 @@ namespace CS2_SimpleAdmin
break; break;
} }
bool kill = command.GetArg(3).ToLower().Equals("-k"); var kill = command.GetArg(3).ToLower().Equals("-k");
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -563,25 +540,25 @@ namespace CS2_SimpleAdmin
}); });
} }
public void ChangeTeam(CCSPlayerController? caller, CCSPlayerController player, string teamName, CsTeam teamNum, bool kill, string? callerName = null, CommandInfo? command = null) public void ChangeTeam(CCSPlayerController? caller, CCSPlayerController? player, string teamName, CsTeam teamNum, bool kill, string? callerName = null, CommandInfo? command = null)
{ {
if (!player.IsBot && player.SteamID.ToString().Length != 17) if (player != null && !player.IsBot && player.SteamID.ToString().Length != 17)
return; return;
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
if (!teamName.Equals("swap")) if (!teamName.Equals("swap"))
{ {
if (player.PawnIsAlive && teamNum != CsTeam.Spectator && !kill && Config.TeamSwitchType == 1) if (player != null && player.PawnIsAlive && teamNum != CsTeam.Spectator && !kill && Config.TeamSwitchType == 1)
player.SwitchTeam(teamNum); player.SwitchTeam(teamNum);
else else
player.ChangeTeam(teamNum); player?.ChangeTeam(teamNum);
} }
else else
{ {
if (player.TeamNum != (byte)CsTeam.Spectator) if (player != null && player.TeamNum != (byte)CsTeam.Spectator)
{ {
CsTeam _teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist; var _teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist;
teamName = _teamNum == CsTeam.Terrorist ? "TT" : "CT"; teamName = _teamNum == CsTeam.Terrorist ? "TT" : "CT";
if (player.PawnIsAlive && !kill && Config.TeamSwitchType == 1) if (player.PawnIsAlive && !kill && Config.TeamSwitchType == 1)
{ {
@@ -594,39 +571,37 @@ namespace CS2_SimpleAdmin
} }
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) foreach (var controller in Helper.GetValidPlayers())
{ {
using (new WithTemporaryCulture(_player.GetLanguage())) using (new WithTemporaryCulture(controller.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_team_message", callerName, player.PlayerName, teamName]); sb.Append(_localizer["sa_admin_team_message", callerName, player?.PlayerName ?? string.Empty, teamName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
if (command != null) if (command == null) return;
{
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
}
[ConsoleCommand("css_rename", "Rename a player.")] [ConsoleCommand("css_rename", "Rename a player.")]
[CommandHelper(1, "<#userid or name> <new name>")] [CommandHelper(1, "<#userid or name> <new name>")]
[RequiresPermissions("@css/kick")] [RequiresPermissions("@css/kick")]
public void OnRenameCommand(CCSPlayerController? caller, CommandInfo command) public void OnRenameCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string? newName = command.GetArg(2); var newName = command.GetArg(2);
if (string.IsNullOrEmpty(newName)) if (string.IsNullOrEmpty(newName))
return; return;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
@@ -636,23 +611,21 @@ namespace CS2_SimpleAdmin
if (!player.IsBot && player.SteamID.ToString().Length != 17) if (!player.IsBot && player.SteamID.ToString().Length != 17)
return; return;
if (caller!.CanTarget(player)) if (!caller!.CanTarget(player)) return;
if (caller == null || !silentPlayers.Contains(caller.Slot))
{ {
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_rename_message", callerName, player.PlayerName, newName]); sb.Append(_localizer["sa_admin_rename_message", callerName, player.PlayerName, newName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
} }
} }
} }
player.Rename(newName); player.Rename(newName);
}
}); });
} }
@@ -661,10 +634,10 @@ namespace CS2_SimpleAdmin
[RequiresPermissions("@css/cheats")] [RequiresPermissions("@css/cheats")]
public void OnRespawnCommand(CCSPlayerController? caller, CommandInfo command) public void OnRespawnCommand(CCSPlayerController? caller, CommandInfo command)
{ {
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -678,11 +651,11 @@ namespace CS2_SimpleAdmin
}); });
} }
public void Respawn(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) public void Respawn(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
{ {
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
if (CBasePlayerController_SetPawnFunc == null || player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) return; if (CBasePlayerController_SetPawnFunc == null || player?.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) return;
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
CBasePlayerController_SetPawnFunc.Invoke(player, playerPawn, true, false); CBasePlayerController_SetPawnFunc.Invoke(player, playerPawn, true, false);
@@ -695,16 +668,14 @@ namespace CS2_SimpleAdmin
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
} }
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) if (caller != null && silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_respawn_message", callerName, player.PlayerName]); sb.Append(_localizer["sa_admin_respawn_message", callerName, player.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
} }
} }
} }
@@ -718,14 +689,14 @@ namespace CS2_SimpleAdmin
{ {
if (caller == null || !caller.PawnIsAlive) return; if (caller == null || !caller.PawnIsAlive) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null || targets.Count() > 1) if (targets == null || targets.Count() > 1)
return; return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
@@ -735,8 +706,7 @@ namespace CS2_SimpleAdmin
if (!player.IsBot && player.SteamID.ToString().Length != 17 || !player.PawnIsAlive) if (!player.IsBot && player.SteamID.ToString().Length != 17 || !player.PawnIsAlive)
return; return;
if (caller!.CanTarget(player)) if (!caller!.CanTarget(player)) return;
{
caller!.TeleportPlayer(player); caller!.TeleportPlayer(player);
caller!.Pawn.Value!.ToggleNoclip(); caller!.Pawn.Value!.ToggleNoclip();
@@ -745,17 +715,14 @@ namespace CS2_SimpleAdmin
caller!.Pawn.Value!.ToggleNoclip(); caller!.Pawn.Value!.ToggleNoclip();
}); });
if (caller != null && !silentPlayers.Contains(caller.Slot)) if (silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_tp_message", caller.PlayerName, player.PlayerName]); sb.Append(_localizer["sa_admin_tp_message", caller.PlayerName, player.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
}
} }
} }
}); });
@@ -769,14 +736,14 @@ namespace CS2_SimpleAdmin
{ {
if (caller == null || !caller.PawnIsAlive) return; if (caller == null || !caller.PawnIsAlive) return;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller.PlayerName;
TargetResult? targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null || targets.Count() > 1) if (targets == null || targets.Count() > 1)
return; return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); var playersToTarget = targets!.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
@@ -786,8 +753,7 @@ namespace CS2_SimpleAdmin
if (!player.IsBot && player.SteamID.ToString().Length != 17 || !player.PawnIsAlive) if (!player.IsBot && player.SteamID.ToString().Length != 17 || !player.PawnIsAlive)
return; return;
if (caller!.CanTarget(player)) if (!caller!.CanTarget(player)) return;
{
player!.TeleportPlayer(caller!); player!.TeleportPlayer(caller!);
caller!.Pawn.Value!.ToggleNoclip(); caller!.Pawn.Value!.ToggleNoclip();
@@ -796,17 +762,14 @@ namespace CS2_SimpleAdmin
caller!.Pawn.Value!.ToggleNoclip(); caller!.Pawn.Value!.ToggleNoclip();
}); });
if (caller != null && !silentPlayers.Contains(caller.Slot)) if (silentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
{ {
foreach (CCSPlayerController _player in Helper.GetValidPlayers()) using (new WithTemporaryCulture(controller.GetLanguage()))
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{ {
StringBuilder sb = new(_localizer!["sa_prefix"]); StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_bring_message", caller.PlayerName, player.PlayerName]); sb.Append(_localizer["sa_admin_bring_message", caller.PlayerName, player.PlayerName]);
_player.PrintToChat(sb.ToString()); controller.PrintToChat(sb.ToString());
}
}
} }
} }
}); });

View File

@@ -73,12 +73,12 @@ namespace CS2_SimpleAdmin
public Discord Discord { get; set; } = new Discord(); public Discord Discord { get; set; } = new Discord();
[JsonPropertyName("DefaultMaps")] [JsonPropertyName("DefaultMaps")]
public List<string> DefaultMaps { get; set; } = new List<string>(); public List<string> DefaultMaps { get; set; } = [];
[JsonPropertyName("WorkshopMaps")] [JsonPropertyName("WorkshopMaps")]
public List<string> WorkshopMaps { get; set; } = new List<string>(); public List<string> WorkshopMaps { get; set; } = [];
[JsonPropertyName("CustomServerCommands")] [JsonPropertyName("CustomServerCommands")]
public List<CustomServerCommandData> CustomServerCommands { get; set; } = new List<CustomServerCommandData>(); public List<CustomServerCommandData> CustomServerCommands { get; set; } = [];
} }
} }

View File

@@ -46,7 +46,7 @@ public class Database(string dbConnectionString)
public bool CheckDatabaseConnection() public bool CheckDatabaseConnection()
{ {
using MySqlConnection connection = GetConnection(); using var connection = GetConnection();
try try
{ {

View File

@@ -9,19 +9,21 @@ public class Migration(Database database)
public void ExecuteMigrations() public void ExecuteMigrations()
{ {
string migrationsDirectory = CS2_SimpleAdmin.Instance.ModuleDirectory + "/Database/Migrations"; var migrationsDirectory = CS2_SimpleAdmin.Instance.ModuleDirectory + "/Database/Migrations";
var files = Directory.GetFiles(migrationsDirectory, "*.sql") var files = Directory.GetFiles(migrationsDirectory, "*.sql")
.OrderBy(f => f); .OrderBy(f => f);
using MySqlConnection connection = _database.GetConnection(); using var connection = _database.GetConnection();
// Create sa_migrations table if not exists // Create sa_migrations table if not exists
using var cmd = new MySqlCommand(@" using var cmd = new MySqlCommand("""
CREATE TABLE IF NOT EXISTS `sa_migrations` ( CREATE TABLE IF NOT EXISTS `sa_migrations` (
`id` INT PRIMARY KEY AUTO_INCREMENT, `id` INT PRIMARY KEY AUTO_INCREMENT,
`version` VARCHAR(255) NOT NULL `version` VARCHAR(255) NOT NULL
);", connection); );
""", connection);
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
@@ -33,8 +35,7 @@ public class Migration(Database database)
var version = Path.GetFileNameWithoutExtension(file); var version = Path.GetFileNameWithoutExtension(file);
// Check if the migration has already been applied // Check if the migration has already been applied
if (string.Compare(version, lastAppliedVersion, StringComparison.OrdinalIgnoreCase) > 0) if (string.Compare(version, lastAppliedVersion, StringComparison.OrdinalIgnoreCase) <= 0) continue;
{
var sqlScript = File.ReadAllText(file); var sqlScript = File.ReadAllText(file);
using var cmdMigration = new MySqlCommand(sqlScript, connection); using var cmdMigration = new MySqlCommand(sqlScript, connection);
@@ -46,7 +47,6 @@ public class Migration(Database database)
CS2_SimpleAdmin._logger?.LogInformation($"Migration \"{version}\" successfully applied."); CS2_SimpleAdmin._logger?.LogInformation($"Migration \"{version}\" successfully applied.");
} }
} }
}
private static string GetLastAppliedVersion(MySqlConnection connection) private static string GetLastAppliedVersion(MySqlConnection connection)
{ {

113
Events.cs
View File

@@ -15,7 +15,7 @@ namespace CS2_SimpleAdmin;
public partial class CS2_SimpleAdmin public partial class CS2_SimpleAdmin
{ {
public static HashSet<int> loadedPlayers = new HashSet<int>(); private static readonly HashSet<int> LoadedPlayers = [];
private void RegisterEvents() private void RegisterEvents()
{ {
@@ -40,7 +40,7 @@ public partial class CS2_SimpleAdmin
return HookResult.Continue; return HookResult.Continue;
} }
if (!loadedPlayers.Contains(player.Slot)) if (!LoadedPlayers.Contains(player.Slot))
{ {
return HookResult.Continue; return HookResult.Continue;
} }
@@ -68,15 +68,15 @@ public partial class CS2_SimpleAdmin
RemoveFromConcurrentBag(godPlayers, player.Slot); RemoveFromConcurrentBag(godPlayers, player.Slot);
} }
SteamID? authorizedSteamID = player.AuthorizedSteamID; SteamID? authorizedSteamId = player.AuthorizedSteamID;
if (authorizedSteamID != null && AdminSQLManager._adminCache.TryGetValue(authorizedSteamID, out DateTime? expirationTime) if (authorizedSteamId != null && AdminSQLManager._adminCache.TryGetValue(authorizedSteamId, out var expirationTime)
&& expirationTime <= DateTime.Now) && expirationTime <= DateTime.Now)
{ {
AdminManager.ClearPlayerPermissions(authorizedSteamID); AdminManager.ClearPlayerPermissions(authorizedSteamId);
AdminManager.RemovePlayerAdminData(authorizedSteamID); AdminManager.RemovePlayerAdminData(authorizedSteamId);
} }
loadedPlayers.Remove(player.Slot); LoadedPlayers.Remove(player.Slot);
return HookResult.Continue; return HookResult.Continue;
} }
@@ -96,7 +96,7 @@ public partial class CS2_SimpleAdmin
|| player.IsBot || player.IsHLTV || !player.UserId.HasValue) || player.IsBot || player.IsHLTV || !player.UserId.HasValue)
return HookResult.Continue; return HookResult.Continue;
string ipAddress = player.IpAddress.Split(":")[0]; var ipAddress = player.IpAddress.Split(":")[0];
// Check if the player's IP or SteamID is in the bannedPlayers list // Check if the player's IP or SteamID is in the bannedPlayers list
if (bannedPlayers.Contains(ipAddress) || bannedPlayers.Contains(player.SteamID.ToString())) if (bannedPlayers.Contains(ipAddress) || bannedPlayers.Contains(player.SteamID.ToString()))
@@ -110,7 +110,7 @@ public partial class CS2_SimpleAdmin
if (_database == null) return HookResult.Continue; if (_database == null) return HookResult.Continue;
PlayerInfo playerInfo = new PlayerInfo var playerInfo = new PlayerInfo
{ {
UserId = player.UserId.Value, UserId = player.UserId.Value,
Index = (ushort)player.Index, Index = (ushort)player.Index,
@@ -142,10 +142,10 @@ public partial class CS2_SimpleAdmin
bannedPlayers.Add(playerInfo.SteamId); bannedPlayers.Add(playerInfo.SteamId);
// Kick the player if banned // Kick the player if banned
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId); var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId);
if (victim != null && victim.UserId.HasValue) if (victim.UserId.HasValue)
{ {
Helper.KickPlayer(victim.UserId.Value, "Banned"); Helper.KickPlayer(victim.UserId.Value, "Banned");
} }
@@ -155,39 +155,38 @@ public partial class CS2_SimpleAdmin
} }
// Check if the player is muted // Check if the player is muted
List<dynamic> activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId); var activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId);
if (activeMutes.Count > 0) if (activeMutes.Count > 0)
{ {
foreach (dynamic mute in activeMutes) foreach (var mute in activeMutes)
{ {
string muteType = mute.type; string muteType = mute.type;
DateTime ends = mute.ends; DateTime ends = mute.ends;
int duration = mute.duration; int duration = mute.duration;
switch (muteType)
{
// Apply mute penalty based on mute type // Apply mute penalty based on mute type
if (muteType == "GAG") case "GAG":
{
PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration); PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration);
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
if (TagsDetected) if (TagsDetected)
{ {
Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}"); Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
} }
}); });
} break;
else if (muteType == "MUTE") case "MUTE":
{
PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration); PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration);
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
player.VoiceFlags = VoiceFlags.Muted; player.VoiceFlags = VoiceFlags.Muted;
}); });
} break;
else default:
{
PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration); PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration);
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
player.VoiceFlags = VoiceFlags.Muted; player.VoiceFlags = VoiceFlags.Muted;
if (TagsDetected) if (TagsDetected)
@@ -195,6 +194,7 @@ public partial class CS2_SimpleAdmin
Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}"); Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
} }
}); });
break;
} }
} }
} }
@@ -206,8 +206,7 @@ public partial class CS2_SimpleAdmin
}); });
// Add player to loadedPlayers // Add player to loadedPlayers
if (!loadedPlayers.Contains(player.Slot)) LoadedPlayers.Add(player.Slot);
loadedPlayers.Add(player.Slot);
return HookResult.Continue; return HookResult.Continue;
} }
@@ -225,8 +224,8 @@ public partial class CS2_SimpleAdmin
public HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) public HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info)
{ {
if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).StartsWith("/") if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).StartsWith($"/")
|| info.GetArg(1).StartsWith("!") && info.GetArg(1).Length >= 12) || info.GetArg(1).StartsWith($"!") && info.GetArg(1).Length >= 12)
return HookResult.Continue; return HookResult.Continue;
if (info.GetArg(1).Length == 0) if (info.GetArg(1).Length == 0)
@@ -242,8 +241,8 @@ public partial class CS2_SimpleAdmin
public HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info) public HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info)
{ {
if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).StartsWith("/") if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).StartsWith($"/")
|| info.GetArg(1).StartsWith("!") && info.GetArg(1).Length >= 12) || info.GetArg(1).StartsWith($"!") && info.GetArg(1).Length >= 12)
return HookResult.Continue; return HookResult.Continue;
if (info.GetArg(1).Length == 0) if (info.GetArg(1).Length == 0)
@@ -254,14 +253,14 @@ public partial class CS2_SimpleAdmin
if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
return HookResult.Handled; return HookResult.Handled;
if (info.GetArg(1).StartsWith("@")) if (!info.GetArg(1).StartsWith($"@")) return HookResult.Continue;
{
StringBuilder sb = new(); StringBuilder sb = new();
if (AdminManager.PlayerHasPermissions(player, "@css/chat")) if (AdminManager.PlayerHasPermissions(player, "@css/chat"))
{ {
sb.Append(_localizer!["sa_adminchat_template_admin", player!.PlayerName, info.GetArg(1).Remove(0, 1)]); sb.Append(_localizer!["sa_adminchat_template_admin", player!.PlayerName, info.GetArg(1).Remove(0, 1)]);
foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && p is { IsBot: false, IsHLTV: false } && AdminManager.PlayerHasPermissions(p, "@css/chat")))
{ {
p.PrintToChat(sb.ToString()); p.PrintToChat(sb.ToString());
} }
@@ -270,21 +269,19 @@ public partial class CS2_SimpleAdmin
{ {
sb.Append(_localizer!["sa_adminchat_template_player", player!.PlayerName, info.GetArg(1).Remove(0, 1)]); sb.Append(_localizer!["sa_adminchat_template_player", player!.PlayerName, info.GetArg(1).Remove(0, 1)]);
player.PrintToChat(sb.ToString()); player.PrintToChat(sb.ToString());
foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) foreach (var p in Utilities.GetPlayers().Where(p => p is { IsValid: true, IsBot: false, IsHLTV: false } && AdminManager.PlayerHasPermissions(p, "@css/chat")))
{ {
p.PrintToChat(sb.ToString()); p.PrintToChat(sb.ToString());
} }
} }
return HookResult.Handled; return HookResult.Handled;
}
return HookResult.Continue;
} }
private void OnMapStart(string mapName) private void OnMapStart(string mapName)
{ {
string? path = Path.GetDirectoryName(ModuleDirectory); var path = Path.GetDirectoryName(ModuleDirectory);
if (Directory.Exists(path + "/CS2-Tags")) if (Directory.Exists(path + "/CS2-Tags"))
{ {
TagsDetected = true; TagsDetected = true;
@@ -296,9 +293,7 @@ public partial class CS2_SimpleAdmin
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
PlayerPenaltyManager.RemoveAllPenalties(); PlayerPenaltyManager.RemoveAllPenalties();
_database = new(dbConnectionString); _database = new Database(dbConnectionString);
if (_database == null) return;
AddTimer(61.0f, () => AddTimer(61.0f, () =>
{ {
@@ -306,8 +301,8 @@ public partial class CS2_SimpleAdmin
Logger.LogCritical("[OnMapStart] Expired check"); Logger.LogCritical("[OnMapStart] Expired check");
#endif #endif
List<CCSPlayerController> players = Helper.GetValidPlayers(); var players = Helper.GetValidPlayers();
List<(string? IpAddress, ulong SteamID, int? UserId)> onlinePlayers = players var onlinePlayers = players
.Where(player => player.IpAddress != null && player.SteamID.ToString().Length == 17) .Where(player => player.IpAddress != null && player.SteamID.ToString().Length == 17)
.Select(player => (player.IpAddress, player.SteamID, player.UserId)) .Select(player => (player.IpAddress, player.SteamID, player.UserId))
.ToList(); .ToList();
@@ -330,13 +325,11 @@ public partial class CS2_SimpleAdmin
bannedPlayers.Clear(); bannedPlayers.Clear();
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
try try
{ {
foreach (CCSPlayerController player in players) foreach (var player in players.Where(player => PlayerPenaltyManager.IsSlotInPenalties(player.Slot)))
{
if (PlayerPenaltyManager.IsSlotInPenalties(player.Slot))
{ {
if (!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) if (!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
player.VoiceFlags = VoiceFlags.Normal; player.VoiceFlags = VoiceFlags.Normal;
@@ -347,31 +340,26 @@ public partial class CS2_SimpleAdmin
Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}");
} }
if ( if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) ||
!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) && PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) ||
!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag)) continue;
!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag)
)
{
player.VoiceFlags = VoiceFlags.Normal; player.VoiceFlags = VoiceFlags.Normal;
if (TagsDetected) if (TagsDetected)
Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}");
} }
}
}
PlayerPenaltyManager.RemoveExpiredPenalties(); PlayerPenaltyManager.RemoveExpiredPenalties();
} }
catch (Exception) { } catch { }
}); });
}); });
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
AddTimer(2.0f, () => AddTimer(2.0f, () =>
{ {
string? address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>()}"; var address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>()}";
string? hostname = ConVar.Find("hostname")!.StringValue; var hostname = ConVar.Find("hostname")!.StringValue;
Task.Run(async () => Task.Run(async () =>
{ {
@@ -379,7 +367,7 @@ public partial class CS2_SimpleAdmin
try try
{ {
await using var connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
bool addressExists = await connection.ExecuteScalarAsync<bool>( var addressExists = await connection.ExecuteScalarAsync<bool>(
"SELECT COUNT(*) FROM sa_servers WHERE address = @address", "SELECT COUNT(*) FROM sa_servers WHERE address = @address",
new { address }); new { address });
@@ -409,12 +397,12 @@ public partial class CS2_SimpleAdmin
if (Config.EnableMetrics) if (Config.EnableMetrics)
{ {
string queryString = $"?address={address}&hostname={hostname}"; var queryString = $"?address={address}&hostname={hostname}";
using HttpClient client = new(); using HttpClient client = new();
try try
{ {
HttpResponseMessage response = await client.GetAsync($"https://api.daffyy.love/index.php{queryString}"); var response = await client.GetAsync($"https://api.daffyy.love/index.php{queryString}");
} }
catch (HttpRequestException ex) catch (HttpRequestException ex)
{ {
@@ -442,11 +430,10 @@ public partial class CS2_SimpleAdmin
if (player is null || @event.Attacker is null || !player.PawnIsAlive || player.PlayerPawn.Value == null) if (player is null || @event.Attacker is null || !player.PawnIsAlive || player.PlayerPawn.Value == null)
return HookResult.Continue; return HookResult.Continue;
if (godPlayers.Contains(player.Slot)) if (!godPlayers.Contains(player.Slot)) return HookResult.Continue;
{
player.PlayerPawn.Value.Health = player.PlayerPawn.Value.MaxHealth; player.PlayerPawn.Value.Health = player.PlayerPawn.Value.MaxHealth;
player.PlayerPawn.Value.ArmorValue = 100; player.PlayerPawn.Value.ArmorValue = 100;
}
return HookResult.Continue; return HookResult.Continue;
} }

View File

@@ -22,43 +22,46 @@ public static class PlayerExtensions
controller.PrintToChat(_message.ToString()); controller.PrintToChat(_message.ToString());
} }
public static bool CanTarget(this CCSPlayerController controller, CCSPlayerController target) public static bool CanTarget(this CCSPlayerController? controller, CCSPlayerController? target)
{ {
if (target.IsBot) return true; if (target != null && target.IsBot) return true;
if (controller is null) return true; if (controller is null) return true;
return AdminManager.CanPlayerTarget(controller, target) || AdminManager.CanPlayerTarget(new SteamID(controller.SteamID), new SteamID(target.SteamID)); return target != null && (AdminManager.CanPlayerTarget(controller, target) ||
AdminManager.CanPlayerTarget(new SteamID(controller.SteamID),
new SteamID(target.SteamID)));
} }
public static void SetSpeed(this CCSPlayerController controller, float speed) public static void SetSpeed(this CCSPlayerController? controller, float speed)
{ {
CCSPlayerPawn? playerPawnValue = controller.PlayerPawn.Value; var playerPawnValue = controller?.PlayerPawn.Value;
if (playerPawnValue == null) return; if (playerPawnValue == null) return;
playerPawnValue.VelocityModifier = speed; playerPawnValue.VelocityModifier = speed;
} }
public static void SetGravity(this CCSPlayerController controller, float gravity) public static void SetGravity(this CCSPlayerController? controller, float gravity)
{ {
CCSPlayerPawn? playerPawnValue = controller.PlayerPawn.Value; var playerPawnValue = controller?.PlayerPawn.Value;
if (playerPawnValue == null) return; if (playerPawnValue == null) return;
playerPawnValue.GravityScale = gravity; playerPawnValue.GravityScale = gravity;
} }
public static void SetMoney(this CCSPlayerController controller, int money) public static void SetMoney(this CCSPlayerController? controller, int money)
{ {
var moneyServices = controller.InGameMoneyServices; var moneyServices = controller?.InGameMoneyServices;
if (moneyServices == null) return; if (moneyServices == null) return;
moneyServices.Account = money; moneyServices.Account = money;
Utilities.SetStateChanged(controller, "CCSPlayerController", "m_pInGameMoneyServices"); if (controller != null) Utilities.SetStateChanged(controller, "CCSPlayerController", "m_pInGameMoneyServices");
} }
public static void SetHp(this CCSPlayerController controller, int health = 100) public static void SetHp(this CCSPlayerController? controller, int health = 100)
{ {
if (health <= 0 || !controller.PawnIsAlive || controller.PlayerPawn.Value == null) return; if (controller == null) return;
if ((health <= 0 || !controller.PawnIsAlive || controller.PlayerPawn.Value == null)) return;
controller.PlayerPawn.Value.Health = health; controller.PlayerPawn.Value.Health = health;
@@ -116,14 +119,13 @@ public static class PlayerExtensions
} }
} }
public static void Rename(this CCSPlayerController controller, string newName = "Unknown") public static void Rename(this CCSPlayerController? controller, string newName = "Unknown")
{ {
if (CS2_SimpleAdmin.Instance == null)
return;
newName = newName ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; newName = newName ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown";
SchemaString<CBasePlayerController> playerName = new SchemaString<CBasePlayerController>(controller, "m_iszPlayerName"); if (controller != null)
{
var playerName = new SchemaString<CBasePlayerController>(controller, "m_iszPlayerName");
playerName.Set(newName + " "); playerName.Set(newName + " ");
CS2_SimpleAdmin.Instance.AddTimer(0.25f, () => CS2_SimpleAdmin.Instance.AddTimer(0.25f, () =>
@@ -136,16 +138,17 @@ public static class PlayerExtensions
{ {
playerName.Set(newName); playerName.Set(newName);
}); });
}
CS2_SimpleAdmin.Instance.AddTimer(0.4f, () => CS2_SimpleAdmin.Instance.AddTimer(0.4f, () =>
{ {
Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName"); if (controller != null) Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName");
}); });
} }
public static void TeleportPlayer(this CCSPlayerController controller, CCSPlayerController target) public static void TeleportPlayer(this CCSPlayerController? controller, CCSPlayerController? target)
{ {
if (controller.PlayerPawn?.Value == null && target!.PlayerPawn?.Value == null) if (controller?.PlayerPawn?.Value == null && target!.PlayerPawn?.Value == null)
return; return;
if ( if (

121
Helper.cs
View File

@@ -47,28 +47,26 @@ namespace CS2_SimpleAdmin
public static List<CCSPlayerController> GetValidPlayers() public static List<CCSPlayerController> GetValidPlayers()
{ {
return Utilities.GetPlayers().FindAll(p => p != null && p.IsValid && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV); return Utilities.GetPlayers().FindAll(p => p?.IsValid == true && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p is { Connected: PlayerConnectedState.PlayerConnected, IsBot: false, IsHLTV: false });
} }
public static List<CCSPlayerController> GetValidPlayersWithBots() public static IEnumerable<CCSPlayerController?> GetValidPlayersWithBots()
{ {
return Utilities.GetPlayers().FindAll(p => return Utilities.GetPlayers().FindAll(p =>
p != null && p.IsValid && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV || p.IsValid && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p is { Connected: PlayerConnectedState.PlayerConnected, IsBot: false, IsHLTV: false } ||
p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && p.IsBot && !p.IsHLTV p is { IsValid: true, Connected: PlayerConnectedState.PlayerConnected, IsBot: true, IsHLTV: false }
); );
} }
public static bool IsValidSteamID64(string input) public static bool IsValidSteamId64(string input)
{ {
string pattern = @"^\d{17}$"; const string pattern = @"^\d{17}$";
return Regex.IsMatch(input, pattern); return Regex.IsMatch(input, pattern);
} }
public static bool IsValidIP(string input) public static bool IsValidIp(string input)
{ {
string pattern = @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; const string pattern = @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
return Regex.IsMatch(input, pattern); return Regex.IsMatch(input, pattern);
} }
@@ -81,27 +79,25 @@ namespace CS2_SimpleAdmin
return; return;
} }
if (flags != null) if (flags == null) return;
{
foreach (var flag in flags) foreach (var flag in flags)
{ {
if (!string.IsNullOrEmpty(flag)) if (string.IsNullOrEmpty(flag)) continue;
{
if (flag.StartsWith("@")) if (flag.StartsWith($"@"))
{ {
//Console.WriteLine($"Adding permission {flag} to SteamID {steamid}"); //Console.WriteLine($"Adding permission {flag} to SteamID {steamid}");
AdminManager.AddPlayerPermissions(steamid, flag); AdminManager.AddPlayerPermissions(steamid, flag);
} }
else if (flag.StartsWith("#")) else if (flag.StartsWith($"#"))
{ {
//Console.WriteLine($"Adding SteamID {steamid} to group {flag}"); //Console.WriteLine($"Adding SteamID {steamid} to group {flag}");
AdminManager.AddPlayerToGroup(steamid, flag); AdminManager.AddPlayerToGroup(steamid, flag);
} }
} }
}
AdminManager.SetPlayerImmunity(steamid, (uint)immunity); AdminManager.SetPlayerImmunity(steamid, (uint)immunity);
} }
}
catch (Exception) catch (Exception)
{ {
return; return;
@@ -112,7 +108,7 @@ namespace CS2_SimpleAdmin
{ {
if (!string.IsNullOrEmpty(reason)) if (!string.IsNullOrEmpty(reason))
{ {
int escapeChars = reason.IndexOfAny(new char[] { ';', '|' }); var escapeChars = reason.IndexOfAny([';', '|']);
if (escapeChars != -1) if (escapeChars != -1)
{ {
@@ -125,7 +121,7 @@ namespace CS2_SimpleAdmin
public static void PrintToCenterAll(string message) public static void PrintToCenterAll(string message)
{ {
Utilities.GetPlayers().Where(p => p is not null && p.IsValid && !p.IsBot && !p.IsHLTV).ToList().ForEach(controller => Utilities.GetPlayers().Where(p => p is { IsValid: true, IsBot: false, IsHLTV: false }).ToList().ForEach(controller =>
{ {
controller.PrintToCenter(message); controller.PrintToCenter(message);
}); });
@@ -142,25 +138,26 @@ namespace CS2_SimpleAdmin
internal static void LogCommand(CCSPlayerController? caller, CommandInfo command) internal static void LogCommand(CCSPlayerController? caller, CommandInfo command)
{ {
if (CS2_SimpleAdmin.Instance == null || CS2_SimpleAdmin._localizer == null) if (CS2_SimpleAdmin._localizer == null)
return; return;
string playerName = caller?.PlayerName ?? "Console"; var playerName = caller?.PlayerName ?? "Console";
string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer["sa_unknown"]; var hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer["sa_unknown"];
CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer["sa_discord_log_command", CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer[
"sa_discord_log_command",
playerName, command.GetCommandString]}".Replace("HOSTNAME", hostname).Replace("**", "")); playerName, command.GetCommandString]}".Replace("HOSTNAME", hostname).Replace("**", ""));
} }
internal static void LogCommand(CCSPlayerController? caller, string command) internal static void LogCommand(CCSPlayerController? caller, string command)
{ {
if (CS2_SimpleAdmin.Instance == null || CS2_SimpleAdmin._localizer == null) if (CS2_SimpleAdmin._localizer == null)
return; return;
string playerName = caller?.PlayerName ?? "Console"; var playerName = caller?.PlayerName ?? "Console";
string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; var hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown";
CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer?["sa_discord_log_command", CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer?["sa_discord_log_command",
playerName, command]}".Replace("HOSTNAME", hostname).Replace("**", "")); playerName, command]}".Replace("HOSTNAME", hostname).Replace("**", ""));
@@ -168,8 +165,8 @@ namespace CS2_SimpleAdmin
public static IEnumerable<Embed> GenerateEmbedsDiscord(string title, string description, string thumbnailUrl, Color color, string[] fieldNames, string[] fieldValues, bool[] inlineFlags) public static IEnumerable<Embed> GenerateEmbedsDiscord(string title, string description, string thumbnailUrl, Color color, string[] fieldNames, string[] fieldValues, bool[] inlineFlags)
{ {
string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; var hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown";
string? address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>()}"; var address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>()}";
description = description.Replace("{hostname}", hostname ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"); description = description.Replace("{hostname}", hostname ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown");
description = description.Replace("{address}", address ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"); description = description.Replace("{address}", address ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown");
@@ -182,7 +179,7 @@ namespace CS2_SimpleAdmin
Color = color, Color = color,
}; };
for (int i = 0; i < fieldNames.Length; i++) for (var i = 0; i < fieldNames.Length; i++)
{ {
fieldValues[i] = fieldValues[i].Replace("{hostname}", hostname ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"); fieldValues[i] = fieldValues[i].Replace("{hostname}", hostname ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown");
fieldValues[i] = fieldValues[i].Replace("{address}", address ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"); fieldValues[i] = fieldValues[i].Replace("{address}", address ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown");
@@ -200,13 +197,12 @@ namespace CS2_SimpleAdmin
public static void SendDiscordLogMessage(CCSPlayerController? caller, CommandInfo command, DiscordWebhookClient? discordWebhookClientLog, IStringLocalizer? localizer) public static void SendDiscordLogMessage(CCSPlayerController? caller, CommandInfo command, DiscordWebhookClient? discordWebhookClientLog, IStringLocalizer? localizer)
{ {
if (discordWebhookClientLog != null && localizer != null) if (discordWebhookClientLog == null || localizer == null) return;
{
string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>"; var communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>";
string callerName = caller != null ? caller.PlayerName : "Console"; var callerName = caller != null ? caller.PlayerName : "Console";
discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
} }
}
public enum PenaltyType public enum PenaltyType
{ {
@@ -216,24 +212,24 @@ namespace CS2_SimpleAdmin
Silence, Silence,
} }
public static string ConvertMinutesToTime(int minutes) private static string ConvertMinutesToTime(int minutes)
{ {
TimeSpan time = TimeSpan.FromMinutes(minutes); var time = TimeSpan.FromMinutes(minutes);
return time.Days > 0 ? $"{time.Days}d {time.Hours}h {time.Minutes}m" : time.Hours > 0 ? $"{time.Hours}h {time.Minutes}m" : $"{time.Minutes}m"; return time.Days > 0 ? $"{time.Days}d {time.Hours}h {time.Minutes}m" : time.Hours > 0 ? $"{time.Hours}h {time.Minutes}m" : $"{time.Minutes}m";
} }
public static void SendDiscordPenaltyMessage(CCSPlayerController? caller, CCSPlayerController? target, string reason, int duration, PenaltyType penalty, DiscordWebhookClient? discordWebhookClientPenalty, IStringLocalizer? localizer) public static void SendDiscordPenaltyMessage(CCSPlayerController? caller, CCSPlayerController? target, string reason, int duration, PenaltyType penalty, DiscordWebhookClient? discordWebhookClientPenalty, IStringLocalizer? localizer)
{ {
if (discordWebhookClientPenalty != null && localizer != null) if (discordWebhookClientPenalty == null || localizer == null) return;
{
string callercommunityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>";
string targetcommunityUrl = target != null ? "<" + new SteamID(target.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>";
string callerName = caller != null ? caller.PlayerName : "Console";
string targetName = target != null ? target.PlayerName : localizer?["sa_unknown"] ?? "Unknown";
string targetSteamId = target != null ? new SteamID(target.SteamID).SteamId2.ToString() : localizer?["sa_unknown"] ?? "Unknown";
string time = duration != 0 ? ConvertMinutesToTime(duration) : localizer?["sa_permanent"] ?? "Permanent"; var callerCommunityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>";
var targetCommunityUrl = target != null ? "<" + new SteamID(target.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>";
var callerName = caller != null ? caller.PlayerName : "Console";
var targetName = target != null ? target.PlayerName : localizer?["sa_unknown"] ?? "Unknown";
var targetSteamId = target != null ? new SteamID(target.SteamID).SteamId2.ToString() : localizer?["sa_unknown"] ?? "Unknown";
var time = duration != 0 ? ConvertMinutesToTime(duration) : localizer?["sa_permanent"] ?? "Permanent";
string[] fieldNames = [ string[] fieldNames = [
localizer?["sa_player"] ?? "Player:", localizer?["sa_player"] ?? "Player:",
@@ -241,10 +237,10 @@ namespace CS2_SimpleAdmin
localizer?["sa_duration"] ?? "Duration:", localizer?["sa_duration"] ?? "Duration:",
localizer?["sa_reason"] ?? "Reason:", localizer?["sa_reason"] ?? "Reason:",
localizer?["sa_admin"] ?? "Admin:"]; localizer?["sa_admin"] ?? "Admin:"];
string[] fieldValues = [$"[{targetName}]({targetcommunityUrl})", targetSteamId, time, reason, $"[{callerName}]({callercommunityUrl})"]; string[] fieldValues = [$"[{targetName}]({targetCommunityUrl})", targetSteamId, time, reason, $"[{callerName}]({callerCommunityUrl})"];
bool[] inlineFlags = [true, true, true, false, false]; bool[] inlineFlags = [true, true, true, false, false];
string? hostname = ConVar.Find("hostname")!.StringValue ?? localizer?["sa_unknown"] ?? "Unknown"; var hostname = ConVar.Find("hostname")!.StringValue ?? localizer?["sa_unknown"] ?? "Unknown";
var embed = new EmbedBuilder var embed = new EmbedBuilder
{ {
@@ -271,19 +267,18 @@ namespace CS2_SimpleAdmin
Timestamp = DateTimeOffset.UtcNow Timestamp = DateTimeOffset.UtcNow
}; };
for (int i = 0; i < fieldNames.Length; i++) for (var i = 0; i < fieldNames.Length; i++)
{ {
embed.AddField(fieldNames[i], fieldValues[i], inlineFlags[i]); embed.AddField(fieldNames[i], fieldValues[i], inlineFlags[i]);
} }
discordWebhookClientPenalty.SendMessageAsync(embeds: [embed.Build()]); discordWebhookClientPenalty.SendMessageAsync(embeds: [embed.Build()]);
} }
}
public static string GenerateMessageDiscord(string message) private static string GenerateMessageDiscord(string message)
{ {
string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; var hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown";
string? address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>()}"; var address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>()}";
message = message.Replace("HOSTNAME", hostname); message = message.Replace("HOSTNAME", hostname);
message = message.Replace("ADDRESS", address); message = message.Replace("ADDRESS", address);
@@ -304,7 +299,12 @@ namespace CS2_SimpleAdmin
config.Version = newCfgVersion; config.Version = newCfgVersion;
// serialize the updated config back to json // serialize the updated config back to json
var updatedJsonContent = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); var updatedJsonContent = JsonSerializer.Serialize(config,
new JsonSerializerOptions
{
WriteIndented = true,
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
File.WriteAllText(CfgPath, updatedJsonContent); File.WriteAllText(CfgPath, updatedJsonContent);
} }
@@ -316,22 +316,21 @@ namespace CS2_SimpleAdmin
if (caller != null && caller.IsValid == false) if (caller != null && caller.IsValid == false)
caller = null; caller = null;
string callerName = caller == null ? "Console" : caller.PlayerName; var callerName = caller == null ? "Console" : caller.PlayerName;
string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>"; var communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : "<https://steamcommunity.com/profiles/0>";
CS2_SimpleAdmin._discordWebhookClientLog.SendMessageAsync(GenerateMessageDiscord(CS2_SimpleAdmin._localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandString])); CS2_SimpleAdmin._discordWebhookClientLog.SendMessageAsync(GenerateMessageDiscord(CS2_SimpleAdmin._localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandString]));
} }
} }
public class SchemaString<SchemaClass> : NativeObject where SchemaClass : NativeObject public class SchemaString<SchemaClass>(SchemaClass instance, string member)
: NativeObject(Schema.GetSchemaValue<nint>(instance.Handle, typeof(SchemaClass).Name!, member))
where SchemaClass : NativeObject
{ {
public SchemaString(SchemaClass instance, string member) : base(Schema.GetSchemaValue<nint>(instance.Handle, typeof(SchemaClass).Name!, member))
{ }
public unsafe void Set(string str) public unsafe void Set(string str)
{ {
byte[] bytes = SchemaString<SchemaClass>.GetStringBytes(str); var bytes = SchemaString<SchemaClass>.GetStringBytes(str);
for (int i = 0; i < bytes.Length; i++) for (var i = 0; i < bytes.Length; i++)
{ {
Unsafe.Write((void*)(Handle.ToInt64() + i), bytes[i]); Unsafe.Write((void*)(Handle.ToInt64() + i), bytes[i]);
} }

View File

@@ -61,11 +61,11 @@ public class AdminSQLManager(Database database)
public async Task<List<(string, string, List<string>, int, DateTime?)>> GetAllPlayersFlags() public async Task<List<(string, string, List<string>, int, DateTime?)>> GetAllPlayersFlags()
{ {
DateTime now = DateTime.UtcNow.ToLocalTime(); var now = DateTime.UtcNow.ToLocalTime();
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string sql = @" string sql = @"
SELECT sa_admins.player_steamid, sa_admins.player_name, sa_admins_flags.flag, sa_admins.immunity, sa_admins.ends SELECT sa_admins.player_steamid, sa_admins.player_name, sa_admins_flags.flag, sa_admins.immunity, sa_admins.ends
@@ -75,7 +75,7 @@ public class AdminSQLManager(Database database)
AND (sa_admins.server_id IS NULL OR sa_admins.server_id = @serverid) AND (sa_admins.server_id IS NULL OR sa_admins.server_id = @serverid)
ORDER BY sa_admins.player_steamid"; ORDER BY sa_admins.player_steamid";
List<dynamic>? activeFlags = (await connection.QueryAsync(sql, new { CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList(); var activeFlags = (await connection.QueryAsync(sql, new { CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList();
if (activeFlags == null) if (activeFlags == null)
{ {
@@ -83,13 +83,13 @@ public class AdminSQLManager(Database database)
} }
List<(string, string, List<string>, int, DateTime?)> filteredFlagsWithImmunity = []; List<(string, string, List<string>, int, DateTime?)> filteredFlagsWithImmunity = [];
string currentSteamId = string.Empty; var currentSteamId = string.Empty;
string currentPlayerName = string.Empty; var currentPlayerName = string.Empty;
List<string> currentFlags = []; List<string> currentFlags = [];
int immunityValue = 0; var immunityValue = 0;
DateTime? ends = null; DateTime? ends = null;
foreach (dynamic flagInfo in activeFlags) foreach (var flagInfo in activeFlags)
{ {
if (flagInfo is not IDictionary<string, object> flagInfoDict) if (flagInfo is not IDictionary<string, object> flagInfoDict)
{ {
@@ -113,7 +113,7 @@ public class AdminSQLManager(Database database)
continue; continue;
} }
if (endsObj != null && DateTime.TryParse(endsObj.ToString(), out var parsedEnds)) if (DateTime.TryParse(endsObj.ToString(), out var parsedEnds))
{ {
ends = parsedEnds; ends = parsedEnds;
} }
@@ -207,13 +207,12 @@ public class AdminSQLManager(Database database)
} }
*/ */
public async Task<Dictionary<string, (List<string>, int)>> GetAllGroupsData() private async Task<Dictionary<string, (List<string>, int)>> GetAllGroupsData()
{
try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using MySqlConnection connection = await _database.GetConnectionAsync();
try
string sql = "SELECT group_id FROM sa_groups_servers WHERE server_id = @serverid"; {
var sql = "SELECT group_id FROM sa_groups_servers WHERE server_id = @serverid";
var groupDataSql = connection.Query<int>(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList(); var groupDataSql = connection.Query<int>(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList();
sql = @" sql = @"
@@ -241,7 +240,7 @@ public class AdminSQLManager(Database database)
// Check if the group name already exists in the dictionary // Check if the group name already exists in the dictionary
if (!groupInfoDictionary.TryGetValue(groupName, out (List<string>, int) value)) if (!groupInfoDictionary.TryGetValue(groupName, out (List<string>, int) value))
{ {
value = (new List<string>(), immunity); value = ([], immunity);
// If it doesn't exist, add a new entry with an empty list of flags and immunity // If it doesn't exist, add a new entry with an empty list of flags and immunity
groupInfoDictionary[groupName] = value; groupInfoDictionary[groupName] = value;
} }
@@ -258,7 +257,7 @@ public class AdminSQLManager(Database database)
public async Task CrateGroupsJsonFile() public async Task CrateGroupsJsonFile()
{ {
Dictionary<string, (List<string>, int)> groupsData = await GetAllGroupsData(); var groupsData = await GetAllGroupsData();
var jsonStructure = new Dictionary<string, object>(); var jsonStructure = new Dictionary<string, object>();
@@ -273,8 +272,8 @@ public class AdminSQLManager(Database database)
jsonStructure[kvp.Key] = groupData; jsonStructure[kvp.Key] = groupData;
} }
string json = JsonConvert.SerializeObject(jsonStructure, Formatting.Indented); var json = JsonConvert.SerializeObject(jsonStructure, Formatting.Indented);
File.WriteAllText(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/groups.json", json); await File.WriteAllTextAsync(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/groups.json", json);
} }
/* /*
@@ -370,8 +369,8 @@ public class AdminSQLManager(Database database)
}) })
.ToDictionary(item => item.playerName, item => item.playerData); .ToDictionary(item => item.playerName, item => item.playerData);
string json = JsonConvert.SerializeObject(jsonData, Formatting.Indented); var json = JsonConvert.SerializeObject(jsonData, Formatting.Indented);
File.WriteAllText(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/admins.json", json); await File.WriteAllTextAsync(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/admins.json", json);
} }
public async Task DeleteAdminBySteamId(string playerSteamId, bool globalDelete = false) public async Task DeleteAdminBySteamId(string playerSteamId, bool globalDelete = false)
@@ -382,17 +381,10 @@ public class AdminSQLManager(Database database)
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string sql = "";
if (globalDelete) var sql = "";
{ sql = globalDelete ? "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID" : "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID AND server_id = @ServerId";
sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID";
}
else
{
sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID AND server_id = @ServerId";
}
await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId, CS2_SimpleAdmin.ServerId }); await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId, CS2_SimpleAdmin.ServerId });
} }
@@ -401,9 +393,9 @@ public class AdminSQLManager(Database database)
public async Task AddAdminBySteamId(string playerSteamId, string playerName, List<string> flagsList, int immunity = 0, int time = 0, bool globalAdmin = false) public async Task AddAdminBySteamId(string playerSteamId, string playerName, List<string> flagsList, int immunity = 0, int time = 0, bool globalAdmin = false)
{ {
if (string.IsNullOrEmpty(playerSteamId) || flagsList == null || flagsList.Count == 0) return; if (string.IsNullOrEmpty(playerSteamId) || flagsList.Count == 0) return;
DateTime now = DateTime.UtcNow.ToLocalTime(); var now = DateTime.UtcNow.ToLocalTime();
DateTime? futureTime; DateTime? futureTime;
if (time != 0) if (time != 0)
@@ -413,13 +405,13 @@ public class AdminSQLManager(Database database)
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
// Insert admin into sa_admins table // Insert admin into sa_admins table
var insertAdminSql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `immunity`, `ends`, `created`, `server_id`) " + const string insertAdminSql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `immunity`, `ends`, `created`, `server_id`) " +
"VALUES (@playerSteamid, @playerName, @immunity, @ends, @created, @serverid); SELECT LAST_INSERT_ID();"; "VALUES (@playerSteamid, @playerName, @immunity, @ends, @created, @serverid); SELECT LAST_INSERT_ID();";
int adminId = await connection.ExecuteScalarAsync<int>(insertAdminSql, new var adminId = await connection.ExecuteScalarAsync<int>(insertAdminSql, new
{ {
playerSteamId, playerSteamId,
playerName, playerName,
@@ -432,14 +424,14 @@ public class AdminSQLManager(Database database)
// Insert flags into sa_admins_flags table // Insert flags into sa_admins_flags table
foreach (var flag in flagsList) foreach (var flag in flagsList)
{ {
if (flag.StartsWith("#")) if (flag.StartsWith($"#"))
{ {
string sql = "SELECT id FROM `sa_groups` WHERE name = @groupName"; const string sql = "SELECT id FROM `sa_groups` WHERE name = @groupName";
int? groupId = await connection.QuerySingleOrDefaultAsync<int?>(sql, new { groupName = flag }); var groupId = await connection.QuerySingleOrDefaultAsync<int?>(sql, new { groupName = flag });
if (groupId != null) if (groupId != null)
{ {
var updateAdminGroup = "UPDATE `sa_admins` SET group_id = @groupId WHERE id = @adminId"; const string updateAdminGroup = "UPDATE `sa_admins` SET group_id = @groupId WHERE id = @adminId";
await connection.ExecuteAsync(updateAdminGroup, new await connection.ExecuteAsync(updateAdminGroup, new
{ {
groupId, groupId,
@@ -466,16 +458,15 @@ public class AdminSQLManager(Database database)
public async Task AddGroup(string groupName, List<string> flagsList, int immunity = 0) public async Task AddGroup(string groupName, List<string> flagsList, int immunity = 0)
{ {
if (string.IsNullOrEmpty(groupName) || flagsList == null || flagsList.Count == 0) return; if (string.IsNullOrEmpty(groupName) || flagsList.Count == 0) return;
await using var connection = await _database.GetConnectionAsync();
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync();
// Insert group into sa_groups table // Insert group into sa_groups table
var insertGroup = "INSERT INTO `sa_groups` (`name`, `immunity`) " + var insertGroup = "INSERT INTO `sa_groups` (`name`, `immunity`) " +
"VALUES (@groupName, @immunity); SELECT LAST_INSERT_ID();"; "VALUES (@groupName, @immunity); SELECT LAST_INSERT_ID();";
int groupId = await connection.ExecuteScalarAsync<int>(insertGroup, new var groupId = await connection.ExecuteScalarAsync<int>(insertGroup, new
{ {
groupName, groupName,
immunity immunity
@@ -484,7 +475,7 @@ public class AdminSQLManager(Database database)
// Insert flags into sa_groups_flags table // Insert flags into sa_groups_flags table
foreach (var flag in flagsList) foreach (var flag in flagsList)
{ {
var insertFlagsSql = "INSERT INTO `sa_groups_flags` (`group_id`, `flag`) " + const string insertFlagsSql = "INSERT INTO `sa_groups_flags` (`group_id`, `flag`) " +
"VALUES (@groupId, @flag)"; "VALUES (@groupId, @flag)";
await connection.ExecuteAsync(insertFlagsSql, new await connection.ExecuteAsync(insertFlagsSql, new
@@ -494,10 +485,10 @@ public class AdminSQLManager(Database database)
}); });
} }
var insertGroupServer = "INSERT INTO `sa_groups_servers` (`group_id`, `server_id`) " +
"VALUES (@groupId, @server_id)";
if (CS2_SimpleAdmin.ServerId != null) if (CS2_SimpleAdmin.ServerId != null)
{ {
string insertGroupServer = "INSERT INTO `sa_groups_servers` (`group_id`, `server_id`) " +
"VALUES (@groupId, @server_id)";
await connection.ExecuteAsync(insertGroupServer, new { groupId, server_id = CS2_SimpleAdmin.ServerId }); await connection.ExecuteAsync(insertGroupServer, new { groupId, server_id = CS2_SimpleAdmin.ServerId });
} }
} }
@@ -511,11 +502,10 @@ public class AdminSQLManager(Database database)
{ {
if (string.IsNullOrEmpty(groupName)) return; if (string.IsNullOrEmpty(groupName)) return;
await using var connection = await _database.GetConnectionAsync();
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); const string sql = "DELETE FROM `sa_groups` WHERE name = @groupName";
string sql = "DELETE FROM `sa_groups` WHERE name = @groupName";
await connection.ExecuteAsync(sql, new { groupName }); await connection.ExecuteAsync(sql, new { groupName });
} }
catch (Exception ex) catch (Exception ex)
@@ -528,9 +518,9 @@ public class AdminSQLManager(Database database)
{ {
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string sql = "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime"; const string sql = "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime";
await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime() }); await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime() });
} }
catch (Exception) catch (Exception)

View File

@@ -19,7 +19,8 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using MySqlConnection connection = await _database.GetConnectionAsync();
var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + var sql =
"INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " +
"VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)";
await connection.ExecuteAsync(sql, new await connection.ExecuteAsync(sql, new
@@ -115,11 +116,10 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
try try
{ {
string sql = ""; var sql = "";
sql = _config.MultiServerMode ? """
if (_config.MultiServerMode)
{
sql = @"
UPDATE sa_bans UPDATE sa_bans
SET player_ip = CASE WHEN player_ip IS NULL THEN @PlayerIP ELSE player_ip END, SET player_ip = CASE WHEN player_ip IS NULL THEN @PlayerIP ELSE player_ip END,
player_name = CASE WHEN player_name IS NULL THEN @PlayerName ELSE player_name END player_name = CASE WHEN player_name IS NULL THEN @PlayerName ELSE player_name END
@@ -130,11 +130,8 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
SELECT COUNT(*) FROM sa_bans SELECT COUNT(*) FROM sa_bans
WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)
AND status = 'ACTIVE' AND status = 'ACTIVE'
AND (duration = 0 OR ends > @CurrentTime);"; AND (duration = 0 OR ends > @CurrentTime);
} """ : @"
else
{
sql = @"
UPDATE sa_bans UPDATE sa_bans
SET player_ip = CASE WHEN player_ip IS NULL THEN @PlayerIP ELSE player_ip END, SET player_ip = CASE WHEN player_ip IS NULL THEN @PlayerIP ELSE player_ip END,
player_name = CASE WHEN player_name IS NULL THEN @PlayerName ELSE player_name END player_name = CASE WHEN player_name IS NULL THEN @PlayerName ELSE player_name END
@@ -146,9 +143,8 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)
AND status = 'ACTIVE' AND status = 'ACTIVE'
AND (duration = 0 OR ends > @CurrentTime) AND server_id = @serverid;"; AND (duration = 0 OR ends > @CurrentTime) AND server_id = @serverid;";
}
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
var parameters = new var parameters = new
{ {
@@ -173,28 +169,31 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
{ {
try try
{ {
string sql = ""; var sql = "";
if (_config.MultiServerMode) sql = _config.MultiServerMode
{ ? "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND server_id = @serverid"
sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND server_id = @serverid"; : "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)";
}
else
{
sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)";
}
int banCount; int banCount;
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
if (!string.IsNullOrEmpty(player.IpAddress)) if (!string.IsNullOrEmpty(player.IpAddress))
{ {
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress, serverid = CS2_SimpleAdmin.ServerId }); banCount = await connection.ExecuteScalarAsync<int>(sql,
new
{
PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress, serverid = CS2_SimpleAdmin.ServerId
});
} }
else else
{ {
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value, serverid = CS2_SimpleAdmin.ServerId }); banCount = await connection.ExecuteScalarAsync<int>(sql,
new
{
PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value, serverid = CS2_SimpleAdmin.ServerId
});
} }
return banCount; return banCount;
@@ -206,15 +205,15 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
public async Task UnbanPlayer(string playerPattern, string adminSteamId, string reason) public async Task UnbanPlayer(string playerPattern, string adminSteamId, string reason)
{ {
if (playerPattern == null || playerPattern.Length <= 1) if (playerPattern is not { Length: > 1 })
{ {
return; return;
} }
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string sqlRetrieveBans = ""; var sqlRetrieveBans = "";
if (_config.MultiServerMode) if (_config.MultiServerMode)
{ {
sqlRetrieveBans = "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE' " + sqlRetrieveBans = "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE' " +
@@ -226,16 +225,17 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
} }
var bans = await connection.QueryAsync(sqlRetrieveBans, new { pattern = playerPattern, serverid = CS2_SimpleAdmin.ServerId }); var bans = await connection.QueryAsync(sqlRetrieveBans, new { pattern = playerPattern, serverid = CS2_SimpleAdmin.ServerId });
if (!bans.Any()) var bansList = bans as dynamic[] ?? bans.ToArray();
if (!bansList.Any())
return; return;
string sqlAdmin = "SELECT id FROM sa_admins WHERE player_steamid = @adminSteamId"; const string sqlAdmin = "SELECT id FROM sa_admins WHERE player_steamid = @adminSteamId";
string sqlInsertUnban = "INSERT INTO sa_unbans (ban_id, admin_id, reason) VALUES (@banId, @adminId, @reason); SELECT LAST_INSERT_ID();"; var sqlInsertUnban = "INSERT INTO sa_unbans (ban_id, admin_id, reason) VALUES (@banId, @adminId, @reason); SELECT LAST_INSERT_ID();";
int? sqlAdminId = await connection.ExecuteScalarAsync<int?>(sqlAdmin, new { adminSteamId }); var sqlAdminId = await connection.ExecuteScalarAsync<int?>(sqlAdmin, new { adminSteamId });
int adminId = sqlAdminId ?? 0; var adminId = sqlAdminId ?? 0;
foreach (var ban in bans) foreach (var ban in bansList)
{ {
int banId = ban.id; int banId = ban.id;
int? unbanId; int? unbanId;
@@ -252,7 +252,7 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
} }
// Update sa_bans to set unban_id // Update sa_bans to set unban_id
string sqlUpdateBan = "UPDATE sa_bans SET status = 'UNBANNED', unban_id = @unbanId WHERE id = @banId"; const string sqlUpdateBan = "UPDATE sa_bans SET status = 'UNBANNED', unban_id = @unbanId WHERE id = @banId";
await connection.ExecuteAsync(sqlUpdateBan, new { unbanId, banId }); await connection.ExecuteAsync(sqlUpdateBan, new { unbanId, banId });
} }
@@ -269,8 +269,8 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
{ {
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string sql = ""; var sql = "";
if (_config.MultiServerMode) if (_config.MultiServerMode)
{ {
@@ -286,19 +286,21 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
{ {
if (!UserId.HasValue) continue; if (!UserId.HasValue) continue;
int banCount = 0; var banCount = 0;
if (!string.IsNullOrEmpty(IpAddress)) if (!string.IsNullOrEmpty(IpAddress))
{ {
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = SteamID, PlayerIP = IpAddress, serverid = CS2_SimpleAdmin.ServerId }); banCount = await connection.ExecuteScalarAsync<int>(sql,
new { PlayerSteamID = SteamID, PlayerIP = IpAddress, serverid = CS2_SimpleAdmin.ServerId });
} }
else else
{ {
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = SteamID, PlayerIP = DBNull.Value, serverid = CS2_SimpleAdmin.ServerId }); banCount = await connection.ExecuteScalarAsync<int>(sql,
new { PlayerSteamID = SteamID, PlayerIP = DBNull.Value, serverid = CS2_SimpleAdmin.ServerId });
} }
if (banCount > 0) if (banCount > 0)
{ {
Server.NextFrame(() => await Server.NextFrameAsync(() =>
{ {
Helper.KickPlayer(UserId.Value, "Banned"); Helper.KickPlayer(UserId.Value, "Banned");
}); });
@@ -310,12 +312,11 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
public async Task ExpireOldBans() public async Task ExpireOldBans()
{ {
var currentTime = DateTime.UtcNow.ToLocalTime();
await using var connection = await _database.GetConnectionAsync();
try try
{ {
DateTime currentTime = DateTime.UtcNow.ToLocalTime();
await using MySqlConnection connection = await _database.GetConnectionAsync();
/* /*
string sql = ""; string sql = "";
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using MySqlConnection connection = await _database.GetConnectionAsync();
@@ -324,11 +325,10 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.UtcNow.ToLocalTime() }); await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.UtcNow.ToLocalTime() });
*/ */
string sql = ""; var sql = "";
sql = _config.MultiServerMode ? """
if (_config.MultiServerMode)
{
sql = @"
UPDATE sa_bans UPDATE sa_bans
SET SET
status = 'EXPIRED' status = 'EXPIRED'
@@ -338,11 +338,9 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
`duration` > 0 `duration` > 0
AND AND
ends <= @currentTime ends <= @currentTime
AND server_id = @serverid"; AND server_id = @serverid
} """ : """
else
{
sql = @"
UPDATE sa_bans UPDATE sa_bans
SET SET
status = 'EXPIRED' status = 'EXPIRED'
@@ -351,17 +349,16 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
AND AND
`duration` > 0 `duration` > 0
AND AND
ends <= @currentTime"; ends <= @currentTime
} """;
await connection.ExecuteAsync(sql, new { currentTime, serverid = CS2_SimpleAdmin.ServerId }); await connection.ExecuteAsync(sql, new { currentTime, serverid = CS2_SimpleAdmin.ServerId });
if (_config.ExpireOldIpBans > 0) if (_config.ExpireOldIpBans > 0)
{ {
DateTime ipBansTime = currentTime.AddDays(-_config.ExpireOldIpBans).ToLocalTime(); var ipBansTime = currentTime.AddDays(-_config.ExpireOldIpBans).ToLocalTime();
if (_config.MultiServerMode) sql = _config.MultiServerMode ? """
{
sql = @"
UPDATE sa_bans UPDATE sa_bans
SET SET
player_ip = NULL player_ip = NULL
@@ -369,19 +366,17 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
status = 'ACTIVE' status = 'ACTIVE'
AND AND
ends <= @ipBansTime ends <= @ipBansTime
AND server_id = @serverid"; AND server_id = @serverid
} """ : """
else
{
sql = @"
UPDATE sa_bans UPDATE sa_bans
SET SET
player_ip = NULL player_ip = NULL
WHERE WHERE
status = 'ACTIVE' status = 'ACTIVE'
AND AND
ends <= @ipBansTime"; ends <= @ipBansTime
} """;
await connection.ExecuteAsync(sql, new { ipBansTime, CS2_SimpleAdmin.ServerId }); await connection.ExecuteAsync(sql, new { ipBansTime, CS2_SimpleAdmin.ServerId });
} }

View File

@@ -10,22 +10,24 @@ internal class MuteManager(Database database)
public async Task MutePlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0, int type = 0) public async Task MutePlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0, int type = 0)
{ {
if (player == null || player.SteamId == null) return; if (player.SteamId == null) return;
DateTime now = DateTime.UtcNow.ToLocalTime(); var now = DateTime.UtcNow.ToLocalTime();
DateTime futureTime = now.AddMinutes(time).ToLocalTime(); var futureTime = now.AddMinutes(time).ToLocalTime();
string muteType = "GAG"; var muteType = type switch
if (type == 1) {
muteType = "MUTE"; 1 => "MUTE",
else if (type == 2) 2 => "SILENCE",
muteType = "SILENCE"; _ => "GAG"
};
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + const string sql =
"INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " +
"VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)"; "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)";
await connection.ExecuteAsync(sql, new await connection.ExecuteAsync(sql, new
@@ -50,19 +52,20 @@ internal class MuteManager(Database database)
if (string.IsNullOrEmpty(playerSteamId)) return; if (string.IsNullOrEmpty(playerSteamId)) return;
DateTime now = DateTime.UtcNow.ToLocalTime(); var now = DateTime.UtcNow.ToLocalTime();
DateTime futureTime = now.AddMinutes(time).ToLocalTime(); var futureTime = now.AddMinutes(time).ToLocalTime();
string muteType = "GAG"; var muteType = type switch
if (type == 1) {
muteType = "MUTE"; 1 => "MUTE",
else if (type == 2) 2 => "SILENCE",
muteType = "SILENCE"; _ => "GAG"
};
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + const string sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " +
"VALUES (@playerSteamid, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)"; "VALUES (@playerSteamid, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)";
await connection.ExecuteAsync(sql, new await connection.ExecuteAsync(sql, new
@@ -95,9 +98,9 @@ internal class MuteManager(Database database)
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
DateTime currentTime = DateTime.Now.ToLocalTime(); var currentTime = DateTime.Now.ToLocalTime();
string sql = ""; var sql = "";
if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) if (CS2_SimpleAdmin.Instance.Config.MultiServerMode)
{ {
@@ -123,21 +126,15 @@ internal class MuteManager(Database database)
{ {
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
int muteCount; var sql = "";
string sql = "";
if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode
{ ? "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND server_id = @serverid"
sql = "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND server_id = @serverid"; : "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID";
}
else
{
sql = "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID";
}
muteCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = steamId, serverid = CS2_SimpleAdmin.ServerId }); var muteCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = steamId, serverid = CS2_SimpleAdmin.ServerId });
return muteCount; return muteCount;
} }
catch (Exception) catch (Exception)
@@ -148,24 +145,23 @@ internal class MuteManager(Database database)
public async Task UnmutePlayer(string playerPattern, string adminSteamId, string reason, int type = 0) public async Task UnmutePlayer(string playerPattern, string adminSteamId, string reason, int type = 0)
{ {
if (playerPattern == null || playerPattern.Length <= 1) if (playerPattern.Length <= 1)
{ {
return; return;
} }
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string muteType = "GAG"; var muteType = type switch
if (type == 1)
{ {
muteType = "MUTE"; 1 => "MUTE",
} 2 => "SILENCE",
else if (type == 2) _ => "GAG"
muteType = "SILENCE"; };
string sqlRetrieveMutes = ""; var sqlRetrieveMutes = "";
if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) if (CS2_SimpleAdmin.Instance.Config.MultiServerMode)
{ {
@@ -180,16 +176,17 @@ internal class MuteManager(Database database)
var mutes = await connection.QueryAsync(sqlRetrieveMutes, new { pattern = playerPattern, muteType, serverid = CS2_SimpleAdmin.ServerId }); var mutes = await connection.QueryAsync(sqlRetrieveMutes, new { pattern = playerPattern, muteType, serverid = CS2_SimpleAdmin.ServerId });
if (!mutes.Any()) var mutesList = mutes as dynamic[] ?? mutes.ToArray();
if (mutesList.Length == 0)
return; return;
string sqlAdmin = "SELECT id FROM sa_admins WHERE player_steamid = @adminSteamId"; const string sqlAdmin = "SELECT id FROM sa_admins WHERE player_steamid = @adminSteamId";
string sqlInsertUnmute = "INSERT INTO sa_unmutes (mute_id, admin_id, reason) VALUES (@muteId, @adminId, @reason); SELECT LAST_INSERT_ID();"; var sqlInsertUnmute = "INSERT INTO sa_unmutes (mute_id, admin_id, reason) VALUES (@muteId, @adminId, @reason); SELECT LAST_INSERT_ID();";
int? sqlAdminId = await connection.ExecuteScalarAsync<int?>(sqlAdmin, new { adminSteamId }); var sqlAdminId = await connection.ExecuteScalarAsync<int?>(sqlAdmin, new { adminSteamId });
int adminId = sqlAdminId ?? 0; var adminId = sqlAdminId ?? 0;
foreach (var mute in mutes) foreach (var mute in mutesList)
{ {
int muteId = mute.id; int muteId = mute.id;
int? unmuteId; int? unmuteId;
@@ -206,7 +203,7 @@ internal class MuteManager(Database database)
} }
// Update sa_mutes to set unmute_id // Update sa_mutes to set unmute_id
string sqlUpdateMute = "UPDATE sa_mutes SET status = 'UNMUTED', unmute_id = @unmuteId WHERE id = @muteId"; const string sqlUpdateMute = "UPDATE sa_mutes SET status = 'UNMUTED', unmute_id = @unmuteId WHERE id = @muteId";
await connection.ExecuteAsync(sqlUpdateMute, new { unmuteId, muteId }); await connection.ExecuteAsync(sqlUpdateMute, new { unmuteId, muteId });
} }
} }
@@ -220,17 +217,12 @@ internal class MuteManager(Database database)
{ {
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string sql = ""; var sql = "";
if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode
{ ? "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime AND server_id = @serverid"
sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime AND server_id = @serverid"; : "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime";
}
else
{
sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime";
}
await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime(), serverid = CS2_SimpleAdmin.ServerId }); await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime(), serverid = CS2_SimpleAdmin.ServerId });
} }

View File

@@ -11,13 +11,13 @@ public enum PenaltyType
public class PlayerPenaltyManager public class PlayerPenaltyManager
{ {
private static ConcurrentDictionary<int, Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>> penalties = private static readonly ConcurrentDictionary<int, Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>> Penalties =
new ConcurrentDictionary<int, Dictionary<PenaltyType, List<(DateTime, int)>>>(); new ConcurrentDictionary<int, Dictionary<PenaltyType, List<(DateTime, int)>>>();
// Add a penalty for a player // Add a penalty for a player
public static void AddPenalty(int slot, PenaltyType penaltyType, DateTime endDateTime, int durationSeconds) public static void AddPenalty(int slot, PenaltyType penaltyType, DateTime endDateTime, int durationSeconds)
{ {
penalties.AddOrUpdate(slot, Penalties.AddOrUpdate(slot,
(_) => (_) =>
{ {
var dict = new Dictionary<PenaltyType, List<(DateTime, int)>> var dict = new Dictionary<PenaltyType, List<(DateTime, int)>>
@@ -28,11 +28,13 @@ public class PlayerPenaltyManager
}, },
(_, existingDict) => (_, existingDict) =>
{ {
if (!existingDict.ContainsKey(penaltyType)) if (!existingDict.TryGetValue(penaltyType, out var value))
{ {
existingDict[penaltyType] = new List<(DateTime, int)>(); value = new List<(DateTime, int)>();
existingDict[penaltyType] = value;
} }
existingDict[penaltyType].Add((endDateTime, durationSeconds));
value.Add((endDateTime, durationSeconds));
return existingDict; return existingDict;
}); });
} }
@@ -41,11 +43,11 @@ public class PlayerPenaltyManager
{ {
//Console.WriteLine($"Checking penalties for player with slot {slot} and penalty type {penaltyType}"); //Console.WriteLine($"Checking penalties for player with slot {slot} and penalty type {penaltyType}");
if (penalties.TryGetValue(slot, out var penaltyDict) && penaltyDict.TryGetValue(penaltyType, out var penaltiesList)) if (!Penalties.TryGetValue(slot, out var penaltyDict) ||
{ !penaltyDict.TryGetValue(penaltyType, out var penaltiesList)) return false;
//Console.WriteLine($"Found penalties for player with slot {slot} and penalty type {penaltyType}"); //Console.WriteLine($"Found penalties for player with slot {slot} and penalty type {penaltyType}");
DateTime now = DateTime.UtcNow.ToLocalTime(); var now = DateTime.UtcNow.ToLocalTime();
// Check if any active penalties exist // Check if any active penalties exist
foreach (var penalty in penaltiesList.ToList()) foreach (var penalty in penaltiesList.ToList())
@@ -72,18 +74,16 @@ public class PlayerPenaltyManager
// Return false if no active penalties are found // Return false if no active penalties are found
//Console.WriteLine($"Player with slot {slot} is not penalized for type {penaltyType}"); //Console.WriteLine($"Player with slot {slot} is not penalized for type {penaltyType}");
return false; return false;
}
// Return false if no penalties of the specified type were found for the player // Return false if no penalties of the specified type were found for the player
//Console.WriteLine($"No penalties found for player with slot {slot} and penalty type {penaltyType}"); //Console.WriteLine($"No penalties found for player with slot {slot} and penalty type {penaltyType}");
return false;
} }
// Get the end datetime and duration of penalties for a player and penalty type // Get the end datetime and duration of penalties for a player and penalty type
public static List<(DateTime EndDateTime, int Duration)> GetPlayerPenalties(int slot, PenaltyType penaltyType) public static List<(DateTime EndDateTime, int Duration)> GetPlayerPenalties(int slot, PenaltyType penaltyType)
{ {
if (penalties.TryGetValue(slot, out Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>? penaltyDict) && if (Penalties.TryGetValue(slot, out var penaltyDict) &&
penaltyDict.TryGetValue(penaltyType, out List<(DateTime EndDateTime, int Duration)>? penaltiesList) && penaltiesList != null) penaltyDict.TryGetValue(penaltyType, out var penaltiesList))
{ {
return penaltiesList; return penaltiesList;
} }
@@ -92,28 +92,28 @@ public class PlayerPenaltyManager
public static bool IsSlotInPenalties(int slot) public static bool IsSlotInPenalties(int slot)
{ {
return penalties.ContainsKey(slot); return Penalties.ContainsKey(slot);
} }
// Remove all penalties for a player slot // Remove all penalties for a player slot
public static void RemoveAllPenalties(int slot) public static void RemoveAllPenalties(int slot)
{ {
if (penalties.ContainsKey(slot)) if (Penalties.ContainsKey(slot))
{ {
penalties.TryRemove(slot, out _); Penalties.TryRemove(slot, out _);
} }
} }
// Remove all penalties // Remove all penalties
public static void RemoveAllPenalties() public static void RemoveAllPenalties()
{ {
penalties.Clear(); Penalties.Clear();
} }
// Remove all penalties of a selected type from a specific player // Remove all penalties of a selected type from a specific player
public static void RemovePenaltiesByType(int slot, PenaltyType penaltyType) public static void RemovePenaltiesByType(int slot, PenaltyType penaltyType)
{ {
if (penalties.TryGetValue(slot, out Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>? penaltyDict) && if (Penalties.TryGetValue(slot, out Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>? penaltyDict) &&
penaltyDict.ContainsKey(penaltyType)) penaltyDict.ContainsKey(penaltyType))
{ {
penaltyDict.Remove(penaltyType); penaltyDict.Remove(penaltyType);
@@ -123,8 +123,8 @@ public class PlayerPenaltyManager
// Remove all expired penalties for all players and penalty types // Remove all expired penalties for all players and penalty types
public static void RemoveExpiredPenalties() public static void RemoveExpiredPenalties()
{ {
DateTime now = DateTime.UtcNow.ToLocalTime(); var now = DateTime.UtcNow.ToLocalTime();
foreach (var kvp in penalties.ToList()) // Use ToList to avoid modification while iterating foreach (var kvp in Penalties.ToList()) // Use ToList to avoid modification while iterating
{ {
var playerSlot = kvp.Key; var playerSlot = kvp.Key;
var penaltyDict = kvp.Value; var penaltyDict = kvp.Value;
@@ -138,7 +138,7 @@ public class PlayerPenaltyManager
// Remove player slot if no penalties left // Remove player slot if no penalties left
if (penaltyDict.Count == 0) if (penaltyDict.Count == 0)
{ {
penalties.TryRemove(playerSlot, out _); Penalties.TryRemove(playerSlot, out _);
} }
} }
} }

View File

@@ -16,7 +16,7 @@ namespace CS2_SimpleAdmin.Menus
new Tuple<string, int>("Permanent", 0) new Tuple<string, int>("Permanent", 0)
}; };
public static void OpenMenu(CCSPlayerController admin, string menuName, CCSPlayerController player, Action<CCSPlayerController, CCSPlayerController, int> onSelectAction) public static void OpenMenu(CCSPlayerController admin, string menuName, CCSPlayerController? player, Action<CCSPlayerController, CCSPlayerController?, int> onSelectAction)
{ {
BaseMenu menu = AdminMenu.CreateMenu(menuName); BaseMenu menu = AdminMenu.CreateMenu(menuName);

View File

@@ -15,7 +15,7 @@ namespace CS2_SimpleAdmin.Menus
{ {
if (_weaponsCache == null) if (_weaponsCache == null)
{ {
Array weaponsArray = Enum.GetValues(typeof(CsItem)); var weaponsArray = Enum.GetValues(typeof(CsItem));
// avoid duplicates in the menu // avoid duplicates in the menu
_weaponsCache = new(); _weaponsCache = new();
@@ -44,12 +44,12 @@ namespace CS2_SimpleAdmin.Menus
return; return;
} }
BaseMenu menu = AdminMenu.CreateMenu("Fun Actions"); var menu = AdminMenu.CreateMenu("Fun Actions");
List<ChatMenuOptionData> options = new(); List<ChatMenuOptionData> options = new();
// permissions // permissions
bool hasCheats = AdminManager.PlayerHasPermissions(admin, "@css/cheats"); var hasCheats = AdminManager.PlayerHasPermissions(admin, "@css/cheats");
bool hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay"); var hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay");
// TODO: Localize options // TODO: Localize options
// options added in order // options added in order
@@ -72,35 +72,35 @@ namespace CS2_SimpleAdmin.Menus
options.Add(new ChatMenuOptionData("Set Money", () => PlayersMenu.OpenMenu(admin, "Set Money", SetMoneyMenu))); options.Add(new ChatMenuOptionData("Set Money", () => PlayersMenu.OpenMenu(admin, "Set Money", SetMoneyMenu)));
} }
foreach (ChatMenuOptionData menuOptionData in options) foreach (var menuOptionData in options)
{ {
string menuName = menuOptionData.name; var menuName = menuOptionData.name;
menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled);
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void GodMode(CCSPlayerController admin, CCSPlayerController player) private static void GodMode(CCSPlayerController admin, CCSPlayerController? player)
{ {
CS2_SimpleAdmin.Instance.God(admin, player); CS2_SimpleAdmin.Instance.God(admin, player);
} }
private static void NoClip(CCSPlayerController admin, CCSPlayerController player) private static void NoClip(CCSPlayerController admin, CCSPlayerController? player)
{ {
CS2_SimpleAdmin.Instance.NoClip(admin, player); CS2_SimpleAdmin.Instance.NoClip(admin, player);
} }
private static void Respawn(CCSPlayerController admin, CCSPlayerController player) private static void Respawn(CCSPlayerController admin, CCSPlayerController? player)
{ {
CS2_SimpleAdmin.Instance.Respawn(admin, player); CS2_SimpleAdmin.Instance.Respawn(admin, player);
} }
private static void GiveWeaponMenu(CCSPlayerController admin, CCSPlayerController player) private static void GiveWeaponMenu(CCSPlayerController admin, CCSPlayerController player)
{ {
BaseMenu menu = AdminMenu.CreateMenu($"Give Weapon: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Give Weapon: {player.PlayerName}");
foreach (KeyValuePair<int, CsItem> weapon in GetWeaponsCache) foreach (var weapon in GetWeaponsCache)
{ {
menu.AddMenuOption(weapon.Value.ToString(), (_, _) => { GiveWeapon(admin, player, weapon.Value); }); menu.AddMenuOption(weapon.Value.ToString(), (_, _) => { GiveWeapon(admin, player, weapon.Value); });
} }
@@ -113,14 +113,14 @@ namespace CS2_SimpleAdmin.Menus
CS2_SimpleAdmin.Instance.GiveWeapon(admin, player, weaponValue); CS2_SimpleAdmin.Instance.GiveWeapon(admin, player, weaponValue);
} }
private static void StripWeapons(CCSPlayerController admin, CCSPlayerController player) private static void StripWeapons(CCSPlayerController admin, CCSPlayerController? player)
{ {
CS2_SimpleAdmin.Instance.StripWeapons(admin, player); CS2_SimpleAdmin.Instance.StripWeapons(admin, player);
} }
private static void Freeze(CCSPlayerController admin, CCSPlayerController player) private static void Freeze(CCSPlayerController admin, CCSPlayerController? player)
{ {
if (!(player.PlayerPawn?.Value?.IsValid ?? false)) if (!(player?.PlayerPawn?.Value?.IsValid ?? false))
return; return;
if (player.PlayerPawn.Value.MoveType != MoveType_t.MOVETYPE_OBSOLETE) if (player.PlayerPawn.Value.MoveType != MoveType_t.MOVETYPE_OBSOLETE)
@@ -129,9 +129,9 @@ namespace CS2_SimpleAdmin.Menus
CS2_SimpleAdmin.Instance.Unfreeze(admin, player); CS2_SimpleAdmin.Instance.Unfreeze(admin, player);
} }
private static void SetHpMenu(CCSPlayerController admin, CCSPlayerController player) private static void SetHpMenu(CCSPlayerController admin, CCSPlayerController? player)
{ {
Tuple<string, int>[] _hpArray = new[] var hpArray = new[]
{ {
new Tuple<string, int>("1", 1), new Tuple<string, int>("1", 1),
new Tuple<string, int>("10", 10), new Tuple<string, int>("10", 10),
@@ -143,25 +143,25 @@ namespace CS2_SimpleAdmin.Menus
new Tuple<string, int>("999", 999) new Tuple<string, int>("999", 999)
}; };
BaseMenu menu = AdminMenu.CreateMenu($"Set HP: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Set HP: {player?.PlayerName}");
foreach (Tuple<string, int> hpTuple in _hpArray) foreach (var hpTuple in hpArray)
{ {
string optionName = hpTuple.Item1; var optionName = hpTuple.Item1;
menu.AddMenuOption(optionName, (_, _) => { SetHP(admin, player, hpTuple.Item2); }); menu.AddMenuOption(optionName, (_, _) => { SetHP(admin, player, hpTuple.Item2); });
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void SetHP(CCSPlayerController admin, CCSPlayerController player, int hp) private static void SetHP(CCSPlayerController admin, CCSPlayerController? player, int hp)
{ {
CS2_SimpleAdmin.Instance.SetHp(admin, player, hp); CS2_SimpleAdmin.Instance.SetHp(admin, player, hp);
} }
private static void SetSpeedMenu(CCSPlayerController admin, CCSPlayerController player) private static void SetSpeedMenu(CCSPlayerController admin, CCSPlayerController? player)
{ {
Tuple<string, float>[] _speedArray = new[] var speedArray = new[]
{ {
new Tuple<string, float>("0.1", .1f), new Tuple<string, float>("0.1", .1f),
new Tuple<string, float>("0.25", .25f), new Tuple<string, float>("0.25", .25f),
@@ -173,25 +173,25 @@ namespace CS2_SimpleAdmin.Menus
new Tuple<string, float>("4", 4) new Tuple<string, float>("4", 4)
}; };
BaseMenu menu = AdminMenu.CreateMenu($"Set Speed: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Set Speed: {player?.PlayerName}");
foreach (Tuple<string, float> speedTuple in _speedArray) foreach (var speedTuple in speedArray)
{ {
string optionName = speedTuple.Item1; var optionName = speedTuple.Item1;
menu.AddMenuOption(optionName, (_, _) => { SetSpeed(admin, player, speedTuple.Item2); }); menu.AddMenuOption(optionName, (_, _) => { SetSpeed(admin, player, speedTuple.Item2); });
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void SetSpeed(CCSPlayerController admin, CCSPlayerController player, float speed) private static void SetSpeed(CCSPlayerController admin, CCSPlayerController? player, float speed)
{ {
CS2_SimpleAdmin.Instance.SetSpeed(admin, player, speed); CS2_SimpleAdmin.Instance.SetSpeed(admin, player, speed);
} }
private static void SetGravityMenu(CCSPlayerController admin, CCSPlayerController player) private static void SetGravityMenu(CCSPlayerController admin, CCSPlayerController? player)
{ {
Tuple<string, float>[] _gravityArray = new[] var gravityArray = new[]
{ {
new Tuple<string, float>("0.1", .1f), new Tuple<string, float>("0.1", .1f),
new Tuple<string, float>("0.25", .25f), new Tuple<string, float>("0.25", .25f),
@@ -201,25 +201,25 @@ namespace CS2_SimpleAdmin.Menus
new Tuple<string, float>("2", 2) new Tuple<string, float>("2", 2)
}; };
BaseMenu menu = AdminMenu.CreateMenu($"Set Gravity: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Set Gravity: {player?.PlayerName}");
foreach (Tuple<string, float> gravityTuple in _gravityArray) foreach (var gravityTuple in gravityArray)
{ {
string optionName = gravityTuple.Item1; var optionName = gravityTuple.Item1;
menu.AddMenuOption(optionName, (_, _) => { SetGravity(admin, player, gravityTuple.Item2); }); menu.AddMenuOption(optionName, (_, _) => { SetGravity(admin, player, gravityTuple.Item2); });
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void SetGravity(CCSPlayerController admin, CCSPlayerController player, float gravity) private static void SetGravity(CCSPlayerController admin, CCSPlayerController? player, float gravity)
{ {
CS2_SimpleAdmin.Instance.SetGravity(admin, player, gravity); CS2_SimpleAdmin.Instance.SetGravity(admin, player, gravity);
} }
private static void SetMoneyMenu(CCSPlayerController admin, CCSPlayerController player) private static void SetMoneyMenu(CCSPlayerController admin, CCSPlayerController? player)
{ {
Tuple<string, int>[] _moneyArray = new[] var moneyArray = new[]
{ {
new Tuple<string, int>("$0", 0), new Tuple<string, int>("$0", 0),
new Tuple<string, int>("$1000", 1000), new Tuple<string, int>("$1000", 1000),
@@ -229,18 +229,18 @@ namespace CS2_SimpleAdmin.Menus
new Tuple<string, int>("$16000", 16000) new Tuple<string, int>("$16000", 16000)
}; };
BaseMenu menu = AdminMenu.CreateMenu($"Set Money: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Set Money: {player?.PlayerName}");
foreach (Tuple<string, int> moneyTuple in _moneyArray) foreach (var moneyTuple in moneyArray)
{ {
string optionName = moneyTuple.Item1; var optionName = moneyTuple.Item1;
menu.AddMenuOption(optionName, (_, _) => { SetMoney(admin, player, moneyTuple.Item2); }); menu.AddMenuOption(optionName, (_, _) => { SetMoney(admin, player, moneyTuple.Item2); });
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void SetMoney(CCSPlayerController admin, CCSPlayerController player, int money) private static void SetMoney(CCSPlayerController admin, CCSPlayerController? player, int money)
{ {
CS2_SimpleAdmin.Instance.SetMoney(admin, player, money); CS2_SimpleAdmin.Instance.SetMoney(admin, player, money);
} }

View File

@@ -28,9 +28,9 @@ namespace CS2_SimpleAdmin.Menus
options.Add(new ChatMenuOptionData("Remove Admin", () => PlayersMenu.OpenAdminPlayersMenu(admin, "Remove Admin", RemoveAdmin, player => player != admin && admin.CanTarget(player)))); options.Add(new ChatMenuOptionData("Remove Admin", () => PlayersMenu.OpenAdminPlayersMenu(admin, "Remove Admin", RemoveAdmin, player => player != admin && admin.CanTarget(player))));
options.Add(new ChatMenuOptionData("Reload Admins", () => ReloadAdmins(admin))); options.Add(new ChatMenuOptionData("Reload Admins", () => ReloadAdmins(admin)));
foreach (ChatMenuOptionData menuOptionData in options) foreach (var menuOptionData in options)
{ {
string menuName = menuOptionData.name; var menuName = menuOptionData.name;
menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled);
} }
@@ -39,7 +39,7 @@ namespace CS2_SimpleAdmin.Menus
private static void AddAdminMenu(CCSPlayerController admin, CCSPlayerController player) private static void AddAdminMenu(CCSPlayerController admin, CCSPlayerController player)
{ {
Tuple<string, string>[] flags = new[] var flags = new[]
{ {
new Tuple<string, string>("Generic", "@css/generic"), new Tuple<string, string>("Generic", "@css/generic"),
new Tuple<string, string>("Chat", "@css/chat"), new Tuple<string, string>("Chat", "@css/chat"),
@@ -54,12 +54,12 @@ namespace CS2_SimpleAdmin.Menus
new Tuple<string, string>("Root", "@css/root"), new Tuple<string, string>("Root", "@css/root"),
}; };
BaseMenu menu = AdminMenu.CreateMenu($"Add Admin: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Add Admin: {player.PlayerName}");
foreach (Tuple<string, string> flagsTuple in flags) foreach (var flagsTuple in flags)
{ {
string optionName = flagsTuple.Item1; var optionName = flagsTuple.Item1;
bool disabled = AdminManager.PlayerHasPermissions(player, flagsTuple.Item2); var disabled = AdminManager.PlayerHasPermissions(player, flagsTuple.Item2);
menu.AddMenuOption(optionName, (_, _) => { AddAdmin(admin, player, flagsTuple.Item2); }, disabled); menu.AddMenuOption(optionName, (_, _) => { AddAdmin(admin, player, flagsTuple.Item2); }, disabled);
} }

View File

@@ -9,7 +9,7 @@ namespace CS2_SimpleAdmin.Menus
{ {
public static void OpenMenu(CCSPlayerController admin) public static void OpenMenu(CCSPlayerController admin)
{ {
if (admin == null || admin.IsValid == false) if (admin.IsValid == false)
return; return;
if (AdminManager.PlayerHasPermissions(admin, "@css/generic") == false) if (AdminManager.PlayerHasPermissions(admin, "@css/generic") == false)
@@ -19,14 +19,14 @@ namespace CS2_SimpleAdmin.Menus
return; return;
} }
BaseMenu menu = AdminMenu.CreateMenu("Manage Players"); var menu = AdminMenu.CreateMenu("Manage Players");
List<ChatMenuOptionData> options = []; List<ChatMenuOptionData> options = [];
// permissions // permissions
bool hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay"); var hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay");
bool hasKick = AdminManager.PlayerHasPermissions(admin, "@css/kick"); var hasKick = AdminManager.PlayerHasPermissions(admin, "@css/kick");
bool hasBan = AdminManager.PlayerHasPermissions(admin, "@css/ban"); var hasBan = AdminManager.PlayerHasPermissions(admin, "@css/ban");
bool hasChat = AdminManager.PlayerHasPermissions(admin, "@css/chat"); var hasChat = AdminManager.PlayerHasPermissions(admin, "@css/chat");
// TODO: Localize options // TODO: Localize options
// options added in order // options added in order
@@ -44,14 +44,14 @@ namespace CS2_SimpleAdmin.Menus
if (hasBan) if (hasBan)
{ {
options.Add(new ChatMenuOptionData("Ban", () => PlayersMenu.OpenRealPlayersMenu(admin, "Ban", (admin, player) => DurationMenu.OpenMenu(admin, $"Ban: {player.PlayerName}", player, BanMenu)))); options.Add(new ChatMenuOptionData("Ban", () => PlayersMenu.OpenRealPlayersMenu(admin, "Ban", (admin, player) => DurationMenu.OpenMenu(admin, $"Ban: {player?.PlayerName}", player, BanMenu))));
} }
if (hasChat) if (hasChat)
{ {
options.Add(new ChatMenuOptionData("Gag", () => PlayersMenu.OpenRealPlayersMenu(admin, "Gag", (admin, player) => DurationMenu.OpenMenu(admin, $"Gag: {player.PlayerName}", player, GagMenu)))); options.Add(new ChatMenuOptionData("Gag", () => PlayersMenu.OpenRealPlayersMenu(admin, "Gag", (admin, player) => DurationMenu.OpenMenu(admin, $"Gag: {player?.PlayerName}", player, GagMenu))));
options.Add(new ChatMenuOptionData("Mute", () => PlayersMenu.OpenRealPlayersMenu(admin, "Mute", (admin, player) => DurationMenu.OpenMenu(admin, $"Mute: {player.PlayerName}", player, MuteMenu)))); options.Add(new ChatMenuOptionData("Mute", () => PlayersMenu.OpenRealPlayersMenu(admin, "Mute", (admin, player) => DurationMenu.OpenMenu(admin, $"Mute: {player?.PlayerName}", player, MuteMenu))));
options.Add(new ChatMenuOptionData("Silence", () => PlayersMenu.OpenRealPlayersMenu(admin, "Silence", (admin, player) => DurationMenu.OpenMenu(admin, $"Silence: {player.PlayerName}", player, SilenceMenu)))); options.Add(new ChatMenuOptionData("Silence", () => PlayersMenu.OpenRealPlayersMenu(admin, "Silence", (admin, player) => DurationMenu.OpenMenu(admin, $"Silence: {player?.PlayerName}", player, SilenceMenu))));
} }
if (hasKick) if (hasKick)
@@ -59,18 +59,18 @@ namespace CS2_SimpleAdmin.Menus
options.Add(new ChatMenuOptionData("Force Team", () => PlayersMenu.OpenMenu(admin, "Force Team", ForceTeamMenu))); options.Add(new ChatMenuOptionData("Force Team", () => PlayersMenu.OpenMenu(admin, "Force Team", ForceTeamMenu)));
} }
foreach (ChatMenuOptionData menuOptionData in options) foreach (var menuOptionData in options)
{ {
string menuName = menuOptionData.name; var menuName = menuOptionData.name;
menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled);
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) private static void SlapMenu(CCSPlayerController admin, CCSPlayerController? player)
{ {
BaseMenu menu = AdminMenu.CreateMenu($"Slap: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Slap: {player?.PlayerName}");
List<ChatMenuOptionData> options = List<ChatMenuOptionData> options =
[ [
// options added in order // options added in order
@@ -82,33 +82,31 @@ namespace CS2_SimpleAdmin.Menus
new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100)), new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100)),
]; ];
foreach (ChatMenuOptionData menuOptionData in options) foreach (var menuOptionData in options)
{ {
string menuName = menuOptionData.name; var menuName = menuOptionData.name;
menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled);
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void ApplySlapAndKeepMenu(CCSPlayerController admin, CCSPlayerController player, int damage) private static void ApplySlapAndKeepMenu(CCSPlayerController admin, CCSPlayerController? player, int damage)
{
if (player is not null && player.IsValid)
{ {
if (player is null || !player.IsValid) return;
CS2_SimpleAdmin.Instance.Slap(admin, player, damage); CS2_SimpleAdmin.Instance.Slap(admin, player, damage);
SlapMenu(admin, player); SlapMenu(admin, player);
} }
}
private static void Slay(CCSPlayerController admin, CCSPlayerController player) private static void Slay(CCSPlayerController admin, CCSPlayerController? player)
{ {
if (player is not null && player.IsValid) if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.Slay(admin, player); CS2_SimpleAdmin.Instance.Slay(admin, player);
} }
private static void KickMenu(CCSPlayerController admin, CCSPlayerController player) private static void KickMenu(CCSPlayerController admin, CCSPlayerController? player)
{ {
BaseMenu menu = AdminMenu.CreateMenu($"Kick: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Kick: {player?.PlayerName}");
List<string> options = List<string> options =
[ [
"Voice Abuse", "Voice Abuse",
@@ -117,7 +115,7 @@ namespace CS2_SimpleAdmin.Menus
"Other" "Other"
]; ];
foreach (string option in options) foreach (var option in options)
{ {
menu.AddMenuOption(option, (_, _) => menu.AddMenuOption(option, (_, _) =>
{ {
@@ -129,15 +127,15 @@ namespace CS2_SimpleAdmin.Menus
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void Kick(CCSPlayerController admin, CCSPlayerController player, string reason) private static void Kick(CCSPlayerController admin, CCSPlayerController? player, string reason)
{ {
if (player is not null && player.IsValid) if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.Kick(admin, player, reason); CS2_SimpleAdmin.Instance.Kick(admin, player, reason);
} }
private static void BanMenu(CCSPlayerController admin, CCSPlayerController player, int duration) private static void BanMenu(CCSPlayerController admin, CCSPlayerController? player, int duration)
{ {
BaseMenu menu = AdminMenu.CreateMenu($"Ban: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Ban: {player?.PlayerName}");
List<string> options = List<string> options =
[ [
"Hacking", "Hacking",
@@ -147,7 +145,7 @@ namespace CS2_SimpleAdmin.Menus
"Other" "Other"
]; ];
foreach (string option in options) foreach (var option in options)
{ {
menu.AddMenuOption(option, (_, _) => menu.AddMenuOption(option, (_, _) =>
{ {
@@ -159,16 +157,16 @@ namespace CS2_SimpleAdmin.Menus
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Ban(CCSPlayerController admin, CCSPlayerController? player, int duration, string reason)
{ {
if (player is not null && player.IsValid) if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason); CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason);
} }
private static void GagMenu(CCSPlayerController admin, CCSPlayerController player, int duration) private static void GagMenu(CCSPlayerController admin, CCSPlayerController? player, int duration)
{ {
// TODO: Localize and make options in config? // TODO: Localize and make options in config?
BaseMenu menu = AdminMenu.CreateMenu($"Gag: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Gag: {player?.PlayerName}");
List<string> options = List<string> options =
[ [
"Advertising", "Advertising",
@@ -179,7 +177,7 @@ namespace CS2_SimpleAdmin.Menus
"Other" "Other"
]; ];
foreach (string option in options) foreach (var option in options)
{ {
menu.AddMenuOption(option, (_, _) => menu.AddMenuOption(option, (_, _) =>
{ {
@@ -191,16 +189,16 @@ namespace CS2_SimpleAdmin.Menus
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Gag(CCSPlayerController admin, CCSPlayerController? player, int duration, string reason)
{ {
if (player is not null && player.IsValid) if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.Gag(admin, player, duration, reason); CS2_SimpleAdmin.Instance.Gag(admin, player, duration, reason);
} }
private static void MuteMenu(CCSPlayerController admin, CCSPlayerController player, int duration) private static void MuteMenu(CCSPlayerController admin, CCSPlayerController? player, int duration)
{ {
// TODO: Localize and make options in config? // TODO: Localize and make options in config?
BaseMenu menu = AdminMenu.CreateMenu($"Mute: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Mute: {player?.PlayerName}");
List<string> options = List<string> options =
[ [
"Shouting", "Shouting",
@@ -213,7 +211,7 @@ namespace CS2_SimpleAdmin.Menus
"Other" "Other"
]; ];
foreach (string option in options) foreach (var option in options)
{ {
menu.AddMenuOption(option, (_, _) => menu.AddMenuOption(option, (_, _) =>
{ {
@@ -225,16 +223,16 @@ namespace CS2_SimpleAdmin.Menus
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Mute(CCSPlayerController admin, CCSPlayerController? player, int duration, string reason)
{ {
if (player is not null && player.IsValid) if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.Mute(admin, player, duration, reason); CS2_SimpleAdmin.Instance.Mute(admin, player, duration, reason);
} }
private static void SilenceMenu(CCSPlayerController admin, CCSPlayerController player, int duration) private static void SilenceMenu(CCSPlayerController admin, CCSPlayerController? player, int duration)
{ {
// TODO: Localize and make options in config? // TODO: Localize and make options in config?
BaseMenu menu = AdminMenu.CreateMenu($"Silence: {player.PlayerName}"); var menu = AdminMenu.CreateMenu($"Silence: {player?.PlayerName}");
List<string> options = List<string> options =
[ [
"Shouting", "Shouting",
@@ -247,7 +245,7 @@ namespace CS2_SimpleAdmin.Menus
"Other" "Other"
]; ];
foreach (string option in options) foreach (var option in options)
{ {
menu.AddMenuOption(option, (_, _) => menu.AddMenuOption(option, (_, _) =>
{ {
@@ -259,16 +257,16 @@ namespace CS2_SimpleAdmin.Menus
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void Silence(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Silence(CCSPlayerController admin, CCSPlayerController? player, int duration, string reason)
{ {
if (player is not null && player.IsValid) if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.Silence(admin, player, duration, reason); CS2_SimpleAdmin.Instance.Silence(admin, player, duration, reason);
} }
private static void ForceTeamMenu(CCSPlayerController admin, CCSPlayerController player) private static void ForceTeamMenu(CCSPlayerController admin, CCSPlayerController? player)
{ {
// TODO: Localize // TODO: Localize
BaseMenu menu = AdminMenu.CreateMenu($"Force {player.PlayerName}'s Team"); var menu = AdminMenu.CreateMenu($"Force {player?.PlayerName}'s Team");
List<ChatMenuOptionData> options = List<ChatMenuOptionData> options =
[ [
new ChatMenuOptionData("CT", () => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist)), new ChatMenuOptionData("CT", () => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist)),
@@ -277,16 +275,16 @@ namespace CS2_SimpleAdmin.Menus
new ChatMenuOptionData("Spectator", () => ForceTeam(admin, player, "spec", CsTeam.Spectator)), new ChatMenuOptionData("Spectator", () => ForceTeam(admin, player, "spec", CsTeam.Spectator)),
]; ];
foreach (ChatMenuOptionData menuOptionData in options) foreach (var menuOptionData in options)
{ {
string menuName = menuOptionData.name; var menuName = menuOptionData.name;
menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled);
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
} }
private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player, string teamName, CsTeam teamNum) private static void ForceTeam(CCSPlayerController admin, CCSPlayerController? player, string teamName, CsTeam teamNum)
{ {
if (player is not null && player.IsValid) if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.ChangeTeam(admin, player, teamName, teamNum, true); CS2_SimpleAdmin.Instance.ChangeTeam(admin, player, teamName, teamNum, true);

View File

@@ -12,7 +12,7 @@ namespace CS2_SimpleAdmin.Menus
OpenMenu(admin, menuName, onSelectAction, p => p.IsBot == false); OpenMenu(admin, menuName, onSelectAction, p => p.IsBot == false);
} }
public static void OpenAdminPlayersMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null) public static void OpenAdminPlayersMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController?, bool>? enableFilter = null)
{ {
OpenMenu(admin, menuName, onSelectAction, p => AdminManager.GetPlayerAdminData(p)?.Flags?.Count > 0); OpenMenu(admin, menuName, onSelectAction, p => AdminManager.GetPlayerAdminData(p)?.Flags?.Count > 0);
} }
@@ -22,28 +22,32 @@ namespace CS2_SimpleAdmin.Menus
OpenMenu(admin, menuName, onSelectAction, p => p.PawnIsAlive); OpenMenu(admin, menuName, onSelectAction, p => p.PawnIsAlive);
} }
public static void OpenDeadMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null) public static void OpenDeadMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController?> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null)
{ {
OpenMenu(admin, menuName, onSelectAction, p => p.PawnIsAlive == false); OpenMenu(admin, menuName, onSelectAction, p => p.PawnIsAlive == false);
} }
public static void OpenMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null) public static void OpenMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null)
{ {
BaseMenu menu = AdminMenu.CreateMenu(menuName); var menu = AdminMenu.CreateMenu(menuName);
IEnumerable<CCSPlayerController> players = Helper.GetValidPlayersWithBots(); var players = Helper.GetValidPlayersWithBots();
string playerName = string.Empty;
foreach (CCSPlayerController player in players) foreach (var player in players)
{ {
playerName = player.PlayerName.Length > 26 ? player.PlayerName[..26] : player.PlayerName; var playerName = player != null && player.PlayerName.Length > 26 ? player.PlayerName[..26] : player?.PlayerName;
string optionName = HttpUtility.HtmlEncode(playerName); var optionName = HttpUtility.HtmlEncode(playerName);
if (enableFilter != null && enableFilter(player) == false) if (player != null && enableFilter != null && enableFilter(player) == false)
continue; continue;
bool enabled = admin.CanTarget(player); var enabled = admin.CanTarget(player);
menu.AddMenuOption(optionName, (_, _) => { onSelectAction?.Invoke(admin, player); }, enabled == false); if (optionName != null)
menu.AddMenuOption(optionName, (_, _) =>
{
if (player != null) onSelectAction?.Invoke(admin, player);
},
enabled == false);
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);

View File

@@ -3,10 +3,10 @@
public class PlayerInfo public class PlayerInfo
{ {
public int? Index { get; set; } public int? Index { get; set; }
public int UserId { get; set; } public int UserId { get; init; }
public int Slot { get; set; } public int Slot { get; init; }
public string? SteamId { get; set; } public string? SteamId { get; init; }
public string? Name { get; set; } public string? Name { get; init; }
public string? IpAddress { get; set; } public string? IpAddress { get; init; }
} }
} }