Merge branch 'daffyyyy:main' into main

This commit is contained in:
Dliix66
2024-04-28 02:20:16 +02:00
committed by GitHub
34 changed files with 1752 additions and 1283 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

@@ -11,17 +11,17 @@ using System.Collections.Concurrent;
namespace CS2_SimpleAdmin; namespace CS2_SimpleAdmin;
[MinimumApiVersion(201)] [MinimumApiVersion(215)]
public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdminConfig> public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdminConfig>
{ {
public static CS2_SimpleAdmin Instance { get; private set; } = new(); public static CS2_SimpleAdmin Instance { get; private set; } = new();
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;
@@ -37,7 +37,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleName => "CS2-SimpleAdmin";
public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
public override string ModuleAuthor => "daffyy & Dliix66"; public override string ModuleAuthor => "daffyy & Dliix66";
public override string ModuleVersion => "1.3.9a"; public override string ModuleVersion => "1.4.1a";
public CS2_SimpleAdminConfig Config { get; set; } = new(); public CS2_SimpleAdminConfig Config { get; set; } = new();
@@ -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)
@@ -124,17 +124,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
Config = config; Config = config;
Helper.UpdateConfig(config); Helper.UpdateConfig(config);
if (!Directory.Exists(ModuleDirectory + "/data"))
{
Directory.CreateDirectory(ModuleDirectory + "/data");
}
_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())
{ {
@@ -157,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

@@ -10,10 +10,10 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.213" /> <PackageReference Include="CounterStrikeSharp.API" Version="1.0.215" />
<PackageReference Include="Dapper" Version="2.1.35" /> <PackageReference Include="Dapper" Version="2.1.35" />
<PackageReference Include="Discord.Net.Webhook" Version="3.14.1" /> <PackageReference Include="Discord.Net.Webhook" Version="3.14.1" />
<PackageReference Include="MySqlConnector" Version="2.3.6" /> <PackageReference Include="MySqlConnector" Version="2.3.7" />
<PackageReference Include="Newtonsoft.Json" Version="*" /> <PackageReference Include="Newtonsoft.Json" Version="*" />
</ItemGroup> </ItemGroup>

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)
@@ -208,7 +201,97 @@ namespace CS2_SimpleAdmin
Server.PrintToConsole(msg); Server.PrintToConsole(msg);
} }
[ConsoleCommand("css_reladmin")] [ConsoleCommand("css_addgroup")]
[CommandHelper(minArgs: 3, usage: "<group_name> <flags> <immunity>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
[RequiresPermissions("@css/root")]
public void OnAddGroup(CCSPlayerController? caller, CommandInfo command)
{
if (_database == null) return;
if (!command.GetArg(1).StartsWith("#"))
{
command.ReplyToCommand($"Group name must start with #.");
return;
}
if (!command.GetArg(2).StartsWith($"@") && !command.GetArg(2).StartsWith($"#"))
{
command.ReplyToCommand($"Invalid flag or group.");
return;
}
var groupName = command.GetArg(1);
var flags = command.GetArg(2);
var immunity = 0;
int.TryParse(command.GetArg(3), out immunity);
AddGroup(caller, groupName, flags, immunity, command);
}
public static void AddGroup(CCSPlayerController? caller, string name, string flags, int immunity, CommandInfo? command = null)
{
if (_database == null) return;
AdminSQLManager _adminManager = new(_database);
var flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList();
_ = _adminManager.AddGroup(name, flagsList, immunity);
if (command != null)
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, $"css_addgroup {name} {flags} {immunity}");
var msg = $"Created group '{name}' with flags '{flags}'";
if (command != null)
command.ReplyToCommand(msg);
else if (caller != null && caller.IsValid)
caller.PrintToChat(msg);
else
Server.PrintToConsole(msg);
}
[ConsoleCommand("css_delgroup")]
[CommandHelper(minArgs: 1, usage: "<group_name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
[RequiresPermissions("@css/root")]
public void OnDelGroupCommand(CCSPlayerController? caller, CommandInfo command)
{
if (_database == null) return;
if (!command.GetArg(1).StartsWith($"#"))
{
command.ReplyToCommand($"Group name must start with #.");
return;
}
var groupName = command.GetArg(1);
RemoveGroup(caller, groupName, command);
}
private void RemoveGroup(CCSPlayerController? caller, string name, CommandInfo? command = null)
{
if (_database == null) return;
AdminSQLManager _adminManager = new(_database);
_ = _adminManager.DeleteGroup(name);
AddTimer(2, () =>
{
ReloadAdmins(caller);
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
if (command != null)
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
Helper.LogCommand(caller, $"css_delgroup {name}");
var msg = $"Removed group '{name}'";
if (command != null)
command.ReplyToCommand(msg);
else if (caller != null && caller.IsValid)
caller.PrintToChat(msg);
else
Server.PrintToConsole(msg);
}
[ConsoleCommand("css_reloadadmins")]
[CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
[RequiresPermissions("@css/root")] [RequiresPermissions("@css/root")]
public void OnRelAdminCommand(CCSPlayerController? caller, CommandInfo command) public void OnRelAdminCommand(CCSPlayerController? caller, CommandInfo command)
@@ -217,24 +300,36 @@ namespace CS2_SimpleAdmin
ReloadAdmins(caller); ReloadAdmins(caller);
command.ReplyToCommand("Reloaded sql admins"); command.ReplyToCommand("Reloaded sql admins and groups");
} }
public void ReloadAdmins(CCSPlayerController? caller) public void ReloadAdmins(CCSPlayerController? caller)
{ {
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);
_ = _adminManager.GiveAllFlags();
Task.Run(async () =>
{
await _adminManager.CrateGroupsJsonFile();
await _adminManager.CreateAdminsJsonFile();
AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json");
AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json");
});
//_ = _adminManager.GiveAllGroupsFlags();
//_ = _adminManager.GiveAllFlags();
} }
[ConsoleCommand("css_stealth")] [ConsoleCommand("css_stealth")]
@@ -274,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);
@@ -291,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,
@@ -304,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;
@@ -337,7 +431,6 @@ namespace CS2_SimpleAdmin
printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------");
}); });
}); });
}
}); });
} }
@@ -346,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 ---------");
} }
@@ -373,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)
{ {
@@ -403,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();
} }
@@ -415,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());
}
} }
} }
} }
@@ -455,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, () =>
{ {
@@ -486,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)
@@ -502,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.")]
@@ -529,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());
} }
} }
} }
@@ -567,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>")]
@@ -580,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)
{ {
@@ -610,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

@@ -29,7 +29,7 @@ namespace CS2_SimpleAdmin
public class CS2_SimpleAdminConfig : BasePluginConfig public class CS2_SimpleAdminConfig : BasePluginConfig
{ {
[JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 9; [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 10;
[JsonPropertyName("DatabaseHost")] [JsonPropertyName("DatabaseHost")]
public string DatabaseHost { get; set; } = ""; public string DatabaseHost { get; set; } = "";
@@ -60,6 +60,8 @@ namespace CS2_SimpleAdmin
[JsonPropertyName("BanType")] [JsonPropertyName("BanType")]
public int BanType { get; set; } = 1; public int BanType { get; set; } = 1;
[JsonPropertyName("MultiServerMode")]
public bool MultiServerMode { get; set; } = true;
[JsonPropertyName("ExpireOldIpBans")] [JsonPropertyName("ExpireOldIpBans")]
public int ExpireOldIpBans { get; set; } = 0; public int ExpireOldIpBans { get; set; } = 0;
@@ -71,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)
{ {

View File

@@ -27,19 +27,19 @@ CREATE TABLE IF NOT EXISTS `sa_mutes` (
`server_id` INT NULL, `server_id` INT NULL,
`status` enum('ACTIVE','UNMUTED','EXPIRED','') NOT NULL DEFAULT 'ACTIVE', `status` enum('ACTIVE','UNMUTED','EXPIRED','') NOT NULL DEFAULT 'ACTIVE',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `sa_admins` ( CREATE TABLE IF NOT EXISTS `sa_admins` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`player_name` varchar(128) NOT NULL, `player_name` varchar(128) NOT NULL,
`player_steamid` varchar(64) NOT NULL, `player_steamid` varchar(64) NOT NULL,
`flags` TEXT NOT NULL, `flags` TEXT NOT NULL,
`immunity` varchar(64) NOT NULL DEFAULT '0', `immunity` int(11) NOT NULL DEFAULT 0,
`server_id` INT NULL, `server_id` INT NULL,
`ends` timestamp NULL, `ends` timestamp NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `sa_servers` ( CREATE TABLE IF NOT EXISTS `sa_servers` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -47,4 +47,4 @@ CREATE TABLE IF NOT EXISTS `sa_servers` (
`address` varchar(64) NOT NULL, `address` varchar(64) NOT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `address` (`address`) UNIQUE KEY `address` (`address`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

View File

@@ -9,13 +9,13 @@ SELECT
min_admins.admin_id, min_admins.admin_id,
TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(sa_admins.flags, ',', numbers.n), ',', -1)) AS flag TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(sa_admins.flags, ',', numbers.n), ',', -1)) AS flag
FROM numbers FROM numbers
JOIN ( INNER JOIN (
SELECT MIN(id) AS admin_id, player_steamid, server_id SELECT MIN(id) AS admin_id, player_steamid, server_id
FROM sa_admins FROM sa_admins
WHERE player_steamid != 'Console' WHERE player_steamid != 'Console'
GROUP BY player_steamid, server_id GROUP BY player_steamid, server_id
) AS min_admins ON 1=1 ) AS min_admins ON 1=1
JOIN sa_admins ON CHAR_LENGTH(sa_admins.flags) - CHAR_LENGTH(REPLACE(sa_admins.flags, ',', '')) >= numbers.n - 1 INNER JOIN sa_admins ON CHAR_LENGTH(sa_admins.flags) - CHAR_LENGTH(REPLACE(sa_admins.flags, ',', '')) >= numbers.n - 1
AND min_admins.player_steamid = sa_admins.player_steamid AND min_admins.player_steamid = sa_admins.player_steamid
AND (min_admins.server_id = sa_admins.server_id OR (min_admins.server_id IS NULL AND sa_admins.server_id IS NULL)) AND (min_admins.server_id = sa_admins.server_id OR (min_admins.server_id IS NULL AND sa_admins.server_id IS NULL))
@@ -25,6 +25,9 @@ SELECT
(SELECT MAX(id) + 1 FROM sa_admins WHERE server_id IS NULL) AS admin_id, (SELECT MAX(id) + 1 FROM sa_admins WHERE server_id IS NULL) AS admin_id,
TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(sa_admins.flags, ',', numbers.n), ',', -1)) AS flag TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(sa_admins.flags, ',', numbers.n), ',', -1)) AS flag
FROM numbers FROM numbers
JOIN sa_admins ON CHAR_LENGTH(sa_admins.flags) - CHAR_LENGTH(REPLACE(sa_admins.flags, ',', '')) >= numbers.n - 1 INNER JOIN sa_admins ON CHAR_LENGTH(sa_admins.flags) - CHAR_LENGTH(REPLACE(sa_admins.flags, ',', '')) >= numbers.n - 1
AND sa_admins.server_id IS NULL AND sa_admins.server_id IS NULL
WHERE sa_admins.player_steamid != 'Console'; WHERE sa_admins.player_steamid != 'Console'
AND EXISTS (
SELECT 1 FROM sa_admins WHERE id = (SELECT MAX(id) + 1 FROM sa_admins WHERE server_id IS NULL)
);

View File

@@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS `sa_unmutes` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `sa_admins` (`id`, `player_name`, `player_steamid`, `flags`, `immunity`, `server_id`, `ends`, `created`) INSERT INTO `sa_admins` (`id`, `player_name`, `player_steamid`, `flags`, `immunity`, `server_id`, `ends`, `created`)
VALUES (-1, 'Console', 'Console', '', '0', NULL, NULL, '0000-00-00 00:00:00'); VALUES (-1, 'Console', 'Console', '', '0', NULL, NULL, NOW());
UPDATE `sa_admins` SET `id` = 0 WHERE `id` = -1; UPDATE `sa_admins` SET `id` = 0 WHERE `id` = -1;

View File

@@ -0,0 +1,26 @@
CREATE TABLE IF NOT EXISTS `sa_groups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`immunity` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `sa_groups_flags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL,
`flag` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `sa_groups_servers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL,
`server_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE `sa_admins` ADD `group_id` INT NULL AFTER `created`;
ALTER TABLE `sa_groups_flags` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE;
ALTER TABLE `sa_groups_servers` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE;
ALTER TABLE `sa_admins` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE SET NULL;

122
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)
{ {
@@ -422,7 +410,14 @@ public partial class CS2_SimpleAdmin
} }
} }
await _adminManager.GiveAllFlags(); //await _adminManager.GiveAllGroupsFlags();
//await _adminManager.GiveAllFlags();
await _adminManager.CrateGroupsJsonFile();
await _adminManager.CreateAdminsJsonFile();
AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json");
AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json");
}); });
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
} }
@@ -435,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

@@ -2,7 +2,9 @@
using Dapper; using Dapper;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MySqlConnector; using MySqlConnector;
using Newtonsoft.Json;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using static Dapper.SqlMapper;
namespace CS2_SimpleAdmin; namespace CS2_SimpleAdmin;
@@ -57,36 +59,37 @@ public class AdminSQLManager(Database database)
} }
*/ */
public async Task<List<(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_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
FROM sa_admins_flags FROM sa_admins_flags
JOIN sa_admins ON sa_admins_flags.admin_id = sa_admins.id JOIN sa_admins ON sa_admins_flags.admin_id = sa_admins.id
WHERE (sa_admins.ends IS NULL OR sa_admins.ends > @CurrentTime) WHERE (sa_admins.ends IS NULL OR sa_admins.ends > @CurrentTime)
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)
{ {
return []; return [];
} }
List<(string, List<string>, int, DateTime?)> filteredFlagsWithImmunity = []; List<(string, string, List<string>, int, DateTime?)> filteredFlagsWithImmunity = [];
string currentSteamId = string.Empty; var currentSteamId = 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)
{ {
@@ -94,6 +97,7 @@ public class AdminSQLManager(Database database)
} }
if (!flagInfoDict.TryGetValue("player_steamid", out var steamIdObj) || if (!flagInfoDict.TryGetValue("player_steamid", out var steamIdObj) ||
!flagInfoDict.TryGetValue("player_name", out var playerNameObj) ||
!flagInfoDict.TryGetValue("flag", out var flagObj) || !flagInfoDict.TryGetValue("flag", out var flagObj) ||
!flagInfoDict.TryGetValue("immunity", out var immunityValueObj) || !flagInfoDict.TryGetValue("immunity", out var immunityValueObj) ||
!flagInfoDict.TryGetValue("ends", out var endsObj)) !flagInfoDict.TryGetValue("ends", out var endsObj))
@@ -102,30 +106,32 @@ public class AdminSQLManager(Database database)
} }
if (steamIdObj is not string steamId || if (steamIdObj is not string steamId ||
playerNameObj is not string playerName ||
flagObj is not string flag || flagObj is not string flag ||
!int.TryParse(immunityValueObj.ToString(), out immunityValue)) !int.TryParse(immunityValueObj.ToString(), out immunityValue))
{ {
continue; continue;
} }
if (endsObj != null && DateTime.TryParse(endsObj.ToString(), out var parsedEnds)) if (DateTime.TryParse(endsObj.ToString(), out var parsedEnds))
{ {
ends = parsedEnds; ends = parsedEnds;
} }
if (currentSteamId != steamId && !string.IsNullOrEmpty(currentSteamId)) if (currentSteamId != steamId && !string.IsNullOrEmpty(currentSteamId))
{ {
filteredFlagsWithImmunity.Add((currentSteamId, currentFlags, immunityValue, ends)); filteredFlagsWithImmunity.Add((currentSteamId, currentPlayerName, currentFlags, immunityValue, ends));
currentFlags = []; currentFlags = [];
} }
currentSteamId = steamId; currentSteamId = steamId;
currentPlayerName = playerName;
currentFlags.Add(flag); currentFlags.Add(flag);
} }
if (!string.IsNullOrEmpty(currentSteamId)) if (!string.IsNullOrEmpty(currentSteamId))
{ {
filteredFlagsWithImmunity.Add((currentSteamId, currentFlags, immunityValue, ends)); filteredFlagsWithImmunity.Add((currentSteamId, currentPlayerName, currentFlags, immunityValue, ends));
} }
return filteredFlagsWithImmunity; return filteredFlagsWithImmunity;
@@ -136,9 +142,175 @@ public class AdminSQLManager(Database database)
} }
} }
/*
public async Task<Dictionary<int, Tuple<List<string>, List<Tuple<string, DateTime?>>, int>>> GetAllGroupsFlags()
{
try
{
await using MySqlConnection connection = await _database.GetConnectionAsync();
string sql = "SELECT group_id FROM sa_groups_servers WHERE server_id = @serverid";
var groupIds = connection.Query<int>(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList();
sql = @"
SELECT g.group_id, f.flag
FROM sa_groups_flags f
JOIN sa_groups_servers g ON f.group_id = g.group_id
WHERE g.server_id = @serverid";
var groupFlagData = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList();
if (groupIds.Count == 0 || groupFlagData.Count == 0)
{
return [];
}
var groupInfoDictionary = new Dictionary<int, Tuple<List<string>, List<Tuple<string, DateTime?>>, int>>();
foreach (var groupId in groupIds)
{
groupInfoDictionary[groupId] = new Tuple<List<string>, List<Tuple<string, DateTime?>>, int>([], [], 0);
}
foreach (var row in groupFlagData)
{
var groupId = (int)row.group_id;
var flag = (string)row.flag;
groupInfoDictionary[groupId].Item1.Add(flag);
}
sql = @"
SELECT a.group_id, a.player_steamid, a.ends, g.immunity, g.name
FROM sa_admins a
JOIN sa_groups g ON a.group_id = g.id
WHERE a.group_id IN @groupIds";
var playerData = (await connection.QueryAsync(sql, new { groupIds })).ToList();
foreach (var row in playerData)
{
var groupId = (int)row.group_id;
var playerSteamid = (string)row.player_steamid;
var ends = row.ends as DateTime?;
var immunity = (int)row.immunity;
groupInfoDictionary[groupId].Item2.Add(new Tuple<string, DateTime?>(playerSteamid, ends));
groupInfoDictionary[groupId] = new Tuple<List<string>, List<Tuple<string, DateTime?>>, int>(groupInfoDictionary[groupId].Item1, groupInfoDictionary[groupId].Item2, immunity);
}
return groupInfoDictionary;
}
catch { }
return [];
}
*/
private async Task<Dictionary<string, (List<string>, int)>> GetAllGroupsData()
{
await using MySqlConnection connection = await _database.GetConnectionAsync();
try
{
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();
sql = @"
SELECT g.group_id, sg.name AS group_name, sg.immunity, f.flag
FROM sa_groups_flags f
JOIN sa_groups_servers g ON f.group_id = g.group_id
JOIN sa_groups sg ON sg.id = g.group_id
WHERE g.server_id = @serverid";
var groupData = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList();
if (groupDataSql.Count == 0 || groupData.Count == 0)
{
return [];
}
var groupInfoDictionary = new Dictionary<string, (List<string>, int)>();
foreach (var row in groupData)
{
var groupName = (string)row.group_name;
var flag = (string)row.flag;
var immunity = (int)row.immunity;
// Check if the group name already exists in the dictionary
if (!groupInfoDictionary.TryGetValue(groupName, out (List<string>, int) value))
{
value = ([], immunity);
// If it doesn't exist, add a new entry with an empty list of flags and immunity
groupInfoDictionary[groupName] = value;
}
value.Item1.Add(flag);
}
return groupInfoDictionary;
}
catch { }
return [];
}
public async Task CrateGroupsJsonFile()
{
var groupsData = await GetAllGroupsData();
var jsonStructure = new Dictionary<string, object>();
foreach (var kvp in groupsData)
{
var groupData = new Dictionary<string, object>
{
["flags"] = kvp.Value.Item1,
["immunity"] = kvp.Value.Item2
};
jsonStructure[kvp.Key] = groupData;
}
var json = JsonConvert.SerializeObject(jsonStructure, Formatting.Indented);
await File.WriteAllTextAsync(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/groups.json", json);
}
/*
public async Task GiveAllGroupsFlags()
{
Dictionary<int, Tuple<List<string>, List<Tuple<string, DateTime?>>, int>> groupFlags = await GetAllGroupsFlags();
foreach (var kvp in groupFlags)
{
var flags = kvp.Value.Item1;
var players = kvp.Value.Item2;
int immunity = kvp.Value.Item3;
foreach (var playerTuple in players)
{
var steamIdStr = playerTuple.Item1;
var ends = playerTuple.Item2;
if (!string.IsNullOrEmpty(steamIdStr) && SteamID.TryParse(steamIdStr, out var steamId) && steamId != null)
{
if (!_adminCache.ContainsKey(steamId))
{
_adminCache.TryAdd(steamId, ends);
}
Helper.GivePlayerFlags(steamId, flags, (uint)immunity);
// Often need to call 2 times
Helper.GivePlayerFlags(steamId, flags, (uint)immunity);
}
}
}
}
*/
/*
public async Task GiveAllFlags() public async Task GiveAllFlags()
{ {
List<(string, List<string>, int, DateTime?)> allPlayers = await GetAllPlayersFlags(); List<(string, string, List<string>, int, DateTime?)> allPlayers = await GetAllPlayersFlags();
foreach (var record in allPlayers) foreach (var record in allPlayers)
{ {
@@ -162,6 +334,44 @@ public class AdminSQLManager(Database database)
} }
} }
} }
*/
public async Task CreateAdminsJsonFile()
{
List<(string identity, string name, List<string> flags, int immunity, DateTime? ends)> allPlayers = await GetAllPlayersFlags();
var jsonData = allPlayers
.Select(player =>
{
SteamID? steamId = null;
if (!string.IsNullOrEmpty(player.identity) && SteamID.TryParse(player.identity, out var id) && id != null)
{
steamId = id;
}
if (steamId != null && !_adminCache.ContainsKey(steamId))
{
_adminCache.TryAdd(steamId, player.ends);
}
return new
{
playerName = player.name,
playerData = new
{
player.identity,
player.immunity,
flags = player.flags.Where(flag => flag.StartsWith("@")).ToList(),
groups = player.flags.Where(flag => flag.StartsWith("#")).ToList()
}
};
})
.ToDictionary(item => item.playerName, item => item.playerData);
var json = JsonConvert.SerializeObject(jsonData, Formatting.Indented);
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)
{ {
@@ -171,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 });
} }
@@ -190,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)
@@ -202,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,
@@ -221,7 +424,22 @@ 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)
{ {
Console.WriteLine(flag); if (flag.StartsWith($"#"))
{
const string sql = "SELECT id FROM `sa_groups` WHERE name = @groupName";
var groupId = await connection.QuerySingleOrDefaultAsync<int?>(sql, new { groupName = flag });
if (groupId != null)
{
const string updateAdminGroup = "UPDATE `sa_admins` SET group_id = @groupId WHERE id = @adminId";
await connection.ExecuteAsync(updateAdminGroup, new
{
groupId,
adminId
});
}
}
var insertFlagsSql = "INSERT INTO `sa_admins_flags` (`admin_id`, `flag`) " + var insertFlagsSql = "INSERT INTO `sa_admins_flags` (`admin_id`, `flag`) " +
"VALUES (@adminId, @flag)"; "VALUES (@adminId, @flag)";
@@ -238,13 +456,71 @@ public class AdminSQLManager(Database database)
} }
} }
public async Task AddGroup(string groupName, List<string> flagsList, int immunity = 0)
{
if (string.IsNullOrEmpty(groupName) || flagsList.Count == 0) return;
await using var connection = await _database.GetConnectionAsync();
try
{
// Insert group into sa_groups table
var insertGroup = "INSERT INTO `sa_groups` (`name`, `immunity`) " +
"VALUES (@groupName, @immunity); SELECT LAST_INSERT_ID();";
var groupId = await connection.ExecuteScalarAsync<int>(insertGroup, new
{
groupName,
immunity
});
// Insert flags into sa_groups_flags table
foreach (var flag in flagsList)
{
const string insertFlagsSql = "INSERT INTO `sa_groups_flags` (`group_id`, `flag`) " +
"VALUES (@groupId, @flag)";
await connection.ExecuteAsync(insertFlagsSql, new
{
groupId,
flag
});
}
var insertGroupServer = "INSERT INTO `sa_groups_servers` (`group_id`, `server_id`) " +
"VALUES (@groupId, @server_id)";
if (CS2_SimpleAdmin.ServerId != null)
{
await connection.ExecuteAsync(insertGroupServer, new { groupId, server_id = CS2_SimpleAdmin.ServerId });
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public async Task DeleteGroup(string groupName)
{
if (string.IsNullOrEmpty(groupName)) return;
await using var connection = await _database.GetConnectionAsync();
try
{
const string sql = "DELETE FROM `sa_groups` WHERE name = @groupName";
await connection.ExecuteAsync(sql, new { groupName });
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public async Task DeleteOldAdmins() public async Task DeleteOldAdmins()
{ {
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,7 +116,10 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
try try
{ {
string sql = @" var sql = "";
sql = _config.MultiServerMode ? """
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
@@ -126,16 +130,29 @@ 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);
""" : @"
UPDATE sa_bans
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
WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)
AND status = 'ACTIVE'
AND (duration = 0 OR ends > @CurrentTime) AND server_id = @serverid;
await using MySqlConnection connection = await _database.GetConnectionAsync(); SELECT COUNT(*) FROM sa_bans
WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)
AND status = 'ACTIVE'
AND (duration = 0 OR ends > @CurrentTime) AND server_id = @serverid;";
await using var connection = await _database.GetConnectionAsync();
var parameters = new var parameters = new
{ {
PlayerSteamID = player.SteamId, PlayerSteamID = player.SteamId,
PlayerIP = _config.BanType == 0 || string.IsNullOrEmpty(player.IpAddress) ? null : player.IpAddress, PlayerIP = _config.BanType == 0 || string.IsNullOrEmpty(player.IpAddress) ? null : player.IpAddress,
PlayerName = !string.IsNullOrEmpty(player.Name) ? player.Name : string.Empty, PlayerName = !string.IsNullOrEmpty(player.Name) ? player.Name : string.Empty,
CurrentTime = currentTime CurrentTime = currentTime,
serverid = CS2_SimpleAdmin.ServerId
}; };
banCount = await connection.ExecuteScalarAsync<int>(sql, parameters); banCount = await connection.ExecuteScalarAsync<int>(sql, parameters);
@@ -152,18 +169,31 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
{ {
try try
{ {
string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)"; var sql = "";
sql = _config.MultiServerMode
? "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)";
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 }); 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 }); banCount = await connection.ExecuteScalarAsync<int>(sql,
new
{
PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value, serverid = CS2_SimpleAdmin.ServerId
});
} }
return banCount; return banCount;
@@ -175,27 +205,37 @@ 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 = "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE'"; var sqlRetrieveBans = "";
var bans = await connection.QueryAsync(sqlRetrieveBans, new { pattern = playerPattern }); if (_config.MultiServerMode)
{
sqlRetrieveBans = "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE' " +
"AND server_id = @serverid";
}
else
{
sqlRetrieveBans = "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE'";
}
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;
@@ -212,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 });
} }
@@ -229,26 +269,38 @@ 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 = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE'"; var sql = "";
if (_config.MultiServerMode)
{
sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE' AND" +
" server_id = @serverid";
}
else
{
sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE'";
}
foreach (var (IpAddress, SteamID, UserId) in players) foreach (var (IpAddress, SteamID, UserId) in players)
{ {
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 }); 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 }); 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");
}); });
@@ -260,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();
@@ -274,7 +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 ? """
UPDATE sa_bans UPDATE sa_bans
SET SET
status = 'EXPIRED' status = 'EXPIRED'
@@ -283,24 +337,48 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config)
AND AND
`duration` > 0 `duration` > 0
AND AND
ends <= @currentTime"; ends <= @currentTime
AND server_id = @serverid
""" : """
await connection.ExecuteAsync(sql, new { currentTime }); UPDATE sa_bans
SET
status = 'EXPIRED'
WHERE
status = 'ACTIVE'
AND
`duration` > 0
AND
ends <= @currentTime
""";
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();
sql = _config.MultiServerMode ? """
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
AND server_id = @serverid
""" : """
await connection.ExecuteAsync(sql, new { ipBansTime }); UPDATE sa_bans
SET
player_ip = NULL
WHERE
status = 'ACTIVE'
AND
ends <= @ipBansTime
""";
await connection.ExecuteAsync(sql, new { ipBansTime, CS2_SimpleAdmin.ServerId });
} }
} }
catch (Exception) catch (Exception)

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,11 +98,21 @@ 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 = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; var sql = "";
var parameters = new { PlayerSteamID = steamId, CurrentTime = currentTime }; if (CS2_SimpleAdmin.Instance.Config.MultiServerMode)
{
sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime) " +
"AND server_id = @serverid";
}
else
{
sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)";
}
var parameters = new { PlayerSteamID = steamId, CurrentTime = currentTime, serverid = CS2_SimpleAdmin.ServerId };
var activeMutes = (await connection.QueryAsync(sql, parameters)).ToList(); var activeMutes = (await connection.QueryAsync(sql, parameters)).ToList();
return activeMutes; return activeMutes;
} }
@@ -113,12 +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 = "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID";
muteCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = steamId }); sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode
? "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND server_id = @serverid"
: "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID";
var muteCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = steamId, serverid = CS2_SimpleAdmin.ServerId });
return muteCount; return muteCount;
} }
catch (Exception) catch (Exception)
@@ -129,36 +145,48 @@ 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",
_ => "GAG"
};
var sqlRetrieveMutes = "";
if (CS2_SimpleAdmin.Instance.Config.MultiServerMode)
{
sqlRetrieveMutes = "SELECT id FROM sa_mutes WHERE (player_steamid = @pattern OR player_name = @pattern) AND " +
"type = @muteType AND status = 'ACTIVE' AND server_id = @serverid";
}
else
{
sqlRetrieveMutes = "SELECT id FROM sa_mutes WHERE (player_steamid = @pattern OR player_name = @pattern) AND " +
"type = @muteType AND status = 'ACTIVE'";
} }
else if (type == 2)
muteType = "SILENCE";
string sqlRetrieveMutes = "SELECT id FROM sa_mutes WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'"; var mutes = await connection.QueryAsync(sqlRetrieveMutes, new { pattern = playerPattern, muteType, serverid = CS2_SimpleAdmin.ServerId });
var mutes = await connection.QueryAsync(sqlRetrieveMutes, new { pattern = playerPattern, muteType });
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;
@@ -175,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 });
} }
} }
@@ -189,10 +217,14 @@ internal class MuteManager(Database database)
{ {
try try
{ {
await using MySqlConnection connection = await _database.GetConnectionAsync(); await using var connection = await _database.GetConnectionAsync();
string sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; var sql = "";
await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime() }); 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"
: "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 });
} }
catch (Exception) catch (Exception)
{ {

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

@@ -35,15 +35,13 @@ namespace CS2_SimpleAdmin.Menus
return; return;
} }
//bool xpRights = AdminManager.PlayerHasPermissions(admin, "@wcs/xp"); BaseMenu menu = CreateMenu("Simple Admin");
List<ChatMenuOptionData> options =
BaseMenu menu = AdminMenu.CreateMenu("Simple Admin"); [
List<ChatMenuOptionData> options = new()
{
new ChatMenuOptionData("Manage Players", () => ManagePlayersMenu.OpenMenu(admin)), new ChatMenuOptionData("Manage Players", () => ManagePlayersMenu.OpenMenu(admin)),
new ChatMenuOptionData("Manage Server", () => ManageServerMenu.OpenMenu(admin)), new ChatMenuOptionData("Manage Server", () => ManageServerMenu.OpenMenu(admin)),
new ChatMenuOptionData("Fun actions", () => FunActionsMenu.OpenMenu(admin)), new ChatMenuOptionData("Fun actions", () => FunActionsMenu.OpenMenu(admin)),
}; ];
List<CustomServerCommandData> customCommands = CS2_SimpleAdmin.Instance.Config.CustomServerCommands; List<CustomServerCommandData> customCommands = CS2_SimpleAdmin.Instance.Config.CustomServerCommands;
if (customCommands.Count > 0) if (customCommands.Count > 0)

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; }
} }
} }