From b0c7fd12c34f08063391e61b93242d5819ebc852 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 17 Jun 2026 02:59:23 +0200 Subject: [PATCH 1/3] Bump version to 1.8.2a and add rename timer --- CS2-SimpleAdmin/CS2-SimpleAdmin.cs | 2 +- CS2-SimpleAdmin/Events.cs | 2 +- CS2-SimpleAdmin/Managers/PlayerManager.cs | 10 ++++++++++ CS2-SimpleAdmin/VERSION | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs index 83d5856..8ea5f4f 100644 --- a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.8.1a"; + public override string ModuleVersion => "1.8.2a"; public override void Load(bool hotReload) { diff --git a/CS2-SimpleAdmin/Events.cs b/CS2-SimpleAdmin/Events.cs index 26df60c..8d0149a 100644 --- a/CS2-SimpleAdmin/Events.cs +++ b/CS2-SimpleAdmin/Events.cs @@ -253,7 +253,7 @@ public partial class CS2_SimpleAdmin player.DiePosition = null; } - AddTimer(0.41f, () => + AddTimer(0.5f, () => { foreach (var list in RenamedPlayers) { diff --git a/CS2-SimpleAdmin/Managers/PlayerManager.cs b/CS2-SimpleAdmin/Managers/PlayerManager.cs index 2f08393..1e9c5c2 100644 --- a/CS2-SimpleAdmin/Managers/PlayerManager.cs +++ b/CS2-SimpleAdmin/Managers/PlayerManager.cs @@ -275,6 +275,16 @@ internal class PlayerManager /// public void CheckPlayersTimer() { + CS2_SimpleAdmin.Instance.AddTimer(5f, () => + { + foreach (var (steamid, name) in CS2_SimpleAdmin.RenamedPlayers) + { + var player = Helper.GetPlayerFromSteamid64(steamid); + if (player == null || !player.IsValid || player.PlayerName == name) continue; + player.Rename(name); + } + }); + CS2_SimpleAdmin.Instance.PlayersTimer = CS2_SimpleAdmin.Instance.AddTimer(61.0f, () => { #if DEBUG diff --git a/CS2-SimpleAdmin/VERSION b/CS2-SimpleAdmin/VERSION index e86c1d6..dafd1e7 100644 --- a/CS2-SimpleAdmin/VERSION +++ b/CS2-SimpleAdmin/VERSION @@ -1 +1 @@ -1.8.1a \ No newline at end of file +1.8.2a \ No newline at end of file From a588267165dc54ad90822bfedae21fdf06955c3f Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 17 Jun 2026 03:19:34 +0200 Subject: [PATCH 2/3] Use IpHistory record and make player timer repeat --- CS2-SimpleAdmin/Managers/CacheManager.cs | 32 +++++++++++------------ CS2-SimpleAdmin/Managers/PlayerManager.cs | 2 +- CS2-SimpleAdmin/Models/IpHistoryRow.cs | 3 +++ 3 files changed, 20 insertions(+), 17 deletions(-) create mode 100644 CS2-SimpleAdmin/Models/IpHistoryRow.cs diff --git a/CS2-SimpleAdmin/Managers/CacheManager.cs b/CS2-SimpleAdmin/Managers/CacheManager.cs index 27bc518..d18802c 100644 --- a/CS2-SimpleAdmin/Managers/CacheManager.cs +++ b/CS2-SimpleAdmin/Managers/CacheManager.cs @@ -73,7 +73,7 @@ internal class CacheManager: IDisposable if (CS2_SimpleAdmin.Instance.Config.OtherSettings.CheckMultiAccountsByIp) { // Optimization: Load IP history and build cache in single pass - var ipHistory = await connection.QueryAsync<(ulong steamid, string? name, uint address, DateTime used_at)>( + var ipHistory = await connection.QueryAsync( "SELECT steamid, name, address, used_at FROM sa_players_ips ORDER BY steamid, address, used_at DESC"); var unknownName = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; @@ -84,24 +84,24 @@ internal class CacheManager: IDisposable foreach (var record in ipHistory) { // When we encounter a new steamid, save the previous one - if (record.steamid != currentSteamId && currentSteamId != 0) + if (record.Steamid != currentSteamId && currentSteamId != 0) { _playerIpsCache[currentSteamId] = currentIpSet; currentIpSet = new HashSet(new IpRecordComparer()); latestIpTimestamps.Clear(); } - currentSteamId = record.steamid; + currentSteamId = record.Steamid; // Only keep the latest timestamp for each IP - if (!latestIpTimestamps.TryGetValue(record.address, out var existingTimestamp) || - record.used_at > existingTimestamp) + if (!latestIpTimestamps.TryGetValue(record.Address, out var existingTimestamp) || + record.Used_at > existingTimestamp) { - latestIpTimestamps[record.address] = record.used_at; + latestIpTimestamps[record.Address] = record.Used_at; currentIpSet.Add(new IpRecord( - record.address, - record.used_at, - string.IsNullOrEmpty(record.name) ? unknownName : record.name + record.Address, + record.Used_at, + string.IsNullOrEmpty(record.Name) ? unknownName : record.Name )); } } @@ -283,23 +283,23 @@ internal class CacheManager: IDisposable if (CS2_SimpleAdmin.Instance.Config.OtherSettings.CheckMultiAccountsByIp) { - var ipHistory = (await connection.QueryAsync<(ulong steamid, string? name, uint address, DateTime used_at)>( + var ipHistory = (await connection.QueryAsync( "SELECT steamid, name, address, used_at FROM sa_players_ips WHERE used_at >= @lastUpdate ORDER BY used_at DESC LIMIT 300", new { lastUpdate = _lastUpdateTime })); - foreach (var group in ipHistory.AsValueEnumerable().GroupBy(x => x.steamid)) + foreach (var group in ipHistory.AsValueEnumerable().GroupBy(x => x.Steamid)) { var ipSet = new HashSet( group - .GroupBy(x => x.address) + .GroupBy(x => x.Address) .Select(g => { - var latest = g.MaxBy(x => x.used_at); + var latest = g.MaxBy(x => x.Used_at); return new IpRecord( g.Key, - latest.used_at, - !string.IsNullOrEmpty(latest.name) - ? latest.name + latest.Used_at, + !string.IsNullOrEmpty(latest.Name) + ? latest.Name : CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown" ); }), diff --git a/CS2-SimpleAdmin/Managers/PlayerManager.cs b/CS2-SimpleAdmin/Managers/PlayerManager.cs index 1e9c5c2..1736112 100644 --- a/CS2-SimpleAdmin/Managers/PlayerManager.cs +++ b/CS2-SimpleAdmin/Managers/PlayerManager.cs @@ -283,7 +283,7 @@ internal class PlayerManager if (player == null || !player.IsValid || player.PlayerName == name) continue; player.Rename(name); } - }); + }, TimerFlags.REPEAT); CS2_SimpleAdmin.Instance.PlayersTimer = CS2_SimpleAdmin.Instance.AddTimer(61.0f, () => { diff --git a/CS2-SimpleAdmin/Models/IpHistoryRow.cs b/CS2-SimpleAdmin/Models/IpHistoryRow.cs new file mode 100644 index 0000000..f8a53ac --- /dev/null +++ b/CS2-SimpleAdmin/Models/IpHistoryRow.cs @@ -0,0 +1,3 @@ +namespace CS2_SimpleAdmin.Models; + +public record IpHistoryRow(ulong Steamid, string? Name, uint Address, DateTime Used_at); From cf284bd1211e081319e6ffc4660bf7e670888979 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sun, 28 Jun 2026 00:49:54 +0200 Subject: [PATCH 3/3] Bump version and adjust SteamID type handling --- CS2-SimpleAdmin/CS2-SimpleAdmin.cs | 2 +- CS2-SimpleAdmin/Managers/CacheManager.cs | 6 +++--- CS2-SimpleAdmin/Models/IpHistoryRow.cs | 8 +++++++- CS2-SimpleAdmin/VERSION | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs index 8ea5f4f..a2a82ee 100644 --- a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.8.2a"; + public override string ModuleVersion => "1.8.2b"; public override void Load(bool hotReload) { diff --git a/CS2-SimpleAdmin/Managers/CacheManager.cs b/CS2-SimpleAdmin/Managers/CacheManager.cs index d18802c..d02e036 100644 --- a/CS2-SimpleAdmin/Managers/CacheManager.cs +++ b/CS2-SimpleAdmin/Managers/CacheManager.cs @@ -84,14 +84,14 @@ internal class CacheManager: IDisposable foreach (var record in ipHistory) { // When we encounter a new steamid, save the previous one - if (record.Steamid != currentSteamId && currentSteamId != 0) + if ((ulong)record.Steamid != currentSteamId && currentSteamId != 0) { _playerIpsCache[currentSteamId] = currentIpSet; currentIpSet = new HashSet(new IpRecordComparer()); latestIpTimestamps.Clear(); } - currentSteamId = record.Steamid; + currentSteamId = (ulong)record.Steamid; // Only keep the latest timestamp for each IP if (!latestIpTimestamps.TryGetValue(record.Address, out var existingTimestamp) || @@ -307,7 +307,7 @@ internal class CacheManager: IDisposable ); _playerIpsCache.AddOrUpdate( - group.Key, + (ulong)group.Key, _ => ipSet, (_, existingSet) => { diff --git a/CS2-SimpleAdmin/Models/IpHistoryRow.cs b/CS2-SimpleAdmin/Models/IpHistoryRow.cs index f8a53ac..5c794a7 100644 --- a/CS2-SimpleAdmin/Models/IpHistoryRow.cs +++ b/CS2-SimpleAdmin/Models/IpHistoryRow.cs @@ -1,3 +1,9 @@ namespace CS2_SimpleAdmin.Models; -public record IpHistoryRow(ulong Steamid, string? Name, uint Address, DateTime Used_at); +public record IpHistoryRow +{ + public long Steamid { get; init; } + public string? Name { get; init; } + public uint Address { get; init; } + public DateTime Used_at { get; init; } +} diff --git a/CS2-SimpleAdmin/VERSION b/CS2-SimpleAdmin/VERSION index dafd1e7..c7a73ab 100644 --- a/CS2-SimpleAdmin/VERSION +++ b/CS2-SimpleAdmin/VERSION @@ -1 +1 @@ -1.8.2a \ No newline at end of file +1.8.2b \ No newline at end of file