mirror of
https://github.com/daffyyyy/CS2-SimpleAdmin.git
synced 2026-02-18 18:49:23 +00:00
1.3.8b
- Plugin checks every minute if a player is banned - Minor changes - Removed bot_quota warning - NET8
This commit is contained in:
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
30
Events.cs
30
Events.cs
@@ -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]
|
||||||
|
|||||||
@@ -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?>();
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user