- Plugin save all players ips to database, when player banned then all used ips are banned too (for ban evading)
- Minor changes
This commit is contained in:
Dawid Bepierszcz
2024-07-03 19:18:25 +02:00
parent 6fc8b015ba
commit 3b98f19a7c
11 changed files with 162 additions and 118 deletions

View File

@@ -39,7 +39,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)");
public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
public override string ModuleAuthor => "daffyy & Dliix66";
public override string ModuleVersion => "1.4.8b";
public override string ModuleVersion => "1.4.9a";
public CS2_SimpleAdminConfig Config { get; set; } = new();

View File

@@ -101,7 +101,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -121,7 +121,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -207,7 +207,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -228,7 +228,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -321,7 +321,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -341,7 +341,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{

View File

@@ -521,7 +521,7 @@ namespace CS2_SimpleAdmin
playersToTarget.ForEach(player =>
{
if (player == null || !player.IsValid)
if (!player.IsValid)
return;
if (caller!.CanTarget(player))
@@ -549,7 +549,7 @@ namespace CS2_SimpleAdmin
if (player != null && !player.IsBot)
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, callerName]);
}
if (player != null && player.UserId.HasValue)
AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason),
@@ -563,7 +563,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && (caller.UserId == null || SilentPlayers.Contains(caller.Slot))) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))

View File

@@ -87,7 +87,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -110,7 +110,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -187,7 +187,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -208,7 +208,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -424,7 +424,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -444,7 +444,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -524,7 +524,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -544,7 +544,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -746,7 +746,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -769,7 +769,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -850,7 +850,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -870,7 +870,7 @@ namespace CS2_SimpleAdmin
}
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{

View File

@@ -19,7 +19,6 @@ namespace CS2_SimpleAdmin
var targets = GetTarget(command);
if (targets == null) return;
var playersToTarget = targets.Players.Where(player =>
player is not null &&
player.IsValid &&
player is { PawnIsAlive: true, IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected }).ToList();
@@ -42,7 +41,7 @@ namespace CS2_SimpleAdmin
Helper.LogCommand(caller, $"css_noclip {player.PlayerName}");
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -88,7 +87,7 @@ namespace CS2_SimpleAdmin
AddTimer(time, () => player?.Pawn.Value!.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -129,7 +128,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{

View File

@@ -45,7 +45,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -126,7 +126,7 @@ namespace CS2_SimpleAdmin
callerName ??= caller == null ? "Console" : caller.PlayerName;
if (caller != null && (SilentPlayers.Contains(caller.Slot))) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -173,7 +173,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -221,7 +221,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -270,7 +270,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -321,7 +321,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -370,7 +370,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -425,7 +425,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -473,15 +473,20 @@ namespace CS2_SimpleAdmin
if (command != null)
{
Helper.LogCommand(caller, command);
Helper.SendDiscordLogMessage(caller, command, DiscordWebhookClientLog, _localizer);
if (_localizer != null)
Helper.SendDiscordLogMessage(caller, command, DiscordWebhookClientLog, _localizer);
}
if (_localizer == null)
return;
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
StringBuilder sb = new(_localizer!["sa_prefix"]);
StringBuilder sb = new(_localizer["sa_prefix"]);
sb.Append(_localizer["sa_admin_slap_message", callerName, player.PlayerName]);
controller.PrintToChat(sb.ToString());
}
@@ -569,7 +574,7 @@ namespace CS2_SimpleAdmin
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -611,7 +616,7 @@ namespace CS2_SimpleAdmin
if (!caller!.CanTarget(player)) return;
if (caller == null || !SilentPlayers.Contains(caller.Slot))
{
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -667,7 +672,7 @@ namespace CS2_SimpleAdmin
}
if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -712,7 +717,7 @@ namespace CS2_SimpleAdmin
});
if (SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{
@@ -757,7 +762,7 @@ namespace CS2_SimpleAdmin
});
if (SilentPlayers.Contains(caller.Slot)) return;
foreach (var controller in Helper.GetValidPlayers())
foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
{
using (new WithTemporaryCulture(controller.GetLanguage()))
{

View File

@@ -0,0 +1,8 @@
CREATE TABLE IF NOT EXISTS `sa_players_ips` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`steamid` bigint(20) NOT NULL,
`address` varchar(64) NOT NULL,
`used_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `steamid` (`steamid`,`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

View File

@@ -182,6 +182,21 @@ public partial class CS2_SimpleAdmin
BanManager banManager = new(_database, Config);
MuteManager muteManager = new(_database);
try
{
await using var connection = await _database.GetConnectionAsync();
const string query = @"INSERT IGNORE INTO `sa_players_ips` (steamid, address)
VALUES (@SteamID, @IPAddress)";
await connection.ExecuteAsync(query, new
{
SteamID = playerInfo.SteamId,
IPAddress = playerInfo.IpAddress,
});
}
catch { }
try
{
// Check if the player is banned

View File

@@ -1,9 +1,8 @@
using System.Text;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using Dapper;
using Microsoft.Extensions.Logging;
using MySqlConnector;
using Serilog.Core;
using System.Text;
namespace CS2_SimpleAdmin;
@@ -151,6 +150,25 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf
};
banCount = await connection.ExecuteScalarAsync<int>(sql, parameters);
if (config.BanType == 1 && banCount == 0)
{
sql = """
SELECT
COUNT(*)
FROM
sa_bans
JOIN sa_players_ips ON sa_bans.player_steamid = sa_players_ips.steamid
WHERE
sa_bans.status = 'ACTIVE'
AND sa_players_ips.address = @PlayerIP;
""";
banCount = await connection.ExecuteScalarAsync<int>(sql, new
{
PlayerIP = player.IpAddress
});
}
}
catch (Exception)
{
@@ -301,70 +319,70 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf
public async Task CheckOnlinePlayers(List<(string? IpAddress, ulong SteamID, int? UserId, int Slot)> players)
{
try
{
await using var connection = await database.GetConnectionAsync();
bool checkIpBans = config.BanType > 0;
try
{
await using var connection = await database.GetConnectionAsync();
bool checkIpBans = config.BanType > 0;
var filteredPlayers = players.Where(p => p.UserId.HasValue).ToList();
var filteredPlayers = players.Where(p => p.UserId.HasValue).ToList();
var steamIds = filteredPlayers.Select(p => p.SteamID).Distinct().ToList();
var ipAddresses = filteredPlayers
.Where(p => !string.IsNullOrEmpty(p.IpAddress))
.Select(p => p.IpAddress)
.Distinct()
.ToList();
var steamIds = filteredPlayers.Select(p => p.SteamID).Distinct().ToList();
var ipAddresses = filteredPlayers
.Where(p => !string.IsNullOrEmpty(p.IpAddress))
.Select(p => p.IpAddress)
.Distinct()
.ToList();
var sql = new StringBuilder();
sql.Append("SELECT `player_steamid`, `player_ip` FROM `sa_bans` WHERE `status` = 'ACTIVE' ");
var sql = new StringBuilder();
sql.Append("SELECT `player_steamid`, `player_ip` FROM `sa_bans` WHERE `status` = 'ACTIVE' ");
if (config.MultiServerMode)
{
sql.Append("AND (player_steamid IN @SteamIDs ");
if (checkIpBans && ipAddresses.Count != 0)
{
sql.Append("OR player_ip IN @IpAddresses");
}
sql.Append(')');
}
else
{
sql.Append("AND server_id = @ServerId AND (player_steamid IN @SteamIDs ");
if (checkIpBans && ipAddresses.Count != 0)
{
sql.Append("OR player_ip IN @IpAddresses");
}
sql.Append(')');
}
if (config.MultiServerMode)
{
sql.Append("AND (player_steamid IN @SteamIDs ");
if (checkIpBans && ipAddresses.Count != 0)
{
sql.Append("OR player_ip IN @IpAddresses");
}
sql.Append(')');
}
else
{
sql.Append("AND server_id = @ServerId AND (player_steamid IN @SteamIDs ");
if (checkIpBans && ipAddresses.Count != 0)
{
sql.Append("OR player_ip IN @IpAddresses");
}
sql.Append(')');
}
var bannedPlayers = await connection.QueryAsync<(ulong PlayerSteamID, string PlayerIP)>(
sql.ToString(),
new
{
SteamIDs = steamIds,
IpAddresses = checkIpBans ? ipAddresses : [],
ServerId = CS2_SimpleAdmin.ServerId
});
var bannedPlayers = await connection.QueryAsync<(ulong PlayerSteamID, string PlayerIP)>(
sql.ToString(),
new
{
SteamIDs = steamIds,
IpAddresses = checkIpBans ? ipAddresses : [],
ServerId = CS2_SimpleAdmin.ServerId
});
var valueTuples = bannedPlayers.ToList();
var bannedSteamIds = valueTuples.Select(b => b.PlayerSteamID).ToHashSet();
var bannedIps = valueTuples.Select(b => b.PlayerIP).ToHashSet();
var valueTuples = bannedPlayers.ToList();
var bannedSteamIds = valueTuples.Select(b => b.PlayerSteamID).ToHashSet();
var bannedIps = valueTuples.Select(b => b.PlayerIP).ToHashSet();
foreach (var player in filteredPlayers.Where(player => bannedSteamIds.Contains(player.SteamID) ||
(checkIpBans && bannedIps.Contains(player.IpAddress ?? ""))))
{
if (!player.UserId.HasValue) continue;
foreach (var player in filteredPlayers.Where(player => bannedSteamIds.Contains(player.SteamID) ||
(checkIpBans && bannedIps.Contains(player.IpAddress ?? ""))))
{
if (!player.UserId.HasValue) continue;
await Server.NextFrameAsync(() =>
{
Helper.KickPlayer(player.UserId.Value, "Banned");
});
}
}
catch (Exception ex)
{
CS2_SimpleAdmin._logger?.LogError($"Error checking online players: {ex.Message}");
}
await Server.NextFrameAsync(() =>
{
Helper.KickPlayer(player.UserId.Value, "Banned");
});
}
}
catch (Exception ex)
{
CS2_SimpleAdmin._logger?.LogError($"Error checking online players: {ex.Message}");
}
}
public async Task ExpireOldBans()

View File

@@ -1,5 +1,4 @@
using CounterStrikeSharp.API.Core;
using Dapper;
using Dapper;
using Microsoft.Extensions.Logging;
namespace CS2_SimpleAdmin;

View File

@@ -1 +1 @@
1.4.8b
1.4.9a