daffyyyy / CS2-SimpleAdmin

Manage your Counter-Strike 2 server by simple commands :)
GNU General Public License v3.0
93 stars 30 forks source link

[Bug] Temporary bans issued via css_addban and css_banip won't apply #93

Closed barlap closed 3 months ago

barlap commented 3 months ago

Temporary bans issued via css_addban or css_banip will be written in the database as intended but can be simply bypassed by reconnecting to the server. After reconnecting the Expiry check task will run and mark the ban as "EXPIRED" in the database. The css_addban and css_banip with 0 value (permanent) works as intended.

My guess is that it has something to do with the following piece of code from Events.cs

` public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) { CCSPlayerController? player = @event.Userid;

if DEBUG

    Logger.LogCritical($"[OnPlayerConnect] Before check {player.PlayerName} : {player.IpAddress}");

endif

    if (player is null
        || string.IsNullOrEmpty(player.IpAddress) || player.IpAddress.Contains("127.0.0.1")
        || player.IsBot || player.IsHLTV || !player.UserId.HasValue) return HookResult.Continue;

if DEBUG

    Logger.LogCritical("[OnPlayerConnect] After Check");

endif

    string ipAddress = player.IpAddress.Split(":")[0];

    if (bannedPlayers.Contains(ipAddress) || bannedPlayers.Contains(player.SteamID.ToString()))
    {
        if (!player.UserId.HasValue) return HookResult.Continue;
        Helper.KickPlayer(player.UserId.Value, "Banned");
        return HookResult.Continue;
    }

    if (_database == null || !player.UserId.HasValue || player.UserId == null)
        return HookResult.Continue;

    PlayerInfo playerInfo = new PlayerInfo
    {
        UserId = player.UserId.Value,
        Index = (ushort)player.Index,
        Slot = player.Slot,
        SteamId = player.SteamID.ToString(),
        Name = player.PlayerName,
        IpAddress = ipAddress
    };

    BanManager _banManager = new(_database, Config);
    MuteManager _muteManager = new(_database);
    PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();

    Task.Run(async () =>
    {
        if (await _banManager.IsPlayerBanned(playerInfo))
        {
            if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress))
                bannedPlayers.Add(playerInfo.IpAddress);

            if (playerInfo.SteamId != null && !bannedPlayers.Contains(playerInfo.SteamId))
                bannedPlayers.Add(playerInfo.SteamId);

            Server.NextFrame(() =>
            {
                var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId);
                if (victim != null && victim.UserId.HasValue)
                {
                    Helper.KickPlayer(victim.UserId.Value, "Banned");
                }
            });

            return;
        }

        List<dynamic> activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId);

        if (activeMutes.Count > 0)
        {
            foreach (dynamic mute in activeMutes)
            {
                string muteType = mute.type;
                DateTime ends = mute.ends;
                int duration = mute.duration;

                if (muteType == "GAG")
                {
                    playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration);
                    Server.NextFrame(() =>
                    {
                        if (TagsDetected)
                        {
                            Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
                        }
                    });
                }
                else if (muteType == "MUTE")
                {
                    playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration);
                    Server.NextFrame(() =>
                    {
                        player.VoiceFlags = VoiceFlags.Muted;
                    });
                }
                else
                {
                    playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration);
                    Server.NextFrame(() =>
                    {
                        player.VoiceFlags = VoiceFlags.Muted;
                        if (TagsDetected)
                        {
                            Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
                        }
                    });
                }
            }
        }
    });

    if (!loadedPlayers.Contains(player.Slot))
        loadedPlayers.Add(player.Slot);

    return HookResult.Continue;
}`
daffyyyy commented 3 months ago

Fixed.