- Plugin checks every minute if a player is banned
- Minor changes
- Removed bot_quota warning
- NET8
This commit is contained in:
Dawid Bepierszcz
2024-04-16 22:08:44 +02:00
parent 143f0b7e1b
commit 7a8fd066f7
9 changed files with 232 additions and 144 deletions

View File

@@ -26,7 +26,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v3 uses: actions/setup-dotnet@v3
with: with:
dotnet-version: 7.0.x dotnet-version: 8.0.x
- name: Restore - name: Restore
run: dotnet restore run: dotnet restore
- name: Build - name: Build
@@ -42,7 +42,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v3 uses: actions/setup-dotnet@v3
with: with:
dotnet-version: 7.0.x dotnet-version: 8.0.x
- name: Restore - name: Restore
run: dotnet restore run: dotnet restore
- name: Build - name: Build

View File

@@ -38,7 +38,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.8a"; public override string ModuleVersion => "1.3.8b";
public CS2_SimpleAdminConfig Config { get; set; } = new(); public CS2_SimpleAdminConfig Config { get; set; } = new();

View File

@@ -49,7 +49,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) return; if (_database == null || player is null || !player.IsValid) return;
callerName ??= caller == null ? "Console" : caller.PlayerName; callerName ??= caller == null ? "Console" : caller.PlayerName;
@@ -58,14 +58,14 @@ namespace CS2_SimpleAdmin
player.Pawn.Value!.Freeze(); player.Pawn.Value!.Freeze();
} }
PlayerInfo playerInfo = new PlayerInfo PlayerInfo playerInfo = new()
{ {
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 PlayerInfo adminInfo = new()
{ {
SteamId = caller?.SteamID.ToString(), SteamId = caller?.SteamID.ToString(),
Name = caller?.PlayerName, Name = caller?.PlayerName,
@@ -79,7 +79,8 @@ namespace CS2_SimpleAdmin
}); });
if (player.UserId.HasValue) if (player.UserId.HasValue)
AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value),
CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress)) if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress))
bannedPlayers.Add(playerInfo.IpAddress); bannedPlayers.Add(playerInfo.IpAddress);

View File

@@ -409,7 +409,7 @@ namespace CS2_SimpleAdmin
player.Pawn.Value!.Freeze(); player.Pawn.Value!.Freeze();
} }
reason = reason ?? _localizer?["sa_unknown"] ?? "Unknown"; reason ??= _localizer?["sa_unknown"] ?? "Unknown";
if (command != null) if (command != null)
Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
@@ -423,12 +423,14 @@ namespace CS2_SimpleAdmin
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.UserId.HasValue)
AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason),
CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
} }
else else
{ {
if (player.UserId.HasValue) if (player.UserId.HasValue)
AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value),
CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
} }
if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains(caller.Slot)) if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains(caller.Slot))

View File

@@ -306,22 +306,34 @@ public partial class CS2_SimpleAdmin
Logger.LogCritical("[OnMapStart] Expired check"); Logger.LogCritical("[OnMapStart] Expired check");
#endif #endif
List<CCSPlayerController> players = Helper.GetValidPlayers();
List<(string? IpAddress, ulong SteamID, int? UserId)> onlinePlayers = players
.Where(player => player.IpAddress != null && player.SteamID.ToString().Length == 17)
.Select(player => (player.IpAddress, player.SteamID, player.UserId))
.ToList();
Task.Run(async () => Task.Run(async () =>
{ {
AdminSQLManager _adminManager = new AdminSQLManager(_database); AdminSQLManager _adminManager = new(_database);
BanManager _banManager = new BanManager(_database, Config); BanManager _banManager = new(_database, Config);
MuteManager _muteManager = new MuteManager(_database); MuteManager _muteManager = new(_database);
await _banManager.ExpireOldBans(); await _banManager.ExpireOldBans();
await _muteManager.ExpireOldMutes(); await _muteManager.ExpireOldMutes();
await _adminManager.DeleteOldAdmins(); await _adminManager.DeleteOldAdmins();
try
{
await _banManager.CheckOnlinePlayers(onlinePlayers);
}
catch { }
bannedPlayers.Clear(); bannedPlayers.Clear();
Server.NextFrame(() => Server.NextFrame(() =>
{ {
try try
{ {
foreach (CCSPlayerController player in Helper.GetValidPlayers()) foreach (CCSPlayerController player in players)
{ {
if (playerPenaltyManager.IsSlotInPenalties(player.Slot)) if (playerPenaltyManager.IsSlotInPenalties(player.Slot))
{ {
@@ -412,16 +424,6 @@ public partial class CS2_SimpleAdmin
await _adminManager.GiveAllFlags(); await _adminManager.GiveAllFlags();
}); });
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
AddTimer(3.0f, () =>
{
ConVar? botQuota = ConVar.Find("bot_quota");
if (botQuota != null && botQuota.GetPrimitiveValue<int>() > 0)
{
Logger.LogWarning("Due to bugs with bots (game bug), consider disabling bots by setting `bot_quota 0` in the gamemode config if your server crashes after a map change.");
}
});
} }
[GameEventHandler] [GameEventHandler]

View File

@@ -12,7 +12,7 @@ public class AdminSQLManager
// Unused for now // Unused for now
//public static readonly ConcurrentDictionary<string, ConcurrentBag<string>> _adminCache = new ConcurrentDictionary<string, ConcurrentBag<string>>(); //public static readonly ConcurrentDictionary<string, ConcurrentBag<string>> _adminCache = new ConcurrentDictionary<string, ConcurrentBag<string>>();
public static readonly ConcurrentDictionary<SteamID, DateTime?> _adminCache = new ConcurrentDictionary<SteamID, DateTime?>(); public static readonly ConcurrentDictionary<SteamID, DateTime?> _adminCache = new();
//public static readonly ConcurrentDictionary<SteamID, DateTime?> _adminCacheTimestamps = new ConcurrentDictionary<SteamID, DateTime?>(); //public static readonly ConcurrentDictionary<SteamID, DateTime?> _adminCacheTimestamps = new ConcurrentDictionary<SteamID, DateTime?>();

View File

@@ -1,43 +1,42 @@
using Dapper; using CounterStrikeSharp.API;
using Dapper;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MySqlConnector; using MySqlConnector;
namespace CS2_SimpleAdmin; namespace CS2_SimpleAdmin;
internal class BanManager internal class BanManager(Database database, CS2_SimpleAdminConfig config)
{ {
private readonly Database _database; private readonly Database _database = database;
private readonly CS2_SimpleAdminConfig _config; private readonly CS2_SimpleAdminConfig _config = config;
public BanManager(Database database, CS2_SimpleAdminConfig config)
{
_database = database;
_config = config;
}
public async Task BanPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0) public async Task BanPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0)
{ {
DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime now = DateTime.UtcNow.ToLocalTime();
DateTime futureTime = now.AddMinutes(time).ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime();
await using MySqlConnection connection = await _database.GetConnectionAsync(); try
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)";
await connection.ExecuteAsync(sql, new
{ {
playerSteamid = player.SteamId, await using MySqlConnection connection = await _database.GetConnectionAsync();
playerName = player.Name,
playerIp = _config.BanType == 1 ? player.IpAddress : null, var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " +
adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)";
adminName = issuer.Name == null ? "Console" : issuer.Name,
banReason = reason, await connection.ExecuteAsync(sql, new
duration = time, {
ends = futureTime, playerSteamid = player.SteamId,
created = now, playerName = player.Name,
serverid = CS2_SimpleAdmin.ServerId playerIp = _config.BanType == 1 ? player.IpAddress : null,
}); adminSteamid = issuer.SteamId ?? "Console",
adminName = issuer.Name ?? "Console",
banReason = reason,
duration = time,
ends = futureTime,
created = now,
serverid = CS2_SimpleAdmin.ServerId
});
}
catch { }
} }
public async Task AddBanBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0) public async Task AddBanBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0)
@@ -47,22 +46,26 @@ internal class BanManager
DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime now = DateTime.UtcNow.ToLocalTime();
DateTime futureTime = now.AddMinutes(time).ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime();
await using MySqlConnection connection = await _database.GetConnectionAsync(); try
var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " +
"VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)";
await connection.ExecuteAsync(sql, new
{ {
playerSteamid = playerSteamId, await using MySqlConnection connection = await _database.GetConnectionAsync();
adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId,
adminName = issuer.Name == null ? "Console" : issuer.Name, var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " +
banReason = reason, "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)";
duration = time,
ends = futureTime, await connection.ExecuteAsync(sql, new
created = now, {
serverid = CS2_SimpleAdmin.ServerId playerSteamid = playerSteamId,
}); adminSteamid = issuer.SteamId ?? "Console",
adminName = issuer.Name ?? "Console",
banReason = reason,
duration = time,
ends = futureTime,
created = now,
serverid = CS2_SimpleAdmin.ServerId
});
}
catch { }
} }
public async Task AddBanByIp(string playerIp, PlayerInfo issuer, string reason, int time = 0) public async Task AddBanByIp(string playerIp, PlayerInfo issuer, string reason, int time = 0)
@@ -72,22 +75,26 @@ internal class BanManager
DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime now = DateTime.UtcNow.ToLocalTime();
DateTime futureTime = now.AddMinutes(time).ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime();
await using MySqlConnection connection = await _database.GetConnectionAsync(); try
var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " +
"VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)";
await connection.ExecuteAsync(sql, new
{ {
playerIp, await using MySqlConnection connection = await _database.GetConnectionAsync();
adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId,
adminName = issuer.Name == null ? "Console" : issuer.Name, var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " +
banReason = reason, "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)";
duration = time,
ends = futureTime, await connection.ExecuteAsync(sql, new
created = now, {
serverid = CS2_SimpleAdmin.ServerId playerIp,
}); adminSteamid = issuer.SteamId ?? "Console",
adminName = issuer.Name ?? "Console",
banReason = reason,
duration = time,
ends = futureTime,
created = now,
serverid = CS2_SimpleAdmin.ServerId
});
}
catch { }
} }
public async Task<bool> IsPlayerBanned(PlayerInfo player) public async Task<bool> IsPlayerBanned(PlayerInfo player)
@@ -143,21 +150,27 @@ internal class BanManager
public async Task<int> GetPlayerBans(PlayerInfo player) public async Task<int> GetPlayerBans(PlayerInfo player)
{ {
string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)"; try
int banCount;
await using MySqlConnection connection = await _database.GetConnectionAsync();
if (!string.IsNullOrEmpty(player.IpAddress))
{ {
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress }); string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)";
} int banCount;
else
{
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value });
}
return banCount; await using MySqlConnection connection = await _database.GetConnectionAsync();
if (!string.IsNullOrEmpty(player.IpAddress))
{
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress });
}
else
{
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value });
}
return banCount;
}
catch { }
return 0;
} }
public async Task UnbanPlayer(string playerPattern) public async Task UnbanPlayer(string playerPattern)
@@ -166,11 +179,48 @@ internal class BanManager
{ {
return; return;
} }
try
{
await using MySqlConnection connection = await _database.GetConnectionAsync();
await using MySqlConnection connection = await _database.GetConnectionAsync(); string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'";
await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern });
string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; }
await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern }); catch { }
}
public async Task CheckOnlinePlayers(List<(string? IpAddress, ulong SteamID, int? UserId)> players)
{
try
{
await using MySqlConnection connection = await _database.GetConnectionAsync();
string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE'";
foreach (var (IpAddress, SteamID, UserId) in players)
{
if (!UserId.HasValue) continue;
int banCount = 0;
if (!string.IsNullOrEmpty(IpAddress))
{
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = SteamID, PlayerIP = IpAddress });
}
else
{
banCount = await connection.ExecuteScalarAsync<int>(sql, new { PlayerSteamID = SteamID, PlayerIP = DBNull.Value });
}
if (banCount > 0)
{
Server.NextFrame(() =>
{
Helper.KickPlayer(UserId.Value, "Banned");
});
}
}
}
catch { }
} }
public async Task ExpireOldBans() public async Task ExpireOldBans()

View File

@@ -20,7 +20,7 @@ namespace CS2_SimpleAdmin.Menus
} }
BaseMenu menu = AdminMenu.CreateMenu("Manage Players"); BaseMenu menu = AdminMenu.CreateMenu("Manage Players");
List<ChatMenuOptionData> options = new(); List<ChatMenuOptionData> options = [];
// permissions // permissions
bool hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay"); bool hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay");
@@ -71,15 +71,16 @@ namespace CS2_SimpleAdmin.Menus
private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player)
{ {
BaseMenu menu = AdminMenu.CreateMenu($"Slap: {player.PlayerName}"); BaseMenu menu = AdminMenu.CreateMenu($"Slap: {player.PlayerName}");
List<ChatMenuOptionData> options = new(); List<ChatMenuOptionData> options =
[
// options added in order // options added in order
options.Add(new ChatMenuOptionData("0 hp", () => ApplySlapAndKeepMenu(admin, player, 0))); new ChatMenuOptionData("0 hp", () => ApplySlapAndKeepMenu(admin, player, 0)),
options.Add(new ChatMenuOptionData("1 hp", () => ApplySlapAndKeepMenu(admin, player, 1))); new ChatMenuOptionData("1 hp", () => ApplySlapAndKeepMenu(admin, player, 1)),
options.Add(new ChatMenuOptionData("5 hp", () => ApplySlapAndKeepMenu(admin, player, 5))); new ChatMenuOptionData("5 hp", () => ApplySlapAndKeepMenu(admin, player, 5)),
options.Add(new ChatMenuOptionData("10 hp", () => ApplySlapAndKeepMenu(admin, player, 10))); new ChatMenuOptionData("10 hp", () => ApplySlapAndKeepMenu(admin, player, 10)),
options.Add(new ChatMenuOptionData("50 hp", () => ApplySlapAndKeepMenu(admin, player, 50))); new ChatMenuOptionData("50 hp", () => ApplySlapAndKeepMenu(admin, player, 50)),
options.Add(new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100))); new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100)),
];
foreach (ChatMenuOptionData menuOptionData in options) foreach (ChatMenuOptionData menuOptionData in options)
{ {
@@ -92,29 +93,37 @@ namespace CS2_SimpleAdmin.Menus
private static void ApplySlapAndKeepMenu(CCSPlayerController admin, CCSPlayerController player, int damage) private static void ApplySlapAndKeepMenu(CCSPlayerController admin, CCSPlayerController player, int damage)
{ {
CS2_SimpleAdmin.Instance.Slap(admin, player, damage); if (player is not null && player.IsValid)
SlapMenu(admin, player); {
CS2_SimpleAdmin.Instance.Slap(admin, player, damage);
SlapMenu(admin, player);
}
} }
private static void Slay(CCSPlayerController admin, CCSPlayerController player) private static void Slay(CCSPlayerController admin, CCSPlayerController player)
{ {
CS2_SimpleAdmin.Instance.Slay(admin, player); if (player is not null && player.IsValid)
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}"); BaseMenu menu = AdminMenu.CreateMenu($"Kick: {player.PlayerName}");
List<string> options = new() List<string> options =
{ [
"Voice Abuse", "Voice Abuse",
"Chat Abuse", "Chat Abuse",
"Admin disrespect", "Admin disrespect",
"Other" "Other"
}; ];
foreach (string option in options) foreach (string option in options)
{ {
menu.AddMenuOption(option, (_, _) => { Kick(admin, player, option); }); menu.AddMenuOption(option, (_, _) =>
{
if (player is not null && player.IsValid)
Kick(admin, player, option);
});
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
@@ -122,24 +131,29 @@ namespace CS2_SimpleAdmin.Menus
private static void Kick(CCSPlayerController admin, CCSPlayerController player, string reason) private static void Kick(CCSPlayerController admin, CCSPlayerController player, string reason)
{ {
CS2_SimpleAdmin.Instance.Kick(admin, player, reason); if (player is not null && player.IsValid)
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}"); BaseMenu menu = AdminMenu.CreateMenu($"Ban: {player.PlayerName}");
List<string> options = new() List<string> options =
{ [
"Hacking", "Hacking",
"Voice Abuse", "Voice Abuse",
"Chat Abuse", "Chat Abuse",
"Admin disrespect", "Admin disrespect",
"Other" "Other"
}; ];
foreach (string option in options) foreach (string option in options)
{ {
menu.AddMenuOption(option, (_, _) => { Ban(admin, player, duration, option); }); menu.AddMenuOption(option, (_, _) =>
{
if (player is not null && player.IsValid)
Ban(admin, player, duration, option);
});
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
@@ -147,26 +161,31 @@ namespace CS2_SimpleAdmin.Menus
private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration, string reason)
{ {
CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason); if (player is not null && player.IsValid)
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}"); BaseMenu menu = AdminMenu.CreateMenu($"Gag: {player.PlayerName}");
List<string> options = new() List<string> options =
{ [
"Advertising", "Advertising",
"Spamming", "Spamming",
"Spectator camera abuse", "Spectator camera abuse",
"Hate", "Hate",
"Admin disrespect", "Admin disrespect",
"Other" "Other"
}; ];
foreach (string option in options) foreach (string option in options)
{ {
menu.AddMenuOption(option, (_, _) => { Gag(admin, player, duration, option); }); menu.AddMenuOption(option, (_, _) =>
{
if (player is not null && player.IsValid)
Gag(admin, player, duration, option);
});
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
@@ -174,15 +193,16 @@ namespace CS2_SimpleAdmin.Menus
private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration, string reason)
{ {
CS2_SimpleAdmin.Instance.Gag(admin, player, duration, reason); if (player is not null && player.IsValid)
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}"); BaseMenu menu = AdminMenu.CreateMenu($"Mute: {player.PlayerName}");
List<string> options = new() List<string> options =
{ [
"Shouting", "Shouting",
"Playing music", "Playing music",
"Advertising", "Advertising",
@@ -191,11 +211,15 @@ namespace CS2_SimpleAdmin.Menus
"Hate", "Hate",
"Admin disrespect", "Admin disrespect",
"Other" "Other"
}; ];
foreach (string option in options) foreach (string option in options)
{ {
menu.AddMenuOption(option, (_, _) => { Mute(admin, player, duration, option); }); menu.AddMenuOption(option, (_, _) =>
{
if (player is not null && player.IsValid)
Mute(admin, player, duration, option);
});
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
@@ -203,15 +227,16 @@ namespace CS2_SimpleAdmin.Menus
private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration, string reason)
{ {
CS2_SimpleAdmin.Instance.Mute(admin, player, duration, reason); if (player is not null && player.IsValid)
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}"); BaseMenu menu = AdminMenu.CreateMenu($"Silence: {player.PlayerName}");
List<string> options = new() List<string> options =
{ [
"Shouting", "Shouting",
"Playing music", "Playing music",
"Advertising", "Advertising",
@@ -220,11 +245,15 @@ namespace CS2_SimpleAdmin.Menus
"Hate", "Hate",
"Admin disrespect", "Admin disrespect",
"Other" "Other"
}; ];
foreach (string option in options) foreach (string option in options)
{ {
menu.AddMenuOption(option, (_, _) => { Silence(admin, player, duration, option); }); menu.AddMenuOption(option, (_, _) =>
{
if (player is not null && player.IsValid)
Silence(admin, player, duration, option);
});
} }
AdminMenu.OpenMenu(admin, menu); AdminMenu.OpenMenu(admin, menu);
@@ -232,18 +261,21 @@ namespace CS2_SimpleAdmin.Menus
private static void Silence(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) private static void Silence(CCSPlayerController admin, CCSPlayerController player, int duration, string reason)
{ {
CS2_SimpleAdmin.Instance.Silence(admin, player, duration, reason); if (player is not null && player.IsValid)
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"); BaseMenu menu = AdminMenu.CreateMenu($"Force {player.PlayerName}'s Team");
List<ChatMenuOptionData> options = new(); List<ChatMenuOptionData> options =
options.Add(new ChatMenuOptionData("CT", () => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist))); [
options.Add(new ChatMenuOptionData("T", () => ForceTeam(admin, player, "t", CsTeam.Terrorist))); new ChatMenuOptionData("CT", () => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist)),
options.Add(new ChatMenuOptionData("Swap", () => ForceTeam(admin, player, "swap", CsTeam.Spectator))); new ChatMenuOptionData("T", () => ForceTeam(admin, player, "t", CsTeam.Terrorist)),
options.Add(new ChatMenuOptionData("Spectator", () => ForceTeam(admin, player, "spec", CsTeam.Spectator))); new ChatMenuOptionData("Swap", () => ForceTeam(admin, player, "swap", CsTeam.Spectator)),
new ChatMenuOptionData("Spectator", () => ForceTeam(admin, player, "spec", CsTeam.Spectator)),
];
foreach (ChatMenuOptionData menuOptionData in options) foreach (ChatMenuOptionData menuOptionData in options)
{ {
@@ -256,7 +288,8 @@ namespace CS2_SimpleAdmin.Menus
private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player, string teamName, CsTeam teamNum) private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player, string teamName, CsTeam teamNum)
{ {
CS2_SimpleAdmin.Instance.ChangeTeam(admin, player, teamName, teamNum, true); if (player is not null && player.IsValid)
CS2_SimpleAdmin.Instance.ChangeTeam(admin, player, teamName, teamNum, true);
} }
} }
} }