From 6bcb10c5cfdbd063c06c0e2e361f4541995b6d27 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sat, 2 Dec 2023 22:44:11 +0100 Subject: [PATCH 001/356] Initial commit --- .gitignore | 4 + BanManager.cs | 67 +++++++++++++++ CS2-SimpleAdmin.cs | 187 +++++++++++++++++++++++++++++++++++++++++ CS2-SimpleAdmin.csproj | 17 ++++ CS2-SimpleAdmin.sln | 25 ++++++ Config.cs | 53 ++++++++++++ Events.cs | 48 +++++++++++ Helper.cs | 63 ++++++++++++++ PlayerUtils.cs | 71 ++++++++++++++++ README.md | 43 ++++++++++ TargetResult.cs | 8 ++ 11 files changed, 586 insertions(+) create mode 100644 .gitignore create mode 100644 BanManager.cs create mode 100644 CS2-SimpleAdmin.cs create mode 100644 CS2-SimpleAdmin.csproj create mode 100644 CS2-SimpleAdmin.sln create mode 100644 Config.cs create mode 100644 Events.cs create mode 100644 Helper.cs create mode 100644 PlayerUtils.cs create mode 100644 README.md create mode 100644 TargetResult.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..48166c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +bin/ +obj/ +.vs/ +.git \ No newline at end of file diff --git a/BanManager.cs b/BanManager.cs new file mode 100644 index 0000000..2a6213f --- /dev/null +++ b/BanManager.cs @@ -0,0 +1,67 @@ +using CounterStrikeSharp.API.Core; +using Dapper; +using MySqlConnector; +using System.Data; + +namespace CS2_SimpleAdmin +{ + internal class BanManager + { + private readonly IDbConnection _dbConnection; + + public BanManager(string connectionString) + { + _dbConnection = new MySqlConnection(connectionString); + } + + public void BanPlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0) + { + _dbConnection.Open(); + + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + DateTime now = DateTime.Now; + DateTime futureTime = now.AddMinutes(time); + + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `duration`, `ends`, `created`) " + + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @duration, @ends, @created)"; + _dbConnection.Execute(sql, new + { + playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), + playerName = player.PlayerName, + adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminName = issuer == null ? "Console" : issuer.PlayerName, + duration = time, + ends = futureTime, + created = now + }); + + _dbConnection.Close(); + } + + public bool IsPlayerBanned(string steamId) + { + _dbConnection.Open(); + + DateTime now = DateTime.Now; + + string sql = "SELECT COUNT(*) FROM sa_bans WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; + int banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, CurrentTime = now }); + + _dbConnection.Close(); + + return banCount > 0; + } + + public void ExpireOldBans() + { + _dbConnection.Open(); + + string sql = "UPDATE sa_bans SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; + int affectedRows = _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); + + _dbConnection.Close(); + } + + } +} diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs new file mode 100644 index 0000000..4645fce --- /dev/null +++ b/CS2-SimpleAdmin.cs @@ -0,0 +1,187 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core.Attributes.Registration; +using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Commands; +using MySqlConnector; +using static System.Net.Mime.MediaTypeNames; + +namespace CS2_SimpleAdmin; +public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig +{ + internal string dbConnectionString = string.Empty; + public override string ModuleName => "CS2-SimpleAdmin"; + public override string ModuleDescription => ""; + public override string ModuleAuthor => "daffyy"; + public override string ModuleVersion => "1.0.0"; + + public CS2_SimpleAdminConfig Config { get; set; } = new(); + + public override void Load(bool hotReload) + { + registerEvents(); + + if (hotReload) + { + OnMapStart(string.Empty); + } + } + + public void OnConfigParsed(CS2_SimpleAdminConfig config) + { + if (config.DatabaseHost.Length < 1 || config.DatabaseName.Length < 1 || config.DatabaseUser.Length < 1) + { + throw new Exception("[CS2-SimpleAdmin] You need to setup Database credentials in config!"); + } + + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder + { + Server = config.DatabaseHost, + Database = config.DatabaseName, + UserID = config.DatabaseUser, + Password = config.DatabasePassword, + Port = (uint)config.DatabasePort, + }; + + dbConnectionString = builder.ConnectionString; + + try + { + using (var connection = new MySqlConnection(dbConnectionString)) + { + connection.Open(); + connection.Close(); + } + + } + catch (MySqlException ex) + { + throw new Exception("[CS2-SimpleAdmin] Unable to connect to Database!" + ex.Message); + } + + Config = config; + } + + [ConsoleCommand("css_kick")] + [RequiresPermissions("@css/kick")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnKickCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + + player!.Pawn.Value!.Freeze(); + string reason = "Brak powodu"; + + if (command.ArgCount >= 2) + reason = command.GetArg(2); + + if (command.ArgCount >= 2) + { + player!.PrintToCenter($"{Config.Messages.PlayerKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + AddTimer(10.0f, () => Helper.KickPlayer(player!.UserId, reason)); + + } + else + { + AddTimer(10.0f, () => Helper.KickPlayer(player!.UserId)); + } + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + [ConsoleCommand("css_ban")] + [RequiresPermissions("@css/ban")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnBanCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + if (command.ArgCount < 2) + return; + + int time = 0; + string reason = "Unknown"; + + player!.Pawn.Value!.Freeze(); + + BanManager _banManager = new(dbConnectionString); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3) + reason = command.GetArg(3); + + _banManager.BanPlayer(player, caller, reason, time); + + if (time == 0) + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + else + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + AddTimer(10.0f, () => Helper.KickPlayer(player!.UserId)); + + } + + [ConsoleCommand("css_slay")] + [RequiresPermissions("@css/slay")] + [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnSlayCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out CCSPlayerController? player)) + return; + if (!player!.PawnIsAlive) + return; + + player!.CommitSuicide(false, true); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminSlayMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + [ConsoleCommand("css_slap")] + [RequiresPermissions("@css/slay")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> [damage]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnSlapCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out CCSPlayerController? player)) + return; + if (!player!.PawnIsAlive) + return; + + int damage = 0; + + + if (command.ArgCount >= 2) + { + int.TryParse(command.GetArg(2), out damage); + } + + player!.Pawn.Value!.Slap(damage); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminSlapMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + private static bool GetTarget(CommandInfo info, out CCSPlayerController? player) + { + var matches = Helper.GetTarget(info.GetArg(1), out player); + + switch (matches) + { + case TargetResult.None: + info.ReplyToCommand($"Target {info.GetArg(1)} not found."); + return false; + case TargetResult.Multiple: + info.ReplyToCommand($"Multiple targets found for \"{info.GetArg(1)}\"."); + return false; + } + + return true; + } +} + diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj new file mode 100644 index 0000000..e0ae93f --- /dev/null +++ b/CS2-SimpleAdmin.csproj @@ -0,0 +1,17 @@ + + + + net7.0 + CS2_SimpleAdmin + enable + enable + true + + + + + + + + + diff --git a/CS2-SimpleAdmin.sln b/CS2-SimpleAdmin.sln new file mode 100644 index 0000000..0f0c027 --- /dev/null +++ b/CS2-SimpleAdmin.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34309.116 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CS2-SimpleAdmin", "CS2-SimpleAdmin.csproj", "{0DB90496-262F-4BF9-9B55-1490EBF4D49F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0DB90496-262F-4BF9-9B55-1490EBF4D49F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0DB90496-262F-4BF9-9B55-1490EBF4D49F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DB90496-262F-4BF9-9B55-1490EBF4D49F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0DB90496-262F-4BF9-9B55-1490EBF4D49F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {86114444-059F-4DB8-9A55-E6D1BB76238D} + EndGlobalSection +EndGlobal diff --git a/Config.cs b/Config.cs new file mode 100644 index 0000000..6179565 --- /dev/null +++ b/Config.cs @@ -0,0 +1,53 @@ +using CounterStrikeSharp.API.Core; +using System.Text.Json.Serialization; + +namespace CS2_SimpleAdmin +{ + public class Messages + { + [JsonPropertyName("PlayerBanMessageTime")] + public string PlayerBanMessageTime { get; set; } = "You have been banned for {REASON} for {TIME} minutes by {ADMIN}!"; + [JsonPropertyName("PlayerBanMessagePerm")] + public string PlayerBanMessagePerm { get; set; } = "You have been banned permanently for {REASON} by {ADMIN}!"; + [JsonPropertyName("PlayerKickMessage")] + public string PlayerKickMessage { get; set; } = "You have been kicked for {REASON} by {ADMIN}!"; + [JsonPropertyName("AdminBanMessageTime")] + public string AdminBanMessageTime { get; set; } = "Admin {ADMIN} banned {PLAYER} for {REASON} for {TIME} minutes!"; + [JsonPropertyName("AdminBanMessagePerm")] + public string AdminBanMessagePerm { get; set; } = "Admin {ADMIN} banned {PLAYER} permanently for {REASON}"; + + [JsonPropertyName("AdminKickMessage")] + public string AdminKickMessage { get; set; } = "Admin {ADMIN} kicked {PLAYER} for {REASON}!"; + [JsonPropertyName("AdminSlayMessage")] + public string AdminSlayMessage { get; set; } = "Admin {ADMIN} slayed {PLAYER}!"; + [JsonPropertyName("AdminSlapMessage")] + public string AdminSlapMessage { get; set; } = "Admin {ADMIN} slapped {PLAYER}!"; + } + + public class CS2_SimpleAdminConfig : BasePluginConfig + { + public override int Version { get; set; } = 1; + + [JsonPropertyName("DatabaseHost")] + public string DatabaseHost { get; set; } = ""; + + [JsonPropertyName("DatabasePort")] + public int DatabasePort { get; set; } = 3306; + + [JsonPropertyName("DatabaseUser")] + public string DatabaseUser { get; set; } = ""; + + [JsonPropertyName("DatabasePassword")] + public string DatabasePassword { get; set; } = ""; + + [JsonPropertyName("DatabaseName")] + public string DatabaseName { get; set; } = ""; + + [JsonPropertyName("Prefix")] + public string Prefix { get; set; } = "{GREEN}[SimpleAdmin]"; + + [JsonPropertyName("Messages")] + public Messages Messages { get; set; } = new Messages(); + } + +} \ No newline at end of file diff --git a/Events.cs b/Events.cs new file mode 100644 index 0000000..6ed895b --- /dev/null +++ b/Events.cs @@ -0,0 +1,48 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities; + +namespace CS2_SimpleAdmin +{ + public partial class CS2_SimpleAdmin + { + private void registerEvents() + { + RegisterListener(OnClientAuthorized); + RegisterListener(OnMapStart); + } + + private void OnClientAuthorized(int playerSlot, SteamID steamID) + { + int playerIndex = playerSlot + 1; + + CCSPlayerController? player = Utilities.GetPlayerFromIndex(playerIndex); + + if (player.AuthorizedSteamID == null) + { + AddTimer(3.0f, () => + { + OnClientAuthorized(playerSlot, steamID); + }); + return; + } + + BanManager _banManager = new(dbConnectionString); + bool isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString()); + + if (isBanned) + { + Helper.KickPlayer(player.UserId, "Banned"); + } + } + + private void OnMapStart(string mapName) + { + AddTimer(120.0f, () => + { + BanManager _banManager = new(dbConnectionString); + _banManager.ExpireOldBans(); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + } +} diff --git a/Helper.cs b/Helper.cs new file mode 100644 index 0000000..c6491d9 --- /dev/null +++ b/Helper.cs @@ -0,0 +1,63 @@ +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API; +using MySqlConnector; +using CounterStrikeSharp.API.Modules.Utils; +using System.Reflection; + +namespace CS2_SimpleAdmin +{ + internal class Helper + { + internal static CS2_SimpleAdminConfig? Config { get; set; } + + public static List GetPlayerFromName(string name) + { + return Utilities.GetPlayers().FindAll(x => x.PlayerName.Contains(name, StringComparison.OrdinalIgnoreCase)); + } + + public static TargetResult GetTarget(string target, out CCSPlayerController? player) + { + player = null; + + if (target.StartsWith("#") && int.TryParse(target.AsSpan(1), out var userid)) + { + player = Utilities.GetPlayerFromUserid(userid); + } + else + { + var matches = GetPlayerFromName(target); + if (matches.Count > 1) + return TargetResult.Multiple; + + player = matches.FirstOrDefault(); + } + + return player?.IsValid == true ? TargetResult.Single : TargetResult.None; + } + + public static void KickPlayer(int? userId, string? reason = null) + { + Server.ExecuteCommand($"kickid {userId} {reason}"); + } + + internal static string ReplaceTags(string message) + { + if (message.Contains('{')) + { + string modifiedValue = message; + foreach (FieldInfo field in typeof(ChatColors).GetFields()) + { + string pattern = $"{{{field.Name}}}"; + if (message.Contains(pattern, StringComparison.OrdinalIgnoreCase)) + { + modifiedValue = modifiedValue.Replace(pattern, field.GetValue(null)!.ToString(), StringComparison.OrdinalIgnoreCase); + } + } + return modifiedValue; + } + + return message; + } + + } +} diff --git a/PlayerUtils.cs b/PlayerUtils.cs new file mode 100644 index 0000000..b5e4295 --- /dev/null +++ b/PlayerUtils.cs @@ -0,0 +1,71 @@ +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; + +namespace CS2_SimpleAdmin; + +public static class PlayerUtils +{ + public static void Slap(this CBasePlayerPawn pawn, int damage = 0) + { + PerformSlap(pawn, damage); + } + + public static void Bury(this CBasePlayerPawn pawn, float depth = 10f) + { + var newPos = new Vector(pawn.AbsOrigin!.X, pawn.AbsOrigin.Y, + pawn.AbsOrigin!.Z - depth); + + pawn.Teleport(newPos, pawn.AbsRotation!, pawn.AbsVelocity); + } + + public static void Unbury(this CBasePlayerPawn pawn, float depth = 15f) + { + var newPos = new Vector(pawn.AbsOrigin!.X, pawn.AbsOrigin.Y, + pawn.AbsOrigin!.Z + depth); + + pawn.Teleport(newPos, pawn.AbsRotation!, pawn.AbsVelocity); + } + + public static void Freeze(this CBasePlayerPawn pawn) + { + pawn.MoveType = MoveType_t.MOVETYPE_NONE; + } + + public static void Unfreeze(this CBasePlayerPawn pawn) + { + pawn.MoveType = MoveType_t.MOVETYPE_WALK; + } + + public static void ToggleNoclip(this CBasePlayerPawn pawn) + { + if (pawn.MoveType == MoveType_t.MOVETYPE_NOCLIP) + pawn.MoveType = MoveType_t.MOVETYPE_WALK; + else + pawn.MoveType = MoveType_t.MOVETYPE_NOCLIP; + } + + private static void PerformSlap(CBasePlayerPawn pawn, int damage = 0) + { + if (pawn.LifeState != (int)LifeState_t.LIFE_ALIVE) + return; + + /* Teleport in a random direction - thank you, Mani!*/ + /* Thank you AM & al!*/ + var random = new Random(); + var vel = new Vector(pawn.AbsVelocity.X, pawn.AbsVelocity.Y, pawn.AbsVelocity.Z); + + vel.X += ((random.Next(180) + 50) * ((random.Next(2) == 1) ? -1 : 1)); + vel.Y += ((random.Next(180) + 50) * ((random.Next(2) == 1) ? -1 : 1)); + vel.Z += random.Next(200) + 100; + + pawn.Teleport(pawn.AbsOrigin!, pawn.AbsRotation!, vel); + + if (damage <= 0) + return; + + pawn.Health -= damage; + + if (pawn.Health <= 0) + pawn.CommitSuicide(true, true); + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1557cb8 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# CS2-SimpleAdmin + +### Description +Manage your Counter-Strike 2 server by simple commands :) + +### Info +It's only plugin base, I don't have much time for more extensive development, so if you want to help, do it :) + +### Commands +- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player +- css_kick <#userid or name> [reason] - Kick player +- css_slay <#userid or name> - Kill player +- css_slap <#userid or name> [damage] - Slap player + +### Requirments +[CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v90** + +### Configuration +After first launch, u need to configure plugin in addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin/CS2-SimpleAdmin.json + +### Colors +``` + public static char Default = '\x01'; + public static char White = '\x01'; + public static char Darkred = '\x02'; + public static char Green = '\x04'; + public static char LightYellow = '\x03'; + public static char LightBlue = '\x03'; + public static char Olive = '\x05'; + public static char Lime = '\x06'; + public static char Red = '\x07'; + public static char Purple = '\x03'; + public static char Grey = '\x08'; + public static char Yellow = '\x09'; + public static char Gold = '\x10'; + public static char Silver = '\x0A'; + public static char Blue = '\x0B'; + public static char DarkBlue = '\x0C'; + public static char BlueGrey = '\x0D'; + public static char Magenta = '\x0E'; + public static char LightRed = '\x0F'; +``` +Use color name for e.g. {LightRed} \ No newline at end of file diff --git a/TargetResult.cs b/TargetResult.cs new file mode 100644 index 0000000..39ed99e --- /dev/null +++ b/TargetResult.cs @@ -0,0 +1,8 @@ +namespace CS2_SimpleAdmin; + +internal enum TargetResult +{ + None, + Multiple, + Single +} From e4a6c733ab26462984abc7c14f8631189e613b6c Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 2 Dec 2023 22:47:17 +0100 Subject: [PATCH 002/356] Create build.yml --- .github/workflows/build.yml | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..472aa91 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,67 @@ +name: Build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +env: + BUILD_NUMBER: ${{ github.run_number }} + PROJECT_PATH: "CS2-SimpleAdmin.csproj" + PROJECT_NAME: "CS2-SimpleAdmin" + OUTPUT_PATH: "./CS2-SimpleAdmin" + +jobs: + build: + permissions: write-all + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Restore + run: dotnet restore + - name: Build + run: dotnet build ${{ env.PROJECT_PATH }} -c CS2-SimpleAdmin -o ${{ env.OUTPUT_PATH }} + + publish: + if: github.event_name == 'push' + permissions: write-all + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Restore + run: dotnet restore + - name: Build + run: dotnet build ${{ env.PROJECT_PATH }} -c CS2-SimpleAdmin -o ${{ env.OUTPUT_PATH }} + - name: Clean files + run: | + rm -f \ + ${{ env.OUTPUT_PATH }}/CounterStrikeSharp.API.dll \ + ${{ env.OUTPUT_PATH }}/McMaster.NETCore.Plugins.dll \ + ${{ env.OUTPUT_PATH }}/Microsoft.DotNet.PlatformAbstractions.dll \ + ${{ env.OUTPUT_PATH }}/Microsoft.Extensions.DependencyModel.dll \ + - name: Zip + uses: thedoctor0/zip-release@0.7.5 + with: + type: 'zip' + filename: '${{ env.PROJECT_NAME }}.zip' + path: ${{ env.OUTPUT_PATH }} + - name: CS2-SimpleAdmin + uses: ncipollo/release-action@v1.12.0 + with: + artifacts: "${{ env.PROJECT_NAME }}.zip" + name: "Build ${{ env.BUILD_NUMBER }}" + tag: "build-${{ env.BUILD_NUMBER }}" + body: | + Place the plugin in game/csgo/addons/counterstrikesharp/plugins/CS2-SimpleAdmin + After first launch, u need to configure plugin in addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin/CS2-SimpleAdmin.json From ffcd623628f3d7a1a30fb1ade977e722e4ce660b Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 2 Dec 2023 22:48:52 +0100 Subject: [PATCH 003/356] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1557cb8..737dcee 100644 --- a/README.md +++ b/README.md @@ -40,4 +40,6 @@ After first launch, u need to configure plugin in addons/counterstrikesharp/con public static char Magenta = '\x0E'; public static char LightRed = '\x0F'; ``` -Use color name for e.g. {LightRed} \ No newline at end of file +Use color name for e.g. {LightRed} + +Credits for https://github.com/Hackmastr/css-basic-admin/ From d2d1f41e804283f39b44c364abfcc270e5ee5f11 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sat, 2 Dec 2023 23:02:36 +0100 Subject: [PATCH 004/356] Fixed failstart :D --- CS2-SimpleAdmin.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 4645fce..9d59233 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -50,6 +50,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) From 31bc91e0a47bef0cd302e9a9aaa1e1941bbe6507 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sat, 2 Dec 2023 23:16:04 +0100 Subject: [PATCH 005/356] Map and say commands Source https://github.com/Hackmastr/css-basic-admin --- CS2-SimpleAdmin.cs | 74 +++++++++++++++++++++++++++++++++++++++++++--- Config.cs | 5 ++++ Helper.cs | 10 ++++++- 3 files changed, 84 insertions(+), 5 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 9d59233..643f107 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -3,6 +3,8 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; +using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Modules.Utils; using MySqlConnector; using static System.Net.Mime.MediaTypeNames; @@ -183,17 +185,81 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnMapCommand(CCSPlayerController? caller, CommandInfo command) { - var matches = Helper.GetTarget(info.GetArg(1), out player); + string map = command.GetArg(1); + + if (!Server.IsMapValid(map)) + { + command.ReplyToCommand($"Map {map} not found."); + return; + } + + AddTimer(5f, () => + { + Server.ExecuteCommand($"changelevel {map}"); + }); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminChangeMap}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{MAP}", map))); + } + + [ConsoleCommand("css_say", "Say to all players.")] + [CommandHelper(1, "")] + [RequiresPermissions("@css/chat")] + public void OnAdminSayCommand(CCSPlayerController? caller, CommandInfo command) + { + Server.PrintToChatAll(Helper.ReplaceTags(Config.Messages.AdminSayPrefix + command.GetCommandString[command.GetCommandString.IndexOf(' ')..])); + } + + [ConsoleCommand("css_psay", "Private message a player.")] + [CommandHelper(2, "<#userid or name> ")] + [RequiresPermissions("@css/chat")] + public void OnAdminPrivateSayCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + + var range = command.GetArg(0).Length + command.GetArg(1).Length + 2; + var message = command.GetCommandString[range..]; + + command.ReplyToCommand(Helper.ReplaceTags($"({player!.PlayerName}) {message}")); + player.PrintToChat(Helper.ReplaceTags($"({caller!.PlayerName}) {message}")); + } + + [ConsoleCommand("css_csay", "Say to all players (in center).")] + [CommandHelper(1, "")] + [RequiresPermissions("@css/chat")] + public void OnAdminCenterSayCommand(CCSPlayerController? caller, CommandInfo command) + { + Helper.PrintToCenterAll(Helper.ReplaceTags(command.GetCommandString[command.GetCommandString.IndexOf(' ')..])); + } + + [ConsoleCommand("css_hsay", "Say to all players (in hud).")] + [CommandHelper(1, "")] + [RequiresPermissions("@css/chat")] + public void OnAdminHudSayCommand(CCSPlayerController? caller, CommandInfo command) + { + VirtualFunctions.ClientPrintAll( + HudDestination.Alert, + Helper.ReplaceTags(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]), + 0, 0, 0, 0); + } + + + private static bool GetTarget(CommandInfo command, out CCSPlayerController? player) + { + var matches = Helper.GetTarget(command.GetArg(1), out player); switch (matches) { case TargetResult.None: - info.ReplyToCommand($"Target {info.GetArg(1)} not found."); + command.ReplyToCommand($"Target {command.GetArg(1)} not found."); return false; case TargetResult.Multiple: - info.ReplyToCommand($"Multiple targets found for \"{info.GetArg(1)}\"."); + command.ReplyToCommand($"Multiple targets found for \"{command.GetArg(1)}\"."); return false; } diff --git a/Config.cs b/Config.cs index 6179565..f1aa17a 100644 --- a/Config.cs +++ b/Config.cs @@ -22,6 +22,11 @@ namespace CS2_SimpleAdmin public string AdminSlayMessage { get; set; } = "Admin {ADMIN} slayed {PLAYER}!"; [JsonPropertyName("AdminSlapMessage")] public string AdminSlapMessage { get; set; } = "Admin {ADMIN} slapped {PLAYER}!"; + [JsonPropertyName("AdminChangeMap")] + public string AdminChangeMap { get; set; } = "Admin {ADMIN} changed map to {MAP}!"; + [JsonPropertyName("AdminSayPrefix")] + public string AdminSayPrefix { get; set; } = "{RED}ADMIN: {DEFAULT}!"; + } public class CS2_SimpleAdminConfig : BasePluginConfig diff --git a/Helper.cs b/Helper.cs index c6491d9..bd5eceb 100644 --- a/Helper.cs +++ b/Helper.cs @@ -37,7 +37,15 @@ namespace CS2_SimpleAdmin public static void KickPlayer(int? userId, string? reason = null) { - Server.ExecuteCommand($"kickid {userId} {reason}"); + NativeAPI.IssueServerCommand($"kickid {userId} {reason}"); + } + + public static void PrintToCenterAll(string message) + { + Utilities.GetPlayers().ForEach(controller => + { + controller.PrintToCenter(message); + }); } internal static string ReplaceTags(string message) From ad621b9cb8dfe0881a5d38fb6a2fa3d22f077114 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 2 Dec 2023 23:18:06 +0100 Subject: [PATCH 006/356] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 737dcee..76f08fb 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,12 @@ It's only plugin base, I don't have much time for more extensive development, so - css_kick <#userid or name> [reason] - Kick player - css_slay <#userid or name> - Kill player - css_slap <#userid or name> [damage] - Slap player +- css_map - Change map +- css_say - Say message as admin in chat +- css_psay <#userid or name> - Sends private message to player +- css_csay - Say message as admin in center +- css_hsay - Say message as admin in hud + ### Requirments [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v90** From 39e73763b73dc6638670cad4e6e1739d7a566051 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sat, 2 Dec 2023 23:28:09 +0100 Subject: [PATCH 007/356] Fix in creating table --- CS2-SimpleAdmin.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 643f107..ac8c95d 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -54,16 +54,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Sun, 3 Dec 2023 00:15:55 +0100 Subject: [PATCH 008/356] css_admin command Added css_admin command for displaying all commands --- CS2-SimpleAdmin.cs | 18 ++++++++++++++++-- Config.cs | 7 +++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index ac8c95d..f373ee9 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -15,7 +15,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.0"; + public override string ModuleVersion => "1.0.1"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -80,6 +80,20 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -211,7 +225,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_say - Say message as admin in chat\n" + + "- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud"; } public class CS2_SimpleAdminConfig : BasePluginConfig From 35e6a52ad854f561b8f34eb4109c75eb777e96b7 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sun, 3 Dec 2023 00:50:02 +0100 Subject: [PATCH 009/356] Additional commands --- CS2-SimpleAdmin.cs | 99 +++++++++++++++++++++++++++++++++++++++++++++- Config.cs | 12 +++++- README.md | 25 +++++++----- 3 files changed, 125 insertions(+), 11 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index f373ee9..fcada0b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -3,8 +3,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; +using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; +using Microsoft.Extensions.Logging; using MySqlConnector; using static System.Net.Mime.MediaTypeNames; @@ -188,7 +190,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 2) { int.TryParse(command.GetArg(2), out damage); @@ -262,6 +263,102 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig")] + [RequiresPermissions("@css/cheats")] + public void OnNoclipCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + + player!.Pawn.Value!.ToggleNoclip(); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminNoclipMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + [ConsoleCommand("css_freeze", "Freeze a player.")] + [CommandHelper(1, "<#userid or name> [duration]")] + [RequiresPermissions("@css/slay")] + public void OnFreezeCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + + int time = 0; + int.TryParse(command.GetArg(2), out time); + + player!.Pawn.Value!.Freeze(); + + if (time > 0) + AddTimer(time, () => player.Pawn.Value!.Unfreeze()); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminFreezeMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + [ConsoleCommand("css_unfreeze", "Unfreeze a player.")] + [CommandHelper(1, "<#userid or name>")] + [RequiresPermissions("@css/slay")] + public void OnUnfreezeCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + + player!.Pawn.Value!.Unfreeze(); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminUnFreezeMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + [ConsoleCommand("css_respawn", "Respawn a dead player.")] + [CommandHelper(1, "<#userid or name>")] + [RequiresPermissions("@css/cheats")] + public void OnRespawnCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + + player!.Respawn(); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminRespawnMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + [ConsoleCommand("css_cvar", "Change a cvar.")] + [CommandHelper(2, " ")] + [RequiresPermissions("@css/cvar")] + public void OnCvarCommand(CCSPlayerController? caller, CommandInfo command) + { + var cvar = ConVar.Find(command.GetArg(1)); + + if (cvar == null) + { + command.ReplyToCommand($"Cvar \"{command.GetArg(1)}\" not found."); + return; + } + + if (cvar.Name.Equals("sv_cheats") && !AdminManager.PlayerHasPermissions(caller, "@css/cheats")) + { + command.ReplyToCommand($"You don't have permissions to change \"{command.GetArg(1)}\"."); + return; + } + + var value = command.GetArg(2); + + Server.ExecuteCommand($"{cvar.Name} {value}"); + + command.ReplyToCommand($"{caller!.PlayerName} changed cvar {cvar.Name} to {value}."); + Logger.LogInformation($"{caller.PlayerName} changed cvar {cvar.Name} to {value}."); + } + + [ConsoleCommand("css_rcon", "Run a server console command.")] + [CommandHelper(1, "")] + [RequiresPermissions("@css/rcon")] + public void OnRcomCommand(CCSPlayerController? caller, CommandInfo command) + { + Server.ExecuteCommand(command.ArgString); + + Logger.LogInformation($"{caller!.PlayerName} executed command ({command.ArgString})."); + } + + private static bool GetTarget(CommandInfo command, out CCSPlayerController? player) { diff --git a/Config.cs b/Config.cs index 1d0601c..569b434 100644 --- a/Config.cs +++ b/Config.cs @@ -24,12 +24,22 @@ namespace CS2_SimpleAdmin public string AdminSlapMessage { get; set; } = "Admin {ADMIN} slapped {PLAYER}!"; [JsonPropertyName("AdminChangeMap")] public string AdminChangeMap { get; set; } = "Admin {ADMIN} changed map to {MAP}!"; + [JsonPropertyName("AdminNoclipMessage")] + public string AdminNoclipMessage { get; set; } = "Admin {ADMIN} toggled noclip for {PLAYER}!"; + [JsonPropertyName("AdminFreezeMessage")] + public string AdminFreezeMessage { get; set; } = "Admin {ADMIN} freezed {PLAYER}!"; + [JsonPropertyName("AdminUnFreezeMessage")] + public string AdminUnFreezeMessage { get; set; } = "Admin {ADMIN} unfreezed {PLAYER}!"; + [JsonPropertyName("AdminRespawnMessage")] + public string AdminRespawnMessage { get; set; } = "Admin {ADMIN} respawned {PLAYER}!"; [JsonPropertyName("AdminSayPrefix")] public string AdminSayPrefix { get; set; } = "{RED}ADMIN: {DEFAULT}"; [JsonPropertyName("AdminHelpCommand")] public string AdminHelpCommand { get; set; } = "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_kick <#userid or name> [reason] - Kick player\n" + "- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_say - Say message as admin in chat\n" + - "- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud"; + "- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n" + + "- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n" + + "- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server"; } public class CS2_SimpleAdminConfig : BasePluginConfig diff --git a/README.md b/README.md index 76f08fb..dd3661d 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,22 @@ Manage your Counter-Strike 2 server by simple commands :) It's only plugin base, I don't have much time for more extensive development, so if you want to help, do it :) ### Commands -- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player -- css_kick <#userid or name> [reason] - Kick player -- css_slay <#userid or name> - Kill player -- css_slap <#userid or name> [damage] - Slap player -- css_map - Change map -- css_say - Say message as admin in chat -- css_psay <#userid or name> - Sends private message to player -- css_csay - Say message as admin in center -- css_hsay - Say message as admin in hud +- css_admin - Display all admin commands // @css/generic +- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player // @css/ban +- css_kick <#userid or name> [reason] - Kick player / @css/kick +- css_slay <#userid or name> - Kill player // @css/slay +- css_slap <#userid or name> [damage] - Slap player // @css/slay +- css_map - Change map // @css/map +- css_say - Say message as admin in chat // @css/chat +- css_psay <#userid or name> - Sends private message to player // @css/chat +- css_csay - Say message as admin in center // @css/chat +- css_hsay - Say message as admin in hud // @css/chat +- css_noclip <#userid or name> - Toggle noclip for player // @css/cheats +- css_freeze <#userid or name> [duration] - Freeze player // @css/slay +- css_unfreeze <#userid or name> - Unfreeze player // @css/slay +- css_respawn <#userid or name> - Respawn player // @css/cheats +- css_cvar - Change cvar value // @css/cvar +- css_rcon - Run command as server // @css/rcon ### Requirments From d496977c7661d077892c809dd15b71326c49eb04 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sun, 3 Dec 2023 01:22:18 +0100 Subject: [PATCH 010/356] Forgotten column with the reason for the ban OOOooops :D --- BanManager.cs | 8 +++++--- CS2-SimpleAdmin.cs | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/BanManager.cs b/BanManager.cs index 2a6213f..eb2f77a 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -23,14 +23,15 @@ namespace CS2_SimpleAdmin DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); - var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `duration`, `ends`, `created`) " + - "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @duration, @ends, @created)"; + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; _dbConnection.Execute(sql, new { playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), playerName = player.PlayerName, adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), adminName = issuer == null ? "Console" : issuer.PlayerName, + banReason = reason, duration = time, ends = futureTime, created = now @@ -58,7 +59,8 @@ namespace CS2_SimpleAdmin _dbConnection.Open(); string sql = "UPDATE sa_bans SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; - int affectedRows = _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); + _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); + //int affectedRows = _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); _dbConnection.Close(); } diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index fcada0b..325e196 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -61,6 +61,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Sun, 3 Dec 2023 01:23:46 +0100 Subject: [PATCH 011/356] Fixed map permission --- CS2-SimpleAdmin.cs | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 325e196..962f116 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -202,7 +202,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnMapCommand(CCSPlayerController? caller, CommandInfo command) { diff --git a/README.md b/README.md index dd3661d..78a726c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_kick <#userid or name> [reason] - Kick player / @css/kick - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay -- css_map - Change map // @css/map +- css_map - Change map // @css/changemap - css_say - Say message as admin in chat // @css/chat - css_psay <#userid or name> - Sends private message to player // @css/chat - css_csay - Say message as admin in center // @css/chat From 5ea71f1679257cd2c27454b3cc4f2dc6b3774165 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sun, 3 Dec 2023 13:37:54 +0100 Subject: [PATCH 012/356] New commands, addban and unban --- BanManager.cs | 42 ++++++++++++++++++++++++++ CS2-SimpleAdmin.cs | 73 ++++++++++++++++++++++++++++++++++++++++++++-- Helper.cs | 13 +++++++++ README.md | 2 ++ 4 files changed, 128 insertions(+), 2 deletions(-) diff --git a/BanManager.cs b/BanManager.cs index eb2f77a..1eb7662 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -1,7 +1,9 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities; using Dapper; using MySqlConnector; using System.Data; +using System.Xml.Linq; namespace CS2_SimpleAdmin { @@ -40,6 +42,31 @@ namespace CS2_SimpleAdmin _dbConnection.Close(); } + public void AddBanBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0) + { + if (string.IsNullOrEmpty(playerSteamId)) return; + + _dbConnection.Open(); + + DateTime now = DateTime.Now; + DateTime futureTime = now.AddMinutes(time); + + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + _dbConnection.Execute(sql, new + { + playerSteamid = playerSteamId, + adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminName = issuer == null ? "Console" : issuer.PlayerName, + banReason = reason, + duration = time, + ends = futureTime, + created = now + }); + + _dbConnection.Close(); + } + public bool IsPlayerBanned(string steamId) { _dbConnection.Open(); @@ -54,6 +81,21 @@ namespace CS2_SimpleAdmin return banCount > 0; } + public void UnbanPlayer(string playerPattern) + { + if (playerPattern == null || playerPattern.Length <= 1) + { + return; + } + + _dbConnection.Open(); + + string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern"; + _dbConnection.Execute(sqlUnban, new { pattern = playerPattern }); + + _dbConnection.Close(); + } + public void ExpireOldBans() { _dbConnection.Open(); diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 962f116..002c1fd 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -8,7 +8,6 @@ using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Logging; using MySqlConnector; -using static System.Net.Mime.MediaTypeNames; namespace CS2_SimpleAdmin; public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig @@ -58,7 +57,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer(player!.UserId)); + } + [ConsoleCommand("css_addban")] + [RequiresPermissions("@css/ban")] + [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnAddBanCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.ArgCount < 2) + return; + if (string.IsNullOrEmpty(command.GetArg(1))) return; + + string steamid = command.GetArg(1); + + if (!Helper.IsValidSteamID64(steamid)) + { + command.ReplyToCommand($"Invalid SteamID64."); + return; + } + + int time = 0; + string reason = "Unknown"; + + BanManager _banManager = new(dbConnectionString); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3) + reason = command.GetArg(3); + + _banManager.AddBanBySteamid(steamid, caller, reason, time); + + List matches = Helper.GetPlayerFromSteamid64(steamid); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null) + { + if (time == 0) + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + else + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + AddTimer(10.0f, () => Helper.KickPlayer(player.UserId)); + } + } + command.ReplyToCommand($"Banned player with steamid {steamid}."); + } + + [ConsoleCommand("css_unban")] + [RequiresPermissions("@css/unban")] + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.GetArg(1).Length <= 1) + { + command.ReplyToCommand($"Too short pattern to search."); + return; + } + + string pattern = command.GetArg(1); + BanManager _banManager = new(dbConnectionString); + + _banManager.UnbanPlayer(pattern); + + command.ReplyToCommand($"Unbanned player with pattern {pattern}."); } [ConsoleCommand("css_slay")] diff --git a/Helper.cs b/Helper.cs index bd5eceb..7868106 100644 --- a/Helper.cs +++ b/Helper.cs @@ -3,6 +3,7 @@ using CounterStrikeSharp.API; using MySqlConnector; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; +using System.Text.RegularExpressions; namespace CS2_SimpleAdmin { @@ -15,6 +16,18 @@ namespace CS2_SimpleAdmin return Utilities.GetPlayers().FindAll(x => x.PlayerName.Contains(name, StringComparison.OrdinalIgnoreCase)); } + public static List GetPlayerFromSteamid64(string steamid) + { + return Utilities.GetPlayers().FindAll(x => x.AuthorizedSteamID!.SteamId64.ToString().Equals(steamid)); + } + + public static bool IsValidSteamID64(string input) + { + string pattern = @"^\d{17}$"; + + return Regex.IsMatch(input, pattern); + } + public static TargetResult GetTarget(string target, out CCSPlayerController? player) { player = null; diff --git a/README.md b/README.md index 78a726c..87a9044 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ It's only plugin base, I don't have much time for more extensive development, so ### Commands - css_admin - Display all admin commands // @css/generic - css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player // @css/ban +- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64 // @css/ban +- css_unban - Unban player // @css/unban - css_kick <#userid or name> [reason] - Kick player / @css/kick - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay From bce6bd43480939d986837970680f09f83c34df05 Mon Sep 17 00:00:00 2001 From: StefanX <60297289+stefanx111@users.noreply.github.com> Date: Sun, 3 Dec 2023 17:31:10 +0200 Subject: [PATCH 013/356] admin name in css_say --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 002c1fd..5a04aa4 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -296,7 +296,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Sun, 3 Dec 2023 18:19:33 +0200 Subject: [PATCH 014/356] revert: range syntax instead of Substring --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 5a04aa4..5336e95 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -296,7 +296,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Sun, 3 Dec 2023 19:22:34 +0100 Subject: [PATCH 015/356] KickTime in config, and gag --- BanManager.cs | 3 +- CS2-SimpleAdmin.cs | 184 +++++++++++++++++++++++++++++++++++++++++++-- Config.cs | 11 ++- Events.cs | 54 ++++++++++++- Helper.cs | 5 +- MuteManager.cs | 137 +++++++++++++++++++++++++++++++++ README.md | 4 +- 7 files changed, 387 insertions(+), 11 deletions(-) create mode 100644 MuteManager.cs diff --git a/BanManager.cs b/BanManager.cs index 1eb7662..5d6fe3e 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -53,6 +53,7 @@ namespace CS2_SimpleAdmin var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + _dbConnection.Execute(sql, new { playerSteamid = playerSteamId, @@ -90,7 +91,7 @@ namespace CS2_SimpleAdmin _dbConnection.Open(); - string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern"; + string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern AND status = 'ACTIVE'"; _dbConnection.Execute(sqlUnban, new { pattern = playerPattern }); _dbConnection.Close(); diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 002c1fd..32843e6 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -4,6 +4,7 @@ using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Cvars; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Logging; @@ -12,6 +13,8 @@ using MySqlConnector; namespace CS2_SimpleAdmin; public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + public List gaggedPlayers = new List(); + internal string dbConnectionString = string.Empty; public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleDescription => ""; @@ -70,6 +73,24 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 2) reason = command.GetArg(2); @@ -113,17 +134,168 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 2) { player!.PrintToCenter($"{Config.Messages.PlayerKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); - AddTimer(10.0f, () => Helper.KickPlayer(player!.UserId, reason)); + AddTimer(Config.KickTime, () => Helper.KickPlayer(player!.UserId, reason)); } else { - AddTimer(10.0f, () => Helper.KickPlayer(player!.UserId)); + AddTimer(Config.KickTime, () => Helper.KickPlayer(player!.UserId)); } Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); } + [ConsoleCommand("css_gag")] + [RequiresPermissions("@css/chat")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnGagCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out var player)) + return; + if (command.ArgCount < 2) + return; + + int time = 0; + string reason = "Unknown"; + + MuteManager _muteManager = new(dbConnectionString); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3) + reason = command.GetArg(3); + + _muteManager.MutePlayer(player, caller, reason, time, 0); + + if (!gaggedPlayers.Contains((int)player!.Index)) + gaggedPlayers.Add((int)player.Index); + + if (time == 0) + { + player!.PrintToCenter($"{Config.Messages.PlayerGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + else + { + player!.PrintToCenter($"{Config.Messages.PlayerGagMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGagMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + } + + [ConsoleCommand("css_addgag")] + [RequiresPermissions("@css/chat")] + [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnAddGagCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.ArgCount < 2) + return; + if (string.IsNullOrEmpty(command.GetArg(1))) return; + + string steamid = command.GetArg(1); + + if (!Helper.IsValidSteamID64(steamid)) + { + command.ReplyToCommand($"Invalid SteamID64."); + return; + } + + int time = 0; + string reason = "Unknown"; + + MuteManager _muteManager = new(dbConnectionString); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3) + reason = command.GetArg(3); + + _muteManager.AddMuteBySteamid(steamid, caller, reason, time, 0); + + List matches = Helper.GetPlayerFromSteamid64(steamid); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null) + { + if (time == 0) + { + player!.PrintToCenter($"{Config.Messages.PlayerGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + else + { + player!.PrintToCenter($"{Config.Messages.PlayerGagMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGagMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + if (!gaggedPlayers.Contains((int)player.Index)) + gaggedPlayers.Add((int)player.Index); + } + } + command.ReplyToCommand($"Gagged player with steamid {steamid}."); + } + + [ConsoleCommand("css_unmute")] + [RequiresPermissions("@css/chat")] + [CommandHelper(minArgs: 1, usage: " ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnUnmuteCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.GetArg(1).Length <= 1) + { + command.ReplyToCommand($"Too short pattern to search."); + return; + } + + string pattern = command.GetArg(1); + + MuteManager _muteManager = new(dbConnectionString); + + if (Helper.IsValidSteamID64(pattern)) + { + List matches = Helper.GetPlayerFromSteamid64(pattern); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null) + { + gaggedPlayers.Remove((int)player.Index); + } + } + } + else + { + List matches = Helper.GetPlayerFromName(pattern); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null) + { + gaggedPlayers.Remove((int)player.Index); + } + } + } + + if (command.ArgCount >= 3) + { + string? action = command.GetArg(2)?.ToLower(); + + if (action == "gag") + { + _muteManager.UnmutePlayer(pattern, 0); // Unmute by type 0 (gag) + } + else if (action == "mute") + { + _muteManager.UnmutePlayer(pattern, 1); // Unmute by type 1 (mute) + } + } + else + { + _muteManager.UnmutePlayer(pattern, 2); // Default unmute (all types) + } + + command.ReplyToCommand($"Unmuted player with pattern {pattern}."); + } + [ConsoleCommand("css_ban")] [RequiresPermissions("@css/ban")] [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -159,7 +331,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer(player!.UserId)); + AddTimer(Config.KickTime, () => Helper.KickPlayer(player!.UserId)); } [ConsoleCommand("css_addban")] @@ -197,6 +369,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer(player.UserId)); + AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId)); } } command.ReplyToCommand($"Banned player with steamid {steamid}."); diff --git a/Config.cs b/Config.cs index 569b434..fccdaa6 100644 --- a/Config.cs +++ b/Config.cs @@ -11,13 +11,20 @@ namespace CS2_SimpleAdmin public string PlayerBanMessagePerm { get; set; } = "You have been banned permanently for {REASON} by {ADMIN}!"; [JsonPropertyName("PlayerKickMessage")] public string PlayerKickMessage { get; set; } = "You have been kicked for {REASON} by {ADMIN}!"; + [JsonPropertyName("PlayerGagMessageTime")] + public string PlayerGagMessageTime { get; set; } = "You have been gagged for {REASON} for {TIME} minutes by {ADMIN}!"; + [JsonPropertyName("PlayerGagMessagePerm")] + public string PlayerGagMessagePerm { get; set; } = "You have been gagged permanently for {REASON} by {ADMIN}!"; [JsonPropertyName("AdminBanMessageTime")] public string AdminBanMessageTime { get; set; } = "Admin {ADMIN} banned {PLAYER} for {REASON} for {TIME} minutes!"; [JsonPropertyName("AdminBanMessagePerm")] public string AdminBanMessagePerm { get; set; } = "Admin {ADMIN} banned {PLAYER} permanently for {REASON}"; - [JsonPropertyName("AdminKickMessage")] public string AdminKickMessage { get; set; } = "Admin {ADMIN} kicked {PLAYER} for {REASON}!"; + [JsonPropertyName("AdminGagMessageTime")] + public string AdminGagMessageTime { get; set; } = "Admin {ADMIN} gagged {PLAYER} for {REASON} for {TIME} minutes!"; + [JsonPropertyName("AdminGagMessagePerm")] + public string AdminGagMessagePerm { get; set; } = "Admin {ADMIN} gagged {PLAYER} permanently for {REASON}"; [JsonPropertyName("AdminSlayMessage")] public string AdminSlayMessage { get; set; } = "Admin {ADMIN} slayed {PLAYER}!"; [JsonPropertyName("AdminSlapMessage")] @@ -63,6 +70,8 @@ namespace CS2_SimpleAdmin [JsonPropertyName("Prefix")] public string Prefix { get; set; } = "{GREEN}[SimpleAdmin]"; + [JsonPropertyName("KickTime")] + public int KickTime { get; set; } = 10; [JsonPropertyName("Messages")] public Messages Messages { get; set; } = new Messages(); diff --git a/Events.cs b/Events.cs index 6ed895b..cce3bf4 100644 --- a/Events.cs +++ b/Events.cs @@ -1,6 +1,8 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Entities; +using static CounterStrikeSharp.API.Core.Listeners; namespace CS2_SimpleAdmin { @@ -8,8 +10,23 @@ namespace CS2_SimpleAdmin { private void registerEvents() { - RegisterListener(OnClientAuthorized); - RegisterListener(OnMapStart); + RegisterListener(OnClientAuthorized); + RegisterListener(OnClientDisconnect); + RegisterListener(OnMapStart); + AddCommandListener("say", OnCommandSay); + AddCommandListener("say_team", OnCommandSay); + } + + private HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) + { + if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; + + if (gaggedPlayers.Contains((int)player.Index)) + { + return HookResult.Handled; + } + + return HookResult.Continue; } private void OnClientAuthorized(int playerSlot, SteamID steamID) @@ -28,20 +45,53 @@ namespace CS2_SimpleAdmin } BanManager _banManager = new(dbConnectionString); + MuteManager _muteManager = new(dbConnectionString); bool isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString()); + List activeMutes = _muteManager.IsPlayerMuted(player.AuthorizedSteamID.SteamId64.ToString()); + if (activeMutes.Count > 0) + { + // Player is muted, handle mute + foreach (var mute in activeMutes) + { + string muteType = mute.type; + + if (muteType == "GAG") + { + if (!gaggedPlayers.Contains((int)player.Index)) + gaggedPlayers.Add((int)player.Index); + } + else + { + continue; + } + } + } + + // Player is banned, kick him if (isBanned) { Helper.KickPlayer(player.UserId, "Banned"); } } + private void OnClientDisconnect(int playerSlot) + { + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + + if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; + + gaggedPlayers.Remove((int)player.Index); + } + private void OnMapStart(string mapName) { AddTimer(120.0f, () => { BanManager _banManager = new(dbConnectionString); _banManager.ExpireOldBans(); + MuteManager _muteManager = new(dbConnectionString); + _muteManager.ExpireOldMutes(); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } diff --git a/Helper.cs b/Helper.cs index 7868106..fb534bf 100644 --- a/Helper.cs +++ b/Helper.cs @@ -18,7 +18,10 @@ namespace CS2_SimpleAdmin public static List GetPlayerFromSteamid64(string steamid) { - return Utilities.GetPlayers().FindAll(x => x.AuthorizedSteamID!.SteamId64.ToString().Equals(steamid)); + return Utilities.GetPlayers().FindAll(x => + x.AuthorizedSteamID != null && + x.AuthorizedSteamID.SteamId64.ToString().Equals(steamid, StringComparison.OrdinalIgnoreCase) + ); } public static bool IsValidSteamID64(string input) diff --git a/MuteManager.cs b/MuteManager.cs new file mode 100644 index 0000000..470cc36 --- /dev/null +++ b/MuteManager.cs @@ -0,0 +1,137 @@ +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities; +using Dapper; +using MySqlConnector; +using System.Data; +using System.Xml.Linq; + +namespace CS2_SimpleAdmin +{ + public class MuteManager + { + private readonly IDbConnection _dbConnection; + + public MuteManager(string connectionString) + { + _dbConnection = new MySqlConnection(connectionString); + } + + public void MutePlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) + { + _dbConnection.Open(); + + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + DateTime now = DateTime.Now; + DateTime futureTime = now.AddMinutes(time); + + string muteType = "GAG"; + + if (type == 1) + muteType = "MUTE"; + + var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`) " + + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type)"; + + _dbConnection.Execute(sql, new + { + playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), + playerName = player.PlayerName, + adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminName = issuer == null ? "Console" : issuer.PlayerName, + banReason = reason, + duration = time, + ends = futureTime, + created = now, + type = muteType, + }); + + _dbConnection.Close(); + } + + public void AddMuteBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) + { + if (string.IsNullOrEmpty(playerSteamId)) return; + + _dbConnection.Open(); + + DateTime now = DateTime.Now; + DateTime futureTime = now.AddMinutes(time); + + string muteType = "GAG"; + + if (type == 1) + muteType = "MUTE"; + + var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`) " + + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type)"; + + _dbConnection.Execute(sql, new + { + playerSteamid = playerSteamId, + adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminName = issuer == null ? "Console" : issuer.PlayerName, + banReason = reason, + duration = time, + ends = futureTime, + created = now, + type = muteType + }); + + _dbConnection.Close(); + } + + public List IsPlayerMuted(string steamId) + { + _dbConnection.Open(); + + DateTime now = DateTime.Now; + + string sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; + List activeMutes = _dbConnection.Query(sql, new { PlayerSteamID = steamId, CurrentTime = now }).ToList(); + + _dbConnection.Close(); + + return activeMutes; + } + + public void UnmutePlayer(string playerPattern, int type = 0) + { + if (playerPattern == null || playerPattern.Length <= 1) + { + return; + } + + if (type == 2) + { + string _unbanSql = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND status = 'ACTIVE'"; + _dbConnection.Execute(_unbanSql, new { pattern = playerPattern }); + _dbConnection.Close(); + + return; + } + + string muteType = "GAG"; + + if (type == 1) + muteType = "MUTE"; + + _dbConnection.Open(); + + string sqlUnban = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'"; + _dbConnection.Execute(sqlUnban, new { pattern = playerPattern, muteType }); + _dbConnection.Close(); + } + + public void ExpireOldMutes() + { + _dbConnection.Open(); + string sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; + _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); + //int affectedRows = _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); + + _dbConnection.Close(); + } + + } +} diff --git a/README.md b/README.md index 87a9044..2122681 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ It's only plugin base, I don't have much time for more extensive development, so - css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64 // @css/ban - css_unban - Unban player // @css/unban - css_kick <#userid or name> [reason] - Kick player / @css/kick +- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player // @css/chat +- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64 // @css/chat +- css_unmute - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay - css_map - Change map // @css/changemap @@ -26,7 +29,6 @@ It's only plugin base, I don't have much time for more extensive development, so - css_cvar - Change cvar value // @css/cvar - css_rcon - Run command as server // @css/rcon - ### Requirments [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v90** From d16b92e6942e1f60a0ee5fcd9f9a561cdd7b749e Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sun, 3 Dec 2023 21:05:38 +0100 Subject: [PATCH 016/356] IP address banning - IP address banning **Require CounterStrikeSharp v98** --- BanManager.cs | 49 +++++++++++++++++++++++++++----- CS2-SimpleAdmin.cs | 63 ++++++++++++++++++++++++++++++++++++++++-- CS2-SimpleAdmin.csproj | 6 ++-- Config.cs | 5 +++- Events.cs | 12 +++++++- Helper.cs | 15 ++++++++++ README.md | 3 +- 7 files changed, 137 insertions(+), 16 deletions(-) diff --git a/BanManager.cs b/BanManager.cs index 5d6fe3e..9f579d9 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -25,12 +25,13 @@ namespace CS2_SimpleAdmin DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); - var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + - "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + + "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; _dbConnection.Execute(sql, new { playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), playerName = player.PlayerName, + playerIp = player.IpAddress!.Split(":")[0], adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), adminName = issuer == null ? "Console" : issuer.PlayerName, banReason = reason, @@ -68,16 +69,50 @@ namespace CS2_SimpleAdmin _dbConnection.Close(); } - public bool IsPlayerBanned(string steamId) + public void AddBanByIp(string playerIp, CCSPlayerController? issuer, string reason, int time = 0) + { + if (string.IsNullOrEmpty(playerIp)) return; + + _dbConnection.Open(); + + DateTime now = DateTime.Now; + DateTime futureTime = now.AddMinutes(time); + + var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + + "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + + _dbConnection.Execute(sql, new + { + playerIp, + adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminName = issuer == null ? "Console" : issuer.PlayerName, + banReason = reason, + duration = time, + ends = futureTime, + created = now + }); + + _dbConnection.Close(); + } + + public bool IsPlayerBanned(string steamId, string? ipAddress = null) { _dbConnection.Open(); DateTime now = DateTime.Now; - string sql = "SELECT COUNT(*) FROM sa_bans WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; - int banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, CurrentTime = now }); + string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; - _dbConnection.Close(); + int banCount; + + if (!string.IsNullOrEmpty(ipAddress)) + { + banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, PlayerIP = ipAddress, CurrentTime = now }); + } + else + { + banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, PlayerIP = DBNull.Value, CurrentTime = now }); + } return banCount > 0; } @@ -91,7 +126,7 @@ namespace CS2_SimpleAdmin _dbConnection.Open(); - string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern AND status = 'ACTIVE'"; + string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; _dbConnection.Execute(sqlUnban, new { pattern = playerPattern }); _dbConnection.Close(); diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 32843e6..54b8e90 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; @@ -11,6 +12,7 @@ using Microsoft.Extensions.Logging; using MySqlConnector; namespace CS2_SimpleAdmin; +[MinimumApiVersion(98)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public List gaggedPlayers = new List(); @@ -19,7 +21,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.1"; + public override string ModuleVersion => "1.0.3"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -59,8 +61,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnBanIp(CCSPlayerController? caller, CommandInfo command) + { + if (command.ArgCount < 2) + return; + if (string.IsNullOrEmpty(command.GetArg(1))) return; + + string ipAddress = command.GetArg(1); + + if (!Helper.IsValidIP(ipAddress)) + { + command.ReplyToCommand($"Invalid IP address."); + return; + } + + int time = 0; + string reason = "Unknown"; + + BanManager _banManager = new(dbConnectionString); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3) + reason = command.GetArg(3); + + _banManager.AddBanByIp(ipAddress, caller, reason, time); + + List matches = Helper.GetPlayerFromIp(ipAddress); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null) + { + player!.Pawn.Value!.Freeze(); + + if (time == 0) + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + else + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId)); + } + } + command.ReplyToCommand($"Banned player with IP address {ipAddress}."); + } + [ConsoleCommand("css_unban")] [RequiresPermissions("@css/unban")] - [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command) { if (command.GetArg(1).Length <= 1) diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index e0ae93f..3c9bbfc 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/Config.cs b/Config.cs index fccdaa6..4967edd 100644 --- a/Config.cs +++ b/Config.cs @@ -42,7 +42,10 @@ namespace CS2_SimpleAdmin [JsonPropertyName("AdminSayPrefix")] public string AdminSayPrefix { get; set; } = "{RED}ADMIN: {DEFAULT}"; [JsonPropertyName("AdminHelpCommand")] - public string AdminHelpCommand { get; set; } = "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_kick <#userid or name> [reason] - Kick player\n" + + public string AdminHelpCommand { get; set; } = "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n" + + "- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n" + + "- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n" + + "- css_unmute - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_say - Say message as admin in chat\n" + "- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n" + "- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n" + diff --git a/Events.cs b/Events.cs index cce3bf4..10a921a 100644 --- a/Events.cs +++ b/Events.cs @@ -46,7 +46,17 @@ namespace CS2_SimpleAdmin BanManager _banManager = new(dbConnectionString); MuteManager _muteManager = new(dbConnectionString); - bool isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString()); + + bool isBanned = false; + if (player.IpAddress != null) + { + isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString(), player.IpAddress.Split(":")[0]); + } + else + { + isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString()); + } + List activeMutes = _muteManager.IsPlayerMuted(player.AuthorizedSteamID.SteamId64.ToString()); if (activeMutes.Count > 0) diff --git a/Helper.cs b/Helper.cs index fb534bf..bf6940d 100644 --- a/Helper.cs +++ b/Helper.cs @@ -24,6 +24,14 @@ namespace CS2_SimpleAdmin ); } + public static List GetPlayerFromIp(string ipAddress) + { + return Utilities.GetPlayers().FindAll(x => + x.IpAddress != null && + x.IpAddress.Split(":")[0].Equals(ipAddress) + ); + } + public static bool IsValidSteamID64(string input) { string pattern = @"^\d{17}$"; @@ -31,6 +39,13 @@ namespace CS2_SimpleAdmin return Regex.IsMatch(input, pattern); } + public static bool IsValidIP(string input) + { + string pattern = @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; + + return Regex.IsMatch(input, pattern); + } + public static TargetResult GetTarget(string target, out CCSPlayerController? player) { player = null; diff --git a/README.md b/README.md index 2122681..4e81e1c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ It's only plugin base, I don't have much time for more extensive development, so - css_admin - Display all admin commands // @css/generic - css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player // @css/ban - css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64 // @css/ban -- css_unban - Unban player // @css/unban +- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address // @css/ban +- css_unban - Unban player // @css/unban - css_kick <#userid or name> [reason] - Kick player / @css/kick - css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player // @css/chat - css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64 // @css/chat From 2ea03caeeded873709506fd73f2589dec3a4308f Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sun, 3 Dec 2023 21:08:37 +0100 Subject: [PATCH 017/356] Update build.yml --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 472aa91..c93c496 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,8 +3,12 @@ name: Build on: push: branches: [ "main" ] + paths-ignore: + - '**/README.md' pull_request: branches: [ "main" ] + paths-ignore: + - '**/README.md' env: BUILD_NUMBER: ${{ github.run_number }} From 90efff5d24035b849e6eba19c734682fc65675b7 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sun, 3 Dec 2023 21:09:20 +0100 Subject: [PATCH 018/356] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4e81e1c..e777e66 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Manage your Counter-Strike 2 server by simple commands :) It's only plugin base, I don't have much time for more extensive development, so if you want to help, do it :) ### Commands +```js - css_admin - Display all admin commands // @css/generic - css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player // @css/ban - css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64 // @css/ban @@ -29,6 +30,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_respawn <#userid or name> - Respawn player // @css/cheats - css_cvar - Change cvar value // @css/cvar - css_rcon - Run command as server // @css/rcon +``` ### Requirments [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v90** From 696b8c387780af4db3671b7ffa0b542c9b8f8829 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sun, 3 Dec 2023 21:18:43 +0100 Subject: [PATCH 019/356] Added css_wsmap - css_wsmap - Change workshop map // @css/changemap --- CS2-SimpleAdmin.cs | 19 +++++++++++++++++++ Config.cs | 2 +- README.md | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index a1def61..348985d 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -522,6 +522,25 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig")] + [RequiresPermissions("@css/changemap")] + public void OnWorkshopMapCommand(CCSPlayerController? caller, CommandInfo command) + { + string? _command = null; + var map = command.GetArg(1); + + _command = ulong.TryParse(map, out var mapId) ? $"host_workshop_map {mapId}" : $"ds_workshop_changelevel {map}"; + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminChangeMap}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{MAP}", map))); + + AddTimer(5f, () => + { + Server.ExecuteCommand(_command); + }); + } + [ConsoleCommand("css_say", "Say to all players.")] [CommandHelper(1, "")] [RequiresPermissions("@css/chat")] diff --git a/Config.cs b/Config.cs index 4967edd..d9210b3 100644 --- a/Config.cs +++ b/Config.cs @@ -46,7 +46,7 @@ namespace CS2_SimpleAdmin "- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n" + "- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n" + "- css_unmute - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_say - Say message as admin in chat\n" + + "- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_say - Say message as admin in chat\n" + "- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n" + "- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n" + "- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server"; diff --git a/README.md b/README.md index e777e66..6ecb7aa 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay - css_map - Change map // @css/changemap +- css_wsmap - Change workshop map // @css/changemap - css_say - Say message as admin in chat // @css/chat - css_psay <#userid or name> - Sends private message to player // @css/chat - css_csay - Say message as admin in center // @css/chat From 13e170a9c4da142ec9d53e70bbe9ada25aea66a7 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sun, 3 Dec 2023 23:37:44 +0100 Subject: [PATCH 020/356] Changed to async, instantly mute in CS2-Tags plugin - Changed to async - instantly mute in CS2-Tags plugin --- BanManager.cs | 93 +++++++++++++++++++------------- CS2-SimpleAdmin.cs | 44 ++++++++++----- Events.cs | 54 ++++++------------- MuteManager.cs | 130 ++++++++++++++++++++++++++++++++++----------- 4 files changed, 200 insertions(+), 121 deletions(-) diff --git a/BanManager.cs b/BanManager.cs index 9f579d9..13a74b5 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -9,79 +9,78 @@ namespace CS2_SimpleAdmin { internal class BanManager { - private readonly IDbConnection _dbConnection; + private readonly MySqlConnection _dbConnection; public BanManager(string connectionString) { _dbConnection = new MySqlConnection(connectionString); } - - public void BanPlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0) + public async Task BanPlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0) { - _dbConnection.Open(); - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); + await using var connection = _dbConnection; + await connection.OpenAsync(); + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; - _dbConnection.Execute(sql, new + + await connection.ExecuteAsync(sql, new { playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), playerName = player.PlayerName, playerIp = player.IpAddress!.Split(":")[0], - adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminSteamid = issuer == null ? "Console" : issuer.AuthorizedSteamID?.SteamId64.ToString(), adminName = issuer == null ? "Console" : issuer.PlayerName, banReason = reason, duration = time, ends = futureTime, created = now }); - - _dbConnection.Close(); } - public void AddBanBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0) + public async Task AddBanBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0) { if (string.IsNullOrEmpty(playerSteamId)) return; - _dbConnection.Open(); - DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); + await using var connection = _dbConnection; + await connection.OpenAsync(); + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; - _dbConnection.Execute(sql, new + await connection.ExecuteAsync(sql, new { playerSteamid = playerSteamId, - adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminSteamid = issuer == null ? "Console" : issuer.AuthorizedSteamID?.SteamId64.ToString(), adminName = issuer == null ? "Console" : issuer.PlayerName, banReason = reason, duration = time, ends = futureTime, created = now }); - - _dbConnection.Close(); } - public void AddBanByIp(string playerIp, CCSPlayerController? issuer, string reason, int time = 0) + public async Task AddBanByIp(string playerIp, CCSPlayerController? issuer, string reason, int time = 0) { if (string.IsNullOrEmpty(playerIp)) return; - _dbConnection.Open(); - DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); + await using var connection = _dbConnection; + await connection.OpenAsync(); + var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; - _dbConnection.Execute(sql, new + await connection.ExecuteAsync(sql, new { playerIp, adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), @@ -91,56 +90,76 @@ namespace CS2_SimpleAdmin ends = futureTime, created = now }); - - _dbConnection.Close(); } - public bool IsPlayerBanned(string steamId, string? ipAddress = null) + public async Task IsPlayerBanned(string steamId, string? ipAddress = null) { - _dbConnection.Open(); - DateTime now = DateTime.Now; string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; int banCount; + await using var connection = _dbConnection; + await connection.OpenAsync(); + if (!string.IsNullOrEmpty(ipAddress)) { - banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, PlayerIP = ipAddress, CurrentTime = now }); + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId, PlayerIP = ipAddress, CurrentTime = now }); } else { - banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, PlayerIP = DBNull.Value, CurrentTime = now }); + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId, PlayerIP = DBNull.Value, CurrentTime = now }); } return banCount > 0; } - public void UnbanPlayer(string playerPattern) + public async Task UnbanPlayer(string playerPattern) { if (playerPattern == null || playerPattern.Length <= 1) { return; } - _dbConnection.Open(); + await using var connection = _dbConnection; + await connection.OpenAsync(); string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; - _dbConnection.Execute(sqlUnban, new { pattern = playerPattern }); - - _dbConnection.Close(); + await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern }); } - public void ExpireOldBans() + public async Task ExpireOldBans() { - _dbConnection.Open(); + await using var connection = _dbConnection; + await connection.OpenAsync(); string sql = "UPDATE sa_bans SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; - _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); - //int affectedRows = _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); + await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); + } - _dbConnection.Close(); + public async Task CheckBan(CCSPlayerController? player) + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + string steamId = player.AuthorizedSteamID.SteamId64.ToString(); + string? ipAddress = player.IpAddress?.Split(":")[0]; + + bool isBanned = false; + + if (ipAddress != null) + { + isBanned = await IsPlayerBanned(steamId, ipAddress); + } + else + { + isBanned = await IsPlayerBanned(steamId); + } + + if (isBanned) + { + Helper.KickPlayer(player.UserId, "Banned"); + } } } diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 348985d..bf4647b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -15,13 +15,14 @@ namespace CS2_SimpleAdmin; [MinimumApiVersion(98)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - public List gaggedPlayers = new List(); + public static List gaggedPlayers = new List(); + public static bool TagsDetected = false; internal string dbConnectionString = string.Empty; public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.3"; + public override string ModuleVersion => "1.0.4"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -168,11 +169,15 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _muteManager.MutePlayer(player, caller, reason, time, 0); + _ = _muteManager.MutePlayer(player, caller, reason, time, 0); + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_mute {player!.Index.ToString()}"); if (!gaggedPlayers.Contains((int)player!.Index)) gaggedPlayers.Add((int)player.Index); + if (time == 0) { player!.PrintToCenter($"{Config.Messages.PlayerGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); @@ -212,7 +217,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _muteManager.AddMuteBySteamid(steamid, caller, reason, time, 0); + _ = _muteManager.AddMuteBySteamid(steamid, caller, reason, time, 0); List matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) @@ -231,6 +236,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _banManager.BanPlayer(player, caller, reason, time); + _ = _banManager.BanPlayer(player, caller, reason, time); if (time == 0) { @@ -364,7 +382,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _banManager.AddBanBySteamid(steamid, caller, reason, time); + _ = _banManager.AddBanBySteamid(steamid, caller, reason, time); List matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) @@ -418,7 +436,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _banManager.AddBanByIp(ipAddress, caller, reason, time); + _ = _banManager.AddBanByIp(ipAddress, caller, reason, time); List matches = Helper.GetPlayerFromIp(ipAddress); if (matches.Count == 1) @@ -459,7 +477,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig activeMutes = _muteManager.IsPlayerMuted(player.AuthorizedSteamID.SteamId64.ToString()); - - if (activeMutes.Count > 0) - { - // Player is muted, handle mute - foreach (var mute in activeMutes) - { - string muteType = mute.type; - - if (muteType == "GAG") - { - if (!gaggedPlayers.Contains((int)player.Index)) - gaggedPlayers.Add((int)player.Index); - } - else - { - continue; - } - } - } - - // Player is banned, kick him - if (isBanned) - { - Helper.KickPlayer(player.UserId, "Banned"); - } + _ = _banManager.CheckBan(player); + _ = _muteManager.CheckMute(player); } private void OnClientDisconnect(int playerSlot) @@ -91,7 +57,11 @@ namespace CS2_SimpleAdmin if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; - gaggedPlayers.Remove((int)player.Index); + if (gaggedPlayers.Contains((int)player.Index)) + gaggedPlayers.Remove((int)player.Index); + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.Index.ToString()}"); } private void OnMapStart(string mapName) @@ -99,10 +69,16 @@ namespace CS2_SimpleAdmin AddTimer(120.0f, () => { BanManager _banManager = new(dbConnectionString); - _banManager.ExpireOldBans(); + _ = _banManager.ExpireOldBans(); MuteManager _muteManager = new(dbConnectionString); - _muteManager.ExpireOldMutes(); + _ = _muteManager.ExpireOldMutes(); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + string? path = Path.GetDirectoryName(ModuleDirectory); + if (Directory.Exists(path + "/CS2-Tags")) + { + TagsDetected = true; + } } } } diff --git a/MuteManager.cs b/MuteManager.cs index 470cc36..c6f9243 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -1,39 +1,37 @@ using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; using Dapper; using MySqlConnector; using System.Data; -using System.Xml.Linq; namespace CS2_SimpleAdmin { public class MuteManager { - private readonly IDbConnection _dbConnection; + private readonly MySqlConnection _dbConnection; public MuteManager(string connectionString) { _dbConnection = new MySqlConnection(connectionString); } - public void MutePlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) + public async Task MutePlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) { - _dbConnection.Open(); - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + await using var connection = _dbConnection; + await connection.OpenAsync(); + DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); string muteType = "GAG"; - if (type == 1) muteType = "MUTE"; var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`) " + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type)"; - _dbConnection.Execute(sql, new + await connection.ExecuteAsync(sql, new { playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), playerName = player.PlayerName, @@ -46,27 +44,30 @@ namespace CS2_SimpleAdmin type = muteType, }); - _dbConnection.Close(); + if (connection.State != ConnectionState.Closed) + { + connection.Close(); + } } - public void AddMuteBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) + public async Task AddMuteBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) { if (string.IsNullOrEmpty(playerSteamId)) return; - _dbConnection.Open(); + await using var connection = _dbConnection; + await connection.OpenAsync(); DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); string muteType = "GAG"; - if (type == 1) muteType = "MUTE"; var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`) " + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type)"; - _dbConnection.Execute(sql, new + await connection.ExecuteAsync(sql, new { playerSteamid = playerSteamId, adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), @@ -78,60 +79,125 @@ namespace CS2_SimpleAdmin type = muteType }); - _dbConnection.Close(); + if (connection.State != ConnectionState.Closed) + { + connection.Close(); + } } - public List IsPlayerMuted(string steamId) + public async Task> IsPlayerMuted(string steamId) { - _dbConnection.Open(); + await using var connection = _dbConnection; + await connection.OpenAsync(); DateTime now = DateTime.Now; string sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; - List activeMutes = _dbConnection.Query(sql, new { PlayerSteamID = steamId, CurrentTime = now }).ToList(); + var activeMutes = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now })).ToList(); - _dbConnection.Close(); + if (connection.State != ConnectionState.Closed) + { + connection.Close(); + } return activeMutes; } - public void UnmutePlayer(string playerPattern, int type = 0) + public async Task UnmutePlayer(string playerPattern, int type = 0) { if (playerPattern == null || playerPattern.Length <= 1) { return; } + await using var connection = _dbConnection; + await connection.OpenAsync(); + if (type == 2) { string _unbanSql = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND status = 'ACTIVE'"; - _dbConnection.Execute(_unbanSql, new { pattern = playerPattern }); - _dbConnection.Close(); + await connection.ExecuteAsync(_unbanSql, new { pattern = playerPattern }); + + if (connection.State != ConnectionState.Closed) + { + connection.Close(); + } return; } string muteType = "GAG"; - if (type == 1) + { muteType = "MUTE"; - - _dbConnection.Open(); + } string sqlUnban = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'"; - _dbConnection.Execute(sqlUnban, new { pattern = playerPattern, muteType }); - _dbConnection.Close(); + await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern, muteType }); + + if (connection.State != ConnectionState.Closed) + { + connection.Close(); + } } - public void ExpireOldMutes() + public async Task ExpireOldMutes() { - _dbConnection.Open(); - string sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; - _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); - //int affectedRows = _dbConnection.Execute(sql, new { CurrentTime = DateTime.Now }); + await using var connection = _dbConnection; + await connection.OpenAsync(); - _dbConnection.Close(); + string sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; + await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); + + if (connection.State != ConnectionState.Closed) + { + connection.Close(); + } } + public async Task CheckMute(CCSPlayerController? player) + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + string steamId = player.AuthorizedSteamID.SteamId64.ToString(); + List activeMutes = await IsPlayerMuted(steamId); + + if (activeMutes.Count > 0) + { + foreach (var mute in activeMutes) + { + string muteType = mute.type; + TimeSpan duration = mute.ends - mute.created; + int durationInSeconds = (int)duration.TotalSeconds; + + if (muteType == "GAG") + { + if (!CS2_SimpleAdmin.gaggedPlayers.Contains((int)player.Index)) + CS2_SimpleAdmin.gaggedPlayers.Add((int)player.Index); + + if (CS2_SimpleAdmin.TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_mute {player!.Index.ToString()}"); + + CCSPlayerController currentPlayer = player; + + if (mute.duration == 0 || durationInSeconds >= 1800) continue; + + await Task.Delay(TimeSpan.FromSeconds(durationInSeconds)); + + if (currentPlayer != null && currentPlayer.IsValid) + { + NativeAPI.IssueServerCommand($"css_tag_unmute {currentPlayer.Index.ToString()}"); + await UnmutePlayer(currentPlayer.AuthorizedSteamID.SteamId64.ToString(), 0); + } + } + else + { + // Mic mute + } + } + } + } + + } } From bd0f21b2adece30b1e23ca14655fd45e8b4a26bc Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Mon, 4 Dec 2023 00:16:21 +0100 Subject: [PATCH 021/356] Auto unmute after mute, max 30 minutes --- CS2-SimpleAdmin.cs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index bf4647b..545f494 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.4"; + public override string ModuleVersion => "1.0.4a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -177,6 +177,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) + { + AddTimer(time * 60, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index.ToString()}"); + + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } if (time == 0) { @@ -239,6 +251,19 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) + { + AddTimer(time * 60, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index.ToString()}"); + + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + if (!gaggedPlayers.Contains((int)player.Index)) gaggedPlayers.Add((int)player.Index); } From 9c293e62013f496c59eb7fed45e8067064f689e7 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Mon, 4 Dec 2023 00:43:47 +0100 Subject: [PATCH 022/356] . --- CS2-SimpleAdmin.cs | 21 ++++++++++++++++----- Events.cs | 7 ++++++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 545f494..091a41a 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -5,24 +5,24 @@ using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Cvars; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Logging; using MySqlConnector; +using System.Collections.Concurrent; namespace CS2_SimpleAdmin; [MinimumApiVersion(98)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - public static List gaggedPlayers = new List(); + public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); public static bool TagsDetected = false; internal string dbConnectionString = string.Empty; public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.4a"; + public override string ModuleVersion => "1.0.4b"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -295,7 +295,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Mon, 4 Dec 2023 17:34:21 +0100 Subject: [PATCH 023/356] Hotfix for cssharp 101 Hotfix for non-main thread --- BanManager.cs | 65 ++++++++--------------------- CS2-SimpleAdmin.cs | 101 ++++++++++++++++++++++++++++++++++++--------- Events.cs | 71 ++++++++++++++++++++++++++++--- Helper.cs | 3 +- MuteManager.cs | 53 +++++++----------------- PlayerInfo.cs | 17 ++++++++ 6 files changed, 197 insertions(+), 113 deletions(-) create mode 100644 PlayerInfo.cs diff --git a/BanManager.cs b/BanManager.cs index 13a74b5..f41d5bf 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -1,9 +1,5 @@ -using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; -using Dapper; +using Dapper; using MySqlConnector; -using System.Data; -using System.Xml.Linq; namespace CS2_SimpleAdmin { @@ -15,10 +11,8 @@ namespace CS2_SimpleAdmin { _dbConnection = new MySqlConnection(connectionString); } - public async Task BanPlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0) + public async Task BanPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0) { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); @@ -30,11 +24,11 @@ namespace CS2_SimpleAdmin await connection.ExecuteAsync(sql, new { - playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), - playerName = player.PlayerName, - playerIp = player.IpAddress!.Split(":")[0], - adminSteamid = issuer == null ? "Console" : issuer.AuthorizedSteamID?.SteamId64.ToString(), - adminName = issuer == null ? "Console" : issuer.PlayerName, + playerSteamid = player.SteamId, + playerName = player.Name, + playerIp = player.IpAddress, + adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, + adminName = issuer.Name == null ? "Console" : issuer.Name, banReason = reason, duration = time, ends = futureTime, @@ -42,7 +36,7 @@ namespace CS2_SimpleAdmin }); } - public async Task AddBanBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0) + public async Task AddBanBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0) { if (string.IsNullOrEmpty(playerSteamId)) return; @@ -58,8 +52,8 @@ namespace CS2_SimpleAdmin await connection.ExecuteAsync(sql, new { playerSteamid = playerSteamId, - adminSteamid = issuer == null ? "Console" : issuer.AuthorizedSteamID?.SteamId64.ToString(), - adminName = issuer == null ? "Console" : issuer.PlayerName, + adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, + adminName = issuer.Name == null ? "Console" : issuer.Name, banReason = reason, duration = time, ends = futureTime, @@ -67,7 +61,7 @@ namespace CS2_SimpleAdmin }); } - public async Task AddBanByIp(string playerIp, CCSPlayerController? issuer, string reason, int time = 0) + public async Task AddBanByIp(string playerIp, PlayerInfo issuer, string reason, int time = 0) { if (string.IsNullOrEmpty(playerIp)) return; @@ -83,8 +77,8 @@ namespace CS2_SimpleAdmin await connection.ExecuteAsync(sql, new { playerIp, - adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), - adminName = issuer == null ? "Console" : issuer.PlayerName, + adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, + adminName = issuer.Name == null ? "Console" : issuer.Name, banReason = reason, duration = time, ends = futureTime, @@ -92,7 +86,7 @@ namespace CS2_SimpleAdmin }); } - public async Task IsPlayerBanned(string steamId, string? ipAddress = null) + public async Task IsPlayerBanned(PlayerInfo player) { DateTime now = DateTime.Now; @@ -103,13 +97,13 @@ namespace CS2_SimpleAdmin await using var connection = _dbConnection; await connection.OpenAsync(); - if (!string.IsNullOrEmpty(ipAddress)) + if (!string.IsNullOrEmpty(player.IpAddress)) { - banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId, PlayerIP = ipAddress, CurrentTime = now }); + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress, CurrentTime = now }); } else { - banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId, PlayerIP = DBNull.Value, CurrentTime = now }); + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value, CurrentTime = now }); } return banCount > 0; @@ -137,30 +131,5 @@ namespace CS2_SimpleAdmin string sql = "UPDATE sa_bans SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); } - - public async Task CheckBan(CCSPlayerController? player) - { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - - string steamId = player.AuthorizedSteamID.SteamId64.ToString(); - string? ipAddress = player.IpAddress?.Split(":")[0]; - - bool isBanned = false; - - if (ipAddress != null) - { - isBanned = await IsPlayerBanned(steamId, ipAddress); - } - else - { - isBanned = await IsPlayerBanned(steamId); - } - - if (isBanned) - { - Helper.KickPlayer(player.UserId, "Banned"); - } - } - } } diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 091a41a..da52c81 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -12,7 +12,7 @@ using MySqlConnector; using System.Collections.Concurrent; namespace CS2_SimpleAdmin; -[MinimumApiVersion(98)] +[MinimumApiVersion(101)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); @@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.4b"; + public override string ModuleVersion => "1.0.4c"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -138,12 +138,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 2) { player!.PrintToCenter($"{Config.Messages.PlayerKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); - AddTimer(Config.KickTime, () => Helper.KickPlayer(player!.UserId, reason)); - + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, reason)); } else { - AddTimer(Config.KickTime, () => Helper.KickPlayer(player!.UserId)); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); } Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); @@ -162,14 +161,30 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _ = _muteManager.MutePlayer(player, caller, reason, time, 0); + PlayerInfo playerInfo = new PlayerInfo + { + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + MuteManager _muteManager = new(dbConnectionString); + await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time); + }); if (TagsDetected) NativeAPI.IssueServerCommand($"css_tag_mute {player!.Index.ToString()}"); @@ -184,8 +199,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _ = _muteManager.AddMuteBySteamid(steamid, caller, reason, time, 0); + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + _ = _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 0); List matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) @@ -360,6 +383,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _ = _banManager.BanPlayer(player, caller, reason, time); + PlayerInfo playerInfo = new PlayerInfo + { + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + BanManager _banManager = new(dbConnectionString); + await _banManager.BanPlayer(playerInfo, adminInfo, reason, time); + }); if (time == 0) { @@ -388,7 +428,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer(player!.UserId)); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); } [ConsoleCommand("css_addban")] @@ -418,7 +458,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) reason = command.GetArg(3); - _ = _banManager.AddBanBySteamid(steamid, caller, reason, time); + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + BanManager _banManager = new(dbConnectionString); + await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); + }); List matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) @@ -439,7 +490,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer(player.UserId)); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); } } command.ReplyToCommand($"Banned player with steamid {steamid}."); @@ -465,15 +516,24 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + { + BanManager _banManager = new(dbConnectionString); + await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); + }); int.TryParse(command.GetArg(2), out time); if (command.ArgCount >= 3) reason = command.GetArg(3); - _ = _banManager.AddBanByIp(ipAddress, caller, reason, time); - List matches = Helper.GetPlayerFromIp(ipAddress); if (matches.Count == 1) { @@ -493,9 +553,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer(player.UserId)); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, "Banned")); } } + command.ReplyToCommand($"Banned player with IP address {ipAddress}."); } diff --git a/Events.cs b/Events.cs index 8b63485..a39702a 100644 --- a/Events.cs +++ b/Events.cs @@ -35,7 +35,7 @@ namespace CS2_SimpleAdmin CCSPlayerController? player = Utilities.GetPlayerFromIndex(playerIndex); - if (player.AuthorizedSteamID == null) + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) { AddTimer(3.0f, () => { @@ -44,11 +44,72 @@ namespace CS2_SimpleAdmin return; } - BanManager _banManager = new(dbConnectionString); - MuteManager _muteManager = new(dbConnectionString); + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + if (player == null) return; + BanManager _banManager = new(dbConnectionString); + bool isBanned = await _banManager.IsPlayerBanned(playerInfo); + + MuteManager _muteManager = new(dbConnectionString); + List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId); + + Server.NextFrame(() => + { + if (player == null) return; + if (isBanned) + { + Helper.KickPlayer((ushort)player.UserId!, "Banned"); + return; + } + + if (activeMutes.Count > 0) + { + foreach (var mute in activeMutes) + { + string muteType = mute.type; + TimeSpan duration = mute.ends - mute.created; + int durationInSeconds = (int)duration.TotalSeconds; + + if (muteType == "GAG") + { + if (!gaggedPlayers.Any(index => index == player.Index)) + gaggedPlayers.Add((int)player.Index); + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_mute {player.Index}"); + + /* + CCSPlayerController currentPlayer = player; + + if (mute.duration == 0 || durationInSeconds >= 1800) continue; + + await Task.Delay(TimeSpan.FromSeconds(durationInSeconds)); + + if (currentPlayer != null && currentPlayer.IsValid) + { + NativeAPI.IssueServerCommand($"css_tag_unmute {currentPlayer.Index.ToString()}"); + await UnmutePlayer(currentPlayer.AuthorizedSteamID.SteamId64.ToString(), 0); + } + */ + } + else + { + // Mic mute + } + } + } + }); + }); - _ = _banManager.CheckBan(player); - _ = _muteManager.CheckMute(player); } private void OnClientDisconnect(int playerSlot) diff --git a/Helper.cs b/Helper.cs index bf6940d..fc5d2ba 100644 --- a/Helper.cs +++ b/Helper.cs @@ -1,6 +1,5 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API; -using MySqlConnector; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; using System.Text.RegularExpressions; @@ -66,7 +65,7 @@ namespace CS2_SimpleAdmin return player?.IsValid == true ? TargetResult.Single : TargetResult.None; } - public static void KickPlayer(int? userId, string? reason = null) + public static void KickPlayer(ushort userId, string? reason = null) { NativeAPI.IssueServerCommand($"kickid {userId} {reason}"); } diff --git a/MuteManager.cs b/MuteManager.cs index c6f9243..4600a5d 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -14,9 +14,9 @@ namespace CS2_SimpleAdmin _dbConnection = new MySqlConnection(connectionString); } - public async Task MutePlayer(CCSPlayerController? player, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) + public async Task MutePlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0, int type = 0) { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + if (player == null || player.SteamId == null) return; await using var connection = _dbConnection; await connection.OpenAsync(); @@ -33,24 +33,19 @@ namespace CS2_SimpleAdmin await connection.ExecuteAsync(sql, new { - playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), - playerName = player.PlayerName, - adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), - adminName = issuer == null ? "Console" : issuer.PlayerName, + playerSteamid = player.SteamId, + playerName = player.Name, + adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, + adminName = issuer.SteamId == null ? "Console" : issuer.Name, banReason = reason, duration = time, ends = futureTime, created = now, type = muteType, }); - - if (connection.State != ConnectionState.Closed) - { - connection.Close(); - } } - public async Task AddMuteBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0, int type = 0) + public async Task AddMuteBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0, int type = 0) { if (string.IsNullOrEmpty(playerSteamId)) return; @@ -70,19 +65,14 @@ namespace CS2_SimpleAdmin await connection.ExecuteAsync(sql, new { playerSteamid = playerSteamId, - adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), - adminName = issuer == null ? "Console" : issuer.PlayerName, + adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, + adminName = issuer.Name == null ? "Console" : issuer.Name, banReason = reason, duration = time, ends = futureTime, created = now, type = muteType }); - - if (connection.State != ConnectionState.Closed) - { - connection.Close(); - } } public async Task> IsPlayerMuted(string steamId) @@ -95,11 +85,6 @@ namespace CS2_SimpleAdmin string sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; var activeMutes = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now })).ToList(); - if (connection.State != ConnectionState.Closed) - { - connection.Close(); - } - return activeMutes; } @@ -134,11 +119,6 @@ namespace CS2_SimpleAdmin string sqlUnban = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'"; await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern, muteType }); - - if (connection.State != ConnectionState.Closed) - { - connection.Close(); - } } public async Task ExpireOldMutes() @@ -148,18 +128,13 @@ namespace CS2_SimpleAdmin string sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); - - if (connection.State != ConnectionState.Closed) - { - connection.Close(); - } } - public async Task CheckMute(CCSPlayerController? player) + public async Task CheckMute(PlayerInfo player) { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + if (player.Index == null) return; - string steamId = player.AuthorizedSteamID.SteamId64.ToString(); + string steamId = player.SteamId!; List activeMutes = await IsPlayerMuted(steamId); if (activeMutes.Count > 0) @@ -172,12 +147,13 @@ namespace CS2_SimpleAdmin if (muteType == "GAG") { - if (!CS2_SimpleAdmin.gaggedPlayers.Contains((int)player.Index)) + if (!CS2_SimpleAdmin.gaggedPlayers.Any(index => index == player.Index)) CS2_SimpleAdmin.gaggedPlayers.Add((int)player.Index); if (CS2_SimpleAdmin.TagsDetected) NativeAPI.IssueServerCommand($"css_tag_mute {player!.Index.ToString()}"); + /* CCSPlayerController currentPlayer = player; if (mute.duration == 0 || durationInSeconds >= 1800) continue; @@ -189,6 +165,7 @@ namespace CS2_SimpleAdmin NativeAPI.IssueServerCommand($"css_tag_unmute {currentPlayer.Index.ToString()}"); await UnmutePlayer(currentPlayer.AuthorizedSteamID.SteamId64.ToString(), 0); } + */ } else { diff --git a/PlayerInfo.cs b/PlayerInfo.cs new file mode 100644 index 0000000..60e40f0 --- /dev/null +++ b/PlayerInfo.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CS2_SimpleAdmin +{ + public class PlayerInfo + { + public int? Index { get; set; } + public int? UserId { get; set; } + public string? SteamId { get; set; } + public string? Name { get; set; } + public string? IpAddress { get; set; } + } +} From fdbf1b1a5cb6a44debf7139b009315f219af73f9 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Wed, 6 Dec 2023 01:55:30 +0100 Subject: [PATCH 024/356] Respecting immunity and css_team command --- CS2-SimpleAdmin.cs | 159 ++++++++++++++++++++++++++++++++++++++------- Events.cs | 7 +- PlayerInfo.cs | 8 +-- PlayerUtils.cs | 6 ++ README.md | 1 + 5 files changed, 148 insertions(+), 33 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index da52c81..7011eb4 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.4c"; + public override string ModuleVersion => "1.0.5"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -126,9 +126,15 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnKickCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out var player)) + if (!GetTarget(command, out var player) || player == null || !player.IsValid) return; + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } + player!.Pawn.Value!.Freeze(); string reason = "Unknown"; @@ -153,10 +159,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnGagCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out var player)) + if (!GetTarget(command, out var player) || player == null || !player.IsValid) return; - if (command.ArgCount < 2) + + if (!caller!.CanTarget(player) || command.ArgCount < 2) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); return; + } int time = 0; string reason = "Unknown"; @@ -252,14 +262,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) { CCSPlayerController? player = matches.FirstOrDefault(); if (player != null) { + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } + if (time == 0) { player!.PrintToCenter($"{Config.Messages.PlayerGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); @@ -291,6 +305,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnBanCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out var player)) + if (!GetTarget(command, out var player) || command.ArgCount < 2) return; if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - if (command.ArgCount < 2) + + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); return; + } int time = 0; string reason = "Unknown"; @@ -465,11 +484,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - { - BanManager _banManager = new(dbConnectionString); - await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); - }); List matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) @@ -477,6 +491,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + { + BanManager _banManager = new(dbConnectionString); + await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); + }); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); } } @@ -523,12 +549,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - { - BanManager _banManager = new(dbConnectionString); - await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); - }); - int.TryParse(command.GetArg(2), out time); if (command.ArgCount >= 3) @@ -540,6 +560,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + { + BanManager _banManager = new(dbConnectionString); + await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); + }); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, "Banned")); } } @@ -584,8 +616,15 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnSlayCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out CCSPlayerController? player)) + if (!GetTarget(command, out CCSPlayerController? player) || player == null || !player.IsValid) return; + + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } + if (!player!.PawnIsAlive) return; @@ -599,8 +638,15 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [damage]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnSlapCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out CCSPlayerController? player)) + if (!GetTarget(command, out CCSPlayerController? player) || player == null || !player.IsValid) return; + + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } + if (!player!.PawnIsAlive) return; @@ -616,6 +662,53 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig []", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnTeamCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!GetTarget(command, out CCSPlayerController? player) || player == null || !player.IsValid) + return; + + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } + + string teamName = command.GetArg(2).ToLower(); + CsTeam teamNum = CsTeam.Spectator; + + switch (teamName) + { + case "ct": + case "counterterrorist": + teamNum = CsTeam.CounterTerrorist; + break; + case "t": + case "tt": + case "terrorist": + teamNum = CsTeam.Terrorist; + break; + default: + teamNum = CsTeam.Spectator; + break; + } + + if (player.TeamNum == ((byte)teamNum)) + { + command.ReplyToCommand($"{player.PlayerName} is already in selected team!"); + return; + } + + if (player.PawnIsAlive && teamNum != CsTeam.Spectator) + player.SwitchTeam(teamNum); + else + player.ChangeTeam(teamNum); + + command.ReplyToCommand($"Successfully changed team for {player.PlayerName}"); + } + [ConsoleCommand("css_map")] [RequiresPermissions("@css/changemap")] [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -703,9 +796,15 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { @@ -60,7 +63,7 @@ namespace CS2_SimpleAdmin bool isBanned = await _banManager.IsPlayerBanned(playerInfo); MuteManager _muteManager = new(dbConnectionString); - List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId); + List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId!); Server.NextFrame(() => { diff --git a/PlayerInfo.cs b/PlayerInfo.cs index 60e40f0..13e55c2 100644 --- a/PlayerInfo.cs +++ b/PlayerInfo.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CS2_SimpleAdmin +namespace CS2_SimpleAdmin { public class PlayerInfo { diff --git a/PlayerUtils.cs b/PlayerUtils.cs index b5e4295..0156b0c 100644 --- a/PlayerUtils.cs +++ b/PlayerUtils.cs @@ -1,4 +1,5 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Utils; namespace CS2_SimpleAdmin; @@ -10,6 +11,11 @@ public static class PlayerUtils PerformSlap(pawn, damage); } + public static bool CanTarget(this CCSPlayerController controller, CCSPlayerController target) + { + return AdminManager.CanPlayerTarget(controller, target); + } + public static void Bury(this CBasePlayerPawn pawn, float depth = 10f) { var newPos = new Vector(pawn.AbsOrigin!.X, pawn.AbsOrigin.Y, diff --git a/README.md b/README.md index 6ecb7aa..17333c7 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_unmute - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay +- css_team <#userid or name> [] - Change player team // @css/kick - css_map - Change map // @css/changemap - css_wsmap - Change workshop map // @css/changemap - css_say - Say message as admin in chat // @css/chat From 29fe968155c385a89fff8319c7712a92762b15be Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Wed, 6 Dec 2023 02:39:08 +0100 Subject: [PATCH 025/356] css_asay and @message --- CS2-SimpleAdmin.cs | 18 +++++++++++++++++- Events.cs | 10 ++++++++++ README.md | 3 +++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 7011eb4..8aebbe1 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.5"; + public override string ModuleVersion => "1.0.5a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -32,6 +32,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig")] + [RequiresPermissions("@css/chat")] + public void OnAdminToAdminSayCommand(CCSPlayerController? caller, CommandInfo command) + { + if (caller == null || !caller.IsValid || command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return; + if (command.GetCommandString[command.GetCommandString.IndexOf(' ')..].StartsWith("@")) + { + foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) + { + p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{caller.PlayerName}: {command.GetCommandString[command.GetCommandString.IndexOf(' ')..]}"); + } + } + } + [ConsoleCommand("css_say", "Say to all players.")] [CommandHelper(1, "")] [RequiresPermissions("@css/chat")] diff --git a/Events.cs b/Events.cs index 08e3448..9cd1dc1 100644 --- a/Events.cs +++ b/Events.cs @@ -1,7 +1,9 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API.Modules.Utils; using static CounterStrikeSharp.API.Core.Listeners; namespace CS2_SimpleAdmin @@ -26,6 +28,14 @@ namespace CS2_SimpleAdmin return HookResult.Handled; } + if (info.GetArg(1).StartsWith("@") && AdminManager.PlayerHasPermissions(player, "@css/chat")) + { + foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) + { + p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{player.PlayerName}: {info.GetArg(1)}"); + } + } + return HookResult.Continue; } diff --git a/README.md b/README.md index 17333c7..083d7d1 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_team <#userid or name> [] - Change player team // @css/kick - css_map - Change map // @css/changemap - css_wsmap - Change workshop map // @css/changemap +- css_asay - Say message to all admins // @css/chat - css_say - Say message as admin in chat // @css/chat - css_psay <#userid or name> - Sends private message to player // @css/chat - css_csay - Say message as admin in center // @css/chat @@ -32,6 +33,8 @@ It's only plugin base, I don't have much time for more extensive development, so - css_respawn <#userid or name> - Respawn player // @css/cheats - css_cvar - Change cvar value // @css/cvar - css_rcon - Run command as server // @css/rcon + +- @Message - Say message to all admins // @css/chat ``` ### Requirments From 90ca6c1ac292ddd66c78373a0fc56670b5ff00b5 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Wed, 6 Dec 2023 02:44:30 +0100 Subject: [PATCH 026/356] Admin chat fix --- CS2-SimpleAdmin.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 8aebbe1..955fb42 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -756,12 +756,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { - foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) - { - p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{caller.PlayerName}: {command.GetCommandString[command.GetCommandString.IndexOf(' ')..]}"); - } + p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{caller.PlayerName}: {command.GetCommandString[command.GetCommandString.IndexOf(' ')..]}"); } } From f3a1200492e0d7c2a37ebc7ba562d64a7b6a235a Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Wed, 6 Dec 2023 02:49:31 +0100 Subject: [PATCH 027/356] Changed adminchat to teamchat --- Events.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Events.cs b/Events.cs index 9cd1dc1..2d3951e 100644 --- a/Events.cs +++ b/Events.cs @@ -16,7 +16,7 @@ namespace CS2_SimpleAdmin RegisterListener(OnClientDisconnect); RegisterListener(OnMapStart); AddCommandListener("say", OnCommandSay); - AddCommandListener("say_team", OnCommandSay); + AddCommandListener("say_team", OnCommandTeamSay); } private HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) @@ -28,12 +28,26 @@ namespace CS2_SimpleAdmin return HookResult.Handled; } + return HookResult.Continue; + } + + private HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info) + { + if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; + + if (gaggedPlayers.Contains((int)player.Index)) + { + return HookResult.Handled; + } + if (info.GetArg(1).StartsWith("@") && AdminManager.PlayerHasPermissions(player, "@css/chat")) { foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{player.PlayerName}: {info.GetArg(1)}"); } + + return HookResult.Handled; } return HookResult.Continue; From 6ac370df7443e5370e636be895169fa365399ab6 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Wed, 6 Dec 2023 02:55:07 +0100 Subject: [PATCH 028/356] Update CS2-SimpleAdmin.cs --- CS2-SimpleAdmin.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 955fb42..53b47b5 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -32,7 +32,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Wed, 6 Dec 2023 03:01:07 +0100 Subject: [PATCH 029/356] Update Events.cs --- Events.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Events.cs b/Events.cs index 2d3951e..e12e167 100644 --- a/Events.cs +++ b/Events.cs @@ -44,7 +44,7 @@ namespace CS2_SimpleAdmin { foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { - p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{player.PlayerName}: {info.GetArg(1)}"); + p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{player.PlayerName}: {info.GetArg(1).Remove(0, 1)}"); } return HookResult.Handled; From 59975bb49d94ba623d41d618d70c76d30c8e7e81 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 9 Dec 2023 10:43:33 +0330 Subject: [PATCH 030/356] Add the css_give command and add in README.MD --- CS2-SimpleAdmin.cs | 12 ++++++++++++ Config.cs | 2 ++ README.md | 1 + 3 files changed, 15 insertions(+) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 53b47b5..e442a10 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -916,7 +916,19 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnGiveCommand(CCSPlayerController? caller, CommandInfo command) + { + if(!GetTarget(command, out var player) || player == null || !player.IsValid) return; + + string weapon = command.GetArg(2); + player.GiveNamedItem(weapon); + + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminChangeMap}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{WEAPON}", weapon))); + } private static bool GetTarget(CommandInfo command, out CCSPlayerController? player) { diff --git a/Config.cs b/Config.cs index d9210b3..cd76a34 100644 --- a/Config.cs +++ b/Config.cs @@ -41,6 +41,8 @@ namespace CS2_SimpleAdmin public string AdminRespawnMessage { get; set; } = "Admin {ADMIN} respawned {PLAYER}!"; [JsonPropertyName("AdminSayPrefix")] public string AdminSayPrefix { get; set; } = "{RED}ADMIN: {DEFAULT}"; + [JsonPropertyName("AdminGiveMessage")] + public string AdminGiveMessage { get; set; } = "Admin {ADMIN} Gave {PLAYER} a {WEAPON}!"; [JsonPropertyName("AdminHelpCommand")] public string AdminHelpCommand { get; set; } = "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n" + "- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n" + diff --git a/README.md b/README.md index 083d7d1..f5e5c8a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_respawn <#userid or name> - Respawn player // @css/cheats - css_cvar - Change cvar value // @css/cvar - css_rcon - Run command as server // @css/rcon +- css_give <#userid or name> - Gives a weapon to a Player // @css/cheats - @Message - Say message to all admins // @css/chat ``` From b8048e1500dcb0dec8b93fa1e329f8081914462a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 9 Dec 2023 10:49:19 +0330 Subject: [PATCH 031/356] Fixed server printing map instead of given weapon --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index e442a10..7e4fc0b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -927,7 +927,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Sat, 9 Dec 2023 10:53:13 +0330 Subject: [PATCH 032/356] fixed writing player name after giving waepon in chat --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 7e4fc0b..c01bd29 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -927,7 +927,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Sat, 9 Dec 2023 10:58:21 +0330 Subject: [PATCH 033/356] changed permissions to @css/give --- CS2-SimpleAdmin.cs | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index c01bd29..a263433 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -917,7 +917,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnGiveCommand(CCSPlayerController? caller, CommandInfo command) { diff --git a/README.md b/README.md index f5e5c8a..af477b7 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_respawn <#userid or name> - Respawn player // @css/cheats - css_cvar - Change cvar value // @css/cvar - css_rcon - Run command as server // @css/rcon -- css_give <#userid or name> - Gives a weapon to a Player // @css/cheats +- css_give <#userid or name> - Gives a weapon to a Player // @css/give - @Message - Say message to all admins // @css/chat ``` From 07b79cb91a720db09a83cf9df32fa7c004ba439b Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 10 Dec 2023 00:56:30 +0330 Subject: [PATCH 034/356] Added a check for knifes --- .vscode/settings.json | 5 +++++ CS2-SimpleAdmin.cs | 20 +++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f2fe8c8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "discord.removeDetails": false, + "discord.removeLowerDetails": false, + "discord.removeRemoteRepository": true +} \ No newline at end of file diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index a263433..c178296 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -916,18 +916,28 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnGiveCommand(CCSPlayerController? caller, CommandInfo command) { - if(!GetTarget(command, out var player) || player == null || !player.IsValid) return; + string weaponName = command.GetArg(2); - string weapon = command.GetArg(2); - player.GiveNamedItem(weapon); - - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGiveMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{WEAPON}", weapon.Split("_")[1])).Replace("{PLAYER}",player.PlayerName)); + //check if weapon is inside the bannedItems + foreach(string bannedWeapon in BannedGiveItems){ + if(bannedWeapon.Equals(weaponName.ToLower())){ + command.ReplyToCommand($"Cannot Give {weaponName} because it's illegal to be given."); + return; + } + } + //give the weapon to player and announce it + player.GiveNamedItem(weaponName); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGiveMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{WEAPON}", weaponName.Split("_")[1])).Replace("{PLAYER}",player.PlayerName)); } private static bool GetTarget(CommandInfo command, out CCSPlayerController? player) From a56b5f7b3f2ca85595c77560518eabedd00ff9bb Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 10 Dec 2023 01:15:52 +0330 Subject: [PATCH 035/356] fixed banned weapon checking --- CS2-SimpleAdmin.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index c178296..525444b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -917,9 +917,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -928,13 +925,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Sun, 10 Dec 2023 01:33:59 +0330 Subject: [PATCH 036/356] fixed weapon checking --- .gitignore | 3 ++- .vscode/settings.json | 5 ----- CS2-SimpleAdmin.cs | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 48166c1..6822e32 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ bin/ obj/ .vs/ -.git \ No newline at end of file +.git +.vscode/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index f2fe8c8..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "discord.removeDetails": false, - "discord.removeLowerDetails": false, - "discord.removeRemoteRepository": true -} \ No newline at end of file diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 525444b..b6d6764 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -926,7 +926,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Tue, 12 Dec 2023 12:20:27 +0100 Subject: [PATCH 037/356] 1.2.0a UPDATE Required CSS 124 --- BanManager.cs | 20 + CS2-SimpleAdmin.cs | 960 +++++++++++++++++++++++++++++++---------- CS2-SimpleAdmin.csproj | 6 +- Config.cs | 59 +-- Events.cs | 91 +++- Helper.cs | 2 + MuteManager.cs | 14 + PlayerUtils.cs | 8 + README.md | 11 +- TargetResult.cs | 8 - lang/en.json | 29 ++ lang/pl.json | 29 ++ 12 files changed, 919 insertions(+), 318 deletions(-) delete mode 100644 TargetResult.cs create mode 100644 lang/en.json create mode 100644 lang/pl.json diff --git a/BanManager.cs b/BanManager.cs index f41d5bf..2f37d71 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -109,6 +109,26 @@ namespace CS2_SimpleAdmin return banCount > 0; } + public async Task GetPlayerBans(PlayerInfo player) + { + string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)"; + int banCount; + + await using var connection = _dbConnection; + await connection.OpenAsync(); + + if (!string.IsNullOrEmpty(player.IpAddress)) + { + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress }); + } + else + { + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value }); + } + + return banCount; + } + public async Task UnbanPlayer(string playerPattern) { if (playerPattern == null || playerPattern.Length <= 1) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 53b47b5..cf8dd24 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -4,25 +4,30 @@ using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; +using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; +using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using MySqlConnector; using System.Collections.Concurrent; +using System.Text; namespace CS2_SimpleAdmin; -[MinimumApiVersion(101)] +[MinimumApiVersion(124)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + public static IStringLocalizer? _localizer; public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); + public static ConcurrentBag mutedPlayers = new ConcurrentBag(); public static bool TagsDetected = false; internal string dbConnectionString = string.Empty; public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.5a"; + public override string ModuleVersion => "1.2.0a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -105,6 +110,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [RequiresPermissions("@css/generic")] + public void OnWhoCommand(CCSPlayerController? caller, CommandInfo command) + { + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); + + BanManager _banManager = new(dbConnectionString); + MuteManager _muteManager = new(dbConnectionString); + + playersToTarget.ForEach(player => + { + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + int totalBans = 0; + int totalMutes = 0; + + totalBans = await _banManager.GetPlayerBans(playerInfo); + totalMutes = await _muteManager.GetPlayerMutes(playerInfo.SteamId!); + + + Server.NextFrame(() => + { + caller!.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); + + caller!.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + caller!.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + caller!.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) + { + caller!.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + caller!.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } + if (playerInfo.IpAddress != null) + caller!.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); + caller!.PrintToConsole($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + caller!.PrintToConsole($"• Total Bans: \"{totalBans}\""); + caller!.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); + } + + caller!.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); + }); + }); + + }); + } + + [ConsoleCommand("css_players")] + [CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [RequiresPermissions("@css/generic")] + public void OnPlayersCommand(CCSPlayerController? caller, CommandInfo command) + { + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); + + playersToTarget.ForEach(player => + { + caller!.PrintToConsole($"--------- PLAYER LIST ---------"); + + caller!.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.AuthorizedSteamID?.SteamId64}\")"); + + caller!.PrintToConsole($"--------- END PLAYER LIST ---------"); + + }); + } + [ConsoleCommand("css_kick")] [RequiresPermissions("@css/kick")] [CommandHelper(minArgs: 1, usage: "<#userid or name> [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnKickCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out var player) || player == null || !player.IsValid) - return; - - if (!caller!.CanTarget(player)) - { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); - return; - } - - player!.Pawn.Value!.Freeze(); string reason = "Unknown"; - if (command.ArgCount >= 2) + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands) + { + return; + } + + if (command.ArgCount >= 2 && command.GetArg(2).Length > 0) reason = command.GetArg(2); - if (command.ArgCount >= 2) + targets.Players.ForEach(player => { - player!.PrintToCenter($"{Config.Messages.PlayerKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, reason)); - } - else - { - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); - } + player.Pawn.Value!.Freeze(); - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminKickMessage}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + if (command.ArgCount >= 2) + { + player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, reason)); + } + else + { + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); + } + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + }); } [ConsoleCommand("css_gag")] @@ -159,73 +251,81 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnGagCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out var player) || player == null || !player.IsValid) - return; - - if (!caller!.CanTarget(player) || command.ArgCount < 2) - { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); - return; - } - int time = 0; string reason = "Unknown"; + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands) + { + return; + } + int.TryParse(command.GetArg(2), out time); - if (command.ArgCount >= 3) + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) reason = command.GetArg(3); - PlayerInfo playerInfo = new PlayerInfo + MuteManager _muteManager = new(dbConnectionString); + + playersToTarget.ForEach(player => { - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - PlayerInfo adminInfo = new PlayerInfo - { - SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), - Name = caller?.PlayerName, - IpAddress = caller?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - MuteManager _muteManager = new(dbConnectionString); - await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time); - }); - - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player!.Index.ToString()}"); - - if (!gaggedPlayers.Contains((int)player!.Index)) - gaggedPlayers.Add((int)player.Index); - - if (time > 0 && time <= 30) - { - AddTimer(time * 60, () => + PlayerInfo playerInfo = new PlayerInfo { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index}"); + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; - MuteManager _muteManager = new(dbConnectionString); - _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } + Task.Run(async () => + { + await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time); + }); - if (time == 0) - { - player!.PrintToCenter($"{Config.Messages.PlayerGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGagMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); - } - else - { - player!.PrintToCenter($"{Config.Messages.PlayerGagMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGagMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); - } + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_mute {player!.Index.ToString()}"); + + if (!gaggedPlayers.Contains((int)player!.Index)) + gaggedPlayers.Add((int)player.Index); + + if (time > 0 && time <= 30) + { + AddTimer(time * 60, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index}"); + + MuteManager _muteManager = new(dbConnectionString); + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + + if (time == 0) + { + player!.PrintToCenter(_localizer!["sa_player_gag_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_gag_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + else + { + player!.PrintToCenter(_localizer!["sa_player_gag_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_gag_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + }); } [ConsoleCommand("css_addgag")] @@ -252,7 +352,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) reason = command.GetArg(3); PlayerInfo adminInfo = new PlayerInfo @@ -266,7 +366,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnUnmuteCommand(CCSPlayerController? caller, CommandInfo command) + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnUngagCommand(CCSPlayerController? caller, CommandInfo command) { if (command.GetArg(1).Length <= 1) { @@ -320,8 +424,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) + if (found) { - string? action = command.GetArg(2)?.ToLower(); - - if (action == "gag") - { - _ = _muteManager.UnmutePlayer(pattern, 0); // Unmute by type 0 (gag) - } - else if (action == "mute") - { - _ = _muteManager.UnmutePlayer(pattern, 1); // Unmute by type 1 (mute) - } - } - else - { - _ = _muteManager.UnmutePlayer(pattern, 2); // Default unmute (all types) + _ = _muteManager.UnmutePlayer(pattern, 0); // Unmute by type 0 (gag) + command.ReplyToCommand($"Ungaged player with pattern {pattern}."); + return; } - command.ReplyToCommand($"Unmuted player with pattern {pattern}."); + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands) + { + return; + } + + if (playersToTarget.Count > 1) + { + playersToTarget.ForEach(player => + { + if (gaggedPlayers.Contains((int)player.Index)) + { + if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + gaggedPlayers.Add(removedItem); + } + } + + if (player.AuthorizedSteamID != null) + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); // Unmute by type 0 (gag) + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.Index.ToString()}"); + }); + + command.ReplyToCommand($"Ungaged player with pattern {pattern}."); + return; + } } - [ConsoleCommand("css_ban")] - [RequiresPermissions("@css/ban")] + [ConsoleCommand("css_mute")] + [RequiresPermissions("@css/chat")] [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnBanCommand(CCSPlayerController? caller, CommandInfo command) + public void OnMuteCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out var player) || command.ArgCount < 2) - return; - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + int time = 0; + string reason = "Unknown"; - if (!caller!.CanTarget(player)) + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands) { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) + reason = command.GetArg(3); + + MuteManager _muteManager = new(dbConnectionString); + + playersToTarget.ForEach(player => + { + PlayerInfo playerInfo = new PlayerInfo + { + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + if (!mutedPlayers.Contains((int)player!.Index)) + mutedPlayers.Add((int)player!.Index); + + Task.Run(async () => + { + await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1); + }); + + player.VoiceFlags = VoiceFlags.Muted; + + if (time > 0 && time <= 30) + { + AddTimer(time * 60, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + //MuteManager _muteManager = new(dbConnectionString); + //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + + player.VoiceFlags = VoiceFlags.Normal; + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + + if (time == 0) + { + player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + else + { + player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + }); + + } + + [ConsoleCommand("css_addmute")] + [RequiresPermissions("@css/chat")] + [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnAddMuteCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.ArgCount < 2) + return; + if (string.IsNullOrEmpty(command.GetArg(1))) return; + + string steamid = command.GetArg(1); + + if (!Helper.IsValidSteamID64(steamid)) + { + command.ReplyToCommand($"Invalid SteamID64."); return; } int time = 0; string reason = "Unknown"; - player!.Pawn.Value!.Freeze(); + MuteManager _muteManager = new(dbConnectionString); int.TryParse(command.GetArg(2), out time); - if (command.ArgCount >= 3) + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) reason = command.GetArg(3); - PlayerInfo playerInfo = new PlayerInfo - { - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - PlayerInfo adminInfo = new PlayerInfo { SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), @@ -430,24 +640,225 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + List matches = Helper.GetPlayerFromSteamid64(steamid); + if (matches.Count == 1) { - BanManager _banManager = new(dbConnectionString); - await _banManager.BanPlayer(playerInfo, adminInfo, reason, time); - }); + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null && player.IsValid) + { + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } - if (time == 0) + if (time == 0) + { + player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + else + { + player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + + if (!mutedPlayers.Contains((int)player!.Index)) + mutedPlayers.Add((int)player!.Index); + + if (time > 0 && time <= 30) + { + AddTimer(time * 60, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + + player.VoiceFlags = VoiceFlags.Normal; + + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + } + } + _ = _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 1); + command.ReplyToCommand($"Muted player with steamid {steamid}."); + } + + [ConsoleCommand("css_unmute")] + [RequiresPermissions("@css/chat")] + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnUnmuteCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.GetArg(1).Length <= 1) { - player!.PrintToCenter($"{Config.Messages.PlayerBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + command.ReplyToCommand($"Too short pattern to search."); + return; + } + + string pattern = command.GetArg(1); + bool found = false; + MuteManager _muteManager = new(dbConnectionString); + + if (Helper.IsValidSteamID64(pattern)) + { + List matches = Helper.GetPlayerFromSteamid64(pattern); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null && player.IsValid) + { + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + + player.VoiceFlags = VoiceFlags.Normal; + found = true; + } + } } else { - player!.PrintToCenter($"{Config.Messages.PlayerBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + List matches = Helper.GetPlayerFromName(pattern); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null && player.IsValid) + { + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + + player.VoiceFlags = VoiceFlags.Normal; + pattern = player.AuthorizedSteamID!.SteamId64.ToString(); + found = true; + } + } } - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); + if (found) + { + _ = _muteManager.UnmutePlayer(pattern, 1); // Unmute by type 1 (mute) + command.ReplyToCommand($"Unmuted player with pattern {pattern}."); + return; + } + + TargetResult? targets = GetTarget(command); + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands) + { + return; + } + + if (playersToTarget.Count > 1) + { + playersToTarget.ForEach(player => + { + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + + if (player.AuthorizedSteamID != null) + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); // Unmute by type 1 (mute) + + player.VoiceFlags = VoiceFlags.Normal; + }); + + command.ReplyToCommand($"Unmuted player with pattern {pattern}."); + return; + } + } + + [ConsoleCommand("css_ban")] + [RequiresPermissions("@css/ban")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnBanCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.ArgCount < 2) + return; + + int time = 0; + string reason = "Unknown"; + + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands) + { + return; + } + + BanManager _banManager = new(dbConnectionString); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) + reason = command.GetArg(3); + + playersToTarget.ForEach(player => + { + player.Pawn.Value!.Freeze(); + + PlayerInfo playerInfo = new PlayerInfo + { + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + await _banManager.BanPlayer(playerInfo, adminInfo, reason, time); + }); + + if (time == 0) + { + player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + else + { + player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); + }); } [ConsoleCommand("css_addban")] @@ -474,7 +885,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) reason = command.GetArg(3); PlayerInfo adminInfo = new PlayerInfo @@ -489,7 +900,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig @@ -551,14 +966,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 3) + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) reason = command.GetArg(3); List matches = Helper.GetPlayerFromIp(ipAddress); if (matches.Count == 1) { CCSPlayerController? player = matches.FirstOrDefault(); - if (player != null) + if (player != null && player.IsValid) { if (!caller!.CanTarget(player)) { @@ -570,13 +985,17 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig @@ -616,21 +1035,62 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnSlayCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out CCSPlayerController? player) || player == null || !player.IsValid) - return; + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); - if (!caller!.CanTarget(player)) + playersToTarget.ForEach(player => { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + player.CommitSuicide(false, true); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_slay_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); + } + + [ConsoleCommand("css_give")] + [RequiresPermissions("@css/cheats")] + [CommandHelper(minArgs: 2, usage: "<#userid or name> ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnGiveCommand(CCSPlayerController? caller, CommandInfo command) + { + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + + string weaponName = command.GetArg(2); + + // check if item is typed + if (weaponName == null || weaponName.Length < 5) + { + command.ReplyToCommand($"No weapon typed."); return; } - if (!player!.PawnIsAlive) + // check if item is valid + if (!weaponName.Contains("weapon_") || !weaponName.Contains("item_")) + { + command.ReplyToCommand($"{weaponName} is not a valid item."); return; + } - player!.CommitSuicide(false, true); + // check if weapon is knife + if (weaponName.Contains("_knife") || weaponName.Contains("bayonet")) + { + if (CoreConfig.FollowCS2ServerGuidelines) + { + command.ReplyToCommand($"Cannot Give {weaponName} because it's illegal to be given."); + return; + } + } - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminSlayMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + playersToTarget.ForEach(player => + { + //give the weapon to player and announce it + player.GiveNamedItem(weaponName); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_give_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, weaponName]); + Server.PrintToChatAll(sb.ToString()); + }); } [ConsoleCommand("css_slap")] @@ -638,28 +1098,24 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [damage]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnSlapCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out CCSPlayerController? player) || player == null || !player.IsValid) - return; - - if (!caller!.CanTarget(player)) - { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); - return; - } - - if (!player!.PawnIsAlive) - return; - int damage = 0; + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + if (command.ArgCount >= 2) { int.TryParse(command.GetArg(2), out damage); } - player!.Pawn.Value!.Slap(damage); - - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminSlapMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + playersToTarget.ForEach(player => + { + player!.Pawn.Value!.Slap(damage); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_slap_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); } [ConsoleCommand("css_team")] @@ -667,18 +1123,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig []", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnTeamCommand(CCSPlayerController? caller, CommandInfo command) { - if (!GetTarget(command, out CCSPlayerController? player) || player == null || !player.IsValid) - return; - - if (!caller!.CanTarget(player)) - { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); - return; - } - string teamName = command.GetArg(2).ToLower(); CsTeam teamNum = CsTeam.Spectator; + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + switch (teamName) { case "ct": @@ -695,18 +1146,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - command.ReplyToCommand($"{player.PlayerName} is already in selected team!"); - return; - } - - if (player.PawnIsAlive && teamNum != CsTeam.Spectator) - player.SwitchTeam(teamNum); - else - player.ChangeTeam(teamNum); - - command.ReplyToCommand($"Successfully changed team for {player.PlayerName}"); + if (player.TeamNum != ((byte)teamNum)) + { + if (player.PawnIsAlive && teamNum != CsTeam.Spectator) + player.SwitchTeam(teamNum); + else + player.ChangeTeam(teamNum); + } + }); } [ConsoleCommand("css_map")] @@ -727,7 +1176,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { @@ -755,9 +1208,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { - p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{caller.PlayerName}: {command.GetCommandString[command.GetCommandString.IndexOf(' ')..]}"); + p.PrintToChat(sb.ToString()); } } @@ -766,7 +1224,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => player != null && player.IsValid).ToList(); - var range = command.GetArg(0).Length + command.GetArg(1).Length + 2; - var message = command.GetCommandString[range..]; + int range = command.GetArg(0).Length + command.GetArg(1).Length + 2; + string message = command.GetCommandString[range..]; - command.ReplyToCommand(Helper.ReplaceTags($"({player!.PlayerName}) {message}")); - player.PrintToChat(Helper.ReplaceTags($"({caller!.PlayerName}) {message}")); + playersToTarget.ForEach(player => + { + player.PrintToChat(Helper.ReplaceTags($"({caller!.PlayerName}) {message}")); + }); + + command.ReplyToCommand(Helper.ReplaceTags($" Private message sent!")); } [ConsoleCommand("css_csay", "Say to all players (in center).")] @@ -808,18 +1273,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); - if (!caller!.CanTarget(player)) + playersToTarget.ForEach(player => { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); - return; - } - - player!.Pawn.Value!.ToggleNoclip(); - - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminNoclipMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + player!.Pawn.Value!.ToggleNoclip(); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_noclip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); } [ConsoleCommand("css_freeze", "Freeze a player.")] @@ -827,24 +1290,23 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); - if (time > 0) - AddTimer(time, () => player.Pawn.Value!.Unfreeze()); + playersToTarget.ForEach(player => + { + player!.Pawn.Value!.Freeze(); - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminFreezeMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + if (time > 0) + AddTimer(time, () => player.Pawn.Value!.Unfreeze()); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); } [ConsoleCommand("css_unfreeze", "Unfreeze a player.")] @@ -852,12 +1314,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); - player!.Pawn.Value!.Unfreeze(); - - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminUnFreezeMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + playersToTarget.ForEach(player => + { + player!.Pawn.Value!.Unfreeze(); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_unfreeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); } [ConsoleCommand("css_respawn", "Respawn a dead player.")] @@ -865,18 +1331,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); - if (!caller!.CanTarget(player)) + playersToTarget.ForEach(player => { - command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); - return; - } - - player!.Respawn(); - - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminRespawnMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + player!.Respawn(); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_respawn_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); } [ConsoleCommand("css_cvar", "Change a cvar.")] @@ -912,14 +1376,33 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 1 || command.GetArg(1).StartsWith('@')) + return matches; + + if (matches.Count() == 1 || !command.GetArg(1).StartsWith('@')) + return matches; + + command.ReplyToCommand($"Multiple targets found for \"{command.GetArg(1)}\"."); + return null; + + /* var matches = Helper.GetTarget(command.GetArg(1), out player); switch (matches) @@ -933,6 +1416,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - + + + + + diff --git a/Config.cs b/Config.cs index d9210b3..f92fcd2 100644 --- a/Config.cs +++ b/Config.cs @@ -3,58 +3,9 @@ using System.Text.Json.Serialization; namespace CS2_SimpleAdmin { - public class Messages - { - [JsonPropertyName("PlayerBanMessageTime")] - public string PlayerBanMessageTime { get; set; } = "You have been banned for {REASON} for {TIME} minutes by {ADMIN}!"; - [JsonPropertyName("PlayerBanMessagePerm")] - public string PlayerBanMessagePerm { get; set; } = "You have been banned permanently for {REASON} by {ADMIN}!"; - [JsonPropertyName("PlayerKickMessage")] - public string PlayerKickMessage { get; set; } = "You have been kicked for {REASON} by {ADMIN}!"; - [JsonPropertyName("PlayerGagMessageTime")] - public string PlayerGagMessageTime { get; set; } = "You have been gagged for {REASON} for {TIME} minutes by {ADMIN}!"; - [JsonPropertyName("PlayerGagMessagePerm")] - public string PlayerGagMessagePerm { get; set; } = "You have been gagged permanently for {REASON} by {ADMIN}!"; - [JsonPropertyName("AdminBanMessageTime")] - public string AdminBanMessageTime { get; set; } = "Admin {ADMIN} banned {PLAYER} for {REASON} for {TIME} minutes!"; - [JsonPropertyName("AdminBanMessagePerm")] - public string AdminBanMessagePerm { get; set; } = "Admin {ADMIN} banned {PLAYER} permanently for {REASON}"; - [JsonPropertyName("AdminKickMessage")] - public string AdminKickMessage { get; set; } = "Admin {ADMIN} kicked {PLAYER} for {REASON}!"; - [JsonPropertyName("AdminGagMessageTime")] - public string AdminGagMessageTime { get; set; } = "Admin {ADMIN} gagged {PLAYER} for {REASON} for {TIME} minutes!"; - [JsonPropertyName("AdminGagMessagePerm")] - public string AdminGagMessagePerm { get; set; } = "Admin {ADMIN} gagged {PLAYER} permanently for {REASON}"; - [JsonPropertyName("AdminSlayMessage")] - public string AdminSlayMessage { get; set; } = "Admin {ADMIN} slayed {PLAYER}!"; - [JsonPropertyName("AdminSlapMessage")] - public string AdminSlapMessage { get; set; } = "Admin {ADMIN} slapped {PLAYER}!"; - [JsonPropertyName("AdminChangeMap")] - public string AdminChangeMap { get; set; } = "Admin {ADMIN} changed map to {MAP}!"; - [JsonPropertyName("AdminNoclipMessage")] - public string AdminNoclipMessage { get; set; } = "Admin {ADMIN} toggled noclip for {PLAYER}!"; - [JsonPropertyName("AdminFreezeMessage")] - public string AdminFreezeMessage { get; set; } = "Admin {ADMIN} freezed {PLAYER}!"; - [JsonPropertyName("AdminUnFreezeMessage")] - public string AdminUnFreezeMessage { get; set; } = "Admin {ADMIN} unfreezed {PLAYER}!"; - [JsonPropertyName("AdminRespawnMessage")] - public string AdminRespawnMessage { get; set; } = "Admin {ADMIN} respawned {PLAYER}!"; - [JsonPropertyName("AdminSayPrefix")] - public string AdminSayPrefix { get; set; } = "{RED}ADMIN: {DEFAULT}"; - [JsonPropertyName("AdminHelpCommand")] - public string AdminHelpCommand { get; set; } = "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n" + - "- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n" + - "- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n" + - "- css_unmute - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_say - Say message as admin in chat\n" + - "- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n" + - "- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n" + - "- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server"; - } - public class CS2_SimpleAdminConfig : BasePluginConfig { - public override int Version { get; set; } = 1; + public override int Version { get; set; } = 2; [JsonPropertyName("DatabaseHost")] public string DatabaseHost { get; set; } = ""; @@ -71,13 +22,9 @@ namespace CS2_SimpleAdmin [JsonPropertyName("DatabaseName")] public string DatabaseName { get; set; } = ""; - [JsonPropertyName("Prefix")] - public string Prefix { get; set; } = "{GREEN}[SimpleAdmin]"; [JsonPropertyName("KickTime")] public int KickTime { get; set; } = 10; - - [JsonPropertyName("Messages")] - public Messages Messages { get; set; } = new Messages(); + [JsonPropertyName("DisableDangerousCommands")] + public bool DisableDangerousCommands { get; set; } = true; } - } \ No newline at end of file diff --git a/Events.cs b/Events.cs index e12e167..dd7300e 100644 --- a/Events.cs +++ b/Events.cs @@ -3,7 +3,7 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Entities; -using CounterStrikeSharp.API.Modules.Utils; +using System.Text; using static CounterStrikeSharp.API.Core.Listeners; namespace CS2_SimpleAdmin @@ -17,8 +17,8 @@ namespace CS2_SimpleAdmin RegisterListener(OnMapStart); AddCommandListener("say", OnCommandSay); AddCommandListener("say_team", OnCommandTeamSay); + AddCommandListener("callvote", OnCommandCallVote); } - private HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) { if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; @@ -40,11 +40,26 @@ namespace CS2_SimpleAdmin return HookResult.Handled; } - if (info.GetArg(1).StartsWith("@") && AdminManager.PlayerHasPermissions(player, "@css/chat")) + if (info.GetArg(1).StartsWith("@")) { - foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) + StringBuilder sb = new(); + + if (AdminManager.PlayerHasPermissions(player, "@css/chat")) { - p.PrintToChat($" {ChatColors.Lime}(ADMIN) {ChatColors.Default}{player.PlayerName}: {info.GetArg(1).Remove(0, 1)}"); + sb.Append(_localizer!["sa_adminchat_template_admin", player.PlayerName, info.GetArg(1).Remove(0, 1)]); + foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) + { + p.PrintToChat(sb.ToString()); + } + } + else + { + sb.Append(_localizer!["sa_adminchat_template_player", player.PlayerName, info.GetArg(1).Remove(0, 1)]); + player.PrintToChat(sb.ToString()); + foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) + { + p.PrintToChat(sb.ToString()); + } } return HookResult.Handled; @@ -53,11 +68,26 @@ namespace CS2_SimpleAdmin return HookResult.Continue; } + private HookResult OnCommandCallVote(CCSPlayerController? player, CommandInfo info) + { + string reason = info.GetArg(1); + + if (reason == "kick" || reason == "ban") + { + int.TryParse(info.GetArg(2), out int target); + if (target > 0) + { + if (!player!.CanTarget(Utilities.GetPlayerFromUserid(target))) + return HookResult.Handled; + } + } + + return HookResult.Continue; + } + private void OnClientAuthorized(int playerSlot, SteamID steamID) { - int playerIndex = playerSlot + 1; - - CCSPlayerController? player = Utilities.GetPlayerFromIndex(playerIndex); + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; @@ -82,7 +112,7 @@ namespace CS2_SimpleAdmin Task.Run(async () => { - if (player == null) return; + if (player == null || !player.IsValid) return; BanManager _banManager = new(dbConnectionString); bool isBanned = await _banManager.IsPlayerBanned(playerInfo); @@ -91,7 +121,7 @@ namespace CS2_SimpleAdmin Server.NextFrame(() => { - if (player == null) return; + if (player == null || !player.IsValid) return; if (isBanned) { Helper.KickPlayer((ushort)player.UserId!, "Banned"); @@ -108,12 +138,36 @@ namespace CS2_SimpleAdmin if (muteType == "GAG") { + // Chat mute if (!gaggedPlayers.Any(index => index == player.Index)) gaggedPlayers.Add((int)player.Index); if (TagsDetected) NativeAPI.IssueServerCommand($"css_tag_mute {player.Index}"); + if (duration.Minutes >= 0 && duration.Minutes <= 30) + { + AddTimer(durationInSeconds, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (gaggedPlayers.Contains((int)player.Index)) + { + if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + gaggedPlayers.Add(removedItem); + } + } + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index}"); + + MuteManager _muteManager = new(dbConnectionString); + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + + /* CCSPlayerController currentPlayer = player; @@ -130,13 +184,26 @@ namespace CS2_SimpleAdmin } else { - // Mic mute + // Voice mute + player.VoiceFlags = VoiceFlags.Muted; + + if (duration.Minutes >= 0 && duration.Minutes <= 30) + { + AddTimer(durationInSeconds, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + player.VoiceFlags = VoiceFlags.Normal; + + MuteManager _muteManager = new(dbConnectionString); + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } } } } }); }); - } private void OnClientDisconnect(int playerSlot) diff --git a/Helper.cs b/Helper.cs index fc5d2ba..08b6bfa 100644 --- a/Helper.cs +++ b/Helper.cs @@ -45,6 +45,7 @@ namespace CS2_SimpleAdmin return Regex.IsMatch(input, pattern); } + /* public static TargetResult GetTarget(string target, out CCSPlayerController? player) { player = null; @@ -64,6 +65,7 @@ namespace CS2_SimpleAdmin return player?.IsValid == true ? TargetResult.Single : TargetResult.None; } + */ public static void KickPlayer(ushort userId, string? reason = null) { diff --git a/MuteManager.cs b/MuteManager.cs index 4600a5d..50f6267 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -1,4 +1,5 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities; using Dapper; using MySqlConnector; using System.Data; @@ -88,6 +89,19 @@ namespace CS2_SimpleAdmin return activeMutes; } + public async Task GetPlayerMutes(string steamId) + { + await using var connection = _dbConnection; + await connection.OpenAsync(); + + int muteCount; + string sql = "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID"; + + muteCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId }); + + return muteCount; + } + public async Task UnmutePlayer(string playerPattern, int type = 0) { if (playerPattern == null || playerPattern.Length <= 1) diff --git a/PlayerUtils.cs b/PlayerUtils.cs index 0156b0c..0ffaaf8 100644 --- a/PlayerUtils.cs +++ b/PlayerUtils.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Utils; +using System.Text; namespace CS2_SimpleAdmin; @@ -10,9 +11,16 @@ public static class PlayerUtils { PerformSlap(pawn, damage); } + public static void Print(this CCSPlayerController controller, string message = "") + { + StringBuilder _message = new(CS2_SimpleAdmin._localizer!["sa_prefix"]); + _message.Append(message); + controller.PrintToChat(_message.ToString()); + } public static bool CanTarget(this CCSPlayerController controller, CCSPlayerController target) { + if (target.IsBot) return true; return AdminManager.CanPlayerTarget(controller, target); } diff --git a/README.md b/README.md index 083d7d1..20fbc1f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ Manage your Counter-Strike 2 server by simple commands :) ### Info -It's only plugin base, I don't have much time for more extensive development, so if you want to help, do it :) +~~It's only plugin base~~, I don't have much time for more extensive development, so if you want to help, do it :) +**The plugin will be developed as much as possible**, so it is no longer just a base for other plugins ### Commands ```js @@ -16,7 +17,11 @@ It's only plugin base, I don't have much time for more extensive development, so - css_kick <#userid or name> [reason] - Kick player / @css/kick - css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player // @css/chat - css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64 // @css/chat -- css_unmute - Ungag player // @css/chat +- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player // @css/chat +- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64 // @css/chat +- css_unmute - Unmute player // @css/chat +- css_give <#userid or name> - Give weapon to player // @css/cheats - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay - css_team <#userid or name> [] - Change player team // @css/kick @@ -34,7 +39,7 @@ It's only plugin base, I don't have much time for more extensive development, so - css_cvar - Change cvar value // @css/cvar - css_rcon - Run command as server // @css/rcon -- @Message - Say message to all admins // @css/chat +- team_chat @Message - Say message to all admins // @css/chat ``` ### Requirments diff --git a/TargetResult.cs b/TargetResult.cs deleted file mode 100644 index 39ed99e..0000000 --- a/TargetResult.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace CS2_SimpleAdmin; - -internal enum TargetResult -{ - None, - Multiple, - Single -} diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 0000000..0c08f72 --- /dev/null +++ b/lang/en.json @@ -0,0 +1,29 @@ +{ + "sa_prefix": "{lightred}[SA] {default}", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_player_ban_message_time": "You have been banned for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", + "sa_player_ban_message_perm": "You have been banned permanently for {lightred}{0}{default} by {lightred}{1}{default}!", + "sa_player_kick_message": "You have been kicked for {lightred}{0}{default} by {lightred}{1}{default}!", + "sa_player_gag_message_time": "You have been gagged for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", + "sa_player_gag_message_perm": "You have been gagged permanently for {lightred}{0}{default} by {lightred}{1}{default}!", + "sa_player_mute_message_time": "You have been muted for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", + "sa_player_mute_message_perm": "You have been muted permanently for {lightred}{0}{default} by {lightred}{1}{default}!", + "sa_admin_ban_message_time": "Admin {lightred}{0}{default} banned {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", + "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} banned {lightred}{1}{default} permanently for {lightred}{2}{default}!", + "sa_admin_kick_message": "Admin {lightred}{0}{default} kicked {lightred}{1}{default} for {lightred}{2}{default}!", + "sa_admin_gag_message_time": "Admin {lightred}{0}{default} gagged {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", + "sa_admin_gag_message_perm": "Admin {lightred}{0}{default} gagged {lightred}{1}{default} permanently for {lightred}{2}{default}!", + "sa_admin_mute_message_time": "Admin {lightred}{0}{default} muted {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", + "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} muted {lightred}{1}{default} permanently for {lightred}{2}{default}!", + "sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{WE{default}APON}!", + "sa_admin_slay_message": "Admin {lightred}{0}{default} slayed {lightred}{1}{default}!", + "sa_admin_slap_message": "Admin {lightred}{0}{default} slapped {lightred}{1}{default}!", + "sa_admin_changemap_message": "Admin {lightred}{0}{default} changed map to {lightred}{1}{default}!", + "sa_admin_noclip_message": "Admin {lightred}{0}{default} toggled noclip for {lightred}{1}{default}!", + "sa_admin_freeze_message": "Admin {lightred}{0}{default} freezed {lightred}{1}{default}!", + "sa_admin_umfreeze_message": "Admin {lightred}{0}{default} umfreezed {lightred}{1}{default}!", + "sa_admin_respawn_message": "Admin {lightred}{0}{default} respawned {lightred}{1}{default}!", + "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(PLAYER) {lightred}{0}{default}: {lightred}{1}{default}" +} \ No newline at end of file diff --git a/lang/pl.json b/lang/pl.json new file mode 100644 index 0000000..d496dc6 --- /dev/null +++ b/lang/pl.json @@ -0,0 +1,29 @@ +{ + "sa_prefix": "{lightred}[SA] {default}", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_player_ban_message_time": "Zostałeś zbanowany za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", + "sa_player_ban_message_perm": "Zostałeś zbanowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", + "sa_player_kick_message": "Zostałeś wyrzucony za {lightred}{0}{default} przez {lightred}{1}{default}!", + "sa_player_gag_message_time": "Zostałeś zakneblowany za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", + "sa_player_gag_message_perm": "Zostałeś zakneblowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", + "sa_player_mute_message_time": "Zostałeś uciszony za {lightred}{0}{default} na {lightred}{1}{default} minute przez {lightred}{2}{default}!", + "sa_player_mute_message_perm": "Zostałeś uciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", + "sa_admin_ban_message_time": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", + "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", + "sa_admin_kick_message": "Admin {lightred}{0}{default} wyrzucił {lightred}{1}{default} za {lightred}{2}{default}!", + "sa_admin_gag_message_time": "Admin {lightred}{0}{default} zakneblował {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", + "sa_admin_gag_message_perm": "Admin {lightred}{0}{default} zakneblował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", + "sa_admin_mute_message_time": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", + "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", + "sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{WE{default}APON}!", + "sa_admin_slay_message": "Admin {lightred}{0}{default} zgładził {lightred}{1}{default}!", + "sa_admin_slap_message": "Admin {lightred}{0}{default} uderzył {lightred}{1}{default}!", + "sa_admin_changemap_message": "Admin {lightred}{0}{default} zmienił mapę na {lightred}{1}{default}!", + "sa_admin_noclip_message": "Admin {lightred}{0}{default} ustawił latanie dla {lightred}{1}{default}!", + "sa_admin_freeze_message": "Admin {lightred}{0}{default} zamroził {lightred}{1}{default}!", + "sa_admin_umfreeze_message": "Admin {lightred}{0}{default} odmroził {lightred}{1}{default}!", + "sa_admin_respawn_message": "Admin {lightred}{0}{default} odrodził {lightred}{1}{default}!", + "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(GRACZ) {lightred}{0}{default}: {lightred}{1}{default}" +} \ No newline at end of file From b813a422a2b64695381710f8018b0c645cae239f Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Tue, 12 Dec 2023 12:24:09 +0100 Subject: [PATCH 038/356] Update CS2-SimpleAdmin.cs --- CS2-SimpleAdmin.cs | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 3bf9c1c..a13db46 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1381,25 +1381,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - public void OnGiveCommand(CCSPlayerController? caller, CommandInfo command) - { - if(!GetTarget(command, out var player) || player == null || !player.IsValid) return; - string weaponName = command.GetArg(2); - - //check if weapon is knife - if(weaponName.Contains("_knife") || weaponName.Contains("bayonet")){ - command.ReplyToCommand($"Cannot Give {weaponName} because it's illegal to be given."); - return; - } - //give the weapon to player and announce it - player.GiveNamedItem(weaponName); - Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminGiveMessage}".Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{WEAPON}", weaponName.Split("_")[1])).Replace("{PLAYER}",player.PlayerName)); - } - private static TargetResult? GetTarget(CommandInfo command) { var matches = command.GetArgTargetResult(1); From 22bb7ebac0f41168a22dfe31f194c424af993c55 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Tue, 12 Dec 2023 12:31:54 +0100 Subject: [PATCH 039/356] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3727f59..9e40293 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Manage your Counter-Strike 2 server by simple commands :) ### Commands ```js - css_admin - Display all admin commands // @css/generic +- css_who - Display informations about player // @css/generic +- css_players - Display player list // @css/generic - css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player // @css/ban - css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64 // @css/ban - css_banip [time in minutes/0 perm] [reason] - Ban player via IP address // @css/ban From 719caeafef1c6923b721a7a59059a666e109e4a5 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Tue, 12 Dec 2023 12:50:02 +0100 Subject: [PATCH 040/356] Probably fix for auto ungag? --- CS2-SimpleAdmin.cs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index a13db46..39cf4c6 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -306,8 +306,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Tue, 12 Dec 2023 12:51:31 +0100 Subject: [PATCH 041/356] Update Events.cs --- Events.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Events.cs b/Events.cs index dd7300e..d8f24c2 100644 --- a/Events.cs +++ b/Events.cs @@ -193,10 +193,18 @@ namespace CS2_SimpleAdmin { if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + player.VoiceFlags = VoiceFlags.Normal; - MuteManager _muteManager = new(dbConnectionString); - _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + //MuteManager _muteManager = new(dbConnectionString); + //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } @@ -220,6 +228,14 @@ namespace CS2_SimpleAdmin } } + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + if (TagsDetected) NativeAPI.IssueServerCommand($"css_tag_unmute {player!.Index.ToString()}"); } From e6fb8bc402836553770054f6ca2a66814a2e8dcd Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Tue, 12 Dec 2023 13:31:27 +0100 Subject: [PATCH 042/356] css_rcon caller fix --- CS2-SimpleAdmin.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 39cf4c6..fa0e36b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1365,6 +1365,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig")] [RequiresPermissions("@css/rcon")] - public void OnRcomCommand(CCSPlayerController? caller, CommandInfo command) + public void OnRconCommand(CCSPlayerController? caller, CommandInfo command) { + string playerName = caller == null ? "Console" : caller.PlayerName; Server.ExecuteCommand(command.ArgString); - command.ReplyToCommand($"{caller!.PlayerName} executed command {command.ArgString}."); - - Logger.LogInformation($"{caller!.PlayerName} executed command ({command.ArgString})."); + command.ReplyToCommand($"{playerName} executed command {command.ArgString}."); + Logger.LogInformation($"{playerName} executed command ({command.ArgString})."); } private static TargetResult? GetTarget(CommandInfo command) From efd9ab5c2289862439dbddc49f65e2bb4cd2a494 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Tue, 12 Dec 2023 19:46:19 +0100 Subject: [PATCH 043/356] css_vote and small fixes --- CS2-SimpleAdmin.cs | 66 ++++++++++++++++++++++++++++++++++++++++++++-- Helper.cs | 7 +++++ PlayerUtils.cs | 3 ++- README.md | 3 ++- lang/en.json | 9 +++++-- lang/pl.json | 7 ++++- 6 files changed, 88 insertions(+), 7 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index fa0e36b..089ee0c 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -7,6 +7,7 @@ using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; @@ -21,13 +22,15 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig gaggedPlayers = new ConcurrentBag(); public static ConcurrentBag mutedPlayers = new ConcurrentBag(); + public static Dictionary answers = new Dictionary(); public static bool TagsDetected = false; + public static bool VoteInProgress = false; internal string dbConnectionString = string.Empty; public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.0a"; + public override string ModuleVersion => "1.2.1a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -1140,6 +1143,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [... options ...]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnVoteCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.GetArg(1) == null || command.GetArg(1).Length < 0 || command.ArgCount < 2) + return; + + string question = command.GetArg(1); + int answersCount = command.ArgCount; + + ChatMenu voteMenu = new(_localizer!["sa_admin_vote_menu_title", question]); + + for (int i = 2; i <= answersCount - 1; i++) + { + answers.Add(command.GetArg(i), 0); + voteMenu.AddMenuOption(command.GetArg(i), Helper.handleVotes); + } + + Helper.PrintToCenterAll(_localizer!["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]); + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]); + Server.PrintToChatAll(sb.ToString()); + + VoteInProgress = true; + + foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV)) + { + if (p == null) continue; + ChatMenus.OpenMenu(p, voteMenu); + } + + AddTimer(40, () => + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_vote_message_results", question]); + Server.PrintToChatAll(sb.ToString()); + + foreach (KeyValuePair kvp in answers) + { + sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_vote_message_results_answer", kvp.Key, kvp.Value]); + Server.PrintToChatAll(sb.ToString()); + } + + VoteInProgress = false; + + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + return; + } + [ConsoleCommand("css_map")] [RequiresPermissions("@css/changemap")] [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1227,7 +1290,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { diff --git a/Helper.cs b/Helper.cs index 08b6bfa..3305f4a 100644 --- a/Helper.cs +++ b/Helper.cs @@ -3,6 +3,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; using System.Text.RegularExpressions; +using CounterStrikeSharp.API.Modules.Menu; namespace CS2_SimpleAdmin { @@ -99,5 +100,11 @@ namespace CS2_SimpleAdmin return message; } + internal static void handleVotes(CCSPlayerController player, ChatMenuOption option) + { + if (CS2_SimpleAdmin.VoteInProgress) + CS2_SimpleAdmin.answers[option.Text]++; + } + } } diff --git a/PlayerUtils.cs b/PlayerUtils.cs index 0ffaaf8..e2484fa 100644 --- a/PlayerUtils.cs +++ b/PlayerUtils.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using System.Text; @@ -42,7 +43,7 @@ public static class PlayerUtils public static void Freeze(this CBasePlayerPawn pawn) { - pawn.MoveType = MoveType_t.MOVETYPE_NONE; + pawn.MoveType = MoveType_t.MOVETYPE_OBSOLETE; } public static void Unfreeze(this CBasePlayerPawn pawn) diff --git a/README.md b/README.md index 9e40293..e539578 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Manage your Counter-Strike 2 server by simple commands :) ### Commands ```js - css_admin - Display all admin commands // @css/generic -- css_who - Display informations about player // @css/generic +- css_who <#userid or name> - Display informations about player // @css/generic - css_players - Display player list // @css/generic - css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player // @css/ban - css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64 // @css/ban @@ -27,6 +27,7 @@ Manage your Counter-Strike 2 server by simple commands :) - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay - css_team <#userid or name> [] - Change player team // @css/kick +- css_vote <"Question?"> ["Answer1"] ["Answer2"] ... - Create vote // @css/generic - css_map - Change map // @css/changemap - css_wsmap - Change workshop map // @css/changemap - css_asay - Say message to all admins // @css/chat diff --git a/lang/en.json b/lang/en.json index 0c08f72..16dcefc 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "You have been banned for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", "sa_player_ban_message_perm": "You have been banned permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_player_kick_message": "You have been kicked for {lightred}{0}{default} by {lightred}{1}{default}!", @@ -21,8 +21,13 @@ "sa_admin_changemap_message": "Admin {lightred}{0}{default} changed map to {lightred}{1}{default}!", "sa_admin_noclip_message": "Admin {lightred}{0}{default} toggled noclip for {lightred}{1}{default}!", "sa_admin_freeze_message": "Admin {lightred}{0}{default} freezed {lightred}{1}{default}!", - "sa_admin_umfreeze_message": "Admin {lightred}{0}{default} umfreezed {lightred}{1}{default}!", + "sa_admin_unfreeze_message": "Admin {lightred}{0}{default} umfreezed {lightred}{1}{default}!", "sa_admin_respawn_message": "Admin {lightred}{0}{default} respawned {lightred}{1}{default}!", + "sa_admin_team_message": "Admin {lightred}{0}{default} transfered {lightred}{1}{default} to {lightred}{2}{default}!", + "sa_admin_vote_menu_title": "{lime}VOTING FOR {gold}{0}", + "sa_admin_vote_message": "Admin {lightred}{0}{default} started voting for {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}VOTING RESULTS FOR {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(PLAYER) {lightred}{0}{default}: {lightred}{1}{default}" diff --git a/lang/pl.json b/lang/pl.json index d496dc6..9ed7288 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "Zostałeś zbanowany za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", "sa_player_ban_message_perm": "Zostałeś zbanowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", "sa_player_kick_message": "Zostałeś wyrzucony za {lightred}{0}{default} przez {lightred}{1}{default}!", @@ -23,6 +23,11 @@ "sa_admin_freeze_message": "Admin {lightred}{0}{default} zamroził {lightred}{1}{default}!", "sa_admin_umfreeze_message": "Admin {lightred}{0}{default} odmroził {lightred}{1}{default}!", "sa_admin_respawn_message": "Admin {lightred}{0}{default} odrodził {lightred}{1}{default}!", + "sa_admin_team_message": "Admin {lightred}{0}{default} przerzucił {lightred}{1}{default} do {lightred}{2}{default}!", + "sa_admin_vote_menu_title": "{lime}GŁOSOWANIE NA {gold}{0}", + "sa_admin_vote_message": "Admin {lightred}{0}{default} rozpoczął głosowanie na {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}WYNIKI GŁOSOWANIA {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}[{1}]", "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(GRACZ) {lightred}{0}{default}: {lightred}{1}{default}" From d677551463b5b9fb241368c4cc03bca664aeda9f Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Tue, 12 Dec 2023 19:51:39 +0100 Subject: [PATCH 044/356] Update CS2-SimpleAdmin.cs --- CS2-SimpleAdmin.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 089ee0c..815be5c 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1193,6 +1193,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Tue, 12 Dec 2023 20:01:30 +0100 Subject: [PATCH 045/356] Fixed css_team message --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 815be5c..82673b2 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1179,7 +1179,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Tue, 12 Dec 2023 20:06:01 +0100 Subject: [PATCH 046/356] Update CS2-SimpleAdmin.cs --- CS2-SimpleAdmin.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 82673b2..081009b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1139,7 +1139,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig []", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [CommandHelper(minArgs: 2, usage: "<#userid or name> [] [-k]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnTeamCommand(CCSPlayerController? caller, CommandInfo command) { string teamName = command.GetArg(2).ToLower(); @@ -1173,7 +1173,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Wed, 13 Dec 2023 18:19:16 +0200 Subject: [PATCH 047/356] Create lv.json --- lang/lv.json | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 lang/lv.json diff --git a/lang/lv.json b/lang/lv.json new file mode 100644 index 0000000..6433fb3 --- /dev/null +++ b/lang/lv.json @@ -0,0 +1,34 @@ +{ + "sa_prefix": "{lightred}[SA] {default}", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmins Palīdzība ]{DEFAULT}\n- css_who <#userid vai vārds> - Parāda informāciju par spēlētājiem\n- css_players - Parāda spēlētāju sarakstu\n- css_ban <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam pievienoties serverim\n- css_addban [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam pievienoties serverim izmantojot steamid64\n- css_banip [laiks minūtēs/0 uz mūžu] [iemesls] - liedz spēlētājam pievienoties serverim izmantojot IP adresi\n- css_unban - noņem spēlētāja liegumu pievienoties serverim\n- css_kick <#userid vai vārds> [iemesls] - izmet spēlētāju no servera\n- css_gag <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam čatot\n- css_addgag [laiks minūtēs/0 uz mūžu] [iemesls] - liedz spēlētājam pieeju čatot izmantojot steamid64\n- css_unmute - noņem spēlētāja liegumu izmantot balss čatu\n- css_mute <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz iespēju izmantot balss čatu\n- css_addmute [laiks minūtēs/0 uz mūžu] [iemesls] - Liedz iespēju izmantot balss čatu izmantojot steamid64\n- css_give <#userid vai vārds> - Atļauj iedot jebkādu ieroci spēlētājam\n- css_slay <#userid vai vārds> - Nonāvē spēlētāju\n- css_slap <#userid vai vārds> [damage] - ieper spēlētāju\n- css_vote <'Jautājums?'> ['Atbilde1'] ['Atbilde2'] ... - Sāk balsošanu\n- css_map - Maina karti\n- css_wsmap - Maina Workshop karti\n- css_asay - Nosūta paziņojumu visiem adminiem\n- css_say - Say parāda paziņojumu no admina čatā\n- css_psay <#userid vai vārds> - Nosūta privātu ziņu spēlētājam\n- css_csay - Parāda paziņojumu no admina pa vidu ekrānam\n- css_hsay - Parāda paziņojumu no admina hud logā\n- css_noclip <#userid vai vārds> - Ieslēdz noclip spēlētājam\n- css_freeze <#userid vai vārds> [ilgums] - Sasaldē spēlētāju\n- css_unfreeze <#userid vai vārds> - atkausē spēlētāju\n- css_respawn <#userid vai vārds> - Atdzīvina spēlētāju\n- css_cvar - Nomaina cvar vērtību\n- css_rcon - Palaist komandu kā serverim", + "sa_player_ban_message_time": "Tu tiki banots par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju liedza Admins: {lightred}{2}{default}!", + "sa_player_ban_message_perm": "Tu tiki banots uz mūžu par {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_player_kick_message": "Tu tiki izmests par {lightred}{0}{default} Tevi izmeta Admins: {lightred}{1}{default}!", + "sa_player_gag_message_time": "Tev tika liegta pieeja čatam par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju liedza Admins: {lightred}{2}{default}!", + "sa_player_gag_message_perm": "Tev tika liegta pieeja čatam uz mūžu par {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_player_mute_message_time": "Tev tika liegta pieeja balss čatam par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju Liedza Admins: {lightred}{2}{default}!", + "sa_player_mute_message_perm": "Tev tika liegta pieeja balss čatam uz mūžu par{lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_admin_ban_message_time": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", + "sa_admin_ban_message_perm": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", + "sa_admin_kick_message": "Admins {lightred}{0}{default} izmeta {lightred}{1}{default} par {lightred}{2}{default}!", + "sa_admin_gag_message_time": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", + "sa_admin_gag_message_perm": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", + "sa_admin_mute_message_time": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", + "sa_admin_mute_message_perm": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", + "sa_admin_give_message": "Admins {lightred}{0}{default} iedeva {lightred}{1}{default} {lightred}{IE{default}ROCI}!", + "sa_admin_slay_message": "Admins {lightred}{0}{default} nonāvēja {lightred}{1}{default}!", + "sa_admin_slap_message": "Admins {lightred}{0}{default} iepērā {lightred}{1}{default}!", + "sa_admin_changemap_message": "Admins {lightred}{0}{default} nomainīja karti uz {lightred}{1}{default}!", + "sa_admin_noclip_message": "Admins {lightred}{0}{default} uzlika noclip spēlētājam {lightred}{1}{default}!", + "sa_admin_freeze_message": "Admins {lightred}{0}{default} sasaldēja {lightred}{1}{default}!", + "sa_admin_unfreeze_message": "Admins{lightred}{0}{default} atkausēja {lightred}{1}{default}!", + "sa_admin_respawn_message": "Admins {lightred}{0}{default} atdzīvināja {lightred}{1}{default}!", + "sa_admin_team_message": "Admins {lightred}{0}{default} pārvietoja {lightred}{1}{default} uz {lightred}{2}{default}!", + "sa_admin_vote_menu_title": "{lime}Balsošana par {gold}{0}", + "sa_admin_vote_message": "Admins {lightred}{0}{default} sāka balsošanu par {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}BALSOŠANAS REZULTĀTI PAR {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", + "sa_adminsay_prefix": "{RED}ADMINS: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(ADMINS) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(SPĒLĒTĀJS) {lightred}{0}{default}: {lightred}{1}{default}" +} From 28f6cf63fe108a5993754a01d4bc7e0c6b603a8b Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Wed, 13 Dec 2023 20:20:12 +0100 Subject: [PATCH 048/356] 1.2.2a UPDATE - Fixed css_addban, css_addmute - New command `css_hp` - New command `css_god` - New command `css_speed` --- CS2-SimpleAdmin.cs | 119 ++++++++++--- Events.cs | 404 ++++++++++++++++++++++++--------------------- Helper.cs | 4 +- PlayerUtils.cs | 28 ++++ README.md | 3 + lang/en.json | 7 +- lang/lv.json | 37 +++++ lang/pl.json | 7 +- 8 files changed, 390 insertions(+), 219 deletions(-) create mode 100644 lang/lv.json diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 081009b..82da7f7 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -22,15 +22,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig gaggedPlayers = new ConcurrentBag(); public static ConcurrentBag mutedPlayers = new ConcurrentBag(); - public static Dictionary answers = new Dictionary(); + public static Dictionary voteAnswers = new Dictionary(); + public static List GodPlayers = new List(); public static bool TagsDetected = false; - public static bool VoteInProgress = false; + public static bool voteInProgress = false; internal string dbConnectionString = string.Empty; public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.1a"; + public override string ModuleVersion => "1.2.2a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -105,10 +106,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - { - BanManager _banManager = new(dbConnectionString); - await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); - }); - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); } } + + Task.Run(async () => + { + BanManager _banManager = new(dbConnectionString); + await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); + }); + command.ReplyToCommand($"Banned player with steamid {steamid}."); } @@ -1017,16 +1020,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - { - BanManager _banManager = new(dbConnectionString); - await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); - }); - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, "Banned")); } } + Task.Run(async () => + { + BanManager _banManager = new(dbConnectionString); + await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); + }); + command.ReplyToCommand($"Banned player with IP address {ipAddress}."); } @@ -1086,7 +1089,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - //give the weapon to player and announce it player.GiveNamedItem(weaponName); StringBuilder sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_give_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, weaponName]); @@ -1112,6 +1114,73 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnHpCommand(CCSPlayerController? caller, CommandInfo command) + { + int health = 100; + int.TryParse(command.GetArg(2), out health); + + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + + playersToTarget.ForEach(player => + { + player.SetHp(health); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_hp_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); + } + + [ConsoleCommand("css_speed")] + [RequiresPermissions("@css/slay")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnSpeedCommand(CCSPlayerController? caller, CommandInfo command) + { + double speed = 1.0; + double.TryParse(command.GetArg(2), out speed); + + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + + playersToTarget.ForEach(player => + { + player.Speed = (float)speed; + player.PlayerPawn.Value!.Speed = (float)speed; + + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_speed_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); + } + + [ConsoleCommand("css_god")] + [RequiresPermissions("@css/cheats")] + [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnGodCommand(CCSPlayerController? caller, CommandInfo command) + { + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + + playersToTarget.ForEach(player => + { + if (!GodPlayers.Contains((int)player.Index)) + GodPlayers.Add((int)player.Index); + else + GodPlayers.Remove((int)player.Index); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_god_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); + } + [ConsoleCommand("css_slap")] [RequiresPermissions("@css/slay")] [CommandHelper(minArgs: 1, usage: "<#userid or name> [damage]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1193,7 +1262,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p.IsValid && !p.IsBot && !p.IsHLTV)) { @@ -1225,14 +1294,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig kvp in answers) + foreach (KeyValuePair kvp in voteAnswers) { sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_vote_message_results_answer", kvp.Key, kvp.Value]); Server.PrintToChatAll(sb.ToString()); } - answers.Clear(); - VoteInProgress = false; + voteAnswers.Clear(); + voteInProgress = false; }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); diff --git a/Events.cs b/Events.cs index d8f24c2..82b9321 100644 --- a/Events.cs +++ b/Events.cs @@ -6,255 +6,283 @@ using CounterStrikeSharp.API.Modules.Entities; using System.Text; using static CounterStrikeSharp.API.Core.Listeners; -namespace CS2_SimpleAdmin +namespace CS2_SimpleAdmin; +public partial class CS2_SimpleAdmin { - public partial class CS2_SimpleAdmin + private void registerEvents() { - private void registerEvents() - { - RegisterListener(OnClientAuthorized); - RegisterListener(OnClientDisconnect); - RegisterListener(OnMapStart); - AddCommandListener("say", OnCommandSay); - AddCommandListener("say_team", OnCommandTeamSay); - AddCommandListener("callvote", OnCommandCallVote); - } - private HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) - { - if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; + RegisterListener(OnClientAuthorized); + RegisterListener(OnClientDisconnect); + RegisterListener(OnMapStart); + RegisterEventHandler(OnPlayerHurt); + RegisterEventHandler(OnRoundStart); + AddCommandListener("say", OnCommandSay); + AddCommandListener("say_team", OnCommandTeamSay); + AddCommandListener("callvote", OnCommandCallVote); + } - if (gaggedPlayers.Contains((int)player.Index)) - { - return HookResult.Handled; - } + private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info) + { + GodPlayers.Clear(); + return HookResult.Continue; + } - return HookResult.Continue; + private HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) + { + if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; + + if (gaggedPlayers.Contains((int)player.Index)) + { + return HookResult.Handled; } - private HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info) + return HookResult.Continue; + } + + private HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info) + { + if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; + + if (gaggedPlayers.Contains((int)player.Index)) { - if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; + return HookResult.Handled; + } - if (gaggedPlayers.Contains((int)player.Index)) + if (info.GetArg(1).StartsWith("@")) + { + StringBuilder sb = new(); + + if (AdminManager.PlayerHasPermissions(player, "@css/chat")) { - return HookResult.Handled; - } - - if (info.GetArg(1).StartsWith("@")) - { - StringBuilder sb = new(); - - if (AdminManager.PlayerHasPermissions(player, "@css/chat")) + sb.Append(_localizer!["sa_adminchat_template_admin", player.PlayerName, info.GetArg(1).Remove(0, 1)]); + foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { - sb.Append(_localizer!["sa_adminchat_template_admin", player.PlayerName, info.GetArg(1).Remove(0, 1)]); - foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) - { - p.PrintToChat(sb.ToString()); - } + p.PrintToChat(sb.ToString()); } - else - { - sb.Append(_localizer!["sa_adminchat_template_player", player.PlayerName, info.GetArg(1).Remove(0, 1)]); - player.PrintToChat(sb.ToString()); - foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) - { - p.PrintToChat(sb.ToString()); - } - } - - return HookResult.Handled; } - - return HookResult.Continue; - } - - private HookResult OnCommandCallVote(CCSPlayerController? player, CommandInfo info) - { - string reason = info.GetArg(1); - - if (reason == "kick" || reason == "ban") + else { - int.TryParse(info.GetArg(2), out int target); - if (target > 0) + sb.Append(_localizer!["sa_adminchat_template_player", player.PlayerName, info.GetArg(1).Remove(0, 1)]); + player.PrintToChat(sb.ToString()); + foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { - if (!player!.CanTarget(Utilities.GetPlayerFromUserid(target))) - return HookResult.Handled; + p.PrintToChat(sb.ToString()); } } - return HookResult.Continue; + return HookResult.Handled; } - private void OnClientAuthorized(int playerSlot, SteamID steamID) + return HookResult.Continue; + } + + private HookResult OnCommandCallVote(CCSPlayerController? player, CommandInfo info) + { + string reason = info.GetArg(1); + + if (reason == "kick" || reason == "ban") { - CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); - - if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) - return; - - if (player.AuthorizedSteamID == null) + int.TryParse(info.GetArg(2), out int target); + if (target > 0) { - AddTimer(3.0f, () => - { - OnClientAuthorized(playerSlot, steamID); - }); - return; + if (!player!.CanTarget(Utilities.GetPlayerFromUserid(target))) + return HookResult.Handled; } + } - PlayerInfo playerInfo = new PlayerInfo + return HookResult.Continue; + } + + private void OnClientAuthorized(int playerSlot, SteamID steamID) + { + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + + if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) + return; + + if (player.AuthorizedSteamID == null) + { + AddTimer(3.0f, () => { - UserId = player.UserId, - Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; + OnClientAuthorized(playerSlot, steamID); + }); + return; + } - Task.Run(async () => + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + if (player == null || !player.IsValid) return; + BanManager _banManager = new(dbConnectionString); + bool isBanned = await _banManager.IsPlayerBanned(playerInfo); + + MuteManager _muteManager = new(dbConnectionString); + List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId!); + + Server.NextFrame(() => { if (player == null || !player.IsValid) return; - BanManager _banManager = new(dbConnectionString); - bool isBanned = await _banManager.IsPlayerBanned(playerInfo); - - MuteManager _muteManager = new(dbConnectionString); - List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId!); - - Server.NextFrame(() => + if (isBanned) { - if (player == null || !player.IsValid) return; - if (isBanned) - { - Helper.KickPlayer((ushort)player.UserId!, "Banned"); - return; - } + Helper.KickPlayer((ushort)player.UserId!, "Banned"); + return; + } - if (activeMutes.Count > 0) + if (activeMutes.Count > 0) + { + foreach (var mute in activeMutes) { - foreach (var mute in activeMutes) + string muteType = mute.type; + TimeSpan duration = mute.ends - mute.created; + int durationInSeconds = (int)duration.TotalSeconds; + + if (muteType == "GAG") { - string muteType = mute.type; - TimeSpan duration = mute.ends - mute.created; - int durationInSeconds = (int)duration.TotalSeconds; + // Chat mute + if (!gaggedPlayers.Any(index => index == player.Index)) + gaggedPlayers.Add((int)player.Index); - if (muteType == "GAG") + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_mute {player.Index}"); + + if (duration.Minutes >= 0 && duration.Minutes <= 30) { - // Chat mute - if (!gaggedPlayers.Any(index => index == player.Index)) - gaggedPlayers.Add((int)player.Index); - - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player.Index}"); - - if (duration.Minutes >= 0 && duration.Minutes <= 30) + AddTimer(durationInSeconds, () => { - AddTimer(durationInSeconds, () => + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (gaggedPlayers.Contains((int)player.Index)) { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - - if (gaggedPlayers.Contains((int)player.Index)) + if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) { - if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) - { - gaggedPlayers.Add(removedItem); - } + gaggedPlayers.Add(removedItem); } + } - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index}"); + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index}"); - MuteManager _muteManager = new(dbConnectionString); - _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - - /* - CCSPlayerController currentPlayer = player; - - if (mute.duration == 0 || durationInSeconds >= 1800) continue; - - await Task.Delay(TimeSpan.FromSeconds(durationInSeconds)); - - if (currentPlayer != null && currentPlayer.IsValid) - { - NativeAPI.IssueServerCommand($"css_tag_unmute {currentPlayer.Index.ToString()}"); - await UnmutePlayer(currentPlayer.AuthorizedSteamID.SteamId64.ToString(), 0); - } - */ + MuteManager _muteManager = new(dbConnectionString); + _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } - else + + + /* + CCSPlayerController currentPlayer = player; + + if (mute.duration == 0 || durationInSeconds >= 1800) continue; + + await Task.Delay(TimeSpan.FromSeconds(durationInSeconds)); + + if (currentPlayer != null && currentPlayer.IsValid) { - // Voice mute - player.VoiceFlags = VoiceFlags.Muted; + NativeAPI.IssueServerCommand($"css_tag_unmute {currentPlayer.Index.ToString()}"); + await UnmutePlayer(currentPlayer.AuthorizedSteamID.SteamId64.ToString(), 0); + } + */ + } + else + { + // Voice mute + player.VoiceFlags = VoiceFlags.Muted; - if (duration.Minutes >= 0 && duration.Minutes <= 30) + if (duration.Minutes >= 0 && duration.Minutes <= 30) + { + AddTimer(durationInSeconds, () => { - AddTimer(durationInSeconds, () => + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (mutedPlayers.Contains((int)player.Index)) { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - - if (mutedPlayers.Contains((int)player.Index)) + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) - { - mutedPlayers.Add(removedItem); - } + mutedPlayers.Add(removedItem); } + } - player.VoiceFlags = VoiceFlags.Normal; + player.VoiceFlags = VoiceFlags.Normal; - //MuteManager _muteManager = new(dbConnectionString); - //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } + //MuteManager _muteManager = new(dbConnectionString); + //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } } - }); + } }); + }); + } + + private void OnClientDisconnect(int playerSlot) + { + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + + if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; + + if (gaggedPlayers.Contains((int)player.Index)) + { + if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + gaggedPlayers.Add(removedItem); + } } - private void OnClientDisconnect(int playerSlot) + if (mutedPlayers.Contains((int)player.Index)) { - CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); - - if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; - - if (gaggedPlayers.Contains((int)player.Index)) + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) { - if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) - { - gaggedPlayers.Add(removedItem); - } + mutedPlayers.Add(removedItem); } - - if (mutedPlayers.Contains((int)player.Index)) - { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) - { - mutedPlayers.Add(removedItem); - } - } - - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.Index.ToString()}"); } - private void OnMapStart(string mapName) + if (GodPlayers.Contains((int)player.Index)) { - AddTimer(120.0f, () => - { - BanManager _banManager = new(dbConnectionString); - _ = _banManager.ExpireOldBans(); - MuteManager _muteManager = new(dbConnectionString); - _ = _muteManager.ExpireOldMutes(); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + GodPlayers.Remove((int)player.Index); + } - string? path = Path.GetDirectoryName(ModuleDirectory); - if (Directory.Exists(path + "/CS2-Tags")) - { - TagsDetected = true; - } + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.Index.ToString()}"); + } + + private void OnMapStart(string mapName) + { + AddTimer(120.0f, () => + { + BanManager _banManager = new(dbConnectionString); + _ = _banManager.ExpireOldBans(); + MuteManager _muteManager = new(dbConnectionString); + _ = _muteManager.ExpireOldMutes(); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + string? path = Path.GetDirectoryName(ModuleDirectory); + if (Directory.Exists(path + "/CS2-Tags")) + { + TagsDetected = true; } } + + private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info) + { + CCSPlayerController? player = @event.Userid; + + if (player == null || !player.IsValid) + return HookResult.Continue; + + if (GodPlayers.Contains((int)player.Index) && player.PawnIsAlive) + { + player.Health = 100; + player.PlayerPawn.Value!.Health = 100; + } + + return HookResult.Continue; + } } diff --git a/Helper.cs b/Helper.cs index 3305f4a..1f7aae8 100644 --- a/Helper.cs +++ b/Helper.cs @@ -102,8 +102,8 @@ namespace CS2_SimpleAdmin internal static void handleVotes(CCSPlayerController player, ChatMenuOption option) { - if (CS2_SimpleAdmin.VoteInProgress) - CS2_SimpleAdmin.answers[option.Text]++; + if (CS2_SimpleAdmin.voteInProgress) + CS2_SimpleAdmin.voteAnswers[option.Text]++; } } diff --git a/PlayerUtils.cs b/PlayerUtils.cs index e2484fa..813ff15 100644 --- a/PlayerUtils.cs +++ b/PlayerUtils.cs @@ -25,6 +25,34 @@ public static class PlayerUtils return AdminManager.CanPlayerTarget(controller, target); } + public static void SetHp(this CCSPlayerController controller, int health = 100) + { + if (health <= 0 || !controller.PawnIsAlive || controller.PlayerPawn.Value == null) return; + + controller.Health = health; + controller.PlayerPawn.Value.Health = health; + + if (health > 100) + { + controller.MaxHealth = health; + controller.PlayerPawn.Value.MaxHealth = health; + } + + var weaponServices = controller.PlayerPawn.Value!.WeaponServices; + if (weaponServices == null) return; + + controller.GiveNamedItem("weapon_healthshot"); + + foreach (var weapon in weaponServices.MyWeapons) + { + if (weapon != null && weapon.IsValid && weapon.Value!.DesignerName == "weapon_healthshot") + { + weapon.Value.Remove(); + break; + } + } + } + public static void Bury(this CBasePlayerPawn pawn, float depth = 10f) { var newPos = new Vector(pawn.AbsOrigin!.X, pawn.AbsOrigin.Y, diff --git a/README.md b/README.md index e539578..a42a776 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ Manage your Counter-Strike 2 server by simple commands :) - css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64 // @css/chat - css_unmute - Unmute player // @css/chat - css_give <#userid or name> - Give weapon to player // @css/cheats +- css_hp <#userid or name> [health] - Set player health // @css/slay +- css_speed <#userid or name> [speed] - Set player speed // @css/slay +- css_god <#userid or name> - Toggle godmode for player // @css/cheats - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay - css_team <#userid or name> [] - Change player team // @css/kick diff --git a/lang/en.json b/lang/en.json index 16dcefc..f06dcea 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "You have been banned for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", "sa_player_ban_message_perm": "You have been banned permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_player_kick_message": "You have been kicked for {lightred}{0}{default} by {lightred}{1}{default}!", @@ -15,7 +15,10 @@ "sa_admin_gag_message_perm": "Admin {lightred}{0}{default} gagged {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_mute_message_time": "Admin {lightred}{0}{default} muted {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} muted {lightred}{1}{default} permanently for {lightred}{2}{default}!", - "sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{WE{default}APON}!", + "sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{2}{default}!", + "sa_admin_hp_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} hp amount{default}!", + "sa_admin_speed_message": "Admin {lightred}{0}{default} changed speed for {lightred}{1}{default}!", + "sa_admin_god_message": "Admin {lightred}{0}{default} changed god mode for {lightred}{1}{default}!", "sa_admin_slay_message": "Admin {lightred}{0}{default} slayed {lightred}{1}{default}!", "sa_admin_slap_message": "Admin {lightred}{0}{default} slapped {lightred}{1}{default}!", "sa_admin_changemap_message": "Admin {lightred}{0}{default} changed map to {lightred}{1}{default}!", diff --git a/lang/lv.json b/lang/lv.json new file mode 100644 index 0000000..30553ea --- /dev/null +++ b/lang/lv.json @@ -0,0 +1,37 @@ +{ + "sa_prefix": "{lightred}[SA] {default}", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmins Palīdzība ]{DEFAULT}\n- css_who <#userid vai vārds> - Parāda informāciju par spēlētājiem\n- css_players - Parāda spēlētāju sarakstu\n- css_ban <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam pievienoties serverim\n- css_addban [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam pievienoties serverim izmantojot steamid64\n- css_banip [laiks minūtēs/0 uz mūžu] [iemesls] - liedz spēlētājam pievienoties serverim izmantojot IP adresi\n- css_unban - noņem spēlētāja liegumu pievienoties serverim\n- css_kick <#userid vai vārds> [iemesls] - izmet spēlētāju no servera\n- css_gag <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam čatot\n- css_addgag [laiks minūtēs/0 uz mūžu] [iemesls] - liedz spēlētājam pieeju čatot izmantojot steamid64\n- css_unmute - noņem spēlētāja liegumu izmantot balss čatu\n- css_mute <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz iespēju izmantot balss čatu\n- css_addmute [laiks minūtēs/0 uz mūžu] [iemesls] - Liedz iespēju izmantot balss čatu izmantojot steamid64\n- css_give <#userid vai vārds> - Atļauj iedot jebkādu ieroci spēlētājam\n- css_slay <#userid vai vārds> - Nonāvē spēlētāju\n- css_slap <#userid vai vārds> [damage] - ieper spēlētāju\n- css_vote <'Jautājums?'> ['Atbilde1'] ['Atbilde2'] ... - Sāk balsošanu\n- css_map - Maina karti\n- css_wsmap - Maina Workshop karti\n- css_asay - Nosūta paziņojumu visiem adminiem\n- css_say - Say parāda paziņojumu no admina čatā\n- css_psay <#userid vai vārds> - Nosūta privātu ziņu spēlētājam\n- css_csay - Parāda paziņojumu no admina pa vidu ekrānam\n- css_hsay - Parāda paziņojumu no admina hud logā\n- css_noclip <#userid vai vārds> - Ieslēdz noclip spēlētājam\n- css_freeze <#userid vai vārds> [ilgums] - Sasaldē spēlētāju\n- css_unfreeze <#userid vai vārds> - atkausē spēlētāju\n- css_respawn <#userid vai vārds> - Atdzīvina spēlētāju\n- css_cvar - Nomaina cvar vērtību\n- css_rcon - Palaist komandu kā serverim", + "sa_player_ban_message_time": "Tu tiki banots par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju liedza Admins: {lightred}{2}{default}!", + "sa_player_ban_message_perm": "Tu tiki banots uz mūžu par {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_player_kick_message": "Tu tiki izmests par {lightred}{0}{default} Tevi izmeta Admins: {lightred}{1}{default}!", + "sa_player_gag_message_time": "Tev tika liegta pieeja čatam par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju liedza Admins: {lightred}{2}{default}!", + "sa_player_gag_message_perm": "Tev tika liegta pieeja čatam uz mūžu par {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_player_mute_message_time": "Tev tika liegta pieeja balss čatam par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju Liedza Admins: {lightred}{2}{default}!", + "sa_player_mute_message_perm": "Tev tika liegta pieeja balss čatam uz mūžu par{lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_admin_ban_message_time": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", + "sa_admin_ban_message_perm": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", + "sa_admin_kick_message": "Admins {lightred}{0}{default} izmeta {lightred}{1}{default} par {lightred}{2}{default}!", + "sa_admin_gag_message_time": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", + "sa_admin_gag_message_perm": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", + "sa_admin_mute_message_time": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", + "sa_admin_mute_message_perm": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", + "sa_admin_give_message": "Admins {lightred}{0}{default} iedeva {lightred}{1}{default} {lightred}{2}{default}!", + "sa_admin_hp_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} ZS apjomu{default}!", + "sa_admin_speed_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} ātrumu{default}!", + "sa_admin_god_message": "Admins {lightred}{0}{default} mainīja dieva režīmu priekš {lightred}{1}{default}!", + "sa_admin_slay_message": "Admins {lightred}{0}{default} nonāvēja {lightred}{1}{default}!", + "sa_admin_slap_message": "Admins {lightred}{0}{default} iepērā {lightred}{1}{default}!", + "sa_admin_changemap_message": "Admins {lightred}{0}{default} nomainīja karti uz {lightred}{1}{default}!", + "sa_admin_noclip_message": "Admins {lightred}{0}{default} uzlika noclip spēlētājam {lightred}{1}{default}!", + "sa_admin_freeze_message": "Admins {lightred}{0}{default} sasaldēja {lightred}{1}{default}!", + "sa_admin_unfreeze_message": "Admins{lightred}{0}{default} atkausēja {lightred}{1}{default}!", + "sa_admin_respawn_message": "Admins {lightred}{0}{default} atdzīvināja {lightred}{1}{default}!", + "sa_admin_team_message": "Admins {lightred}{0}{default} pārvietoja {lightred}{1}{default} uz {lightred}{2}{default}!", + "sa_admin_vote_menu_title": "{lime}Balsošana par {gold}{0}", + "sa_admin_vote_message": "Admins {lightred}{0}{default} sāka balsošanu par {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}BALSOŠANAS REZULTĀTI PAR {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", + "sa_adminsay_prefix": "{RED}ADMINS: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(ADMINS) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(SPĒLĒTĀJS) {lightred}{0}{default}: {lightred}{1}{default}" +} diff --git a/lang/pl.json b/lang/pl.json index 9ed7288..e015261 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "Zostałeś zbanowany za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", "sa_player_ban_message_perm": "Zostałeś zbanowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", "sa_player_kick_message": "Zostałeś wyrzucony za {lightred}{0}{default} przez {lightred}{1}{default}!", @@ -15,7 +15,10 @@ "sa_admin_gag_message_perm": "Admin {lightred}{0}{default} zakneblował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_mute_message_time": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", - "sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{WE{default}APON}!", + "sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{2}{default}!", + "sa_admin_hp_message": "Admin {lightred}{0}{default} zmienił ilość hp dla {lightred}{1}{default}!", + "sa_admin_speed_message": "Admin {lightred}{0}{default} zmienił prędkość dla {lightred}{1}{default}!", + "sa_admin_god_message": "Admin {lightred}{0}{default} zmienił tryb Boga dla {lightred}{1}{default}!", "sa_admin_slay_message": "Admin {lightred}{0}{default} zgładził {lightred}{1}{default}!", "sa_admin_slap_message": "Admin {lightred}{0}{default} uderzył {lightred}{1}{default}!", "sa_admin_changemap_message": "Admin {lightred}{0}{default} zmienił mapę na {lightred}{1}{default}!", From 270e3bd858939ab95ba82f58c717bd8d0a8d5603 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Thu, 14 Dec 2023 21:43:40 +0100 Subject: [PATCH 049/356] 1.2.3a - Fixed pern mute when entering the server - New command `css_strip` - Changed `css_team` command added `swap` as team, and `-k` argument to kill player --- CS2-SimpleAdmin.cs | 60 ++++++++++++++++++++++++++++++++++++---------- Events.cs | 4 ++-- PlayerUtils.cs | 2 +- README.md | 3 ++- lang/en.json | 3 ++- lang/lv.json | 7 ++---- lang/pl.json | 3 ++- 7 files changed, 58 insertions(+), 24 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 82da7f7..47fef8f 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -16,7 +16,7 @@ using System.Collections.Concurrent; using System.Text; namespace CS2_SimpleAdmin; -[MinimumApiVersion(124)] +[MinimumApiVersion(126)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static IStringLocalizer? _localizer; @@ -31,7 +31,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.2a"; + public override string ModuleVersion => "1.2.3a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -202,15 +202,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); + caller!.PrintToConsole($"--------- PLAYER LIST ---------"); playersToTarget.ForEach(player => { - caller!.PrintToConsole($"--------- PLAYER LIST ---------"); - caller!.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.AuthorizedSteamID?.SteamId64}\")"); - caller!.PrintToConsole($"--------- END PLAYER LIST ---------"); - }); + caller!.PrintToConsole($"--------- END PLAYER LIST ---------"); } [ConsoleCommand("css_kick")] @@ -624,7 +622,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnStripCommand(CCSPlayerController? caller, CommandInfo command) + { + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + + playersToTarget.ForEach(player => + { + player.RemoveWeapons(); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_strip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + }); + } + [ConsoleCommand("css_hp")] [RequiresPermissions("@css/slay")] [CommandHelper(minArgs: 1, usage: "<#userid or name> ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1232,6 +1248,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (player.TeamNum != ((byte)teamNum)) + if (!teamName.Equals("swap")) { - if (player.PawnIsAlive && command.GetArg(3) == null && teamNum != CsTeam.Spectator) + if (player.PawnIsAlive && teamNum != CsTeam.Spectator && !command.GetArg(3).ToLower().Equals("-k")) player.SwitchTeam(teamNum); else player.ChangeTeam(teamNum); - - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_team_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, _teamName]); - Server.PrintToChatAll(sb.ToString()); } + else + { + if (player.TeamNum != (byte)CsTeam.Spectator) + { + CsTeam teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist; + _teamName = teamNum == CsTeam.Terrorist ? "TT" : "CT"; + if (player.PawnIsAlive && !command.GetArg(3).ToLower().Equals("-k")) + { + player.SwitchTeam(teamNum); + } + else + { + player.ChangeTeam(teamNum); + } + } + } + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_team_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, _teamName]); + Server.PrintToChatAll(sb.ToString()); }); } diff --git a/Events.cs b/Events.cs index 82b9321..f39f87e 100644 --- a/Events.cs +++ b/Events.cs @@ -153,7 +153,7 @@ public partial class CS2_SimpleAdmin if (TagsDetected) NativeAPI.IssueServerCommand($"css_tag_mute {player.Index}"); - if (duration.Minutes >= 0 && duration.Minutes <= 30) + if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) { AddTimer(durationInSeconds, () => { @@ -195,7 +195,7 @@ public partial class CS2_SimpleAdmin // Voice mute player.VoiceFlags = VoiceFlags.Muted; - if (duration.Minutes >= 0 && duration.Minutes <= 30) + if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) { AddTimer(durationInSeconds, () => { diff --git a/PlayerUtils.cs b/PlayerUtils.cs index 813ff15..e493de8 100644 --- a/PlayerUtils.cs +++ b/PlayerUtils.cs @@ -38,7 +38,7 @@ public static class PlayerUtils controller.PlayerPawn.Value.MaxHealth = health; } - var weaponServices = controller.PlayerPawn.Value!.WeaponServices; + CPlayer_WeaponServices? weaponServices = controller.PlayerPawn.Value!.WeaponServices; if (weaponServices == null) return; controller.GiveNamedItem("weapon_healthshot"); diff --git a/README.md b/README.md index a42a776..229cc65 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,13 @@ Manage your Counter-Strike 2 server by simple commands :) - css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64 // @css/chat - css_unmute - Unmute player // @css/chat - css_give <#userid or name> - Give weapon to player // @css/cheats +- css_strip <#userid or name> - Takes all of the player weapons // @css/slay - css_hp <#userid or name> [health] - Set player health // @css/slay - css_speed <#userid or name> [speed] - Set player speed // @css/slay - css_god <#userid or name> - Toggle godmode for player // @css/cheats - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay -- css_team <#userid or name> [] - Change player team // @css/kick +- css_team <#userid or name> [] [-k] - Change player team (swap - swap player team, -k - kill player) // @css/kick - css_vote <"Question?"> ["Answer1"] ["Answer2"] ... - Create vote // @css/generic - css_map - Change map // @css/changemap - css_wsmap - Change workshop map // @css/changemap diff --git a/lang/en.json b/lang/en.json index f06dcea..f49baed 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_strip <#userid or name> - Takes all of the player weapons\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "You have been banned for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", "sa_player_ban_message_perm": "You have been banned permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_player_kick_message": "You have been kicked for {lightred}{0}{default} by {lightred}{1}{default}!", @@ -16,6 +16,7 @@ "sa_admin_mute_message_time": "Admin {lightred}{0}{default} muted {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} muted {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{2}{default}!", + "sa_admin_strip_message": "Admin {lightred}{0}{default} took all of player {lightred}{1}{default} weapons!", "sa_admin_hp_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} hp amount{default}!", "sa_admin_speed_message": "Admin {lightred}{0}{default} changed speed for {lightred}{1}{default}!", "sa_admin_god_message": "Admin {lightred}{0}{default} changed god mode for {lightred}{1}{default}!", diff --git a/lang/lv.json b/lang/lv.json index 7ab6eaf..859a4f3 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmins Palīdzība ]{DEFAULT}\n- css_who <#userid vai vārds> - Parāda informāciju par spēlētājiem\n- css_players - Parāda spēlētāju sarakstu\n- css_ban <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam pievienoties serverim\n- css_addban [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam pievienoties serverim izmantojot steamid64\n- css_banip [laiks minūtēs/0 uz mūžu] [iemesls] - liedz spēlētājam pievienoties serverim izmantojot IP adresi\n- css_unban - noņem spēlētāja liegumu pievienoties serverim\n- css_kick <#userid vai vārds> [iemesls] - izmet spēlētāju no servera\n- css_gag <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz pieeju spēlētājam čatot\n- css_addgag [laiks minūtēs/0 uz mūžu] [iemesls] - liedz spēlētājam pieeju čatot izmantojot steamid64\n- css_unmute - noņem spēlētāja liegumu izmantot balss čatu\n- css_mute <#userid vai vārds> [laiks minūtēs/0 uz mūžu] [iemesls] - liedz iespēju izmantot balss čatu\n- css_addmute [laiks minūtēs/0 uz mūžu] [iemesls] - Liedz iespēju izmantot balss čatu izmantojot steamid64\n- css_give <#userid vai vārds> - Atļauj iedot jebkādu ieroci spēlētājam\n- css_slay <#userid vai vārds> - Nonāvē spēlētāju\n- css_slap <#userid vai vārds> [damage] - ieper spēlētāju\n- css_vote <'Jautājums?'> ['Atbilde1'] ['Atbilde2'] ... - Sāk balsošanu\n- css_map - Maina karti\n- css_wsmap - Maina Workshop karti\n- css_asay - Nosūta paziņojumu visiem adminiem\n- css_say - Say parāda paziņojumu no admina čatā\n- css_psay <#userid vai vārds> - Nosūta privātu ziņu spēlētājam\n- css_csay - Parāda paziņojumu no admina pa vidu ekrānam\n- css_hsay - Parāda paziņojumu no admina hud logā\n- css_noclip <#userid vai vārds> - Ieslēdz noclip spēlētājam\n- css_freeze <#userid vai vārds> [ilgums] - Sasaldē spēlētāju\n- css_unfreeze <#userid vai vārds> - atkausē spēlētāju\n- css_respawn <#userid vai vārds> - Atdzīvina spēlētāju\n- css_cvar - Nomaina cvar vērtību\n- css_rcon - Palaist komandu kā serverim", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_strip <#userid or name> - Takes all of the player weapons\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "Tu tiki banots par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju liedza Admins: {lightred}{2}{default}!", "sa_player_ban_message_perm": "Tu tiki banots uz mūžu par {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", "sa_player_kick_message": "Tu tiki izmests par {lightred}{0}{default} Tevi izmeta Admins: {lightred}{1}{default}!", @@ -15,14 +15,11 @@ "sa_admin_gag_message_perm": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", "sa_admin_mute_message_time": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", "sa_admin_mute_message_perm": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", -<<<<<<< HEAD "sa_admin_give_message": "Admins {lightred}{0}{default} iedeva {lightred}{1}{default} {lightred}{2}{default}!", + "sa_admin_strip_message": "Admins {lightred}{0}{default} paņēma visus spēlētāja {lightred}{1}{default} ieročus!", "sa_admin_hp_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} ZS apjomu{default}!", "sa_admin_speed_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} ātrumu{default}!", "sa_admin_god_message": "Admins {lightred}{0}{default} mainīja dieva režīmu priekš {lightred}{1}{default}!", -======= - "sa_admin_give_message": "Admins {lightred}{0}{default} iedeva {lightred}{1}{default} {lightred}{IE{default}ROCI}!", ->>>>>>> e040dbced51f36dc764ecbd7a099f64431f39040 "sa_admin_slay_message": "Admins {lightred}{0}{default} nonāvēja {lightred}{1}{default}!", "sa_admin_slap_message": "Admins {lightred}{0}{default} iepērā {lightred}{1}{default}!", "sa_admin_changemap_message": "Admins {lightred}{0}{default} nomainīja karti uz {lightred}{1}{default}!", diff --git a/lang/pl.json b/lang/pl.json index e015261..d26f170 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_strip <#userid or name> - Takes all of the player weapons\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "Zostałeś zbanowany za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", "sa_player_ban_message_perm": "Zostałeś zbanowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", "sa_player_kick_message": "Zostałeś wyrzucony za {lightred}{0}{default} przez {lightred}{1}{default}!", @@ -16,6 +16,7 @@ "sa_admin_mute_message_time": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{2}{default}!", + "sa_admin_strip_message": "Admin {lightred}{0}{default} zabrał wszystkie bronie {lightred}{1}{default}!", "sa_admin_hp_message": "Admin {lightred}{0}{default} zmienił ilość hp dla {lightred}{1}{default}!", "sa_admin_speed_message": "Admin {lightred}{0}{default} zmienił prędkość dla {lightred}{1}{default}!", "sa_admin_god_message": "Admin {lightred}{0}{default} zmienił tryb Boga dla {lightred}{1}{default}!", From 7a73212d2ebbb0c175a8a04e0323eb673590efd5 Mon Sep 17 00:00:00 2001 From: BMathers Date: Fri, 15 Dec 2023 02:16:08 +0300 Subject: [PATCH 050/356] Turkish language support --- lang/tr.json | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lang/tr.json diff --git a/lang/tr.json b/lang/tr.json new file mode 100644 index 0000000..6d96ea0 --- /dev/null +++ b/lang/tr.json @@ -0,0 +1,38 @@ +{ + "sa_prefix": "{lightred}[SA] {default}", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin Yardım ]{DEFAULT}\n- css_who <#userid or name> - Oyuncu hakkındaki bilgileri görüntüleme\n- css_players - Oyuncu listesini görüntüle\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Oyuncu yasaklama\n- css_addban [time in minutes/0 perm] [reason] - SteamID64 ile oyuncu yasaklama\n- css_banip [time in minutes/0 perm] [reason] - IP Adresi ile oyuncu yasaklama\n- css_unban - Oyuncunun yasaklamasını kaldırma\n- css_kick <#userid or name> [reason] - Oyuncuyu sunucudan atma\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Oyuncuya sohbet yasağı\n- css_addgag [time in minutes/0 perm] [reason] - SteamID64 ile oyuncuya sohbet yasağı\n- css_unmute - Oyuncunun sohbet yasağını kaldırma\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Oyuncuyu susturma\n- css_addmute [time in minutes/0 perm] [reason] - SteamID64 ile oyuncuyu susturma\n- css_give <#userid or name> - Oyuncuya silah verme\n- css_strip <#userid or name> - Oyuncunun tüm silahlarını alma\n- css_hp <#userid or name> [health] - Oyuncu sağlığını değiştirme\n- css_god <#userid or name> - Oyuncunun ölümsüzlük modunu açıp/kapama\n- css_slay <#userid or name> - Oyuncuyu öldürme\n- css_slap <#userid or name> [damage] - Oyuncuyu tokatlama\n- css_vote <'Soru?'> ['Yanıt1'] ['Yanıt2'] ... - Oylama oluşturma\n- css_map - Haritayı değiştirme\n- css_wsmap - Atölye haritasını değiştirme\n- css_asay - Yöneticilere özel mesaj gönderme\n- css_say - Sohbete yönetici olarak mesaj gönderme\n- css_psay <#userid or name> - Oyuncuya özel mesaj gönderme\n- css_csay - Ekranın ortasında yönetici olarak mesaj gönderme\n- css_hsay - HUD ile yönetici olarak mesaj gönderme\n- css_noclip <#userid or name> - Oyuncu için hayalet modunu aç/kapat\n- css_freeze <#userid or name> [duration] - Oyuncuyu dondur\n- css_unfreeze <#userid or name> - Oyuncunun dondurulmasını kaldır\n- css_respawn <#userid or name> - Oyuncuyu yeniden canlandır\n- css_cvar - Cvar değerini değiştir\n- css_rcon - Komutu sunucu olarak çalıştır", + "sa_player_ban_message_time": "{lightred}{0}{default} sebebiyle {lightred}{1}{default} dakika süreyle {lightred}{2}{default} tarafından yasaklandınız!", + "sa_player_ban_message_perm": "{lightred}{0}{default} sebebiyle {lightred}{1}{default} tarafından kalıcı olarak yasaklandınız!", + "sa_player_kick_message": "{lightred}{0}{default} sebebiyle {lightred}{1}{default} tarafından sunucudan atıldınız!", + "sa_player_gag_message_time": "{lightred}{0}{default} sebebiyle {lightred}{1}{default} dakika süreyle {lightred}{2}{default} tarafından sohbette konuşmanız yasaklandı!", + "sa_player_gag_message_perm": "{lightred}{0}{default} sebebiyle {lightred}{1}{default} tarafından kalıcı olarak sohbette konuşmanız yasaklandı!", + "sa_player_mute_message_time": "{lightred}{0}{default} sebebiyle {lightred}{1}{default} dakika süreyle {lightred}{2}{default} tarafından susturuldunuz!", + "sa_player_mute_message_perm": "{lightred}{0}{default} sebebiyle {lightred}{1}{default} tarafından kalıcı olarak susturuldunuz!", + "sa_admin_ban_message_time": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} sebebiyle {lightred}{3}{default} dakika süreyle yasaklandı!", + "sa_admin_ban_message_perm": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} sebebiyle kalıcı olarak yasaklandı!", + "sa_admin_kick_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} sebebiyle sunucudan atıldı!", + "sa_admin_gag_message_time": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} sebebiyle {lightred}{3}{default} dakika boyunca sohbette konuşması yasaklandı!", + "sa_admin_gag_message_perm": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} sebebiyle sohbette konuşması kalıcı olarak yasaklandı!", + "sa_admin_mute_message_time": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} sebebiyle {lightred}{3}{default} dakika boyunca susturuldu!", + "sa_admin_mute_message_perm": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} sebebiyle kalıcı olarak susturuldu!", + "sa_admin_give_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncuya {lightred}{2}{default} verdi!", + "sa_admin_strip_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncunun tüm silahları alındı!", + "sa_admin_hp_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncunun can miktarını değiştirdi!", + "sa_admin_speed_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncunun hızını değiştirdi!", + "sa_admin_god_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncunun ölümsüzlük modunu değiştirdi!", + "sa_admin_slay_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu öldürüldü!", + "sa_admin_slap_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncuyu tokatladı!", + "sa_admin_changemap_message": "{lightred}{0}{default} isimli yetkili tarafından harita {lightred}{1}{default} olarak değiştirildi!", + "sa_admin_noclip_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncunun hayalet modu değiştirildi!", + "sa_admin_freeze_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu donduruldu!", + "sa_admin_unfreeze_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncunun dondurulması kaldırıldı!", + "sa_admin_respawn_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu yeniden canlandırıldı!", + "sa_admin_team_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} isimli oyuncu {lightred}{2}{default} takımına gönderildi!", + "sa_admin_vote_menu_title": "{gold}{0} {lime}için oy ver!", + "sa_admin_vote_message": "{lightred}{0}{default} isimli yetkili tarafından {lightred}{1}{default} için oylama başlatıldı!", + "sa_admin_vote_message_results": "{gold}{0} {lime}için oylama sonuçları!", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", + "sa_adminsay_prefix": "{RED}YETKILI: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(YETKILI) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(OYUNCU) {lightred}{0}{default}: {lightred}{1}{default}" +} \ No newline at end of file From f95031a3f5c919639ce92c3d2754be57edaae50e Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Mon, 18 Dec 2023 13:46:58 +0100 Subject: [PATCH 051/356] 1.2.4a - mysql admins - minor changes --- AdminSQLManager.cs | 79 ++++++++++++++++++++++ CS2-SimpleAdmin.cs | 165 +++++++++++++++++++++++++++++++++++++-------- Events.cs | 35 ++++++++++ README.md | 2 + 4 files changed, 253 insertions(+), 28 deletions(-) create mode 100644 AdminSQLManager.cs diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs new file mode 100644 index 0000000..5ebe320 --- /dev/null +++ b/AdminSQLManager.cs @@ -0,0 +1,79 @@ +using Dapper; +using MySqlConnector; +using System.Collections.Generic; + +namespace CS2_SimpleAdmin +{ + internal class AdminSQLManager + { + private readonly MySqlConnection _dbConnection; + + public AdminSQLManager(string connectionString) + { + _dbConnection = new MySqlConnection(connectionString); + } + + public async Task> GetAdminFlags(string steamId) + { + await using var connection = _dbConnection; + await connection.OpenAsync(); + + DateTime now = DateTime.Now; + + string sql = "SELECT flags FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime)"; + List activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now })).ToList(); + + return activeFlags; + } + + public async Task DeleteAdminBySteamId(string playerSteamId) + { + if (string.IsNullOrEmpty(playerSteamId)) return; + + await using var connection = _dbConnection; + await connection.OpenAsync(); + + string sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; + await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId }); + } + + public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0) + { + if (string.IsNullOrEmpty(playerSteamId)) return; + + flags = flags.Replace(" ", ""); + + DateTime now = DateTime.Now; + DateTime? futureTime; + if (time != 0) + futureTime = now.AddMinutes(time); + else + futureTime = null; + + await using var connection = _dbConnection; + await connection.OpenAsync(); + + var sql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `flags`, `immunity`, `ends`, `created`) " + + "VALUES (@playerSteamid, @playerName, @flags, @immunity, @ends, @created)"; + + await connection.ExecuteAsync(sql, new + { + playerSteamId, + playerName, + flags, + immunity, + ends = futureTime, + created = now + }); + } + + public async Task DeleteOldAdmins() + { + await using var connection = _dbConnection; + await connection.OpenAsync(); + + string sql = "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime"; + await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); + } + } +} diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 47fef8f..6c9ab63 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -16,7 +16,7 @@ using System.Collections.Concurrent; using System.Text; namespace CS2_SimpleAdmin; -[MinimumApiVersion(126)] +[MinimumApiVersion(124)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static IStringLocalizer? _localizer; @@ -29,9 +29,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; - public override string ModuleDescription => ""; + public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.3a"; + public override string ModuleVersion => "1.2.4a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -104,6 +104,20 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [RequiresPermissions("@css/root")] + public void OnAddAdminCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!Helper.IsValidSteamID64(command.GetArg(1))) + { + command.ReplyToCommand($"Invalid SteamID64."); + return; + } + if (command.GetArg(2).Length <= 0) + { + command.ReplyToCommand($"Invalid player name."); + return; + } + if (!command.GetArg(3).Contains("@") && !command.GetArg(3).Contains("#")) + { + command.ReplyToCommand($"Invalid player name."); + return; + } + + string steamid = command.GetArg(1); + string name = command.GetArg(2); + string flags = command.GetArg(3); + int immunity = 0; + int.TryParse(command.GetArg(4), out immunity); + int time = 0; + int.TryParse(command.GetArg(5), out time); + + AdminSQLManager _adminManager = new(dbConnectionString); + _ = _adminManager.AddAdminBySteamId(steamid, name, flags, immunity, time); + + command.ReplyToCommand($"Added '{flags}' flags to '{name}' ({steamid})"); + } + + [ConsoleCommand("css_deladmin")] + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [RequiresPermissions("@css/root")] + public void OnDelAdminCommand(CCSPlayerController? caller, CommandInfo command) + { + if (!Helper.IsValidSteamID64(command.GetArg(1))) + { + command.ReplyToCommand($"Invalid SteamID64."); + return; + } + + string steamid = command.GetArg(1); + + AdminSQLManager _adminManager = new(dbConnectionString); + _ = _adminManager.DeleteAdminBySteamId(steamid); + + command.ReplyToCommand($"Removed flags from '{steamid}'"); + } + [ConsoleCommand("css_who")] [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [RequiresPermissions("@css/generic")] @@ -163,30 +231,56 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - caller!.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - - caller!.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); - caller!.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); - if (playerInfo.SteamId != null) - caller!.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); - if (player.AuthorizedSteamID != null) + if (caller != null) { - caller!.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); - caller!.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); - } - if (playerInfo.IpAddress != null) - caller!.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); - caller!.PrintToConsole($"• Ping: \"{player.Ping}\""); - if (player.AuthorizedSteamID != null) - { - caller!.PrintToConsole($"• Total Bans: \"{totalBans}\""); - caller!.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); - } + caller!.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - caller!.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); + caller!.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + caller!.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + caller!.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) + { + caller!.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + caller!.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } + if (playerInfo.IpAddress != null) + caller!.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); + caller!.PrintToConsole($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + caller!.PrintToConsole($"• Total Bans: \"{totalBans}\""); + caller!.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); + } + + caller!.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); + } + else + { + Server.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); + + Server.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + Server.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + Server.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) + { + Server.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + Server.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } + if (playerInfo.IpAddress != null) + Server.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); + Server.PrintToConsole($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + Server.PrintToConsole($"• Total Bans: \"{totalBans}\""); + Server.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); + } + + Server.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); + } }); }); @@ -202,13 +296,26 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); - caller!.PrintToConsole($"--------- PLAYER LIST ---------"); - playersToTarget.ForEach(player => + if (caller != null) { - caller!.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.AuthorizedSteamID?.SteamId64}\")"); + caller!.PrintToConsole($"--------- PLAYER LIST ---------"); + playersToTarget.ForEach(player => + { + caller!.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.AuthorizedSteamID?.SteamId64}\")"); - }); - caller!.PrintToConsole($"--------- END PLAYER LIST ---------"); + }); + caller!.PrintToConsole($"--------- END PLAYER LIST ---------"); + } + else + { + Server.PrintToConsole($"--------- PLAYER LIST ---------"); + playersToTarget.ForEach(player => + { + Server.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.AuthorizedSteamID?.SteamId64}\")"); + + }); + Server.PrintToConsole($"--------- END PLAYER LIST ---------"); + } } [ConsoleCommand("css_kick")] @@ -1130,6 +1237,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1288,6 +1396,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [... options ...]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] diff --git a/Events.cs b/Events.cs index f39f87e..4d98187 100644 --- a/Events.cs +++ b/Events.cs @@ -127,6 +127,9 @@ public partial class CS2_SimpleAdmin MuteManager _muteManager = new(dbConnectionString); List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId!); + AdminSQLManager _adminManager = new(dbConnectionString); + List activeFlags = await _adminManager.GetAdminFlags(playerInfo.SteamId!); + Server.NextFrame(() => { if (player == null || !player.IsValid) return; @@ -218,6 +221,36 @@ public partial class CS2_SimpleAdmin } } } + + if (activeFlags != null && activeFlags.Count > 0) + { + foreach (var flags in activeFlags) + { + if (flags == null) continue; + string flagsValue = flags.flags.ToString(); + + if (!string.IsNullOrEmpty(flagsValue)) + { + string[] _flags = flagsValue.Split(","); + + AddTimer(10, () => + { + if (player == null) return; + foreach (var _flag in _flags) + { + if (_flag.StartsWith("@")) + { + AdminManager.AddPlayerPermissions(player, _flag); + } + if (_flag.StartsWith("3")) + { + AdminManager.AddPlayerToGroup(player, _flag); + } + } + }); + } + } + } }); }); } @@ -261,6 +294,8 @@ public partial class CS2_SimpleAdmin _ = _banManager.ExpireOldBans(); MuteManager _muteManager = new(dbConnectionString); _ = _muteManager.ExpireOldMutes(); + AdminSQLManager _adminManager = new(dbConnectionString); + _ = _adminManager.DeleteOldAdmins(); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); string? path = Path.GetDirectoryName(ModuleDirectory); diff --git a/README.md b/README.md index 229cc65..7a82fc5 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ Manage your Counter-Strike 2 server by simple commands :) ### Commands ```js +- css_addadmin [time in minutes] - Add admin by steamid // @css/root +- css_deladmin - Delete admin by steamid // @css/root - css_admin - Display all admin commands // @css/generic - css_who <#userid or name> - Display informations about player // @css/generic - css_players - Display player list // @css/generic From 27582b72af1a9effb6dfeeb0a25e3d794976738e Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Mon, 18 Dec 2023 14:29:56 +0100 Subject: [PATCH 052/356] 1.2.4b - Cache for mysql admins --- AdminSQLManager.cs | 32 +++++++++++++++++++++++++------- CS2-SimpleAdmin.cs | 2 +- Events.cs | 43 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index 5ebe320..57c77a0 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -1,12 +1,12 @@ using Dapper; using MySqlConnector; -using System.Collections.Generic; namespace CS2_SimpleAdmin { internal class AdminSQLManager { private readonly MySqlConnection _dbConnection; + public static readonly Dictionary> _adminCache = new Dictionary>(); public AdminSQLManager(string connectionString) { @@ -15,21 +15,39 @@ namespace CS2_SimpleAdmin public async Task> GetAdminFlags(string steamId) { - await using var connection = _dbConnection; - await connection.OpenAsync(); + if (_adminCache.ContainsKey(steamId)) + { + Console.WriteLine("From cache"); + return _adminCache[steamId].Select(flag => (dynamic)flag).ToList(); + } + else + { + await using var connection = _dbConnection; + await connection.OpenAsync(); - DateTime now = DateTime.Now; + DateTime now = DateTime.Now; - string sql = "SELECT flags FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime)"; - List activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now })).ToList(); + string sql = "SELECT flags FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime)"; + List activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now })).ToList(); - return activeFlags; + _adminCache[steamId] = new List(); + foreach (var flags in activeFlags) + { + if (flags == null) continue; + string flagsValue = flags.flags.ToString(); + _adminCache[steamId].Add(flagsValue); + } + } + return _adminCache[steamId].Select(flag => (dynamic)flag).ToList(); } public async Task DeleteAdminBySteamId(string playerSteamId) { if (string.IsNullOrEmpty(playerSteamId)) return; + if (_adminCache.ContainsKey(playerSteamId)) + _adminCache.Remove(playerSteamId); + await using var connection = _dbConnection; await connection.OpenAsync(); diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 6c9ab63..9dc75f4 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -31,7 +31,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.4a"; + public override string ModuleVersion => "1.2.4b"; public CS2_SimpleAdminConfig Config { get; set; } = new(); diff --git a/Events.cs b/Events.cs index 4d98187..f1aea34 100644 --- a/Events.cs +++ b/Events.cs @@ -222,7 +222,37 @@ public partial class CS2_SimpleAdmin } } - if (activeFlags != null && activeFlags.Count > 0) + if (AdminSQLManager._adminCache.ContainsKey(playerInfo.SteamId!)) + { + AddTimer(10, () => + { + foreach (var flagsValue in AdminSQLManager._adminCache[playerInfo.SteamId!]) + { + if (!string.IsNullOrEmpty(flagsValue)) + { + string[] _flags = flagsValue.Split(','); + + if (player == null) return; + foreach (var _flag in _flags) + { + if (_flag.StartsWith("@")) + { + AdminManager.AddPlayerPermissions(player, _flag); + } + if (_flag.StartsWith("#")) + { + AdminManager.AddPlayerToGroup(player, _flag); + } + } + } + } + }); + } + + + /* + + if (_adminManager._adminCache != null && _adminManager._adminCache.Count > 0) { foreach (var flags in activeFlags) { @@ -250,7 +280,8 @@ public partial class CS2_SimpleAdmin }); } } - } + } + */ }); }); } @@ -282,6 +313,14 @@ public partial class CS2_SimpleAdmin GodPlayers.Remove((int)player.Index); } + if (player.AuthorizedSteamID != null) + { + if (AdminSQLManager._adminCache.ContainsKey(player.AuthorizedSteamID.SteamId64.ToString())) + { + AdminSQLManager._adminCache.Remove(player.AuthorizedSteamID.SteamId64.ToString()); + } + } + if (TagsDetected) NativeAPI.IssueServerCommand($"css_tag_unmute {player!.Index.ToString()}"); } From 5dc14e3301af537e64fa7312f726c0127d018972 Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Mon, 18 Dec 2023 14:30:26 +0100 Subject: [PATCH 053/356] 12.4b --- AdminSQLManager.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index 57c77a0..f10d9a0 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -17,7 +17,6 @@ namespace CS2_SimpleAdmin { if (_adminCache.ContainsKey(steamId)) { - Console.WriteLine("From cache"); return _adminCache[steamId].Select(flag => (dynamic)flag).ToList(); } else From 6a5165a513a67c11fac5d52a1a59c28b3a49ac92 Mon Sep 17 00:00:00 2001 From: DEADLYDEVIL Date: Sun, 24 Dec 2023 19:11:33 +0330 Subject: [PATCH 054/356] Add persian lang --- lang/fa.json | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lang/fa.json diff --git a/lang/fa.json b/lang/fa.json new file mode 100644 index 0000000..564b32e --- /dev/null +++ b/lang/fa.json @@ -0,0 +1,38 @@ +{ + "sa_prefix": "{lightred}[SA] {default}", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid ya Esm> - Etela'ate marbot be bazikon ra namayesh midahad\n- css_players - Liste bazikonan ra namayesh midahad\n- css_ban <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Ban player\n- css_addban [Zaman Be Daghighe/0 perm] [Dalil] - Ban player via steamid64\n- css_banip [Zaman Be Daghighe/0 perm] [Dalil] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid ya Esm> [Dalil] - Kick player\n- css_gag <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Gag player\n- css_addgag [Zaman Be Daghighe/0 perm] [Dalil] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Mute player\n- css_addmute [Zaman Be Daghighe/0 perm] [Dalil] - Mute player via steamid64\n- css_give <#userid ya Esm> - Be bazikon aslahe midahad\n- css_strip <#userid ya Esm> - Tamami aslahe haye bazikon ra migirad\n- css_hp <#userid ya Esm> [health] - Jone player ra tanzim mikonad\n- css_god <#userid ya Esm> - God mode bazikon ra roshan ya khamosh mikonad\n- css_slay <#userid ya Esm> - Bazikon ra mikoshad\n- css_slap <#userid ya Esm> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Map ra taghir midahad\n- css_wsmap - Map ra be workshop taghir midahad\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid ya Esm> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Dakhele Safhe az tarafe admin peygham ersal mikonad\n- css_noclip <#userid ya Esm> - Toggle noclip for player\n- css_freeze <#userid ya Esm> [duration] - Freeze player\n- css_unfreeze <#userid ya Esm> - Unfreeze player\n- css_respawn <#userid ya Esm> - Bazikon ra Respawn mikonad\n- css_cvar - Change cvar value\n- css_rcon - Dastor ra az tarighe server ejra mikonad", + "sa_player_ban_message_time": "Shoma Ban shodid be dalile {lightred}{0}{default} Be modate {lightred}{1}{default} Daghighe Tavasote {lightred}{2}{default}!", + "sa_player_ban_message_perm": "Shoma baraye hamishe Ban shodid be dalile {lightred}{0}{default} Tvasaote {lightred}{1}{default}!", + "sa_player_kick_message": "Shoma kick shodid be dalile {lightred}{0}{default} Tavasote {lightred}{1}{default}!", + "sa_player_gag_message_time": "Shoma Gag shodid be dalile {lightred}{0}{default} Be modate {lightred}{1}{default} Daghighe Tavasote {lightred}{2}{default}!", + "sa_player_gag_message_perm": "Shoma baraye hamishe Gag shodid be dalile {lightred}{0}{default} Tavasote {lightred}{1}{default}!", + "sa_player_mute_message_time": "Shoma Mute shodid be dalile {lightred}{0}{default} Be modate {lightred}{1}{default} Daghighe Tavasote {lightred}{2}{default}!", + "sa_player_mute_message_perm": "Shoma baraye hamishe Mute shodid be dalile {lightred}{0}{default} Tavasote {lightred}{1}{default}!", + "sa_admin_ban_message_time": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Ban kard Be dalile {lightred}{2}{default} Be modate {lightred}{3}{default} Daghighe!", + "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra baraye hamishe Ban kard be dalile {lightred}{2}{default}!", + "sa_admin_kick_message": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Kick kard be dalile {lightred}{2}{default}!", + "sa_admin_gag_message_time": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Gag kard be dalile {lightred}{2}{default} Be modate {lightred}{3}{default} Daghighe!", + "sa_admin_gag_message_perm": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra baraye hamishe Gag kard be dalile {lightred}{2}{default}!", + "sa_admin_mute_message_time": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Mute kard be dalile {lightred}{2}{default} Be modate {lightred}{3}{default} Daghighe!", + "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Baraye hamishe mute kard be dalile {lightred}{2}{default}!", + "sa_admin_give_message": "Admin {lightred}{0}{default} Be bazikon {lightred}{1}{default} Yek adad {lightred}{2}{default} Tahvil dad!", + "sa_admin_strip_message": "Admin {lightred}{0}{default} Tamami vasayele {lightred}{1}{default} Ra gereft!", + "sa_admin_hp_message": "Admin {lightred}{0}{default} Meghdar Joone {lightred}{1}{default} Ra taghir dad{default}!", + "sa_admin_speed_message": "Admin {lightred}{0}{default} Sorate {lightred}{1}{default} Ra taghir dad!", + "sa_admin_god_message": "Admin {lightred}{0}{default} God Mode Bazikon {lightred}{1}{default} Ra Taghir dad!", + "sa_admin_slay_message": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Slay kard!", + "sa_admin_slap_message": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Slap kard!", + "sa_admin_changemap_message": "Admin {lightred}{0}{default} Map ra be {lightred}{1}{default} Taghir dad!", + "sa_admin_noclip_message": "Admin {lightred}{0}{default} Noclip ra baraye {lightred}{1}{default} Roshan kard!", + "sa_admin_freeze_message": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Freeze kard!", + "sa_admin_unfreeze_message": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra az Freeze Dar avord!", + "sa_admin_respawn_message": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra Respawn Kard!", + "sa_admin_team_message": "Admin {lightred}{0}{default} Bazikon {lightred}{1}{default} Ra be team {lightred}{2}{default} Montaghel kard!", + "sa_admin_vote_menu_title": "{lime}RAY GIRI BARAYE {gold}{0}", + "sa_admin_vote_message": "Admin {lightred}{0}{default} Shoroe ray giri baraye {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}NATAYEJE RAY GIRI {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", + "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(PLAYER) {lightred}{0}{default}: {lightred}{1}{default}" +} \ No newline at end of file From 3930d2d4bd9c57a9b304a521c86d8a647e54d6d9 Mon Sep 17 00:00:00 2001 From: DEADLYDEVIL Date: Mon, 25 Dec 2023 21:54:19 +0330 Subject: [PATCH 055/356] add some changes --- lang/fa.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/fa.json b/lang/fa.json index 564b32e..a02519e 100644 --- a/lang/fa.json +++ b/lang/fa.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[SA] {default}", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid ya Esm> - Etela'ate marbot be bazikon ra namayesh midahad\n- css_players - Liste bazikonan ra namayesh midahad\n- css_ban <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Ban player\n- css_addban [Zaman Be Daghighe/0 perm] [Dalil] - Ban player via steamid64\n- css_banip [Zaman Be Daghighe/0 perm] [Dalil] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid ya Esm> [Dalil] - Kick player\n- css_gag <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Gag player\n- css_addgag [Zaman Be Daghighe/0 perm] [Dalil] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Mute player\n- css_addmute [Zaman Be Daghighe/0 perm] [Dalil] - Mute player via steamid64\n- css_give <#userid ya Esm> - Be bazikon aslahe midahad\n- css_strip <#userid ya Esm> - Tamami aslahe haye bazikon ra migirad\n- css_hp <#userid ya Esm> [health] - Jone player ra tanzim mikonad\n- css_god <#userid ya Esm> - God mode bazikon ra roshan ya khamosh mikonad\n- css_slay <#userid ya Esm> - Bazikon ra mikoshad\n- css_slap <#userid ya Esm> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Map ra taghir midahad\n- css_wsmap - Map ra be workshop taghir midahad\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid ya Esm> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Dakhele Safhe az tarafe admin peygham ersal mikonad\n- css_noclip <#userid ya Esm> - Toggle noclip for player\n- css_freeze <#userid ya Esm> [duration] - Freeze player\n- css_unfreeze <#userid ya Esm> - Unfreeze player\n- css_respawn <#userid ya Esm> - Bazikon ra Respawn mikonad\n- css_cvar - Change cvar value\n- css_rcon - Dastor ra az tarighe server ejra mikonad", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid ya Esm> - Etela'ate marbot be bazikon ra namayesh midahad\n- css_players - Liste bazikonan ra namayesh midahad\n- css_ban <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Ban player\n- css_addban [Zaman Be Daghighe/0 perm] [Dalil] - Ban player via steamid64\n- css_banip [Zaman Be Daghighe/0 perm] [Dalil] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid ya Esm> [Dalil] - Kick player\n- css_gag <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Gag player\n- css_addgag [Zaman Be Daghighe/0 perm] [Dalil] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid ya Esm> [Zaman Be Daghighe/0 perm] [Dalil] - Mute player\n- css_addmute [Zaman Be Daghighe/0 perm] [Dalil] - Mute player via steamid64\n- css_give <#userid ya Esm> - Be bazikon aslahe midahad\n- css_strip <#userid ya Esm> - Tamami aslahe haye bazikon ra migirad\n- css_hp <#userid ya Esm> [health] - Jone player ra tanzim mikonad\n- css_god <#userid ya Esm> - God mode bazikon ra roshan ya khamosh mikonad\n- css_slay <#userid ya Esm> - Bazikon ra mikoshad\n- css_slap <#userid ya Esm> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Map ra taghir midahad\n- css_wsmap - Map ra be workshop taghir midahad\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid ya Esm> - Payame shakhsi be bazikon ersal mikonad\n- css_csay - Say message as admin in center\n- css_hsay - Dakhele Safhe az tarafe admin peygham ersal mikonad\n- css_noclip <#userid ya Esm> - Noclip ya baraye bazikon khamosh ya roshan konid\n- css_freeze <#userid ya Esm> [Zaman] - Freeze player\n- css_unfreeze <#userid ya Esm> - Unfreeze player\n- css_respawn <#userid ya Esm> - Bazikon ra Respawn mikonad\n- css_cvar - Change cvar value\n- css_rcon - Dastor ra az tarighe server ejra mikonad", "sa_player_ban_message_time": "Shoma Ban shodid be dalile {lightred}{0}{default} Be modate {lightred}{1}{default} Daghighe Tavasote {lightred}{2}{default}!", "sa_player_ban_message_perm": "Shoma baraye hamishe Ban shodid be dalile {lightred}{0}{default} Tvasaote {lightred}{1}{default}!", "sa_player_kick_message": "Shoma kick shodid be dalile {lightred}{0}{default} Tavasote {lightred}{1}{default}!", From c839e69804a5831cafe7b2324f754f3513f4cc80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?crist=C3=B3bal?= <36176343+criskkky@users.noreply.github.com> Date: Wed, 3 Jan 2024 22:32:38 -0300 Subject: [PATCH 056/356] Add files via upload --- lang/es.json | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lang/es.json diff --git a/lang/es.json b/lang/es.json new file mode 100644 index 0000000..32bc1c8 --- /dev/null +++ b/lang/es.json @@ -0,0 +1,38 @@ +{ + "sa_prefix": "{lightred}[SA] {default}", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin AYUDA ]{DEFAULT}\n- css_who <#userid o nombre> - Mostrar información sobre el jugador\n- css_players - Mostrar lista de jugadores\n- css_ban <#userid o nombre> [tiempo en minutos/0 perm] [razón] - Banear jugador\n- css_addban [tiempo en minutos/0 perm] [razón] - Banear jugador por steamid64\n- css_banip [tiempo en minutos/0 perm] [razón] - Banear jugador por dirección IP\n- css_unban - Desbanear jugador\n- css_kick <#userid o nombre> [razón] - Expulsar jugador\n- css_gag <#userid o nombre> [tiempo en minutos/0 perm] [razón] - Silenciar jugador\n- css_addgag [tiempo en minutos/0 perm] [razón] - Silenciar jugador por steamid64\n- css_unmute - Quitar silencio a jugador\n- css_mute <#userid o nombre> [tiempo en minutos/0 perm] [razón] - Silenciar jugador\n- css_addmute [tiempo en minutos/0 perm] [razón] - Silenciar jugador por steamid64\n- css_give <#userid o nombre> - Darle a jugador un arma\n- css_strip <#userid o nombre> - Quitarle todas las armas al jugador\n- css_hp <#userid o nombre> [salud] - Establecer la salud del jugador\n- css_god <#userid o nombre> - Alternar el modo dios del jugador\n- css_slay <#userid o nombre> - Matar jugador\n- css_slap <#userid o nombre> [daño] - Abofetear jugador\n- css_vote <'Pregunta?'> ['Respuesta1'] ['Respuesta2'] ... - Crear votación\n- css_map - Cambiar mapa\n- css_wsmap - Cambiar mapa de taller\n- css_asay - Decir mensaje a todos los administradores\n- css_say - Decir mensaje como administrador en el chat\n- css_psay <#userid o nombre> - Enviar mensaje privado al jugador\n- css_csay - Decir mensaje como administrador en el centro\n- css_hsay - Decir mensaje como administrador en la pantalla\n- css_noclip <#userid o nombre> - Alternar noclip para el jugador\n- css_freeze <#userid o nombre> [duración] - Congelar jugador\n- css_unfreeze <#userid o nombre> - Descongelar jugador\n- css_respawn <#userid o nombre> - Respawnear jugador\n- css_cvar - Cambiar valor de cvar\n- css_rcon - Ejecutar comando como servidor", + "sa_player_ban_message_time": "Has sido baneado por {lightred}{0}{default} durante {lightred}{1}{default} minutos por {lightred}{2}{default}.", + "sa_player_ban_message_perm": "Has sido baneado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}.", + "sa_player_kick_message": "Has sido expulsado por {lightred}{0}{default} por {lightred}{1}{default}.", + "sa_player_gag_message_time": "Has sido silenciado por {lightred}{0}{default} durante {lightred}{1}{default} minutos por {lightred}{2}{default}.", + "sa_player_gag_message_perm": "Has sido silenciado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}.", + "sa_player_mute_message_time": "Has sido silenciado por {lightred}{0}{default} durante {lightred}{1}{default} minutos por {lightred}{2}{default}.", + "sa_player_mute_message_perm": "Has sido silenciado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}.", + "sa_admin_ban_message_time": "El administrador {lightred}{0}{default} ha baneado a {lightred}{1}{default} por {lightred}{2}{default} durante {lightred}{3}{default} minutos.", + "sa_admin_ban_message_perm": "El administrador {lightred}{0}{default} ha baneado a {lightred}{1}{default} permanentemente por {lightred}{2}{default}.", + "sa_admin_kick_message": "El administrador {lightred}{0}{default} ha expulsado a {lightred}{1}{default} por {lightred}{2}{default}.", + "sa_admin_gag_message_time": "El administrador {lightred}{0}{default} ha silenciado a {lightred}{1}{default} por {lightred}{2}{default} durante {lightred}{3}{default} minutos.", + "sa_admin_gag_message_perm": "El administrador {lightred}{0}{default} ha silenciado a {lightred}{1}{default} permanentemente por {lightred}{2}{default}.", + "sa_admin_mute_message_time": "El administrador {lightred}{0}{default} ha silenciado a {lightred}{1}{default} por {lightred}{2}{default} durante {lightred}{3}{default} minutos.", + "sa_admin_mute_message_perm": "El administrador {lightred}{0}{default} ha silenciado a {lightred}{1}{default} permanentemente por {lightred}{2}{default}.", + "sa_admin_give_message": "El administrador {lightred}{0}{default} le ha dado a {lightred}{1}{default} un {lightred}{2}{default}.", + "sa_admin_strip_message": "El administrador {lightred}{0}{default} le ha quitado todas las armas al jugador {lightred}{1}{default}.", + "sa_admin_hp_message": "El administrador {lightred}{0}{default} ha cambiado la cantidad de salud de {lightred}{1}{default}{default}.", + "sa_admin_speed_message": "El administrador {lightred}{0}{default} ha cambiado la velocidad de {lightred}{1}{default}.", + "sa_admin_god_message": "El administrador {lightred}{0}{default} ha cambiado el modo dios de {lightred}{1}{default}.", + "sa_admin_slay_message": "El administrador {lightred}{0}{default} ha matado a {lightred}{1}{default}.", + "sa_admin_slap_message": "El administrador {lightred}{0}{default} ha abofeteado a {lightred}{1}{default}.", + "sa_admin_changemap_message": "El administrador {lightred}{0}{default} ha cambiado el mapa a {lightred}{1}{default}.", + "sa_admin_noclip_message": "El administrador {lightred}{0}{default} ha activado noclip para {lightred}{1}{default}.", + "sa_admin_freeze_message": "El administrador {lightred}{0}{default} ha congelado a {lightred}{1}{default}.", + "sa_admin_unfreeze_message": "El administrador {lightred}{0}{default} ha descongelado a {lightred}{1}{default}.", + "sa_admin_respawn_message": "El administrador {lightred}{0}{default} ha respawnado a {lightred}{1}{default}.", + "sa_admin_team_message": "El administrador {lightred}{0}{default} ha transferido a {lightred}{1}{default} a {lightred}{2}{default}.", + "sa_admin_vote_menu_title": "{lime}VOTACIÓN PARA {gold}{0}", + "sa_admin_vote_message": "El administrador {lightred}{0}{default} ha iniciado una votación para {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}RESULTADOS DE LA VOTACIÓN PARA {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", + "sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(JUGADOR) {lightred}{0}{default}: {lightred}{1}{default}" +} \ No newline at end of file From 18122cdc08e5dfba5e21c902fb09eea7335c40e3 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Fri, 5 Jan 2024 01:04:08 +0100 Subject: [PATCH 057/356] 1.2.5a -Minor changes - Fixed `css_speed` --- AdminSQLManager.cs | 90 +++++++++++++++++++++++++++++++++++++++--- BanManager.cs | 3 +- CS2-SimpleAdmin.cs | 53 ++++++++++++++++--------- CS2-SimpleAdmin.csproj | 2 +- Config.cs | 1 + Events.cs | 77 ++++++++++++++++-------------------- Helper.cs | 39 +++++++++++++++--- MuteManager.cs | 5 +-- PlayerInfo.cs | 2 +- PlayerUtils.cs | 10 ++++- README.md | 2 +- lang/lv.json | 2 +- 12 files changed, 205 insertions(+), 81 deletions(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index f10d9a0..8b46e32 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -6,13 +6,15 @@ namespace CS2_SimpleAdmin internal class AdminSQLManager { private readonly MySqlConnection _dbConnection; - public static readonly Dictionary> _adminCache = new Dictionary>(); + // Unused for now + //public static readonly ConcurrentDictionary> _adminCache = new ConcurrentDictionary>(); public AdminSQLManager(string connectionString) { _dbConnection = new MySqlConnection(connectionString); } + /* public async Task> GetAdminFlags(string steamId) { if (_adminCache.ContainsKey(steamId)) @@ -26,7 +28,7 @@ namespace CS2_SimpleAdmin DateTime now = DateTime.Now; - string sql = "SELECT flags FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime)"; + string sql = "SELECT flags, ends FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime)"; List activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now })).ToList(); _adminCache[steamId] = new List(); @@ -39,13 +41,91 @@ namespace CS2_SimpleAdmin } return _adminCache[steamId].Select(flag => (dynamic)flag).ToList(); } + */ + + public async Task> GetAdminFlags(string steamId) + { + /* Unused for now + if (_adminCache.TryGetValue(steamId, out ConcurrentBag? cachedFlags)) + { + return cachedFlags.ToList(); + } + */ + DateTime now = DateTime.Now; + + await using var connection = _dbConnection; + await connection.OpenAsync(); + + string sql = "SELECT flags, ends FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime)"; + List? activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now }))?.ToList(); + + if (activeFlags == null) + { + return new List(); + } + + List filteredFlags = new List(); + + foreach (var flags in activeFlags) + { + if (flags == null) continue; + + string flag = flags.flags.ToString(); + if (flag != null) + { + filteredFlags.Add(flag); + } + } + + /* Unused for now + bool shouldCache = activeFlags.Any(flags => + { + if (flags?.ends == null) + { + return true; + } + + if (flags.ends is DateTime endsTime) + { + return (endsTime - now).TotalHours > 1; + } + + return false; + }); + + if (shouldCache) + { + List flagsToCache = new List(); + + foreach (var flags in activeFlags) + { + if (flags.ends == null || (DateTime.Now - (DateTime)flags.ends).TotalHours > 6) + { + if (flags == null) continue; + flagsToCache.Add(flags.flags.ToString()); + } + } + + _adminCache.AddOrUpdate(steamId, new ConcurrentBag(flagsToCache), (_, existingBag) => + { + foreach (var flag in flagsToCache) + { + existingBag.Add(flag); + } + return existingBag; + }); + return flagsToCache.Cast().ToList(); + } + */ + + return filteredFlags.Cast().ToList(); + } public async Task DeleteAdminBySteamId(string playerSteamId) { if (string.IsNullOrEmpty(playerSteamId)) return; - if (_adminCache.ContainsKey(playerSteamId)) - _adminCache.Remove(playerSteamId); + //_adminCache.TryRemove(playerSteamId, out _); await using var connection = _dbConnection; await connection.OpenAsync(); @@ -93,4 +173,4 @@ namespace CS2_SimpleAdmin await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); } } -} +} \ No newline at end of file diff --git a/BanManager.cs b/BanManager.cs index 2f37d71..e327cb2 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -11,6 +11,7 @@ namespace CS2_SimpleAdmin { _dbConnection = new MySqlConnection(connectionString); } + public async Task BanPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0) { DateTime now = DateTime.Now; @@ -152,4 +153,4 @@ namespace CS2_SimpleAdmin await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); } } -} +} \ No newline at end of file diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 9dc75f4..54429af 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -16,7 +16,8 @@ using System.Collections.Concurrent; using System.Text; namespace CS2_SimpleAdmin; -[MinimumApiVersion(124)] + +[MinimumApiVersion(142)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static IStringLocalizer? _localizer; @@ -31,7 +32,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.4b"; + public override string ModuleVersion => "1.2.5a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -125,7 +126,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); + List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && !player.IsHLTV).ToList(); if (caller != null) { @@ -302,7 +302,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { caller!.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.AuthorizedSteamID?.SteamId64}\")"); - }); caller!.PrintToConsole($"--------- END PLAYER LIST ---------"); } @@ -312,7 +311,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { Server.PrintToConsole($"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{player.IpAddress?.Split(":")[0]}\" SteamID64: \"{player.AuthorizedSteamID?.SteamId64}\")"); - }); Server.PrintToConsole($"--------- END PLAYER LIST ---------"); } @@ -1020,7 +1018,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) { @@ -1237,7 +1234,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1274,8 +1270,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + /* player.Speed = (float)speed; player.PlayerPawn.Value!.Speed = (float)speed; + */ + player.SetSpeed((float)speed); StringBuilder sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_speed_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); @@ -1350,15 +1349,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [... options ...]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1445,7 +1446,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { @@ -1516,8 +1519,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player.PrintToChat(Helper.ReplaceTags($"({caller!.PlayerName}) {message}")); + player.PrintToChat(Helper.ReplaceTags($"({caller!.PlayerName}) {utf8String}")); }); command.ReplyToCommand(Helper.ReplaceTags($" Private message sent!")); @@ -1546,7 +1557,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - + diff --git a/Config.cs b/Config.cs index f92fcd2..6875113 100644 --- a/Config.cs +++ b/Config.cs @@ -24,6 +24,7 @@ namespace CS2_SimpleAdmin [JsonPropertyName("KickTime")] public int KickTime { get; set; } = 10; + [JsonPropertyName("DisableDangerousCommands")] public bool DisableDangerousCommands { get; set; } = true; } diff --git a/Events.cs b/Events.cs index f1aea34..71172f7 100644 --- a/Events.cs +++ b/Events.cs @@ -7,11 +7,13 @@ using System.Text; using static CounterStrikeSharp.API.Core.Listeners; namespace CS2_SimpleAdmin; + public partial class CS2_SimpleAdmin { private void registerEvents() { RegisterListener(OnClientAuthorized); + //RegisterEventHandler(OnPlayerFullConnect); RegisterListener(OnClientDisconnect); RegisterListener(OnMapStart); RegisterEventHandler(OnPlayerHurt); @@ -21,6 +23,32 @@ public partial class CS2_SimpleAdmin AddCommandListener("callvote", OnCommandCallVote); } + /*private HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) + { + CCSPlayerController? player = @event.Userid; + + if (player == null || player.IsBot || player.IsHLTV) return HookResult.Continue; + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + Server.NextFrame(() => + { + if (player == null) return; + }); + }); + return HookResult.Continue; + } + */ + private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info) { GodPlayers.Clear(); @@ -100,15 +128,6 @@ public partial class CS2_SimpleAdmin if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; - if (player.AuthorizedSteamID == null) - { - AddTimer(3.0f, () => - { - OnClientAuthorized(playerSlot, steamID); - }); - return; - } - PlayerInfo playerInfo = new PlayerInfo { UserId = player.UserId, @@ -120,7 +139,6 @@ public partial class CS2_SimpleAdmin Task.Run(async () => { - if (player == null || !player.IsValid) return; BanManager _banManager = new(dbConnectionString); bool isBanned = await _banManager.IsPlayerBanned(playerInfo); @@ -178,7 +196,6 @@ public partial class CS2_SimpleAdmin }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } - /* CCSPlayerController currentPlayer = player; @@ -222,33 +239,7 @@ public partial class CS2_SimpleAdmin } } - if (AdminSQLManager._adminCache.ContainsKey(playerInfo.SteamId!)) - { - AddTimer(10, () => - { - foreach (var flagsValue in AdminSQLManager._adminCache[playerInfo.SteamId!]) - { - if (!string.IsNullOrEmpty(flagsValue)) - { - string[] _flags = flagsValue.Split(','); - - if (player == null) return; - foreach (var _flag in _flags) - { - if (_flag.StartsWith("@")) - { - AdminManager.AddPlayerPermissions(player, _flag); - } - if (_flag.StartsWith("#")) - { - AdminManager.AddPlayerToGroup(player, _flag); - } - } - } - } - }); - } - + AddTimer(14, () => Helper.GivePlayerFlags(player, activeFlags)); /* @@ -315,10 +306,10 @@ public partial class CS2_SimpleAdmin if (player.AuthorizedSteamID != null) { - if (AdminSQLManager._adminCache.ContainsKey(player.AuthorizedSteamID.SteamId64.ToString())) - { - AdminSQLManager._adminCache.Remove(player.AuthorizedSteamID.SteamId64.ToString()); - } + //string steamIdString = player.AuthorizedSteamID.SteamId64.ToString(); + + //AdminSQLManager._adminCache.TryRemove(steamIdString, out _); + AdminManager.RemovePlayerPermissions(player); } if (TagsDetected) @@ -359,4 +350,4 @@ public partial class CS2_SimpleAdmin return HookResult.Continue; } -} +} \ No newline at end of file diff --git a/Helper.cs b/Helper.cs index 1f7aae8..885d9db 100644 --- a/Helper.cs +++ b/Helper.cs @@ -1,9 +1,10 @@ -using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; using System.Text.RegularExpressions; -using CounterStrikeSharp.API.Modules.Menu; namespace CS2_SimpleAdmin { @@ -46,6 +47,35 @@ namespace CS2_SimpleAdmin return Regex.IsMatch(input, pattern); } + public static void GivePlayerFlags(CCSPlayerController player, dynamic flags) + { + if (player == null) return; + + foreach (var flagsValue in flags) + { + if (!string.IsNullOrEmpty(flagsValue)) + { + string[] _flags = flagsValue.Split(','); + Console.WriteLine(flagsValue); + + foreach (var _flag in _flags) + { + Server.NextFrame(() => + { + if (_flag.StartsWith("@")) + { + AdminManager.AddPlayerPermissions(player, _flag); + } + if (_flag.StartsWith("#")) + { + AdminManager.AddPlayerToGroup(player, _flag); + } + }); + } + } + } + } + /* public static TargetResult GetTarget(string target, out CCSPlayerController? player) { @@ -105,6 +135,5 @@ namespace CS2_SimpleAdmin if (CS2_SimpleAdmin.voteInProgress) CS2_SimpleAdmin.voteAnswers[option.Text]++; } - } -} +} \ No newline at end of file diff --git a/MuteManager.cs b/MuteManager.cs index 50f6267..e32f972 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -1,5 +1,4 @@ using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; using Dapper; using MySqlConnector; using System.Data; @@ -188,7 +187,5 @@ namespace CS2_SimpleAdmin } } } - - } -} +} \ No newline at end of file diff --git a/PlayerInfo.cs b/PlayerInfo.cs index 13e55c2..2173ce7 100644 --- a/PlayerInfo.cs +++ b/PlayerInfo.cs @@ -8,4 +8,4 @@ public string? Name { get; set; } public string? IpAddress { get; set; } } -} +} \ No newline at end of file diff --git a/PlayerUtils.cs b/PlayerUtils.cs index e493de8..539512e 100644 --- a/PlayerUtils.cs +++ b/PlayerUtils.cs @@ -1,6 +1,5 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; -using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using System.Text; @@ -12,6 +11,7 @@ public static class PlayerUtils { PerformSlap(pawn, damage); } + public static void Print(this CCSPlayerController controller, string message = "") { StringBuilder _message = new(CS2_SimpleAdmin._localizer!["sa_prefix"]); @@ -25,6 +25,14 @@ public static class PlayerUtils return AdminManager.CanPlayerTarget(controller, target); } + public static void SetSpeed(this CCSPlayerController controller, float speed) + { + CCSPlayerPawn? playerPawnValue = controller.PlayerPawn.Value; + if (playerPawnValue == null) return; + + playerPawnValue.VelocityModifier = speed; + } + public static void SetHp(this CCSPlayerController controller, int health = 100) { if (health <= 0 || !controller.PawnIsAlive || controller.PlayerPawn.Value == null) return; diff --git a/README.md b/README.md index 7a82fc5..e2df2c0 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Manage your Counter-Strike 2 server by simple commands :) ``` ### Requirments -[CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v90** +[CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v142** ### Configuration After first launch, u need to configure plugin in addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin/CS2-SimpleAdmin.json diff --git a/lang/lv.json b/lang/lv.json index 859a4f3..1a697c6 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -35,4 +35,4 @@ "sa_adminsay_prefix": "{RED}ADMINS: {lightred}{0}{default}", "sa_adminchat_template_admin": "{LIME}(ADMINS) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(SPĒLĒTĀJS) {lightred}{0}{default}: {lightred}{1}{default}" -} +} \ No newline at end of file From dd5e72e87341a22c52e22a74efe01c2bb2a8f827 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Mon, 8 Jan 2024 22:29:36 +0100 Subject: [PATCH 058/356] Update 1.2.6a - Added server_id - Added immunity --- AdminSQLManager.cs | 39 +++++++++++++++++++++++++++++++++------ BanManager.cs | 21 ++++++++++++--------- CS2-SimpleAdmin.cs | 10 +++++++--- Events.cs | 26 ++++++++++++++++++++++++-- Helper.cs | 31 ++++++++++++++----------------- MuteManager.cs | 12 +++++++----- 6 files changed, 97 insertions(+), 42 deletions(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index 8b46e32..092e771 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -43,7 +43,7 @@ namespace CS2_SimpleAdmin } */ - public async Task> GetAdminFlags(string steamId) + public async Task, int)>> GetAdminFlags(string steamId) { /* Unused for now if (_adminCache.TryGetValue(steamId, out ConcurrentBag? cachedFlags)) @@ -56,14 +56,17 @@ namespace CS2_SimpleAdmin await using var connection = _dbConnection; await connection.OpenAsync(); - string sql = "SELECT flags, ends FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime)"; - List? activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now }))?.ToList(); + string sql = "SELECT flags, immunity, ends FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime) AND (server_id IS NULL OR server_id = @serverid)"; + List? activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList(); if (activeFlags == null) { - return new List(); + return new List<(List, int)>(); } + List<(List, int)> filteredFlagsWithImmunity = new List<(List, int)>(); + + /* List filteredFlags = new List(); foreach (var flags in activeFlags) @@ -76,6 +79,30 @@ namespace CS2_SimpleAdmin filteredFlags.Add(flag); } } + */ + + foreach (dynamic flags in activeFlags) + { + if (flags is not IDictionary flagsDict) + { + continue; + } + + if (!flagsDict.TryGetValue("flags", out var flagsValueObj) || !flagsDict.TryGetValue("immunity", out var immunityValueObj)) + { + continue; + } + + if (!(flagsValueObj is string flagsValue) || !int.TryParse(immunityValueObj.ToString(), out var immunityValue)) + { + continue; + } + + //Console.WriteLine($"Flags: {flagsValue}, Immunity: {immunityValue}"); + + filteredFlagsWithImmunity.Add((flagsValue.Split(',').ToList(), immunityValue)); + } + /* Unused for now bool shouldCache = activeFlags.Any(flags => @@ -117,8 +144,8 @@ namespace CS2_SimpleAdmin return flagsToCache.Cast().ToList(); } */ - - return filteredFlags.Cast().ToList(); + return filteredFlagsWithImmunity; + //return filteredFlags.Cast().ToList(); } public async Task DeleteAdminBySteamId(string playerSteamId) diff --git a/BanManager.cs b/BanManager.cs index e327cb2..4d9b87b 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -20,8 +20,8 @@ namespace CS2_SimpleAdmin await using var connection = _dbConnection; await connection.OpenAsync(); - var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + - "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + 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 { @@ -33,7 +33,8 @@ namespace CS2_SimpleAdmin banReason = reason, duration = time, ends = futureTime, - created = now + created = now, + serverid = CS2_SimpleAdmin.ServerId }); } @@ -47,8 +48,8 @@ namespace CS2_SimpleAdmin await using var connection = _dbConnection; await connection.OpenAsync(); - var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + - "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + 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 { @@ -58,7 +59,8 @@ namespace CS2_SimpleAdmin banReason = reason, duration = time, ends = futureTime, - created = now + created = now, + serverid = CS2_SimpleAdmin.ServerId }); } @@ -72,8 +74,8 @@ namespace CS2_SimpleAdmin await using var connection = _dbConnection; await connection.OpenAsync(); - var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + - "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + 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 { @@ -83,7 +85,8 @@ namespace CS2_SimpleAdmin banReason = reason, duration = time, ends = futureTime, - created = now + created = now, + serverid = CS2_SimpleAdmin.ServerId }); } diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 54429af..96fa85c 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -27,12 +27,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig GodPlayers = new List(); public static bool TagsDetected = false; public static bool voteInProgress = false; + public static int? ServerId = null; internal string dbConnectionString = string.Empty; public override string ModuleName => "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.5a"; + public override string ModuleVersion => "1.2.6a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -81,6 +82,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + BanManager _banManager = new(dbConnectionString); bool isBanned = await _banManager.IsPlayerBanned(playerInfo); @@ -146,7 +150,7 @@ public partial class CS2_SimpleAdmin List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId!); AdminSQLManager _adminManager = new(dbConnectionString); - List activeFlags = await _adminManager.GetAdminFlags(playerInfo.SteamId!); + List<(List, int)> activeFlags = await _adminManager.GetAdminFlags(playerInfo.SteamId!); Server.NextFrame(() => { @@ -239,7 +243,7 @@ public partial class CS2_SimpleAdmin } } - AddTimer(14, () => Helper.GivePlayerFlags(player, activeFlags)); + AddTimer(6, () => Helper.GivePlayerFlags(player, activeFlags)); /* @@ -333,6 +337,24 @@ public partial class CS2_SimpleAdmin { TagsDetected = true; } + + using (var connection = new MySqlConnection(dbConnectionString)) + { + connection.Open(); + + connection.Execute( + "INSERT INTO `sa_servers` (address, hostname) VALUES (@address, @hostname) " + + "ON DUPLICATE KEY UPDATE hostname = @hostname", + new { address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}", hostname = ConVar.Find("hostname")!.StringValue }); + + int? serverId = connection.ExecuteScalar( + "SELECT `id` FROM `sa_servers` WHERE `address` = @address", + new { address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}" }); + + ServerId = serverId; + + connection.Close(); + } } private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info) diff --git a/Helper.cs b/Helper.cs index 885d9db..3e4876e 100644 --- a/Helper.cs +++ b/Helper.cs @@ -47,33 +47,30 @@ namespace CS2_SimpleAdmin return Regex.IsMatch(input, pattern); } - public static void GivePlayerFlags(CCSPlayerController player, dynamic flags) + public static void GivePlayerFlags(CCSPlayerController player, List<(List, int)> flagsWithImmunity) { if (player == null) return; - foreach (var flagsValue in flags) + foreach (var (flags, immunity) in flagsWithImmunity) { - if (!string.IsNullOrEmpty(flagsValue)) - { - string[] _flags = flagsValue.Split(','); - Console.WriteLine(flagsValue); + AdminManager.SetPlayerImmunity(player, (uint)immunity); - foreach (var _flag in _flags) + foreach (var flag in flags) + { + if (!string.IsNullOrEmpty(flag)) { - Server.NextFrame(() => + if (flag.StartsWith("@")) { - if (_flag.StartsWith("@")) - { - AdminManager.AddPlayerPermissions(player, _flag); - } - if (_flag.StartsWith("#")) - { - AdminManager.AddPlayerToGroup(player, _flag); - } - }); + AdminManager.AddPlayerPermissions(player, flag); + } + else if (flag.StartsWith("#")) + { + AdminManager.AddPlayerToGroup(player, flag); + } } } } + } /* diff --git a/MuteManager.cs b/MuteManager.cs index e32f972..c3c323b 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -28,8 +28,8 @@ namespace CS2_SimpleAdmin if (type == 1) muteType = "MUTE"; - var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`) " + - "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type)"; + var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)"; await connection.ExecuteAsync(sql, new { @@ -42,6 +42,7 @@ namespace CS2_SimpleAdmin ends = futureTime, created = now, type = muteType, + serverid = CS2_SimpleAdmin.ServerId }); } @@ -59,8 +60,8 @@ namespace CS2_SimpleAdmin if (type == 1) muteType = "MUTE"; - var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`) " + - "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type)"; + var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)"; await connection.ExecuteAsync(sql, new { @@ -71,7 +72,8 @@ namespace CS2_SimpleAdmin duration = time, ends = futureTime, created = now, - type = muteType + type = muteType, + serverid = CS2_SimpleAdmin.ServerId }); } From d173816492b3d69c049c115c350520e982b238b5 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Mon, 8 Jan 2024 22:34:11 +0100 Subject: [PATCH 059/356] Update AdminSQLManager.cs --- AdminSQLManager.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index 092e771..a5f6aa6 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -177,8 +177,8 @@ namespace CS2_SimpleAdmin await using var connection = _dbConnection; await connection.OpenAsync(); - var sql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `flags`, `immunity`, `ends`, `created`) " + - "VALUES (@playerSteamid, @playerName, @flags, @immunity, @ends, @created)"; + var sql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `flags`, `immunity`, `ends`, `created`, `server_id`) " + + "VALUES (@playerSteamid, @playerName, @flags, @immunity, @ends, @created, @serverid)"; await connection.ExecuteAsync(sql, new { @@ -187,7 +187,8 @@ namespace CS2_SimpleAdmin flags, immunity, ends = futureTime, - created = now + created = now, + serverid = CS2_SimpleAdmin.ServerId }); } From f78cd888de94dfb5f9abcaa9f6637c7e20749855 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Tue, 9 Jan 2024 12:08:14 +0100 Subject: [PATCH 060/356] Fix --- CS2-SimpleAdmin.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 96fa85c..4ce5272 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -33,7 +33,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.6a"; + public override string ModuleVersion => "1.2.6b"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -123,6 +123,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Tue, 9 Jan 2024 22:52:56 +0200 Subject: [PATCH 061/356] lv grammar changes --- lang/lv.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lang/lv.json b/lang/lv.json index 1a697c6..5066eae 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -1,23 +1,23 @@ { "sa_prefix": "{lightred}[SA] {default}", "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_strip <#userid or name> - Takes all of the player weapons\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", - "sa_player_ban_message_time": "Tu tiki banots par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju liedza Admins: {lightred}{2}{default}!", - "sa_player_ban_message_perm": "Tu tiki banots uz mūžu par {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", - "sa_player_kick_message": "Tu tiki izmests par {lightred}{0}{default} Tevi izmeta Admins: {lightred}{1}{default}!", - "sa_player_gag_message_time": "Tev tika liegta pieeja čatam par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju liedza Admins: {lightred}{2}{default}!", - "sa_player_gag_message_perm": "Tev tika liegta pieeja čatam uz mūžu par {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", - "sa_player_mute_message_time": "Tev tika liegta pieeja balss čatam par {lightred}{0}{default} uz {lightred}{1}{default} minūtēm. Pieeju Liedza Admins: {lightred}{2}{default}!", - "sa_player_mute_message_perm": "Tev tika liegta pieeja balss čatam uz mūžu par{lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", - "sa_admin_ban_message_time": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", - "sa_admin_ban_message_perm": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", - "sa_admin_kick_message": "Admins {lightred}{0}{default} izmeta {lightred}{1}{default} par {lightred}{2}{default}!", - "sa_admin_gag_message_time": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", - "sa_admin_gag_message_perm": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", - "sa_admin_mute_message_time": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} par {lightred}{2}{default} uz {lightred}{3}{default} minūtēm!", - "sa_admin_mute_message_perm": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} uz mūžu par {lightred}{2}{default}!", + "sa_player_ban_message_time": "Tu tiki banots ar iemeslu {lightred}{0}{default} uz {lightred}{1}{default} minūti/ēm. Pieeju liedza Admins: {lightred}{2}{default}!", + "sa_player_ban_message_perm": "Tu tiki banots uz mūžu ar iemeslu {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_player_kick_message": "Tu tiki izmests ar iemeslu {lightred}{0}{default} Tevi izmeta Admins: {lightred}{1}{default}!", + "sa_player_gag_message_time": "Tev tika liegta pieeja čatam ar iemeslu {lightred}{0}{default} uz {lightred}{1}{default} minūti/ēm. Pieeju liedza Admins: {lightred}{2}{default}!", + "sa_player_gag_message_perm": "Tev tika liegta pieeja čatam uz mūžu ar iemeslu {lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_player_mute_message_time": "Tev tika liegta pieeja balss čatam ar iemeslu {lightred}{0}{default} uz {lightred}{1}{default} minūti/ēm. Pieeju Liedza Admins: {lightred}{2}{default}!", + "sa_player_mute_message_perm": "Tev tika liegta pieeja balss čatam uz mūžu ar iemeslu{lightred}{0}{default} Pieeju liedza Admins: {lightred}{1}{default}!", + "sa_admin_ban_message_time": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} ar iemeslu {lightred}{2}{default} uz {lightred}{3}{default} minūti/ēm.!", + "sa_admin_ban_message_perm": "Admins {lightred}{0}{default} liedza pieeju serverim {lightred}{1}{default} uz mūžu ar iemeslu {lightred}{2}{default}!", + "sa_admin_kick_message": "Admins {lightred}{0}{default} izmeta {lightred}{1}{default} ar iemeslu {lightred}{2}{default}!", + "sa_admin_gag_message_time": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} ar iemeslu {lightred}{2}{default} uz {lightred}{3}{default} minūti/ēm!", + "sa_admin_gag_message_perm": "Admins {lightred}{0}{default} liedza pieeju čatam {lightred}{1}{default} uz mūžu ar iemeslu {lightred}{2}{default}!", + "sa_admin_mute_message_time": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} ar iemeslu {lightred}{2}{default} uz {lightred}{3}{default} minūti/ēm!", + "sa_admin_mute_message_perm": "Admins {lightred}{0}{default} liedza pieeju balss čatam {lightred}{1}{default} uz mūžu ar iemeslu {lightred}{2}{default}!", "sa_admin_give_message": "Admins {lightred}{0}{default} iedeva {lightred}{1}{default} {lightred}{2}{default}!", "sa_admin_strip_message": "Admins {lightred}{0}{default} paņēma visus spēlētāja {lightred}{1}{default} ieročus!", - "sa_admin_hp_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} ZS apjomu{default}!", + "sa_admin_hp_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} HP daudzumu{default}!", "sa_admin_speed_message": "Admins {lightred}{0}{default} mainīja {lightred}{1}{default} ātrumu{default}!", "sa_admin_god_message": "Admins {lightred}{0}{default} mainīja dieva režīmu priekš {lightred}{1}{default}!", "sa_admin_slay_message": "Admins {lightred}{0}{default} nonāvēja {lightred}{1}{default}!", @@ -35,4 +35,4 @@ "sa_adminsay_prefix": "{RED}ADMINS: {lightred}{0}{default}", "sa_adminchat_template_admin": "{LIME}(ADMINS) {lightred}{0}{default}: {lightred}{1}{default}", "sa_adminchat_template_player": "{SILVER}(SPĒLĒTĀJS) {lightred}{0}{default}: {lightred}{1}{default}" -} \ No newline at end of file +} From 71af90031efd3c66f7719224bc49887717c5f4b2 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Tue, 9 Jan 2024 23:05:49 +0100 Subject: [PATCH 062/356] Database connection exception fix, additional ip check (problem with steam auth) --- CS2-SimpleAdmin.cs | 5 +++-- Events.cs | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 4ce5272..313931b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -23,6 +23,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig gaggedPlayers = new ConcurrentBag(); public static ConcurrentBag mutedPlayers = new ConcurrentBag(); + public static List loadedPlayers = new List(); public static Dictionary voteAnswers = new Dictionary(); public static List GodPlayers = new List(); public static bool TagsDetected = false; @@ -33,7 +34,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.6b"; + public override string ModuleVersion => "1.2.6c"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -123,7 +124,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig(OnClientAuthorized); + RegisterListener(OnClientConnected); //RegisterEventHandler(OnPlayerFullConnect); RegisterListener(OnClientDisconnect); RegisterListener(OnMapStart); @@ -124,6 +125,38 @@ public partial class CS2_SimpleAdmin return HookResult.Continue; } + private void OnClientConnected(int playerSlot) + { + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + + if (player == null || !player.IsValid || player.IpAddress == null || loadedPlayers.Contains((int)player.Index) || player.IsBot || player.IsHLTV) + return; + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress.Split(":")[0] + }; + + Task.Run(async () => + { + BanManager _banManager = new(dbConnectionString); + bool isBanned = await _banManager.IsPlayerBanned(playerInfo); + Server.NextFrame(() => + { + if (player == null || !player.IsValid) return; + if (isBanned) + { + Helper.KickPlayer((ushort)player.UserId!, "Banned"); + return; + } + }); + }); + } + private void OnClientAuthorized(int playerSlot, SteamID steamID) { CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); @@ -142,7 +175,6 @@ public partial class CS2_SimpleAdmin Task.Run(async () => { - BanManager _banManager = new(dbConnectionString); bool isBanned = await _banManager.IsPlayerBanned(playerInfo); @@ -158,6 +190,7 @@ public partial class CS2_SimpleAdmin if (isBanned) { Helper.KickPlayer((ushort)player.UserId!, "Banned"); + Console.WriteLine("Authorized banned"); return; } @@ -277,6 +310,9 @@ public partial class CS2_SimpleAdmin } } */ + + if (!loadedPlayers.Contains((int)player.Index)) + loadedPlayers.Add((int)player.Index); }); }); } @@ -308,6 +344,9 @@ public partial class CS2_SimpleAdmin GodPlayers.Remove((int)player.Index); } + if (loadedPlayers.Contains((int)player.Index)) + loadedPlayers.Remove((int)player.Index); + if (player.AuthorizedSteamID != null) { //string steamIdString = player.AuthorizedSteamID.SteamId64.ToString(); From 40611e9126951567da20518282717f6f590832b4 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 10 Jan 2024 00:03:29 +0100 Subject: [PATCH 063/356] Grammar --- lang/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/pl.json b/lang/pl.json index d26f170..048017c 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -25,7 +25,7 @@ "sa_admin_changemap_message": "Admin {lightred}{0}{default} zmienił mapę na {lightred}{1}{default}!", "sa_admin_noclip_message": "Admin {lightred}{0}{default} ustawił latanie dla {lightred}{1}{default}!", "sa_admin_freeze_message": "Admin {lightred}{0}{default} zamroził {lightred}{1}{default}!", - "sa_admin_umfreeze_message": "Admin {lightred}{0}{default} odmroził {lightred}{1}{default}!", + "sa_admin_unfreeze_message": "Admin {lightred}{0}{default} odmroził {lightred}{1}{default}!", "sa_admin_respawn_message": "Admin {lightred}{0}{default} odrodził {lightred}{1}{default}!", "sa_admin_team_message": "Admin {lightred}{0}{default} przerzucił {lightred}{1}{default} do {lightred}{2}{default}!", "sa_admin_vote_menu_title": "{lime}GŁOSOWANIE NA {gold}{0}", From e602eaa445e3e76bf1dfb9b0801d884ecf716892 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 10 Jan 2024 03:13:23 +0100 Subject: [PATCH 064/356] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e2df2c0..9db93e5 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,8 @@ Manage your Counter-Strike 2 server by simple commands :) ### Requirments [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v142** +MySQL **tested on MySQL (MariaDB) Server version: 10.11.4-MariaDB-1~deb12u1 Debian 12** + ### Configuration After first launch, u need to configure plugin in addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin/CS2-SimpleAdmin.json From 6a82d72244cda7c2d91f405ee9cead3c2e60e49d Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 10 Jan 2024 03:14:01 +0100 Subject: [PATCH 065/356] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9db93e5..d0a3134 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,8 @@ Manage your Counter-Strike 2 server by simple commands :) ``` ### Requirments -[CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v142** -MySQL **tested on MySQL (MariaDB) Server version: 10.11.4-MariaDB-1~deb12u1 Debian 12** +- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v142** +- MySQL **tested on MySQL (MariaDB) Server version: 10.11.4-MariaDB-1~deb12u1 Debian 12** ### Configuration From 8d365b670ed355a1b133adcdd59e3109e304ec31 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 13 Jan 2024 00:19:13 +0100 Subject: [PATCH 066/356] 1.2.6d - Probably workaround for sql admins --- AdminSQLManager.cs | 107 ++++++++++++++++++++++++++++++++++++++++++++- CS2-SimpleAdmin.cs | 2 +- Events.cs | 23 +++++----- Helper.cs | 48 +++++++++++++------- 4 files changed, 153 insertions(+), 27 deletions(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index a5f6aa6..628495c 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -1,4 +1,6 @@ -using Dapper; +using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Entities; +using Dapper; using MySqlConnector; namespace CS2_SimpleAdmin @@ -8,6 +10,8 @@ namespace CS2_SimpleAdmin private readonly MySqlConnection _dbConnection; // Unused for now //public static readonly ConcurrentDictionary> _adminCache = new ConcurrentDictionary>(); + public static readonly HashSet _adminCacheSet = new HashSet(); + public static readonly Dictionary _adminCacheTimestamps = new Dictionary(); public AdminSQLManager(string connectionString) { @@ -148,6 +152,93 @@ namespace CS2_SimpleAdmin //return filteredFlags.Cast().ToList(); } + public async Task, int, DateTime?)>> GetAllPlayersFlags() + { + DateTime now = DateTime.Now; + + await using var connection = _dbConnection; + await connection.OpenAsync(); + + string sql = "SELECT player_steamid, flags, immunity, ends FROM sa_admins WHERE (ends IS NULL OR ends > @CurrentTime) AND (server_id IS NULL OR server_id = @serverid)"; + List? activeFlags = (await connection.QueryAsync(sql, new { CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList(); + + if (activeFlags == null) + { + return new List<(string, List, int, DateTime?)>(); + } + + List<(string, List, int, DateTime?)> filteredFlagsWithImmunity = new List<(string, List, int, DateTime?)>(); + + foreach (dynamic flags in activeFlags) + { + if (flags is not IDictionary flagsDict) + { + continue; + } + + if (!flagsDict.TryGetValue("player_steamid", out var steamIdObj) || + !flagsDict.TryGetValue("flags", out var flagsValueObj) || + !flagsDict.TryGetValue("immunity", out var immunityValueObj) || + !flagsDict.TryGetValue("ends", out var endsObj)) + { + //Console.WriteLine("One or more required keys are missing."); + continue; + } + + DateTime? ends = null; + + if (endsObj != null) // Check if "ends" is not null + { + if (!DateTime.TryParse(endsObj.ToString(), out var parsedEnds)) + { + //Console.WriteLine("Failed to parse 'ends' value."); + continue; + } + + ends = parsedEnds; + } + + if (!(steamIdObj is string steamId) || + !(flagsValueObj is string flagsValue) || + !int.TryParse(immunityValueObj.ToString(), out var immunityValue)) + { + //Console.WriteLine("Failed to parse one or more values."); + continue; + } + + filteredFlagsWithImmunity.Add((steamId, flagsValue.Split(',').ToList(), immunityValue, ends)); + } + + return filteredFlagsWithImmunity; + } + + public async Task GiveAllFlags() + { + List<(string, List, int, DateTime?)> allPlayers = await GetAllPlayersFlags(); + + foreach (var record in allPlayers) + { + string steamIdStr = record.Item1; + List flags = record.Item2; + int immunity = record.Item3; + + DateTime? ends = record.Item4; + + if (!string.IsNullOrEmpty(steamIdStr) && SteamID.TryParse(steamIdStr, out var steamId) && steamId != null) + { + if (!_adminCacheSet.Contains(steamId)) + { + _adminCacheSet.Add(steamId); + _adminCacheTimestamps.Add(steamId, ends); + } + + Helper.GivePlayerFlags(steamId, flags, (uint)immunity); + // Often need to call 2 times + Helper.GivePlayerFlags(steamId, flags, (uint)immunity); + } + } + } + public async Task DeleteAdminBySteamId(string playerSteamId) { if (string.IsNullOrEmpty(playerSteamId)) return; @@ -159,6 +250,18 @@ namespace CS2_SimpleAdmin string sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId }); + + if (!string.IsNullOrEmpty(playerSteamId) && SteamID.TryParse(playerSteamId, out var steamId) && steamId != null) + { + if (_adminCacheSet.Contains(steamId)) + { + _adminCacheSet.Remove(steamId); + _adminCacheTimestamps.Remove(steamId); + } + + AdminManager.ClearPlayerPermissions(steamId); + AdminManager.RemovePlayerAdminData(steamId); + } } public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0) @@ -190,6 +293,8 @@ namespace CS2_SimpleAdmin created = now, serverid = CS2_SimpleAdmin.ServerId }); + + _ = GiveAllFlags(); } public async Task DeleteOldAdmins() diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 313931b..bb80876 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -34,7 +34,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.6c"; + public override string ModuleVersion => "1.2.6d"; public CS2_SimpleAdminConfig Config { get; set; } = new(); diff --git a/Events.cs b/Events.cs index eaa3089..307e163 100644 --- a/Events.cs +++ b/Events.cs @@ -190,10 +190,11 @@ public partial class CS2_SimpleAdmin if (isBanned) { Helper.KickPlayer((ushort)player.UserId!, "Banned"); - Console.WriteLine("Authorized banned"); return; } + //Helper.GivePlayerFlags(player, activeFlags); + if (activeMutes.Count > 0) { foreach (var mute in activeMutes) @@ -276,8 +277,6 @@ public partial class CS2_SimpleAdmin } } - AddTimer(6, () => Helper.GivePlayerFlags(player, activeFlags)); - /* if (_adminManager._adminCache != null && _adminManager._adminCache.Count > 0) @@ -347,12 +346,13 @@ public partial class CS2_SimpleAdmin if (loadedPlayers.Contains((int)player.Index)) loadedPlayers.Remove((int)player.Index); - if (player.AuthorizedSteamID != null) + if (player.AuthorizedSteamID != null && AdminSQLManager._adminCacheSet.Contains(player.AuthorizedSteamID)) { - //string steamIdString = player.AuthorizedSteamID.SteamId64.ToString(); - - //AdminSQLManager._adminCache.TryRemove(steamIdString, out _); - AdminManager.RemovePlayerPermissions(player); + if (AdminSQLManager._adminCacheTimestamps != null && AdminSQLManager._adminCacheTimestamps.TryGetValue(player.AuthorizedSteamID, out DateTime? expirationTime) && expirationTime.HasValue && expirationTime.Value <= DateTime.Now) + { + AdminManager.ClearPlayerPermissions(player.AuthorizedSteamID); + AdminManager.RemovePlayerAdminData(player.AuthorizedSteamID); + } } if (TagsDetected) @@ -361,13 +361,14 @@ public partial class CS2_SimpleAdmin private void OnMapStart(string mapName) { + AdminSQLManager _adminManager = new(dbConnectionString); + AddTimer(120.0f, () => { BanManager _banManager = new(dbConnectionString); - _ = _banManager.ExpireOldBans(); MuteManager _muteManager = new(dbConnectionString); + _ = _banManager.ExpireOldBans(); _ = _muteManager.ExpireOldMutes(); - AdminSQLManager _adminManager = new(dbConnectionString); _ = _adminManager.DeleteOldAdmins(); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); @@ -394,6 +395,8 @@ public partial class CS2_SimpleAdmin connection.Close(); } + + _ = _adminManager.GiveAllFlags(); } private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info) diff --git a/Helper.cs b/Helper.cs index 3e4876e..194835d 100644 --- a/Helper.cs +++ b/Helper.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; @@ -47,32 +48,49 @@ namespace CS2_SimpleAdmin return Regex.IsMatch(input, pattern); } - public static void GivePlayerFlags(CCSPlayerController player, List<(List, int)> flagsWithImmunity) + public static void GivePlayerFlags(SteamID? steamid, List? flags = null, uint immunity = 0) { - if (player == null) return; - - foreach (var (flags, immunity) in flagsWithImmunity) + try { - AdminManager.SetPlayerImmunity(player, (uint)immunity); - - foreach (var flag in flags) + if (steamid == null || (flags == null && immunity == 0)) { - if (!string.IsNullOrEmpty(flag)) + //Console.WriteLine("Invalid input: steamid is null or both flags and immunity are not provided."); + return; + } + + //Console.WriteLine($"Setting immunity for SteamID {steamid} to {immunity}"); + AdminManager.SetPlayerImmunity(steamid, (uint)immunity); + + if (flags != null) + { + //Console.WriteLine($"Applying flags to SteamID {steamid}:"); + + foreach (var flag in flags) { - if (flag.StartsWith("@")) + if (!string.IsNullOrEmpty(flag)) { - AdminManager.AddPlayerPermissions(player, flag); - } - else if (flag.StartsWith("#")) - { - AdminManager.AddPlayerToGroup(player, flag); + if (flag.StartsWith("@")) + { + //Console.WriteLine($"Adding permission {flag} to SteamID {steamid}"); + AdminManager.AddPlayerPermissions(steamid, flag); + } + else if (flag.StartsWith("#")) + { + //Console.WriteLine($"Adding SteamID {steamid} to group {flag}"); + AdminManager.AddPlayerToGroup(steamid, flag); + } } } } } - + catch (Exception) + { + return; + //Console.WriteLine($"An error occurred: {ex}"); + } } + /* public static TargetResult GetTarget(string target, out CCSPlayerController? player) { From 2d41a62b5268b7f76b05e739fc7196d0c6a1c842 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 13 Jan 2024 23:12:23 +0100 Subject: [PATCH 067/356] 1.2.6e - Finally? fixed sqladmins --- AdminSQLManager.cs | 17 +---------------- CS2-SimpleAdmin.cs | 43 +++++++++++++++++++++++++++++++++++++++++-- MuteManager.cs | 2 +- README.md | 3 ++- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index 628495c..0577aa5 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -1,5 +1,4 @@ -using CounterStrikeSharp.API.Modules.Admin; -using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API.Modules.Entities; using Dapper; using MySqlConnector; @@ -250,18 +249,6 @@ namespace CS2_SimpleAdmin string sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId }); - - if (!string.IsNullOrEmpty(playerSteamId) && SteamID.TryParse(playerSteamId, out var steamId) && steamId != null) - { - if (_adminCacheSet.Contains(steamId)) - { - _adminCacheSet.Remove(steamId); - _adminCacheTimestamps.Remove(steamId); - } - - AdminManager.ClearPlayerPermissions(steamId); - AdminManager.RemovePlayerAdminData(steamId); - } } public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0) @@ -293,8 +280,6 @@ namespace CS2_SimpleAdmin created = now, serverid = CS2_SimpleAdmin.ServerId }); - - _ = GiveAllFlags(); } public async Task DeleteOldAdmins() diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index bb80876..0afb1d9 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -6,6 +6,7 @@ using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Cvars; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; @@ -34,7 +35,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.6d"; + public override string ModuleVersion => "1.2.6e"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -215,9 +216,47 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + { + if (!string.IsNullOrEmpty(steamid) && SteamID.TryParse(steamid, out var steamId) && steamId != null) + { + if (AdminSQLManager._adminCacheSet.Contains(steamId)) + { + AdminSQLManager._adminCacheSet.Remove(steamId); + AdminSQLManager._adminCacheTimestamps.Remove(steamId); + } + + AdminManager.ClearPlayerPermissions(steamId); + AdminManager.RemovePlayerAdminData(steamId); + } + }); + command.ReplyToCommand($"Removed flags from '{steamid}'"); } + [ConsoleCommand("css_reladmin")] + [CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [RequiresPermissions("@css/root")] + public void OnRelAdminCommand(CCSPlayerController? caller, CommandInfo command) + { + foreach (SteamID steamId in AdminSQLManager._adminCacheSet) + { + if (AdminSQLManager._adminCacheSet.Contains(steamId)) + { + AdminSQLManager._adminCacheSet.Remove(steamId); + AdminSQLManager._adminCacheTimestamps.Remove(steamId); + } + + AdminManager.ClearPlayerPermissions(steamId); + AdminManager.RemovePlayerAdminData(steamId); + } + + AdminSQLManager _adminManager = new(dbConnectionString); + _ = _adminManager.GiveAllFlags(); + + command.ReplyToCommand($"Reloaded sql admins"); + } + [ConsoleCommand("css_who")] [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [RequiresPermissions("@css/generic")] @@ -417,7 +456,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes] - Add admin by steamid // @css/root - css_deladmin - Delete admin by steamid // @css/root +- css_reladmin - Reload sql admins // @css/root - css_admin - Display all admin commands // @css/generic - css_who <#userid or name> - Display informations about player // @css/generic - css_players - Display player list // @css/generic @@ -53,7 +54,7 @@ Manage your Counter-Strike 2 server by simple commands :) ``` ### Requirments -- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v142** +- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v144** - MySQL **tested on MySQL (MariaDB) Server version: 10.11.4-MariaDB-1~deb12u1 Debian 12** From 8c4cb49d0265cd1c8fa871fb6b9963827ed34fa9 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Mon, 15 Jan 2024 02:39:20 +0100 Subject: [PATCH 068/356] 1.2.7a - CounterStrikeSharp 146 --- .github/workflows/build.yml | 4 ++-- CS2-SimpleAdmin.csproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c93c496..6a20dea 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Restore run: dotnet restore - name: Build @@ -42,7 +42,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Restore run: dotnet restore - name: Build diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index a9b77a8..7dc2678 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 CS2_SimpleAdmin enable enable @@ -9,7 +9,7 @@ - + From 64c806f3d7e92bfb2c8b8d727807eed7338ae7de Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Mon, 15 Jan 2024 02:39:33 +0100 Subject: [PATCH 069/356] Update CS2-SimpleAdmin.cs --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 0afb1d9..d81e55b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -35,7 +35,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.6e"; + public override string ModuleVersion => "1.2.7a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); From d751bdadbdd44f5546a55c2132e40cbefd383b1f Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 17 Jan 2024 23:08:52 +0100 Subject: [PATCH 070/356] 1.2.7b - Back to net7 - SilentMode for admins - Adding global admins via command --- .github/workflows/build.yml | 4 +- AdminSQLManager.cs | 22 ++- CS2-SimpleAdmin.cs | 326 +++++++++++++++++++++++++----------- CS2-SimpleAdmin.csproj | 4 +- Events.cs | 5 + 5 files changed, 256 insertions(+), 105 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6a20dea..c93c496 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 8.0.x + dotnet-version: 7.0.x - name: Restore run: dotnet restore - name: Build @@ -42,7 +42,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 8.0.x + dotnet-version: 7.0.x - name: Restore run: dotnet restore - name: Build diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index 0577aa5..91782e5 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -238,7 +238,7 @@ namespace CS2_SimpleAdmin } } - public async Task DeleteAdminBySteamId(string playerSteamId) + public async Task DeleteAdminBySteamId(string playerSteamId, bool globalDelete = false) { if (string.IsNullOrEmpty(playerSteamId)) return; @@ -247,11 +247,21 @@ namespace CS2_SimpleAdmin await using var connection = _dbConnection; await connection.OpenAsync(); - string sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; - await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId }); + string sql = ""; + + if (globalDelete) + { + sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; + } + else + { + sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID AND server_id = @ServerId"; + } + + await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId, ServerId = CS2_SimpleAdmin.ServerId }); } - public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0) + public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0, bool globalAdmin = false) { if (string.IsNullOrEmpty(playerSteamId)) return; @@ -270,6 +280,8 @@ namespace CS2_SimpleAdmin var sql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `flags`, `immunity`, `ends`, `created`, `server_id`) " + "VALUES (@playerSteamid, @playerName, @flags, @immunity, @ends, @created, @serverid)"; + int? serverId = globalAdmin ? null : CS2_SimpleAdmin.ServerId; + await connection.ExecuteAsync(sql, new { playerSteamId, @@ -278,7 +290,7 @@ namespace CS2_SimpleAdmin immunity, ends = futureTime, created = now, - serverid = CS2_SimpleAdmin.ServerId + serverid = serverId }); } diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index d81e55b..6ed3f81 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -27,6 +27,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig loadedPlayers = new List(); public static Dictionary voteAnswers = new Dictionary(); public static List GodPlayers = new List(); + public static List SilentPlayers = new List(); public static bool TagsDetected = false; public static bool voteInProgress = false; public static int? ServerId = null; @@ -35,7 +36,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.7a"; + public override string ModuleVersion => "1.2.7b"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -182,20 +183,21 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { @@ -254,7 +257,24 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer((ushort)player.UserId!)); } - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } }); } @@ -486,16 +510,24 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer((ushort)player!.UserId!)); + if (time == 0) { player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } } else { player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); - Server.PrintToChatAll(sb.ToString()); - } - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + } }); } @@ -1087,23 +1151,30 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer((ushort)player.UserId!)); if (time == 0) { player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } } else { player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); - Server.PrintToChatAll(sb.ToString()); - } - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + } } } @@ -1165,16 +1236,24 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer((ushort)player.UserId!, "Banned")); @@ -1221,9 +1300,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { player.CommitSuicide(false, true); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_slay_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_slay_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } }); } @@ -1265,9 +1348,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { player.GiveNamedItem(weaponName); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_give_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, weaponName]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_give_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, weaponName]); + Server.PrintToChatAll(sb.ToString()); + } }); } @@ -1285,8 +1372,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { @@ -1644,9 +1763,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { player!.Pawn.Value!.ToggleNoclip(); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_noclip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_noclip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } }); } @@ -1668,9 +1791,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) AddTimer(time, () => player.Pawn.Value!.Unfreeze()); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } }); } @@ -1685,9 +1811,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { player!.Pawn.Value!.Unfreeze(); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_unfreeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_unfreeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } }); } @@ -1702,9 +1832,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { player!.Respawn(); - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_respawn_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + + if (!SilentPlayers.Contains((int)caller!.Index)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_respawn_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } }); } diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index 7dc2678..4276839 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -1,7 +1,7 @@ - net8.0 + net7.0 CS2_SimpleAdmin enable enable @@ -9,7 +9,7 @@ - + diff --git a/Events.cs b/Events.cs index 307e163..eaa1513 100644 --- a/Events.cs +++ b/Events.cs @@ -338,6 +338,11 @@ public partial class CS2_SimpleAdmin } } + if (SilentPlayers.Contains((int)player.Index)) + { + SilentPlayers.Remove((int)player.Index); + } + if (GodPlayers.Contains((int)player.Index)) { GodPlayers.Remove((int)player.Index); From 38020e650954120e781cd5197627cd3a0374388b Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 17 Jan 2024 23:12:22 +0100 Subject: [PATCH 071/356] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9d01543..7488686 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Manage your Counter-Strike 2 server by simple commands :) - css_addadmin [time in minutes] - Add admin by steamid // @css/root - css_deladmin - Delete admin by steamid // @css/root - css_reladmin - Reload sql admins // @css/root +- css_silentmode - Enable or disable silentmode for admins // @css/kick - css_admin - Display all admin commands // @css/generic - css_who <#userid or name> - Display informations about player // @css/generic - css_players - Display player list // @css/generic From 99ce2cdf6a62f21eb9b7e1b3b02b688c6c7c330b Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 17 Jan 2024 23:21:37 +0100 Subject: [PATCH 072/356] 1.2.7c - `css_hide` - Hide on scoreboard Code stolen from https://github.com/DeadSwimek/cs2-hideadmin Thanks DeadSwimek ;] --- CS2-SimpleAdmin.cs | 16 +++++++++++++++- README.md | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 6ed3f81..ec64fbf 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -36,7 +36,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.7b"; + public override string ModuleVersion => "1.2.7c"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -277,6 +277,20 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { caller.ChangeTeam(CsTeam.None); }); + + command.ReplyToCommand("You are hidden now"); + } + [ConsoleCommand("css_who")] [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [RequiresPermissions("@css/generic")] diff --git a/README.md b/README.md index 7488686..6ca19d3 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Manage your Counter-Strike 2 server by simple commands :) - css_deladmin - Delete admin by steamid // @css/root - css_reladmin - Reload sql admins // @css/root - css_silentmode - Enable or disable silentmode for admins // @css/kick +- css_hide - Hide admin on scoreboard // @css/kick - css_admin - Display all admin commands // @css/generic - css_who <#userid or name> - Display informations about player // @css/generic - css_players - Display player list // @css/generic From 374f6002eb2c71b9cdb0a6eae57a95b6aa46e01f Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Fri, 19 Jan 2024 21:03:24 +0100 Subject: [PATCH 073/356] 1.2.7d - Fix for console commands exception (caused by silentmode) - Updated css --- CS2-SimpleAdmin.cs | 98 +++++++++++++++++++++++++++------------------- Events.cs | 38 ++++++++++++++---- 2 files changed, 87 insertions(+), 49 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index ec64fbf..b6182f1 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -23,11 +23,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig gaggedPlayers = new ConcurrentBag(); - public static ConcurrentBag mutedPlayers = new ConcurrentBag(); + //public static ConcurrentBag mutedPlayers = new ConcurrentBag(); public static List loadedPlayers = new List(); public static Dictionary voteAnswers = new Dictionary(); - public static List GodPlayers = new List(); - public static List SilentPlayers = new List(); + public static HashSet godPlayers = new HashSet(); + public static List silentPlayers = new List(); + public static HashSet bannedPlayers = new HashSet(); public static bool TagsDetected = false; public static bool voteInProgress = false; public static int? ServerId = null; @@ -36,7 +37,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.7c"; + public override string ModuleVersion => "1.2.7d"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -265,14 +266,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer((ushort)player.UserId!)); } - if (!SilentPlayers.Contains((int)caller!.Index)) + if (caller == null || caller != null && !silentPlayers.Contains((int)caller!.Index)) { StringBuilder sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); @@ -525,7 +526,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1); }); - player.VoiceFlags = VoiceFlags.Muted; if (time > 0 && time <= 30) { @@ -810,6 +814,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) { @@ -925,6 +933,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + /* if (mutedPlayers.Contains((int)player.Index)) { if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) @@ -1029,6 +1044,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (!GodPlayers.Contains((int)player.Index)) - GodPlayers.Add((int)player.Index); + if (!godPlayers.Contains((int)player.Index)) + godPlayers.Add((int)player.Index); else - GodPlayers.Remove((int)player.Index); + godPlayers.Remove((int)player.Index); StringBuilder sb = new(_localizer!["sa_prefix"]); - if (!SilentPlayers.Contains((int)caller!.Index)) + if (caller == null || caller != null && !silentPlayers.Contains((int)caller!.Index)) { sb.Append(_localizer["sa_admin_god_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); Server.PrintToChatAll(sb.ToString()); @@ -1498,7 +1514,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) AddTimer(time, () => player.Pawn.Value!.Unfreeze()); - if (!SilentPlayers.Contains((int)caller!.Index)) + if (caller == null || caller != null && !silentPlayers.Contains((int)caller!.Index)) { StringBuilder sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); @@ -1826,7 +1842,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { BanManager _banManager = new(dbConnectionString); @@ -411,7 +433,7 @@ public partial class CS2_SimpleAdmin if (player == null || !player.IsValid) return HookResult.Continue; - if (GodPlayers.Contains((int)player.Index) && player.PawnIsAlive) + if (godPlayers.Contains((int)player.Index) && player.PawnIsAlive) { player.Health = 100; player.PlayerPawn.Value!.Health = 100; From 8aee44f7097ea83ae51ba998c8e1fbe89db0a90f Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 20 Jan 2024 02:18:41 +0100 Subject: [PATCH 074/356] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..232867c --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +ko_fi: daffyy From 6640d0044220fd58af2aa0c3bb5cb06dd6edfff5 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 20 Jan 2024 02:25:05 +0100 Subject: [PATCH 075/356] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 6ca19d3..cdc5ca1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # CS2-SimpleAdmin +### Do you appreciate what I do? Buy me a cup of tea ❤️ +[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Y8Y4THKXG) + ### Description Manage your Counter-Strike 2 server by simple commands :) From b5600d7e73446cf23f645cff05ea085209cfa90d Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 20 Jan 2024 17:24:18 +0100 Subject: [PATCH 076/356] 1.2.7e - Minor changes --- CS2-SimpleAdmin.cs | 147 +++++++++++++++++++++-------------------- CS2-SimpleAdmin.csproj | 4 +- Events.cs | 56 ++++++++-------- MuteManager.cs | 8 +-- 4 files changed, 110 insertions(+), 105 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index b6182f1..55598e5 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -22,12 +22,12 @@ namespace CS2_SimpleAdmin; public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static IStringLocalizer? _localizer; - public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); + public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); //public static ConcurrentBag mutedPlayers = new ConcurrentBag(); public static List loadedPlayers = new List(); public static Dictionary voteAnswers = new Dictionary(); - public static HashSet godPlayers = new HashSet(); - public static List silentPlayers = new List(); + public static HashSet godPlayers = new HashSet(); + public static List silentPlayers = new List(); public static HashSet bannedPlayers = new HashSet(); public static bool TagsDetected = false; public static bool voteInProgress = false; @@ -37,7 +37,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.7d"; + public override string ModuleVersion => "1.2.7e"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -266,14 +266,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer((ushort)player.UserId!)); } - if (caller == null || caller != null && !silentPlayers.Contains((int)caller!.Index)) + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) { StringBuilder sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); @@ -495,10 +497,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) { @@ -507,11 +509,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) { @@ -626,11 +628,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (gaggedPlayers.Contains((int)player.Index)) + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) { - if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) { gaggedPlayers.Add(removedItem); } @@ -744,7 +746,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) @@ -1113,7 +1115,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (!godPlayers.Contains((int)player.Index)) - godPlayers.Add((int)player.Index); - else - godPlayers.Remove((int)player.Index); - - StringBuilder sb = new(_localizer!["sa_prefix"]); - - if (caller == null || caller != null && !silentPlayers.Contains((int)caller!.Index)) + if (player != null && player.UserId != null) { - sb.Append(_localizer["sa_admin_god_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + if (!godPlayers.Contains((ushort)player.UserId)) + godPlayers.Add((ushort)player.UserId); + else + godPlayers.Remove((ushort)player.UserId); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller!.UserId)) + { + sb.Append(_localizer["sa_admin_god_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -1514,7 +1519,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) AddTimer(time, () => player.Pawn.Value!.Unfreeze()); - if (caller == null || caller != null && !silentPlayers.Contains((int)caller!.Index)) + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) { StringBuilder sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); @@ -1842,7 +1847,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + net7.0 @@ -9,7 +9,7 @@ - + diff --git a/Events.cs b/Events.cs index 38be2b4..1aec8c0 100644 --- a/Events.cs +++ b/Events.cs @@ -36,7 +36,7 @@ public partial class CS2_SimpleAdmin PlayerInfo playerInfo = new PlayerInfo { UserId = player.UserId, - Index = (int)player.Index, + Index = (ushort)player.UserId, SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), Name = player?.PlayerName, IpAddress = player?.IpAddress?.Split(":")[0] @@ -63,7 +63,7 @@ public partial class CS2_SimpleAdmin { if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; - if (gaggedPlayers.Contains((int)player.Index)) + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) { return HookResult.Handled; } @@ -75,7 +75,7 @@ public partial class CS2_SimpleAdmin { if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; - if (gaggedPlayers.Contains((int)player.Index)) + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) { return HookResult.Handled; } @@ -129,7 +129,7 @@ public partial class CS2_SimpleAdmin { CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); - if (player == null || !player.IsValid || player.IpAddress == null || loadedPlayers.Contains((int)player.Index) || player.IsBot || player.IsHLTV) + if (player == null || !player.IsValid || player.IpAddress == null || player.UserId == null || loadedPlayers.Contains((ushort)player.UserId) || player.IsBot || player.IsHLTV) return; if (bannedPlayers.Contains(player.IpAddress) || player.AuthorizedSteamID != null && bannedPlayers.Contains(player.AuthorizedSteamID.SteamId64.ToString())) @@ -138,7 +138,7 @@ public partial class CS2_SimpleAdmin PlayerInfo playerInfo = new PlayerInfo { UserId = player.UserId, - Index = (int)player.Index, + Index = (ushort)player.UserId, SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), Name = player?.PlayerName, IpAddress = player?.IpAddress.Split(":")[0] @@ -179,7 +179,7 @@ public partial class CS2_SimpleAdmin PlayerInfo playerInfo = new PlayerInfo { UserId = player.UserId, - Index = (int)player.Index, + Index = (ushort)player.Index, SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), Name = player?.PlayerName, IpAddress = player?.IpAddress?.Split(":")[0] @@ -223,11 +223,11 @@ public partial class CS2_SimpleAdmin if (muteType == "GAG") { // Chat mute - if (!gaggedPlayers.Any(index => index == player.Index)) - gaggedPlayers.Add((int)player.Index); + if (player.UserId != null && !gaggedPlayers.Any(index => index == (ushort)player.UserId)) + gaggedPlayers.Add((ushort)player.UserId); if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player.Index}"); + NativeAPI.IssueServerCommand($"css_tag_mute {player.UserId}"); if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) { @@ -235,16 +235,16 @@ public partial class CS2_SimpleAdmin { if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - if (gaggedPlayers.Contains((int)player.Index)) + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) { - if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (int)player.UserId) { gaggedPlayers.Add(removedItem); } } if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player.Index}"); + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.UserId}"); MuteManager _muteManager = new(dbConnectionString); _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); @@ -277,9 +277,9 @@ public partial class CS2_SimpleAdmin if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; /* - if (mutedPlayers.Contains((int)player.Index)) + if (mutedPlayers.Contains((ushort)player.UserId)) { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (ushort)player.UserId) { mutedPlayers.Add(removedItem); } @@ -329,8 +329,8 @@ public partial class CS2_SimpleAdmin } */ - if (!loadedPlayers.Contains((int)player.Index)) - loadedPlayers.Add((int)player.Index); + if (player.UserId != null && !loadedPlayers.Contains((ushort)player.UserId)) + loadedPlayers.Add((ushort)player.UserId); }); }); } @@ -341,36 +341,36 @@ public partial class CS2_SimpleAdmin if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; - if (gaggedPlayers.Contains((int)player.Index)) + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) { - if (gaggedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) { gaggedPlayers.Add(removedItem); } } /* - if (mutedPlayers.Contains((int)player.Index)) + if (mutedPlayers.Contains((ushort)player.UserId)) { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (ushort)player.UserId) { mutedPlayers.Add(removedItem); } } */ - if (silentPlayers.Contains((int)player.Index)) + if (player.UserId != null && silentPlayers.Contains((ushort)player.UserId)) { - silentPlayers.Remove((int)player.Index); + silentPlayers.Remove((ushort)player.UserId); } - if (godPlayers.Contains((int)player.Index)) + if (player.UserId != null && godPlayers.Contains((ushort)player.UserId)) { - godPlayers.Remove((int)player.Index); + godPlayers.Remove((ushort)player.UserId); } - if (loadedPlayers.Contains((int)player.Index)) - loadedPlayers.Remove((int)player.Index); + if (player.UserId != null && loadedPlayers.Contains((ushort)player.UserId)) + loadedPlayers.Remove((ushort)player.UserId); if (player.AuthorizedSteamID != null && AdminSQLManager._adminCacheSet.Contains(player.AuthorizedSteamID)) { @@ -382,7 +382,7 @@ public partial class CS2_SimpleAdmin } if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.Index}"); + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.UserId}"); } private void OnMapStart(string mapName) @@ -433,7 +433,7 @@ public partial class CS2_SimpleAdmin if (player == null || !player.IsValid) return HookResult.Continue; - if (godPlayers.Contains((int)player.Index) && player.PawnIsAlive) + if (player.UserId != null && godPlayers.Contains((ushort)player.UserId) && player.PawnIsAlive) { player.Health = 100; player.PlayerPawn.Value!.Health = 100; diff --git a/MuteManager.cs b/MuteManager.cs index 6d68598..519ce27 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -147,7 +147,7 @@ namespace CS2_SimpleAdmin public async Task CheckMute(PlayerInfo player) { - if (player.Index == null) return; + if (player.UserId == null) return; string steamId = player.SteamId!; List activeMutes = await IsPlayerMuted(steamId); @@ -162,11 +162,11 @@ namespace CS2_SimpleAdmin if (muteType == "GAG") { - if (!CS2_SimpleAdmin.gaggedPlayers.Any(index => index == player.Index)) - CS2_SimpleAdmin.gaggedPlayers.Add((int)player.Index); + if (!CS2_SimpleAdmin.gaggedPlayers.Any(index => index == player.UserId)) + CS2_SimpleAdmin.gaggedPlayers.Add((ushort)player.UserId); if (CS2_SimpleAdmin.TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player!.Index}"); + NativeAPI.IssueServerCommand($"css_tag_mute {player!.UserId}"); /* CCSPlayerController currentPlayer = player; From 855f087a7ba15dca357d127c42bbca722182413a Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 24 Jan 2024 23:50:49 +0100 Subject: [PATCH 077/356] 1.2.8a - Updated minimum CounterStrikeSharp version to **154** - Fixed? issue with checking ban status for player with authorization problem - Added additional checks for immunity - Added new config variable `BanType` if `1` = `SteamID + IP`, if `0` = `SteamID` --- BanManager.cs | 3 +- CS2-SimpleAdmin.cs | 629 ++++++++++++++++++++++------------------- CS2-SimpleAdmin.csproj | 4 +- Config.cs | 8 +- Events.cs | 187 +++++++++++- 5 files changed, 524 insertions(+), 307 deletions(-) diff --git a/BanManager.cs b/BanManager.cs index 4d9b87b..969c903 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -23,11 +23,12 @@ namespace CS2_SimpleAdmin 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)"; + CS2_SimpleAdminConfig config = new CS2_SimpleAdminConfig(); await connection.ExecuteAsync(sql, new { playerSteamid = player.SteamId, playerName = player.Name, - playerIp = player.IpAddress, + playerIp = config.BanType == 1 ? player.IpAddress : null, adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, adminName = issuer.Name == null ? "Console" : issuer.Name, banReason = reason, diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 55598e5..448fd75 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -18,7 +18,7 @@ using System.Text; namespace CS2_SimpleAdmin; -[MinimumApiVersion(142)] +[MinimumApiVersion(154)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static IStringLocalizer? _localizer; @@ -37,7 +37,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.7e"; + public override string ModuleVersion => "1.2.8a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -308,75 +308,78 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - PlayerInfo playerInfo = new PlayerInfo + if (caller!.CanTarget(player)) { - UserId = player.UserId, - Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - int totalBans = 0; - int totalMutes = 0; - - totalBans = await _banManager.GetPlayerBans(playerInfo); - totalMutes = await _muteManager.GetPlayerMutes(playerInfo.SteamId!); - - Server.NextFrame(() => + PlayerInfo playerInfo = new PlayerInfo { - if (caller != null) + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + int totalBans = 0; + int totalMutes = 0; + + totalBans = await _banManager.GetPlayerBans(playerInfo); + totalMutes = await _muteManager.GetPlayerMutes(playerInfo.SteamId!); + + Server.NextFrame(() => { - caller!.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - - caller!.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); - caller!.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); - if (playerInfo.SteamId != null) - caller!.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); - if (player.AuthorizedSteamID != null) + if (caller != null) { - caller!.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); - caller!.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); - } - if (playerInfo.IpAddress != null) - caller!.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); - caller!.PrintToConsole($"• Ping: \"{player.Ping}\""); - if (player.AuthorizedSteamID != null) - { - caller!.PrintToConsole($"• Total Bans: \"{totalBans}\""); - caller!.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); - } + caller!.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - caller!.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); - } - else - { - Server.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); + caller!.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + caller!.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + caller!.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) + { + caller!.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + caller!.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } + if (playerInfo.IpAddress != null) + caller!.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); + caller!.PrintToConsole($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + caller!.PrintToConsole($"• Total Bans: \"{totalBans}\""); + caller!.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); + } - Server.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); - Server.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); - if (playerInfo.SteamId != null) - Server.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); - if (player.AuthorizedSteamID != null) - { - Server.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); - Server.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + caller!.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); } - if (playerInfo.IpAddress != null) - Server.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); - Server.PrintToConsole($"• Ping: \"{player.Ping}\""); - if (player.AuthorizedSteamID != null) + else { - Server.PrintToConsole($"• Total Bans: \"{totalBans}\""); - Server.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); - } + Server.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - Server.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); - } + Server.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + Server.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + Server.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) + { + Server.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + Server.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } + if (playerInfo.IpAddress != null) + Server.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); + Server.PrintToConsole($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + Server.PrintToConsole($"• Total Bans: \"{totalBans}\""); + Server.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); + } + + Server.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); + } + }); }); - }); + } }); } @@ -430,23 +433,26 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player.Pawn.Value!.Freeze(); + if (caller!.CanTarget(player)) + { + player.Pawn.Value!.Freeze(); - if (command.ArgCount >= 2) - { - player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, reason)); - } - else - { - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); - } + if (command.ArgCount >= 2) + { + player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, reason)); + } + else + { + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); + } - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -477,73 +483,76 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - PlayerInfo playerInfo = new PlayerInfo + if (caller!.CanTarget(player)) { - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - PlayerInfo adminInfo = new PlayerInfo - { - SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), - Name = caller?.PlayerName, - IpAddress = caller?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time); - }); - - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player!.UserId}"); - - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) - gaggedPlayers.Add((ushort)player.UserId); - - if (time > 0 && time <= 30) - { - AddTimer(time * 60, () => + PlayerInfo playerInfo = new PlayerInfo { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player.UserId}"); + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + Task.Run(async () => + { + await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time); + }); + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_mute {player!.UserId}"); + + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + gaggedPlayers.Add((ushort)player.UserId); + + if (time > 0 && time <= 30) + { + AddTimer(time * 60, () => { - if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player.UserId}"); + + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) { - gaggedPlayers.Add(removedItem); + if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) + { + gaggedPlayers.Add(removedItem); + } } - } - //MuteManager _muteManager = new(dbConnectionString); - //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - if (time == 0) - { - player!.PrintToCenter(_localizer!["sa_player_gag_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_gag_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); + //MuteManager _muteManager = new(dbConnectionString); + //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } - } - else - { - player!.PrintToCenter(_localizer!["sa_player_gag_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - if (caller == null || caller != null && caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (time == 0) { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_gag_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); - Server.PrintToChatAll(sb.ToString()); + player!.PrintToCenter(_localizer!["sa_player_gag_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_gag_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + } + else + { + player!.PrintToCenter(_localizer!["sa_player_gag_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_gag_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } } } }); @@ -708,7 +717,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - PlayerInfo playerInfo = new PlayerInfo + if (caller!.CanTarget(player)) { - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - PlayerInfo adminInfo = new PlayerInfo - { - SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), - Name = caller?.PlayerName, - IpAddress = caller?.IpAddress?.Split(":")[0] - }; - - /* - if (!mutedPlayers.Contains((ushort)player.UserId)) - mutedPlayers.Add((ushort)player.UserId); - */ - - player!.VoiceFlags = VoiceFlags.Muted; - - Task.Run(async () => - { - await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1); - }); - - - if (time > 0 && time <= 30) - { - AddTimer(time * 60, () => + PlayerInfo playerInfo = new PlayerInfo { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; - //MuteManager _muteManager = new(dbConnectionString); - //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; - /* - if (mutedPlayers.Contains((int)player.Index)) + /* + if (!mutedPlayers.Contains((ushort)player.UserId)) + mutedPlayers.Add((ushort)player.UserId); + */ + + player!.VoiceFlags = VoiceFlags.Muted; + + Task.Run(async () => + { + await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1); + }); + + + if (time > 0 && time <= 30) + { + AddTimer(time * 60, () => { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; + + //MuteManager _muteManager = new(dbConnectionString); + //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + + /* + if (mutedPlayers.Contains((int)player.Index)) { - mutedPlayers.Add(removedItem); + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } } - } - */ + */ - player.VoiceFlags = VoiceFlags.Normal; - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - if (time == 0) - { - player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); + player.VoiceFlags = VoiceFlags.Normal; + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } - } - else - { - player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (time == 0) { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); - Server.PrintToChatAll(sb.ToString()); + player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + } + else + { + player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } } } }); @@ -1088,49 +1100,52 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player.Pawn.Value!.Freeze(); - - PlayerInfo playerInfo = new PlayerInfo + if (caller!.CanTarget(player)) { - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; + player.Pawn.Value!.Freeze(); - PlayerInfo adminInfo = new PlayerInfo - { - SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), - Name = caller?.PlayerName, - IpAddress = caller?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - await _banManager.BanPlayer(playerInfo, adminInfo, reason, time); - }); - - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player!.UserId!)); - - if (time == 0) - { - player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + PlayerInfo playerInfo = new PlayerInfo { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + await _banManager.BanPlayer(playerInfo, adminInfo, reason, time); + }); + + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player!.UserId!)); + + if (time == 0) + { + player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } } - } - else - { - player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + else { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); - Server.PrintToChatAll(sb.ToString()); + player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } } } }); @@ -1401,14 +1416,17 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player.RemoveWeapons(); - - StringBuilder sb = new(_localizer!["sa_prefix"]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (caller!.CanTarget(player)) { - sb.Append(_localizer["sa_admin_strip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + player.RemoveWeapons(); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + sb.Append(_localizer["sa_admin_strip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -1427,14 +1445,17 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player.SetHp(health); - - StringBuilder sb = new(_localizer!["sa_prefix"]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (caller!.CanTarget(player)) { - sb.Append(_localizer["sa_admin_hp_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + player.SetHp(health); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + sb.Append(_localizer["sa_admin_hp_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -1453,18 +1474,21 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - /* - player.Speed = (float)speed; - player.PlayerPawn.Value!.Speed = (float)speed; - */ - player.SetSpeed((float)speed); - - StringBuilder sb = new(_localizer!["sa_prefix"]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (caller!.CanTarget(player)) { - sb.Append(_localizer["sa_admin_speed_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + /* + player.Speed = (float)speed; + player.PlayerPawn.Value!.Speed = (float)speed; + */ + player.SetSpeed((float)speed); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + sb.Append(_localizer["sa_admin_speed_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -1480,19 +1504,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (player != null && player.UserId != null) + if (caller!.CanTarget(player)) { - if (!godPlayers.Contains((ushort)player.UserId)) - godPlayers.Add((ushort)player.UserId); - else - godPlayers.Remove((ushort)player.UserId); - - StringBuilder sb = new(_localizer!["sa_prefix"]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller!.UserId)) + if (player != null && player.UserId != null) { - sb.Append(_localizer["sa_admin_god_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + if (!godPlayers.Contains((ushort)player.UserId)) + godPlayers.Add((ushort)player.UserId); + else + godPlayers.Remove((ushort)player.UserId); + + StringBuilder sb = new(_localizer!["sa_prefix"]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller!.UserId)) + { + sb.Append(_localizer["sa_admin_god_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } } }); @@ -1516,13 +1543,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player!.Pawn.Value!.Slap(damage); - StringBuilder sb = new(_localizer!["sa_prefix"]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (caller!.CanTarget(player)) { - sb.Append(_localizer["sa_admin_slap_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + player!.Pawn.Value!.Slap(damage); + StringBuilder sb = new(_localizer!["sa_prefix"]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + sb.Append(_localizer["sa_admin_slap_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -1634,7 +1664,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p.IsValid && !p.IsBot && !p.IsHLTV)) { if (p == null) continue; - ChatMenus.OpenMenu(p, voteMenu); + MenuManager.OpenChatMenu(p, voteMenu); } AddTimer(40, () => @@ -1797,13 +1827,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player!.Pawn.Value!.ToggleNoclip(); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (caller!.CanTarget(player)) { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_noclip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + player!.Pawn.Value!.ToggleNoclip(); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_noclip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -1821,16 +1854,19 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player!.Pawn.Value!.Freeze(); - - if (time > 0) - AddTimer(time, () => player.Pawn.Value!.Unfreeze()); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (caller!.CanTarget(player)) { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + player!.Pawn.Value!.Freeze(); + + if (time > 0) + AddTimer(time, () => player.Pawn.Value!.Unfreeze()); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } @@ -1866,13 +1902,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player!.Respawn(); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + if (caller!.CanTarget(player)) { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_respawn_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); + player!.Respawn(); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_respawn_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } } }); } diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index 3718839..e9be7e6 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -9,9 +9,9 @@ - + - + diff --git a/Config.cs b/Config.cs index 6875113..73b1a07 100644 --- a/Config.cs +++ b/Config.cs @@ -5,7 +5,7 @@ namespace CS2_SimpleAdmin { public class CS2_SimpleAdminConfig : BasePluginConfig { - public override int Version { get; set; } = 2; + public override int Version { get; set; } = 3; [JsonPropertyName("DatabaseHost")] public string DatabaseHost { get; set; } = ""; @@ -23,9 +23,13 @@ namespace CS2_SimpleAdmin public string DatabaseName { get; set; } = ""; [JsonPropertyName("KickTime")] - public int KickTime { get; set; } = 10; + public int KickTime { get; set; } = 5; [JsonPropertyName("DisableDangerousCommands")] public bool DisableDangerousCommands { get; set; } = true; + + [JsonPropertyName("BanType")] + public int BanType { get; set; } = 1; + } } \ No newline at end of file diff --git a/Events.cs b/Events.cs index 1aec8c0..bcdc15f 100644 --- a/Events.cs +++ b/Events.cs @@ -15,8 +15,8 @@ public partial class CS2_SimpleAdmin { private void registerEvents() { - RegisterListener(OnClientAuthorized); - RegisterListener(OnClientConnected); + //RegisterListener(OnClientAuthorized); + RegisterListener(OnClientConnect); //RegisterEventHandler(OnPlayerFullConnect); RegisterListener(OnClientDisconnect); RegisterListener(OnMapStart); @@ -86,7 +86,7 @@ public partial class CS2_SimpleAdmin if (AdminManager.PlayerHasPermissions(player, "@css/chat")) { - sb.Append(_localizer!["sa_adminchat_template_admin", player.PlayerName, info.GetArg(1).Remove(0, 1)]); + sb.Append(_localizer!["sa_adminchat_template_admin", player!.PlayerName, info.GetArg(1).Remove(0, 1)]); foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { p.PrintToChat(sb.ToString()); @@ -94,7 +94,7 @@ public partial class CS2_SimpleAdmin } else { - sb.Append(_localizer!["sa_adminchat_template_player", player.PlayerName, info.GetArg(1).Remove(0, 1)]); + sb.Append(_localizer!["sa_adminchat_template_player", player!.PlayerName, info.GetArg(1).Remove(0, 1)]); player.PrintToChat(sb.ToString()); foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { @@ -125,10 +125,179 @@ public partial class CS2_SimpleAdmin return HookResult.Continue; } - private void OnClientConnected(int playerSlot) + private void OnClientConnect(int playerSlot, string name, string ipAddress) { CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) + return; + + ipAddress = ipAddress.Split(":")[0]; + + if ( + ipAddress != null && bannedPlayers.Contains(ipAddress) || + player.SteamID.ToString() != "" && bannedPlayers.Contains(player.SteamID.ToString()) + ) + Helper.KickPlayer((ushort)player.UserId!, "Banned"); + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (ushort)player.Index, + SteamId = player?.SteamID.ToString(), + Name = player?.PlayerName, + IpAddress = ipAddress + }; + + Task.Run(async () => + { + BanManager _banManager = new(dbConnectionString); + bool isBanned = await _banManager.IsPlayerBanned(playerInfo); + + MuteManager _muteManager = new(dbConnectionString); + List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId!); + + AdminSQLManager _adminManager = new(dbConnectionString); + List<(List, int)> activeFlags = await _adminManager.GetAdminFlags(playerInfo.SteamId!); + + Server.NextFrame(() => + { + if (player == null || !player.IsValid) return; + if (isBanned) + { + if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress)) + bannedPlayers.Add(playerInfo.IpAddress); + if (player.SteamID.ToString() != "" && !bannedPlayers.Contains(player.SteamID.ToString())) + bannedPlayers.Add(player.SteamID.ToString()); + + Helper.KickPlayer((ushort)player.UserId!, "Banned"); + return; + } + + //Helper.GivePlayerFlags(player, activeFlags); + + if (activeMutes.Count > 0) + { + foreach (var mute in activeMutes) + { + string muteType = mute.type; + TimeSpan duration = mute.ends - mute.created; + int durationInSeconds = (int)duration.TotalSeconds; + + if (muteType == "GAG") + { + // Chat mute + if (player.UserId != null && !gaggedPlayers.Any(index => index == (ushort)player.UserId)) + gaggedPlayers.Add((ushort)player.UserId); + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_mute {player.UserId}"); + + if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) + { + AddTimer(durationInSeconds, () => + { + if (player == null || !player.IsValid || player.SteamID.ToString() == "") return; + + if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + { + if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (int)player.UserId) + { + gaggedPlayers.Add(removedItem); + } + } + + if (TagsDetected) + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.UserId}"); + + MuteManager _muteManager = new(dbConnectionString); + _ = _muteManager.UnmutePlayer(player!.SteamID.ToString(), 0); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + + /* + CCSPlayerController currentPlayer = player; + + if (mute.duration == 0 || durationInSeconds >= 1800) continue; + + await Task.Delay(TimeSpan.FromSeconds(durationInSeconds)); + + if (currentPlayer != null && currentPlayer.IsValid) + { + NativeAPI.IssueServerCommand($"css_tag_unmute {currentPlayer.Index.ToString()}"); + await UnmutePlayer(currentPlayer.AuthorizedSteamID.SteamId64.ToString(), 0); + } + */ + } + else + { + // Voice mute + player.VoiceFlags = VoiceFlags.Muted; + + if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) + { + AddTimer(durationInSeconds, () => + { + if (player == null || !player.IsValid || player.SteamID.ToString() == "") return; + + /* + if (mutedPlayers.Contains((ushort)player.UserId)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (ushort)player.UserId) + { + mutedPlayers.Add(removedItem); + } + } + */ + + player.VoiceFlags = VoiceFlags.Normal; + + //MuteManager _muteManager = new(dbConnectionString); + //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + } + } + } + + /* + + if (_adminManager._adminCache != null && _adminManager._adminCache.Count > 0) + { + foreach (var flags in activeFlags) + { + if (flags == null) continue; + string flagsValue = flags.flags.ToString(); + + if (!string.IsNullOrEmpty(flagsValue)) + { + string[] _flags = flagsValue.Split(","); + + AddTimer(10, () => + { + if (player == null) return; + foreach (var _flag in _flags) + { + if (_flag.StartsWith("@")) + { + AdminManager.AddPlayerPermissions(player, _flag); + } + if (_flag.StartsWith("3")) + { + AdminManager.AddPlayerToGroup(player, _flag); + } + } + }); + } + } + } + */ + }); + }); + + /* + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + if (player == null || !player.IsValid || player.IpAddress == null || player.UserId == null || loadedPlayers.Contains((ushort)player.UserId) || player.IsBot || player.IsHLTV) return; @@ -161,11 +330,15 @@ public partial class CS2_SimpleAdmin } }); }); + */ } private void OnClientAuthorized(int playerSlot, SteamID steamID) { + return; +#pragma warning disable CS0162 CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); +#pragma warning restore CS0162 if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; @@ -247,7 +420,7 @@ public partial class CS2_SimpleAdmin NativeAPI.IssueServerCommand($"css_tag_unmute {player!.UserId}"); MuteManager _muteManager = new(dbConnectionString); - _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); + _ = _muteManager.UnmutePlayer(player!.AuthorizedSteamID.SteamId64.ToString(), 0); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } @@ -359,7 +532,7 @@ public partial class CS2_SimpleAdmin } */ - if (player.UserId != null && silentPlayers.Contains((ushort)player.UserId)) + if (player!.UserId != null && silentPlayers.Contains((ushort)player.UserId)) { silentPlayers.Remove((ushort)player.UserId); } From 450a7804c660699b8d6e4a49993404328a52f29c Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Thu, 25 Jan 2024 01:00:31 +0100 Subject: [PATCH 078/356] 1.2.8a - Small fixes --- AdminSQLManager.cs | 10 ++++++++++ BanManager.cs | 21 ++++++++++++++++++--- CS2-SimpleAdmin.cs | 25 ++++++++++++++++--------- Events.cs | 39 ++++++++++++++++++--------------------- MuteManager.cs | 12 ++++++++++++ 5 files changed, 74 insertions(+), 33 deletions(-) diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index 91782e5..0c737b6 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -147,6 +147,8 @@ namespace CS2_SimpleAdmin return flagsToCache.Cast().ToList(); } */ + await connection.CloseAsync(); + return filteredFlagsWithImmunity; //return filteredFlags.Cast().ToList(); } @@ -208,6 +210,8 @@ namespace CS2_SimpleAdmin filteredFlagsWithImmunity.Add((steamId, flagsValue.Split(',').ToList(), immunityValue, ends)); } + await connection.CloseAsync(); + return filteredFlagsWithImmunity; } @@ -259,6 +263,8 @@ namespace CS2_SimpleAdmin } await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId, ServerId = CS2_SimpleAdmin.ServerId }); + + await connection.CloseAsync(); } public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0, bool globalAdmin = false) @@ -292,6 +298,8 @@ namespace CS2_SimpleAdmin created = now, serverid = serverId }); + + await connection.CloseAsync(); } public async Task DeleteOldAdmins() @@ -301,6 +309,8 @@ namespace CS2_SimpleAdmin string sql = "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); + + await connection.CloseAsync(); } } } \ No newline at end of file diff --git a/BanManager.cs b/BanManager.cs index 969c903..a11f949 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -6,10 +6,12 @@ namespace CS2_SimpleAdmin internal class BanManager { private readonly MySqlConnection _dbConnection; + private readonly CS2_SimpleAdminConfig _config; - public BanManager(string connectionString) + public BanManager(string connectionString, CS2_SimpleAdminConfig config) { _dbConnection = new MySqlConnection(connectionString); + _config = config; } public async Task BanPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0) @@ -23,12 +25,11 @@ namespace CS2_SimpleAdmin 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)"; - CS2_SimpleAdminConfig config = new CS2_SimpleAdminConfig(); await connection.ExecuteAsync(sql, new { playerSteamid = player.SteamId, playerName = player.Name, - playerIp = config.BanType == 1 ? player.IpAddress : null, + playerIp = _config.BanType == 1 ? player.IpAddress : null, adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, adminName = issuer.Name == null ? "Console" : issuer.Name, banReason = reason, @@ -37,6 +38,8 @@ namespace CS2_SimpleAdmin created = now, serverid = CS2_SimpleAdmin.ServerId }); + + await connection.CloseAsync(); } public async Task AddBanBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0) @@ -63,6 +66,8 @@ namespace CS2_SimpleAdmin created = now, serverid = CS2_SimpleAdmin.ServerId }); + + await connection.CloseAsync(); } public async Task AddBanByIp(string playerIp, PlayerInfo issuer, string reason, int time = 0) @@ -89,6 +94,8 @@ namespace CS2_SimpleAdmin created = now, serverid = CS2_SimpleAdmin.ServerId }); + + await connection.CloseAsync(); } public async Task IsPlayerBanned(PlayerInfo player) @@ -111,6 +118,8 @@ namespace CS2_SimpleAdmin banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value, CurrentTime = now }); } + await connection.CloseAsync(); + return banCount > 0; } @@ -131,6 +140,8 @@ namespace CS2_SimpleAdmin banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value }); } + await connection.CloseAsync(); + return banCount; } @@ -146,6 +157,8 @@ namespace CS2_SimpleAdmin 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 }); + + await connection.CloseAsync(); } public async Task ExpireOldBans() @@ -155,6 +168,8 @@ namespace CS2_SimpleAdmin string sql = "UPDATE sa_bans SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); + + await connection.CloseAsync(); } } } \ No newline at end of file diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 448fd75..be32f0f 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -24,7 +24,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig gaggedPlayers = new ConcurrentBag(); //public static ConcurrentBag mutedPlayers = new ConcurrentBag(); - public static List loadedPlayers = new List(); public static Dictionary voteAnswers = new Dictionary(); public static HashSet godPlayers = new HashSet(); public static List silentPlayers = new List(); @@ -303,7 +302,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); - BanManager _banManager = new(dbConnectionString); + BanManager _banManager = new(dbConnectionString, Config); MuteManager _muteManager = new(dbConnectionString); playersToTarget.ForEach(player => @@ -435,7 +434,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 2) { @@ -1091,7 +1094,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - BanManager _banManager = new(dbConnectionString); + BanManager _banManager = new(dbConnectionString, Config); await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); }); @@ -1309,7 +1316,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - BanManager _banManager = new(dbConnectionString); + BanManager _banManager = new(dbConnectionString, Config); await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); }); @@ -1328,7 +1335,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - BanManager _banManager = new(dbConnectionString); + BanManager _banManager = new(dbConnectionString, Config); bool isBanned = await _banManager.IsPlayerBanned(playerInfo); MuteManager _muteManager = new(dbConnectionString); @@ -360,7 +360,7 @@ public partial class CS2_SimpleAdmin Task.Run(async () => { - BanManager _banManager = new(dbConnectionString); + BanManager _banManager = new(dbConnectionString, Config); bool isBanned = await _banManager.IsPlayerBanned(playerInfo); MuteManager _muteManager = new(dbConnectionString); @@ -501,9 +501,6 @@ public partial class CS2_SimpleAdmin } } */ - - if (player.UserId != null && !loadedPlayers.Contains((ushort)player.UserId)) - loadedPlayers.Add((ushort)player.UserId); }); }); } @@ -542,9 +539,6 @@ public partial class CS2_SimpleAdmin godPlayers.Remove((ushort)player.UserId); } - if (player.UserId != null && loadedPlayers.Contains((ushort)player.UserId)) - loadedPlayers.Remove((ushort)player.UserId); - if (player.AuthorizedSteamID != null && AdminSQLManager._adminCacheSet.Contains(player.AuthorizedSteamID)) { if (AdminSQLManager._adminCacheTimestamps != null && AdminSQLManager._adminCacheTimestamps.TryGetValue(player.AuthorizedSteamID, out DateTime? expirationTime) && expirationTime.HasValue && expirationTime.Value <= DateTime.Now) @@ -565,7 +559,7 @@ public partial class CS2_SimpleAdmin AddTimer(60.0f, bannedPlayers.Clear, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(120.0f, () => { - BanManager _banManager = new(dbConnectionString); + BanManager _banManager = new(dbConnectionString, Config); MuteManager _muteManager = new(dbConnectionString); _ = _banManager.ExpireOldBans(); _ = _muteManager.ExpireOldMutes(); @@ -578,23 +572,26 @@ public partial class CS2_SimpleAdmin TagsDetected = true; } - using (var connection = new MySqlConnection(dbConnectionString)) + AddTimer(1.0f, () => { - connection.Open(); + using (var connection = new MySqlConnection(dbConnectionString)) + { + connection.Open(); - connection.Execute( - "INSERT INTO `sa_servers` (address, hostname) VALUES (@address, @hostname) " + - "ON DUPLICATE KEY UPDATE hostname = @hostname", - new { address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}", hostname = ConVar.Find("hostname")!.StringValue }); + connection.Execute( + "INSERT INTO `sa_servers` (address, hostname) VALUES (@address, @hostname) " + + "ON DUPLICATE KEY UPDATE hostname = @hostname", + new { address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}", hostname = ConVar.Find("hostname")!.StringValue }); - int? serverId = connection.ExecuteScalar( - "SELECT `id` FROM `sa_servers` WHERE `address` = @address", - new { address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}" }); + int? serverId = connection.ExecuteScalar( + "SELECT `id` FROM `sa_servers` WHERE `address` = @address", + new { address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}" }); - ServerId = serverId; + ServerId = serverId; - connection.Close(); - } + connection.Close(); + } + }); _ = _adminManager.GiveAllFlags(); } diff --git a/MuteManager.cs b/MuteManager.cs index 519ce27..6c3a1fe 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -44,6 +44,8 @@ namespace CS2_SimpleAdmin type = muteType, serverid = CS2_SimpleAdmin.ServerId }); + + await connection.CloseAsync(); } public async Task AddMuteBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0, int type = 0) @@ -75,6 +77,8 @@ namespace CS2_SimpleAdmin type = muteType, serverid = CS2_SimpleAdmin.ServerId }); + + await connection.CloseAsync(); } public async Task> IsPlayerMuted(string steamId) @@ -87,6 +91,8 @@ namespace CS2_SimpleAdmin string sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; var activeMutes = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now })).ToList(); + await connection.CloseAsync(); + return activeMutes; } @@ -100,6 +106,8 @@ namespace CS2_SimpleAdmin muteCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId }); + await connection.CloseAsync(); + return muteCount; } @@ -134,6 +142,8 @@ namespace CS2_SimpleAdmin string sqlUnban = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'"; await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern, muteType }); + + await connection.CloseAsync(); } public async Task ExpireOldMutes() @@ -143,6 +153,8 @@ namespace CS2_SimpleAdmin string sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now }); + + await connection.CloseAsync(); } public async Task CheckMute(PlayerInfo player) From e584316a2889a89f29ed7b81cd110d3de9aeb6a9 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Thu, 25 Jan 2024 21:09:24 +0100 Subject: [PATCH 079/356] 1.2.8b - Changing connect event, in previous sometimes player == null --- CS2-SimpleAdmin.cs | 2 +- Events.cs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index be32f0f..a4ba2d3 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -36,7 +36,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.8a"; + public override string ModuleVersion => "1.2.8b"; public CS2_SimpleAdminConfig Config { get; set; } = new(); diff --git a/Events.cs b/Events.cs index 23bf8a6..053b92d 100644 --- a/Events.cs +++ b/Events.cs @@ -16,7 +16,8 @@ public partial class CS2_SimpleAdmin private void registerEvents() { //RegisterListener(OnClientAuthorized); - RegisterListener(OnClientConnect); + //RegisterListener(OnClientConnect); + RegisterListener(OnClientPutInServer); //RegisterEventHandler(OnPlayerFullConnect); RegisterListener(OnClientDisconnect); RegisterListener(OnMapStart); @@ -125,14 +126,14 @@ public partial class CS2_SimpleAdmin return HookResult.Continue; } - private void OnClientConnect(int playerSlot, string name, string ipAddress) + private void OnClientPutInServer(int playerSlot) { CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; - ipAddress = ipAddress.Split(":")[0]; + string? ipAddress = !string.IsNullOrEmpty(player.IpAddress) ? player.IpAddress.Split(":")[0] : null; if ( ipAddress != null && bannedPlayers.Contains(ipAddress) || From 67ad1851bfd819f5ac7fcb11145b1c14980a65f2 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:45:16 +0100 Subject: [PATCH 080/356] 1.2.8c - Updated CounterStrikeSharp to 159 - Minor changes --- CS2-SimpleAdmin.cs | 26 +++++++++++++------------- CS2-SimpleAdmin.csproj | 2 +- Events.cs | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index a4ba2d3..fa2e012 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -18,7 +18,7 @@ using System.Text; namespace CS2_SimpleAdmin; -[MinimumApiVersion(154)] +[MinimumApiVersion(159)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static IStringLocalizer? _localizer; @@ -36,7 +36,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.8b"; + public override string ModuleVersion => "1.2.8c"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -510,7 +510,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) @@ -1689,10 +1689,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1706,19 +1705,20 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - { - Server.ExecuteCommand($"changelevel {map}"); - }); - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) { StringBuilder sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_changemap_message", caller == null ? "Console" : caller.PlayerName, map]); Server.PrintToChatAll(sb.ToString()); } + + AddTimer(3.0f, () => + { + Server.ExecuteCommand($"changelevel {map}"); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } + [ConsoleCommand("css_changewsmap", "Change workshop map.")] [ConsoleCommand("css_wsmap", "Change workshop map.")] [ConsoleCommand("css_workshop", "Change workshop map.")] [CommandHelper(1, "")] @@ -1728,7 +1728,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + AddTimer(3.0f, () => { Server.ExecuteCommand(_command); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } [ConsoleCommand("css_asay", "Say to all admins.")] diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index e9be7e6..4bb2cad 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -9,7 +9,7 @@ - + diff --git a/Events.cs b/Events.cs index 053b92d..5433402 100644 --- a/Events.cs +++ b/Events.cs @@ -25,7 +25,7 @@ public partial class CS2_SimpleAdmin RegisterEventHandler(OnRoundStart); AddCommandListener("say", OnCommandSay); AddCommandListener("say_team", OnCommandTeamSay); - AddCommandListener("callvote", OnCommandCallVote); + //AddCommandListener("callvote", OnCommandCallVote); } /*private HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) @@ -202,7 +202,7 @@ public partial class CS2_SimpleAdmin if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) { - if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (int)player.UserId) + if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) { gaggedPlayers.Add(removedItem); } From e028bef5b0983661fe4167386f62618eb9d740ae Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 27 Jan 2024 23:56:13 +0100 Subject: [PATCH 081/356] 1.2.8d - Minor changes - Added the ability to change the map to a workshop map via the `css_map ws:id/name` command - Fixed the `css_wsmap` command and retained it for backward compatibility - Changed gags from userid to steamid --- CS2-SimpleAdmin.cs | 99 +++++++++++++-------- Events.cs | 208 +++++---------------------------------------- MuteManager.cs | 6 +- 3 files changed, 88 insertions(+), 225 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index fa2e012..e14d8f7 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ namespace CS2_SimpleAdmin; public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static IStringLocalizer? _localizer; - public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); + public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); //public static ConcurrentBag mutedPlayers = new ConcurrentBag(); public static Dictionary voteAnswers = new Dictionary(); public static HashSet godPlayers = new HashSet(); @@ -36,7 +36,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.8c"; + public override string ModuleVersion => "1.2.8d"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -508,10 +508,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) { @@ -520,11 +520,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0 && time <= 30) { @@ -640,11 +640,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + if (player != null && player.SteamID.ToString() != "" && gaggedPlayers.Contains(player.SteamID.ToString())) { - if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) + if (gaggedPlayers.TryTake(out string? removedItem) && removedItem != player.SteamID.ToString()) { gaggedPlayers.Add(removedItem); } @@ -758,7 +758,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnMapCommand(CCSPlayerController? caller, CommandInfo command) { - string map = command.GetArg(1); + string _command = string.Empty; + string? map = command.GetCommandString.Split(" ")[1]; - if (!Server.IsMapValid(map)) + if (map.StartsWith("ws:")) { - command.ReplyToCommand($"Map {map} not found."); - return; + if (long.TryParse(map.Replace("ws:", ""), out long mapId)) + { + _command = $"host_workshop_map {mapId}"; + } + else + { + _command = $"ds_workshop_changelevel {map.Replace("ws:", "")}"; + } + + AddTimer(2.0f, () => + { + Server.ExecuteCommand(_command); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + else + { + if (!Server.IsMapValid(map)) + { + command.ReplyToCommand($"Map {map} not found."); + return; + } } if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) @@ -1712,10 +1732,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + if (!map.StartsWith("ws:")) { - Server.ExecuteCommand($"changelevel {map}"); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + AddTimer(2.0f, () => + { + Server.ExecuteCommand($"changelevel {map}"); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } } [ConsoleCommand("css_changewsmap", "Change workshop map.")] @@ -1725,10 +1748,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + AddTimer(2.0f, () => { Server.ExecuteCommand(_command); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); diff --git a/Events.cs b/Events.cs index 5433402..1c36c99 100644 --- a/Events.cs +++ b/Events.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Cvars; -using CounterStrikeSharp.API.Modules.Entities; using Dapper; using MySqlConnector; using System.Text; @@ -64,7 +63,7 @@ public partial class CS2_SimpleAdmin { if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + if (player != null && player.SteamID.ToString() != "" && gaggedPlayers.Contains(player.SteamID.ToString())) { return HookResult.Handled; } @@ -76,7 +75,7 @@ public partial class CS2_SimpleAdmin { if (player == null || !player.IsValid || info.GetArg(1).Length == 0) return HookResult.Continue; - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + if (player != null && player.SteamID.ToString() != "" && gaggedPlayers.Contains(player.SteamID.ToString())) { return HookResult.Handled; } @@ -133,6 +132,8 @@ public partial class CS2_SimpleAdmin if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; + Console.WriteLine("test"); + string? ipAddress = !string.IsNullOrEmpty(player.IpAddress) ? player.IpAddress.Split(":")[0] : null; if ( @@ -150,7 +151,7 @@ public partial class CS2_SimpleAdmin IpAddress = ipAddress }; - Task.Run(async () => + _ = Task.Run(async () => { BanManager _banManager = new(dbConnectionString, Config); bool isBanned = await _banManager.IsPlayerBanned(playerInfo); @@ -188,11 +189,11 @@ public partial class CS2_SimpleAdmin if (muteType == "GAG") { // Chat mute - if (player.UserId != null && !gaggedPlayers.Any(index => index == (ushort)player.UserId)) - gaggedPlayers.Add((ushort)player.UserId); + if (player.SteamID.ToString() != "" && !gaggedPlayers.Any(steamid => steamid.Equals(player.SteamID.ToString()))) + gaggedPlayers.Add(player.SteamID.ToString()); if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player.UserId}"); + NativeAPI.IssueServerCommand($"css_tag_mute {player!.SteamID.ToString()}"); if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) { @@ -200,16 +201,16 @@ public partial class CS2_SimpleAdmin { if (player == null || !player.IsValid || player.SteamID.ToString() == "") return; - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + if (player != null && player.SteamID.ToString() != "" && gaggedPlayers.Contains(player.SteamID.ToString())) { - if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) + if (gaggedPlayers.TryTake(out string? removedItem) && removedItem != player.SteamID.ToString()) { gaggedPlayers.Add(removedItem); } } if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.UserId}"); + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.SteamID.ToString()}"); MuteManager _muteManager = new(dbConnectionString); _ = _muteManager.UnmutePlayer(player!.SteamID.ToString(), 0); @@ -230,7 +231,7 @@ public partial class CS2_SimpleAdmin } */ } - else + else if (muteType == "MUTE") { // Voice mute player.VoiceFlags = VoiceFlags.Muted; @@ -334,187 +335,15 @@ public partial class CS2_SimpleAdmin */ } - private void OnClientAuthorized(int playerSlot, SteamID steamID) - { - return; -#pragma warning disable CS0162 - CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); -#pragma warning restore CS0162 - - if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) - return; - - if ( - player.IpAddress != null && bannedPlayers.Contains(player.IpAddress) || - player.AuthorizedSteamID != null && bannedPlayers.Contains(player.AuthorizedSteamID.SteamId64.ToString()) - ) - Helper.KickPlayer((ushort)player.UserId!, "Banned"); - - PlayerInfo playerInfo = new PlayerInfo - { - UserId = player.UserId, - Index = (ushort)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - BanManager _banManager = new(dbConnectionString, Config); - bool isBanned = await _banManager.IsPlayerBanned(playerInfo); - - MuteManager _muteManager = new(dbConnectionString); - List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId!); - - AdminSQLManager _adminManager = new(dbConnectionString); - List<(List, int)> activeFlags = await _adminManager.GetAdminFlags(playerInfo.SteamId!); - - Server.NextFrame(() => - { - if (player == null || !player.IsValid) return; - if (isBanned) - { - if (player.IpAddress != null && !bannedPlayers.Contains(player.IpAddress)) - bannedPlayers.Add(player.IpAddress); - if (player.AuthorizedSteamID != null && !bannedPlayers.Contains(player.AuthorizedSteamID.SteamId64.ToString())) - bannedPlayers.Add(player.AuthorizedSteamID.SteamId64.ToString()); - - Helper.KickPlayer((ushort)player.UserId!, "Banned"); - return; - } - - //Helper.GivePlayerFlags(player, activeFlags); - - if (activeMutes.Count > 0) - { - foreach (var mute in activeMutes) - { - string muteType = mute.type; - TimeSpan duration = mute.ends - mute.created; - int durationInSeconds = (int)duration.TotalSeconds; - - if (muteType == "GAG") - { - // Chat mute - if (player.UserId != null && !gaggedPlayers.Any(index => index == (ushort)player.UserId)) - gaggedPlayers.Add((ushort)player.UserId); - - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player.UserId}"); - - if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) - { - AddTimer(durationInSeconds, () => - { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) - { - if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (int)player.UserId) - { - gaggedPlayers.Add(removedItem); - } - } - - if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.UserId}"); - - MuteManager _muteManager = new(dbConnectionString); - _ = _muteManager.UnmutePlayer(player!.AuthorizedSteamID.SteamId64.ToString(), 0); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - /* - CCSPlayerController currentPlayer = player; - - if (mute.duration == 0 || durationInSeconds >= 1800) continue; - - await Task.Delay(TimeSpan.FromSeconds(durationInSeconds)); - - if (currentPlayer != null && currentPlayer.IsValid) - { - NativeAPI.IssueServerCommand($"css_tag_unmute {currentPlayer.Index.ToString()}"); - await UnmutePlayer(currentPlayer.AuthorizedSteamID.SteamId64.ToString(), 0); - } - */ - } - else - { - // Voice mute - player.VoiceFlags = VoiceFlags.Muted; - - if (durationInSeconds != 0 && duration.Minutes >= 0 && duration.Minutes <= 30) - { - AddTimer(durationInSeconds, () => - { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - - /* - if (mutedPlayers.Contains((ushort)player.UserId)) - { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (ushort)player.UserId) - { - mutedPlayers.Add(removedItem); - } - } - */ - - player.VoiceFlags = VoiceFlags.Normal; - - //MuteManager _muteManager = new(dbConnectionString); - //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - } - } - } - - /* - - if (_adminManager._adminCache != null && _adminManager._adminCache.Count > 0) - { - foreach (var flags in activeFlags) - { - if (flags == null) continue; - string flagsValue = flags.flags.ToString(); - - if (!string.IsNullOrEmpty(flagsValue)) - { - string[] _flags = flagsValue.Split(","); - - AddTimer(10, () => - { - if (player == null) return; - foreach (var _flag in _flags) - { - if (_flag.StartsWith("@")) - { - AdminManager.AddPlayerPermissions(player, _flag); - } - if (_flag.StartsWith("3")) - { - AdminManager.AddPlayerToGroup(player, _flag); - } - } - }); - } - } - } - */ - }); - }); - } - private void OnClientDisconnect(int playerSlot) { CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); if (player == null || !player.IsValid || player.IsBot || player.IsHLTV) return; - if (player != null && player.UserId != null && gaggedPlayers.Contains((ushort)player.UserId)) + if (player != null && player.SteamID.ToString() != "" && gaggedPlayers.Contains(player.SteamID.ToString())) { - if (gaggedPlayers.TryTake(out ushort removedItem) && removedItem != (ushort)player.UserId) + if (gaggedPlayers.TryTake(out string? removedItem) && removedItem != player.SteamID.ToString()) { gaggedPlayers.Add(removedItem); } @@ -550,11 +379,13 @@ public partial class CS2_SimpleAdmin } if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.UserId}"); + NativeAPI.IssueServerCommand($"css_tag_unmute {player!.SteamID.ToString()}"); } private void OnMapStart(string mapName) { + gaggedPlayers.Clear(); + AdminSQLManager _adminManager = new(dbConnectionString); AddTimer(60.0f, bannedPlayers.Clear, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); @@ -573,7 +404,7 @@ public partial class CS2_SimpleAdmin TagsDetected = true; } - AddTimer(1.0f, () => + AddTimer(2.0f, () => { using (var connection = new MySqlConnection(dbConnectionString)) { @@ -591,10 +422,11 @@ public partial class CS2_SimpleAdmin ServerId = serverId; connection.Close(); + + _ = _adminManager.GiveAllFlags(); } }); - _ = _adminManager.GiveAllFlags(); } private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info) diff --git a/MuteManager.cs b/MuteManager.cs index 6c3a1fe..a2344c1 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -174,11 +174,11 @@ namespace CS2_SimpleAdmin if (muteType == "GAG") { - if (!CS2_SimpleAdmin.gaggedPlayers.Any(index => index == player.UserId)) - CS2_SimpleAdmin.gaggedPlayers.Add((ushort)player.UserId); + if (!CS2_SimpleAdmin.gaggedPlayers.Any(steamid => steamid == player.SteamId!.ToString())) + CS2_SimpleAdmin.gaggedPlayers.Add(player.SteamId!.ToString()); if (CS2_SimpleAdmin.TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_mute {player!.UserId}"); + NativeAPI.IssueServerCommand($"css_tag_mute {player!.SteamId!.ToString()}"); /* CCSPlayerController currentPlayer = player; From dfd9bd53293b8ecce43856522b0648d22fcf4124 Mon Sep 17 00:00:00 2001 From: KillerRoi <54289708+KillerRoi@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:39:29 +0530 Subject: [PATCH 082/356] Added Arabic Translation --- lang/ar.json | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lang/ar.json diff --git a/lang/ar.json b/lang/ar.json new file mode 100644 index 0000000..46cbb1f --- /dev/null +++ b/lang/ar.json @@ -0,0 +1,38 @@ +{ + "sa_prefix": "{lightred}[مساعدة القائمة] {default}،", + "sa_adminhelp": "{أخضر}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - الغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - الغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> <سلاح> - استريدج كافة سلاحات اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء اقتراح\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - الغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم،", + "sa_player_ban_message_time": "لقد حظرتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", + "sa_player_ban_message_perm": "لقد حظرتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", + "sa_player_kick_message": "لقد طردتك لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", + "sa_player_gag_message_time": "لقد حجبت صوتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", + "sa_player_gag_message_perm": "لقد حجبت صوتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", + "sa_player_mute_message_time": "لقد حجبت صوتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", + "sa_player_mute_message_perm": "لقد حجبت صوتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", + "sa_admin_ban_message_time": "المشرف {lightred}{0}{default} حظر {lightred}{1}{default} لمدة {lightred}{2}{default} لدقائق {lightred}{3}{default}!", + "sa_admin_ban_message_perm": "المشرف {lightred}{0}{default} حظر {lightred}{1}{default} دائما لمدة {lightred}{2}{default}!", + "sa_admin_kick_message": "المشرف {lightred}{0}{default} طرد {lightred}{1}{default} لمدة {lightred}{2}{default}!", + "sa_admin_gag_message_time": "المشرف {lightred}{0}{default} حجب صوت {lightred}{1}{default} لمدة {lightred}{2}{default} لدقائك {lightred}{3}{default}!", + "sa_admin_gag_message_perm": "المشرف {lightred}{0}{default} حجب صوت {lightred}{1}{default} دائما لمدة {lightred}{2}{default}!", + "sa_admin_mute_message_time": "المشرف {lightred}{0}{default} حجب صوت {lightred}{1}{default} لمدة {lightred}{2}{default} لدقائك {lightred}{3}{default}!", + "sa_admin_mute_message_perm": "المشرف {lightred}{0}{default} حجب صوت {lightred}{1}{default} دائما لمدة {lightred}{2}{default}!", + "sa_admin_give_message": "المشرف {lightred}{0}{default} أعطى {lightred}{1}{default} سلاح {lightred}{2}{default}!", + "sa_admin_strip_message": "المشرف {lightred}{0}{default} أخذ كافة سلاحات اللاعب {lightred}{1}{default}!", + "sa_admin_hp_message": "المشرف {lightred}{0}{default} غير معدل الصحة لللاعب {lightred}{1}{default}!", + "sa_admin_speed_message": "المشرف {lightred}{0}{default} غير سرعة {lightred}{1}{default}!", + "sa_admin_god_message": "المشرف {lightred}{0}{default} غير وضع اللامراعية لللاعب {lightred}{1}{default}!", + "sa_admin_slay_message": "المشرف {lightred}{0}{default} قتل {lightred}{1}{default}!", + "sa_admin_slap_message": "المشرف {lightred}{0}{default} ضرب {lightred}{1}{default}!", + "sa_admin_changemap_message": "المشرف {lightred}{0}{default} غير الخريطة إلى {lightred}{1}{default}!", + "sa_admin_noclip_message": "المشرف {lightred}{0}{default} تبديل وضع لا للتعليق لللاعب {lightred}{1}{default}!", + "sa_admin_freeze_message": "المشرف {lightred}{0}{default} تجميد {lightred}{1}{default}!", + "sa_admin_unfreeze_message": "المشرف {lightred}{0}{default} فك تجميد {lightred}{1}{default}!", + "sa_admin_respawn_message": "المشرف {lightred}{0}{default} إعادة توليد {lightred}{1}{default}!", + "sa_admin_team_message": "المشرف {lightred}{0}{default} نقل {lightred}{1}{default} إلى {lightred}{2}{default}!", + "sa_admin_vote_menu_title": "{lime}التصويت على {gold}{0}", + "sa_admin_vote_message": "المشرف {lightred}{0}{default} بدأ التصويت على {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}نتائج التصويت على {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", + "sa_adminsay_prefix": "{RED}مشرف: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(مشرف) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(لاعب) {lightred}{0}{default}: {lightred}{1}{default}" +} \ No newline at end of file From a3471e209143938deb6da45d4fec4cc1290d005a Mon Sep 17 00:00:00 2001 From: KillerRoi <54289708+KillerRoi@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:40:59 +0530 Subject: [PATCH 083/356] .. --- lang/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ar.json b/lang/ar.json index 46cbb1f..cd9e704 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[مساعدة القائمة] {default}،", - "sa_adminhelp": "{أخضر}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - الغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - الغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> <سلاح> - استريدج كافة سلاحات اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء اقتراح\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - الغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم،", + "sa_adminhelp": "{أخضر}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - الغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - الغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> <سلاح> - استريدج كافة سلاحات اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء اقتراح\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - الغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم، ", "sa_player_ban_message_time": "لقد حظرتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", "sa_player_ban_message_perm": "لقد حظرتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", "sa_player_kick_message": "لقد طردتك لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", From 31592bf1a53f4ce9407ec5f6c48c1a8264ee585f Mon Sep 17 00:00:00 2001 From: KillerRoi <54289708+KillerRoi@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:42:24 +0530 Subject: [PATCH 084/356] .. --- lang/ar.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lang/ar.json b/lang/ar.json index cd9e704..f138575 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -25,14 +25,14 @@ "sa_admin_changemap_message": "المشرف {lightred}{0}{default} غير الخريطة إلى {lightred}{1}{default}!", "sa_admin_noclip_message": "المشرف {lightred}{0}{default} تبديل وضع لا للتعليق لللاعب {lightred}{1}{default}!", "sa_admin_freeze_message": "المشرف {lightred}{0}{default} تجميد {lightred}{1}{default}!", - "sa_admin_unfreeze_message": "المشرف {lightred}{0}{default} فك تجميد {lightred}{1}{default}!", - "sa_admin_respawn_message": "المشرف {lightred}{0}{default} إعادة توليد {lightred}{1}{default}!", - "sa_admin_team_message": "المشرف {lightred}{0}{default} نقل {lightred}{1}{default} إلى {lightred}{2}{default}!", - "sa_admin_vote_menu_title": "{lime}التصويت على {gold}{0}", - "sa_admin_vote_message": "المشرف {lightred}{0}{default} بدأ التصويت على {lightred}{1}{default}", - "sa_admin_vote_message_results": "{lime}نتائج التصويت على {gold}{0}", - "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", - "sa_adminsay_prefix": "{RED}مشرف: {lightred}{0}{default}", - "sa_adminchat_template_admin": "{LIME}(مشرف) {lightred}{0}{default}: {lightred}{1}{default}", - "sa_adminchat_template_player": "{SILVER}(لاعب) {lightred}{0}{default}: {lightred}{1}{default}" + "sa_admin_unfreeze_message": "المشرف {lightred}{0}{default} فك تجميد {lightred}{1}{default}!", + "sa_admin_respawn_message": "المشرف {lightred}{0}{default} إعادة توليد {lightred}{1}{default}!", + "sa_admin_team_message": "المشرف {lightred}{0}{default} نقل {lightred}{1}{default} إلى {lightred}{2}{default}!", + "sa_admin_vote_menu_title": "{lime}التصويت على {gold}{0}", + "sa_admin_vote_message": "المشرف {lightred}{0}{default} بدأ التصويت على {lightred}{1}{default}", + "sa_admin_vote_message_results": "{lime}نتائج التصويت على {gold}{0}", + "sa_admin_vote_message_results_answer": "{lime}{0} {default}- {gold}{1}", + "sa_adminsay_prefix": "{RED}مشرف: {lightred}{0}{default}", + "sa_adminchat_template_admin": "{LIME}(مشرف) {lightred}{0}{default}: {lightred}{1}{default}", + "sa_adminchat_template_player": "{SILVER}(لاعب) {lightred}{0}{default}: {lightred}{1}{default}" } \ No newline at end of file From 5dc35ddb73743b7c50e0359d10bf20692ee38f92 Mon Sep 17 00:00:00 2001 From: KillerRoi <54289708+KillerRoi@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:43:11 +0530 Subject: [PATCH 085/356] Fixed second line not being able to read --- lang/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ar.json b/lang/ar.json index f138575..66f327d 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[مساعدة القائمة] {default}،", - "sa_adminhelp": "{أخضر}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - الغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - الغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> <سلاح> - استريدج كافة سلاحات اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء اقتراح\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - الغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم، ", + "sa_adminhelp": "{أخضر}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - الغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - الغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> <سلاح> - استريدج كافة سلاحات اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء اقتراح\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - الغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم،\n", "sa_player_ban_message_time": "لقد حظرتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", "sa_player_ban_message_perm": "لقد حظرتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", "sa_player_kick_message": "لقد طردتك لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", From 4b1cb3573b19a99e1e08f0e5255e9319569a86d3 Mon Sep 17 00:00:00 2001 From: KillerRoi <54289708+KillerRoi@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:47:05 +0530 Subject: [PATCH 086/356] Fixed --- lang/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ar.json b/lang/ar.json index 66f327d..5bf821a 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[مساعدة القائمة] {default}،", - "sa_adminhelp": "{أخضر}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - الغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - الغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> <سلاح> - استريدج كافة سلاحات اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء اقتراح\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - الغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم،\n", + "sa_adminhelp": "{lightred}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - إلغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - إلغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> - استرداد كافة الأسلحة من اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء تصويت\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - إلغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم\n", "sa_player_ban_message_time": "لقد حظرتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", "sa_player_ban_message_perm": "لقد حظرتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", "sa_player_kick_message": "لقد طردتك لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", From 8ca82804a2bc58da8e48cd9778bcef4d866c33fd Mon Sep 17 00:00:00 2001 From: KillerRoi <54289708+KillerRoi@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:48:02 +0530 Subject: [PATCH 087/356] Fixed sa_adminhelp not being readable --- lang/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ar.json b/lang/ar.json index 5bf821a..5406aa4 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[مساعدة القائمة] {default}،", - "sa_adminhelp": "{lightred}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - إلغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - إلغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> - استرداد كافة الأسلحة من اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء تصويت\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - إلغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم\n", + "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_strip <#userid or name> - Takes all of the player weapons\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", "sa_player_ban_message_time": "لقد حظرتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", "sa_player_ban_message_perm": "لقد حظرتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", "sa_player_kick_message": "لقد طردتك لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", From fbf395d32749b2398f03ef31237d08920e50ab02 Mon Sep 17 00:00:00 2001 From: KillerRoi <54289708+KillerRoi@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:49:05 +0530 Subject: [PATCH 088/356] Fixed --- lang/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ar.json b/lang/ar.json index 5406aa4..5bf821a 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -1,6 +1,6 @@ { "sa_prefix": "{lightred}[مساعدة القائمة] {default}،", - "sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Display informations about player\n- css_players - Display player list\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n- css_unmute - Ungag player\n- css_mute <#userid or name> [time in minutes/0 perm] [reason] - Mute player\n- css_addmute [time in minutes/0 perm] [reason] - Mute player via steamid64\n- css_give <#userid or name> - Give player a weapon\n- css_strip <#userid or name> - Takes all of the player weapons\n- css_hp <#userid or name> [health] - Set player health\n- css_god <#userid or name> - Toggle player godmode\n- css_slay <#userid or name> - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Create vote\n- css_map - Change map\n- css_wsmap - Change workshop map\n- css_asay - Say message to all admins\n- css_say - Say message as admin in chat\n- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n- css_respawn <#userid or name> - Respawn player\n- css_cvar - Change cvar value\n- css_rcon - Run command as server", + "sa_adminhelp": "{lightred}[ مساعدة برنامج SimpleAdmin CS2 ]{DEFAULT}\n- css_who <#userid أو اسم المستخدم> - عرض معلومات عن اللاعب\n- css_players - عرض قائمة اللاعبين\n- css_ban <#userid أو اسم المستخدم> [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب\n- css_addban [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق steamid64\n- css_banip [وقت الحظر بالدقائق/0 دائم] [سبب الحظر] - حظر اللاعب عن طريق عنوان ip\n- css_unban - إلغاء حظر اللاعب\n- css_kick <#userid أو اسم المستخدم> [سبب الطرد] - طرد اللاعب\n- css_gag <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب\n- css_addgag [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب اللاعب عن طريق steamid64\n- css_unmute - إلغاء حجب الصوت لللاعب\n- css_mute <#userid أو اسم المستخدم> [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب\n- css_addmute [وقت الحجب بالدقائق/0 دائم] [سبب الحجب] - حجب صوت اللاعب عن طريق steamid64\n- css_give <#userid أو اسم المستخدم> <سلاح> - توفير سلاح لللاعب\n- css_strip <#userid أو اسم المستخدم> - استرداد كافة الأسلحة من اللاعب\n- css_hp <#userid أو اسم المستخدم> [الصحة] - تغيير معدل الصحة لللاعب\n- css_god <#userid أو اسم المستخدم> - تبديل وضع اللاعب في اللامراعية\n- css_slay <#userid أو اسم المستخدم> - قتل اللاعب\n- css_slap <#userid أو اسم المستخدم> [مدى الضرر] - ضرب اللاعب\n- css_vote <'سؤال?'> ['إجابة 1'] ['إجابة 2'] ... - بدء تصويت\n- css_map <اسم الخريطة> - تغيير الخريطة\n- css_wsmap <اسم أو معرف> - تغيير الخريطة من مكتبة العمل\n- css_asay <رسالة> - قول رسالة لكافة المشرفين\n- css_say <رسالة> - قول رسالة كمشرف في الدردشة\n- css_psay <#userid أو اسم المستخدم> <رسالة> - إرسال رسالة خاصة إلى اللاعب\n- css_csay <رسالة> - قول رسالة كمشرف في الوسط\n- css_hsay <رسالة> - قول رسالة كمشرف في الشاشة الرئيسية\n- css_noclip <#userid أو اسم المستخدم> - تبديل وضع لا للتعليق لللاعب\n- css_freeze <#userid أو اسم المستخدم> [مدة] - تجميد اللاعب\n- css_unfreeze <#userid أو اسم المستخدم> - إلغاء تجميد اللاعب\n- css_respawn <#userid أو اسم المستخدم> - إعادة توليد اللاعب\n- css_cvar <قيمة> - تغيير قيمة cvar\n- css_rcon <أمر> - تنفيذ أمر كخادم\n", "sa_player_ban_message_time": "لقد حظرتك لمدة {lightred}{0}{default} لدقائق {lightred}{1}{default} بواسطة {lightred}{2}{default}!", "sa_player_ban_message_perm": "لقد حظرتك دائما لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", "sa_player_kick_message": "لقد طردتك لمدة {lightred}{0}{default} بواسطة {lightred}{1}{default}!", From dd7a2f4c16c762f751c28c088579ca3547a4523d Mon Sep 17 00:00:00 2001 From: originalaidn <45371311+originalaidn@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:17:12 +0100 Subject: [PATCH 089/356] huge modification - modified respawn, now the players need to respawn - added stealth command as hide, removed the team selection menu (from CSS discord) - removed silentmode - added discord webhook logging system (need to set in config -DiscordWebhook and edit Version to 4) in the future, need to add every color to replace thing and maybe need to remove those replace messages and add to sendwebhook but not yet. --- CS2-SimpleAdmin.cs | 268 +++++++++++++++++++++++++++++++++++++---- CS2-SimpleAdmin.csproj | 1 + Config.cs | 5 +- 3 files changed, 247 insertions(+), 27 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index e14d8f7..a6f5896 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -8,6 +8,7 @@ using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Localization; @@ -36,7 +37,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.8d"; + public override string ModuleVersion => "1.2.9d"; + + private MemoryFunctionVoid? CBasePlayerController_SetPawnFunc; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -48,6 +51,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig(@"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x49\x89\xFC\x53\x48\x89\xF3\x48\x81\xEC\xC8\x00\x00\x00"); } public void OnConfigParsed(CS2_SimpleAdminConfig config) @@ -260,25 +265,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { caller.ChangeTeam(CsTeam.None); }); - - command.ReplyToCommand("You are hidden now"); + if (silentPlayers.Contains((ushort)caller.UserId)) + { + silentPlayers.Remove((ushort)caller.UserId); + caller.ChangeTeam(CsTeam.Spectator); + caller.PrintToChat($"You aren't hidden now!"); + if(Config.DiscordWebhook.Length > 0) + _ = SendWebhookMessage($"{caller.PlayerName} isn't hidden now."); + } + else + { + silentPlayers.Add((ushort)caller.UserId); + Server.ExecuteCommand("sv_disable_teamselect_menu 1"); + Server.NextFrame(() => + { + caller.PlayerPawn.Value.CommitSuicide(true, false); + AddTimer(1.0f, () => { caller.ChangeTeam(CsTeam.Spectator); }); + AddTimer(1.1f, () => { caller.ChangeTeam(CsTeam.None); }); + caller.PrintToChat($"You are hidden now!"); + if(Config.DiscordWebhook.Length > 0) + _ = SendWebhookMessage($"{caller.PlayerName} is hidden now."); + }); + Server.NextFrame(() => + { + AddTimer(2.0f, () => { Server.ExecuteCommand("sv_disable_teamselect_menu 0"); }); + }); + } } [ConsoleCommand("css_who")] @@ -456,6 +464,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } }); } @@ -544,6 +558,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_gag_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } else @@ -555,6 +574,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_gag_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } } @@ -616,6 +640,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_gag_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } else @@ -627,6 +656,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_gag_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } @@ -762,6 +796,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + _ = SendWebhookMessage($"Ungaged player with pattern {pattern}."); return; } } @@ -853,6 +889,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } else @@ -864,6 +905,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } } @@ -925,6 +971,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } else @@ -936,6 +987,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } @@ -1070,6 +1126,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + _ = SendWebhookMessage($"Unmuted player with pattern {pattern}."); return; } } @@ -1141,6 +1199,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } else @@ -1152,6 +1215,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } } @@ -1216,6 +1284,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } else @@ -1227,6 +1300,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } } @@ -1296,6 +1374,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } else @@ -1307,6 +1390,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } @@ -1340,6 +1428,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + _ = SendWebhookMessage($"Unbanned player with pattern {pattern}."); } [ConsoleCommand("css_slay")] @@ -1360,6 +1450,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_slay_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } }); } @@ -1408,6 +1503,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_give_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, weaponName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } }); } @@ -1433,6 +1533,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_strip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } }); @@ -1462,6 +1567,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_hp_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } }); @@ -1495,6 +1605,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_speed_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } }); @@ -1526,6 +1641,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_god_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } } @@ -1559,6 +1679,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_slap_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } }); @@ -1633,6 +1758,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_team_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, _teamName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } }); } @@ -1664,6 +1794,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } voteInProgress = true; @@ -1679,12 +1814,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_vote_message_results", question]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } foreach (KeyValuePair kvp in voteAnswers) { sb = new(_localizer!["sa_prefix"]); sb.Append(_localizer["sa_admin_vote_message_results_answer", kvp.Key, kvp.Value]); Server.PrintToChatAll(sb.ToString()); + if(Config.DiscordWebhook.Length > 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_vote_message_results_answer", kvp.Key, kvp.Value]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } voteAnswers.Clear(); voteInProgress = false; @@ -1730,6 +1875,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_changemap_message", caller == null ? "Console" : caller.PlayerName, map]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } if (!map.StartsWith("ws:")) @@ -1765,6 +1915,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_changemap_message", caller == null ? "Console" : caller.PlayerName, map]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } AddTimer(2.0f, () => @@ -1785,6 +1940,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_adminchat_template_admin", caller == null ? "Console" : caller.PlayerName, utf8String]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) { @@ -1805,6 +1965,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_adminsay_prefix", utf8String]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } [ConsoleCommand("css_psay", "Private message a player.")] @@ -1825,6 +1990,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { player.PrintToChat(Helper.ReplaceTags($"({caller!.PlayerName}) {utf8String}")); + if(Config.DiscordWebhook.Length > 0) + _ = SendWebhookMessage($"PSAY: {caller!.PlayerName} --> {player!.PlayerName}: {utf8String}"); }); command.ReplyToCommand(Helper.ReplaceTags($" Private message sent!")); @@ -1839,6 +2006,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + _ = SendWebhookMessage($"CSAY: {caller!.PlayerName}: {utf8String}"); } [ConsoleCommand("css_hsay", "Say to all players (in hud).")] @@ -1853,6 +2022,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + _ = SendWebhookMessage($"HSAY: {caller!.PlayerName}: {utf8String}"); } [ConsoleCommand("css_noclip", "Noclip a player.")] @@ -1874,6 +2046,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_noclip_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } }); @@ -1904,6 +2081,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_freeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } } }); @@ -1926,6 +2108,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_unfreeze_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } }); } @@ -1942,7 +2129,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig(player.Handle, + GameData.GetOffset("CCSPlayerController_Respawn"))(player); if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) { @@ -1950,6 +2140,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + { + LocalizedString localizedMessage = _localizer["sa_admin_respawn_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } } }); } @@ -1980,6 +2176,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + _ = SendWebhookMessage($"{playerName} changed cvar {cvar.Name} to {value}."); } [ConsoleCommand("css_rcon", "Run a server console command.")] @@ -1991,6 +2189,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 0) + _ = SendWebhookMessage($"{playerName} executed command ({command.ArgString})."); } private static TargetResult? GetTarget(CommandInfo command) @@ -2029,4 +2229,20 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + diff --git a/Config.cs b/Config.cs index 73b1a07..b1e59dc 100644 --- a/Config.cs +++ b/Config.cs @@ -5,7 +5,7 @@ namespace CS2_SimpleAdmin { public class CS2_SimpleAdminConfig : BasePluginConfig { - public override int Version { get; set; } = 3; + public override int Version { get; set; } = 4; [JsonPropertyName("DatabaseHost")] public string DatabaseHost { get; set; } = ""; @@ -31,5 +31,8 @@ namespace CS2_SimpleAdmin [JsonPropertyName("BanType")] public int BanType { get; set; } = 1; + [JsonPropertyName("DiscordWebhook")] + public string DiscordWebhook { get; set; } = ""; + } } \ No newline at end of file From fd97e4349019e543fb81106955f8f7e56cccb19f Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 15:59:19 +0100 Subject: [PATCH 090/356] Updated version to 1.3.0 --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index e14d8f7..19fdbae 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -36,7 +36,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.2.8d"; + public override string ModuleVersion => "1.3.0"; public CS2_SimpleAdminConfig Config { get; set; } = new(); From bad4289c5c48102eb4eb65e577856272ceb1a074 Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 16:05:08 +0100 Subject: [PATCH 091/356] Added instance getter on the base plugin class for the menus --- CS2-SimpleAdmin.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 19fdbae..c14c5cd 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -21,6 +21,8 @@ namespace CS2_SimpleAdmin; [MinimumApiVersion(159)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + public static CS2_SimpleAdmin Instance { get; private set; } + public static IStringLocalizer? _localizer; public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); //public static ConcurrentBag mutedPlayers = new ConcurrentBag(); @@ -42,6 +44,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Date: Wed, 31 Jan 2024 17:06:54 +0100 Subject: [PATCH 092/356] Base menu structure done --- Menus/AdminMenu.cs | 41 +++++++++++++ Menus/ChatMenuOptionData.cs | 23 ++++++++ Menus/DurationMenu.cs | 32 +++++++++++ Menus/ManagePlayersMenu.cs | 111 ++++++++++++++++++++++++++++++++++++ Menus/PlayersMenu.cs | 23 ++++++++ 5 files changed, 230 insertions(+) create mode 100644 Menus/AdminMenu.cs create mode 100644 Menus/ChatMenuOptionData.cs create mode 100644 Menus/DurationMenu.cs create mode 100644 Menus/ManagePlayersMenu.cs create mode 100644 Menus/PlayersMenu.cs diff --git a/Menus/AdminMenu.cs b/Menus/AdminMenu.cs new file mode 100644 index 0000000..3755569 --- /dev/null +++ b/Menus/AdminMenu.cs @@ -0,0 +1,41 @@ +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Menu; + +namespace CS2_SimpleAdmin.Menus +{ + public static class AdminMenu + { + public static void OpenMenu(CCSPlayerController admin) + { + if (admin == null || admin.IsValid == false) + return; + + if (AdminManager.PlayerHasPermissions(admin, "@css/generic") == false) + { + // TODO: Localize + admin.PrintToChat("[Simple Admin] You do not have permissions to use this command."); + return; + } + + //bool xpRights = AdminManager.PlayerHasPermissions(admin, "@wcs/xp"); + + CenterHtmlMenu menu = new CenterHtmlMenu("Simple Admin"); + ChatMenuOptionData[] options = new[] + { + new ChatMenuOptionData("Manage Players", () => ManagePlayersMenu.OpenMenu(admin)) + //new ChatMenuOptionData("Manage Server", () => GiveXp.OpenMenu(admin, false)), + //new ChatMenuOptionData("Fun actions", () => GiveXp.OpenMenu(admin, true)), + //new ChatMenuOptionData("Manage Admins", () => GiveLevels.OpenMenu(admin, false)) + }; + + foreach (ChatMenuOptionData menuOptionData in options) + { + string menuName = menuOptionData.name; + menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); + } + } +} diff --git a/Menus/ChatMenuOptionData.cs b/Menus/ChatMenuOptionData.cs new file mode 100644 index 0000000..eb28d13 --- /dev/null +++ b/Menus/ChatMenuOptionData.cs @@ -0,0 +1,23 @@ +namespace CS2_SimpleAdmin.Menus +{ + public class ChatMenuOptionData + { + public string name; + public Action action; + public bool disabled = true; + + public ChatMenuOptionData(string name, Action action) + { + this.name = name; + this.action = action; + this.disabled = false; + } + + public ChatMenuOptionData(string name, Action action, bool disabled) + { + this.name = name; + this.action = action; + this.disabled = disabled; + } + } +} diff --git a/Menus/DurationMenu.cs b/Menus/DurationMenu.cs new file mode 100644 index 0000000..43bb701 --- /dev/null +++ b/Menus/DurationMenu.cs @@ -0,0 +1,32 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Menu; + +namespace CS2_SimpleAdmin.Menus +{ + public static class DurationMenu + { + public static Tuple[] _durations = new[] + { + new Tuple("1 minute", 60), + new Tuple("5 minutes", 60 * 5), + new Tuple("15 minutes", 60 * 15), + new Tuple("1 hour", 60 * 60), + new Tuple("1 day", 60 * 60 * 24), + new Tuple("Permanent", 0) + }; + + public static void OpenMenu(CCSPlayerController admin, string menuName, CCSPlayerController player, Action onSelectAction) + { + CenterHtmlMenu menu = new CenterHtmlMenu(menuName); + + foreach (Tuple duration in _durations) + { + string optionName = duration.Item1; + menu.AddMenuOption(optionName, (_, _) => { onSelectAction?.Invoke(admin, player, duration.Item2); }); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); + } + } +} diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs new file mode 100644 index 0000000..b9ccd75 --- /dev/null +++ b/Menus/ManagePlayersMenu.cs @@ -0,0 +1,111 @@ +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Menu; + +namespace CS2_SimpleAdmin.Menus +{ + public static class ManagePlayersMenu + { + public static void OpenMenu(CCSPlayerController admin) + { + if (admin == null || admin.IsValid == false) + return; + + if (AdminManager.PlayerHasPermissions(admin, "@css/generic") == false) + { + // TODO: Localize + admin.PrintToChat("[Simple Admin] You do not have permissions to use this command."); + return; + } + + //bool xpRights = AdminManager.PlayerHasPermissions(admin, "@wcs/xp"); + + CenterHtmlMenu menu = new CenterHtmlMenu("Manage Players"); + List options = new(); + + // permissions + bool hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay"); + bool hasKick = AdminManager.PlayerHasPermissions(admin, "@css/kick"); + bool hasBan = AdminManager.PlayerHasPermissions(admin, "@css/ban"); + bool hasChat = AdminManager.PlayerHasPermissions(admin, "@css/chat"); + + // options added in order + options.Add(new ChatMenuOptionData("Who is", () => PlayersMenu.OpenMenu(admin, "Who is", WhoIs))); + + if (hasSlay) + { + options.Add(new ChatMenuOptionData("Slap", () => PlayersMenu.OpenMenu(admin, "Slap", SlapMenu))); + options.Add(new ChatMenuOptionData("Slay", () => PlayersMenu.OpenMenu(admin, "Slay", Slay))); + } + + if (hasKick) + { + options.Add(new ChatMenuOptionData("Kick", () => PlayersMenu.OpenMenu(admin, "Kick", Kick))); + } + + if (hasBan) + { + options.Add(new ChatMenuOptionData("Ban", () => PlayersMenu.OpenMenu(admin, "Ban", (admin, player) => DurationMenu.OpenMenu(admin, "Ban", player, Ban)))); + } + + if (hasChat) + { + options.Add(new ChatMenuOptionData("Gag", () => PlayersMenu.OpenMenu(admin, "Gag", (admin, player) => DurationMenu.OpenMenu(admin, "Gag", player, Gag)))); + options.Add(new ChatMenuOptionData("Mute", () => PlayersMenu.OpenMenu(admin, "Mute", (admin, player) => DurationMenu.OpenMenu(admin, "Mute", player, Mute)))); + } + + if (hasKick) + { + options.Add(new ChatMenuOptionData("Force Team", () => PlayersMenu.OpenMenu(admin, "Force Team", ForceTeam))); + } + + foreach (ChatMenuOptionData menuOptionData in options) + { + string menuName = menuOptionData.name; + menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); + } + + private static void WhoIs(CCSPlayerController admin, CCSPlayerController player) + { + // TODO: WhoIs + } + + private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) + { + // TODO: Slap + } + + private static void Slay(CCSPlayerController admin, CCSPlayerController player) + { + // TODO: Slay + } + + private static void Kick(CCSPlayerController admin, CCSPlayerController player) + { + // TODO: Kick + } + + private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration) + { + // TODO: Ban + } + + private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration) + { + // TODO: Gag + } + + private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration) + { + // TODO: Mute + } + + private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player) + { + // TODO: ForceTeam + } + } +} diff --git a/Menus/PlayersMenu.cs b/Menus/PlayersMenu.cs new file mode 100644 index 0000000..2244c8e --- /dev/null +++ b/Menus/PlayersMenu.cs @@ -0,0 +1,23 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Menu; + +namespace CS2_SimpleAdmin.Menus +{ + public static class PlayersMenu + { + public static void OpenMenu(CCSPlayerController admin, string menuName, Action onSelectAction) + { + CenterHtmlMenu menu = new CenterHtmlMenu(menuName); + + IEnumerable players = Utilities.GetPlayers().Where(p => p.Connected == PlayerConnectedState.PlayerConnected); + foreach (CCSPlayerController player in players) + { + string optionName = player.PlayerName; + menu.AddMenuOption(optionName, (_, _) => { onSelectAction?.Invoke(admin, player); }); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); + } + } +} From 65b33c17ead62c429cd33ecb2a9f886994d3e662 Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 17:19:13 +0100 Subject: [PATCH 093/356] Moved css_who command to ManagePlayersMenu.cs --- CS2-SimpleAdmin.cs | 74 ++------------------------------------ Menus/ManagePlayersMenu.cs | 67 ++++++++++++++++++++++++++++------ Menus/PlayersMenu.cs | 2 +- 3 files changed, 60 insertions(+), 83 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index c14c5cd..ef1437d 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -15,6 +15,7 @@ using Microsoft.Extensions.Logging; using MySqlConnector; using System.Collections.Concurrent; using System.Text; +using CS2_SimpleAdmin.Menus; namespace CS2_SimpleAdmin; @@ -306,82 +307,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); - BanManager _banManager = new(dbConnectionString, Config); - MuteManager _muteManager = new(dbConnectionString); - playersToTarget.ForEach(player => { if (caller!.CanTarget(player)) { - PlayerInfo playerInfo = new PlayerInfo - { - UserId = player.UserId, - Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - int totalBans = 0; - int totalMutes = 0; - - totalBans = await _banManager.GetPlayerBans(playerInfo); - totalMutes = await _muteManager.GetPlayerMutes(playerInfo.SteamId!); - - Server.NextFrame(() => - { - if (caller != null) - { - caller!.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - - caller!.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); - caller!.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); - if (playerInfo.SteamId != null) - caller!.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); - if (player.AuthorizedSteamID != null) - { - caller!.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); - caller!.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); - } - if (playerInfo.IpAddress != null) - caller!.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); - caller!.PrintToConsole($"• Ping: \"{player.Ping}\""); - if (player.AuthorizedSteamID != null) - { - caller!.PrintToConsole($"• Total Bans: \"{totalBans}\""); - caller!.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); - } - - caller!.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); - } - else - { - Server.PrintToConsole($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - - Server.PrintToConsole($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); - Server.PrintToConsole($"• UserID: \"{playerInfo.UserId}\""); - if (playerInfo.SteamId != null) - Server.PrintToConsole($"• SteamID64: \"{playerInfo.SteamId}\""); - if (player.AuthorizedSteamID != null) - { - Server.PrintToConsole($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); - Server.PrintToConsole($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); - } - if (playerInfo.IpAddress != null) - Server.PrintToConsole($"• IP Address: \"{playerInfo.IpAddress}\""); - Server.PrintToConsole($"• Ping: \"{player.Ping}\""); - if (player.AuthorizedSteamID != null) - { - Server.PrintToConsole($"• Total Bans: \"{totalBans}\""); - Server.PrintToConsole($"• Total Mutes: \"{totalMutes}\""); - } - - Server.PrintToConsole($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); - } - }); - }); + ManagePlayersMenu.WhoIs(caller, player); } }); } diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs index b9ccd75..b560cda 100644 --- a/Menus/ManagePlayersMenu.cs +++ b/Menus/ManagePlayersMenu.cs @@ -1,3 +1,4 @@ +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Menu; @@ -30,7 +31,7 @@ namespace CS2_SimpleAdmin.Menus bool hasChat = AdminManager.PlayerHasPermissions(admin, "@css/chat"); // options added in order - options.Add(new ChatMenuOptionData("Who is", () => PlayersMenu.OpenMenu(admin, "Who is", WhoIs))); + options.Add(new ChatMenuOptionData("Who Is", () => PlayersMenu.OpenMenu(admin, "Who is", WhoIs))); if (hasSlay) { @@ -68,42 +69,88 @@ namespace CS2_SimpleAdmin.Menus MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); } - private static void WhoIs(CCSPlayerController admin, CCSPlayerController player) + public static void WhoIs(CCSPlayerController admin, CCSPlayerController player) { - // TODO: WhoIs + BanManager banManager = new(CS2_SimpleAdmin.Instance.dbConnectionString, CS2_SimpleAdmin.Instance.Config); + MuteManager muteManager = new(CS2_SimpleAdmin.Instance.dbConnectionString); + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + int totalBans = 0; + int totalMutes = 0; + + totalBans = await banManager.GetPlayerBans(playerInfo); + totalMutes = await muteManager.GetPlayerMutes(playerInfo.SteamId!); + + Server.NextFrame(() => + { + Action printMethod = admin == null ? Server.PrintToConsole : admin.PrintToConsole; + printMethod($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); + + printMethod($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + printMethod($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + printMethod($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) + { + printMethod($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + printMethod($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } + + if (playerInfo.IpAddress != null) + printMethod($"• IP Address: \"{playerInfo.IpAddress}\""); + printMethod($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + printMethod($"• Total Bans: \"{totalBans}\""); + printMethod($"• Total Mutes: \"{totalMutes}\""); + } + + printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); + }); + }); } - private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) + public static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) { // TODO: Slap } - private static void Slay(CCSPlayerController admin, CCSPlayerController player) + public static void Slay(CCSPlayerController admin, CCSPlayerController player) { // TODO: Slay } - private static void Kick(CCSPlayerController admin, CCSPlayerController player) + public static void Kick(CCSPlayerController admin, CCSPlayerController player) { // TODO: Kick } - private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration) + public static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Ban } - private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration) + public static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Gag } - private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration) + public static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Mute } - private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player) + public static void ForceTeam(CCSPlayerController admin, CCSPlayerController player) { // TODO: ForceTeam } diff --git a/Menus/PlayersMenu.cs b/Menus/PlayersMenu.cs index 2244c8e..c2cf318 100644 --- a/Menus/PlayersMenu.cs +++ b/Menus/PlayersMenu.cs @@ -14,7 +14,7 @@ namespace CS2_SimpleAdmin.Menus foreach (CCSPlayerController player in players) { string optionName = player.PlayerName; - menu.AddMenuOption(optionName, (_, _) => { onSelectAction?.Invoke(admin, player); }); + menu.AddMenuOption(optionName, (_, _) => { onSelectAction?.Invoke(admin, player); }, admin.CanTarget(player) == false); } MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); From f622701f5e576e6d195180e34287c30141a4bf0a Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 17:29:28 +0100 Subject: [PATCH 094/356] Made slap menu --- CS2-SimpleAdmin.cs | 21 ++++--- Menus/ManagePlayersMenu.cs | 119 ++++++++++++++++++++++--------------- 2 files changed, 83 insertions(+), 57 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index ef1437d..02c0533 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1486,17 +1486,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig options = new(); @@ -69,88 +67,111 @@ namespace CS2_SimpleAdmin.Menus MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); } - public static void WhoIs(CCSPlayerController admin, CCSPlayerController player) + private static void WhoIs(CCSPlayerController admin, CCSPlayerController player) { BanManager banManager = new(CS2_SimpleAdmin.Instance.dbConnectionString, CS2_SimpleAdmin.Instance.Config); MuteManager muteManager = new(CS2_SimpleAdmin.Instance.dbConnectionString); - + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + int totalBans = 0; + int totalMutes = 0; + + totalBans = await banManager.GetPlayerBans(playerInfo); + totalMutes = await muteManager.GetPlayerMutes(playerInfo.SteamId!); + + Server.NextFrame(() => { - UserId = player.UserId, - Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; + Action printMethod = admin == null ? Server.PrintToConsole : admin.PrintToConsole; + printMethod($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - Task.Run(async () => - { - int totalBans = 0; - int totalMutes = 0; - - totalBans = await banManager.GetPlayerBans(playerInfo); - totalMutes = await muteManager.GetPlayerMutes(playerInfo.SteamId!); - - Server.NextFrame(() => + printMethod($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + printMethod($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + printMethod($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) { - Action printMethod = admin == null ? Server.PrintToConsole : admin.PrintToConsole; - printMethod($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); + printMethod($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + printMethod($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } - printMethod($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); - printMethod($"• UserID: \"{playerInfo.UserId}\""); - if (playerInfo.SteamId != null) - printMethod($"• SteamID64: \"{playerInfo.SteamId}\""); - if (player.AuthorizedSteamID != null) - { - printMethod($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); - printMethod($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); - } + if (playerInfo.IpAddress != null) + printMethod($"• IP Address: \"{playerInfo.IpAddress}\""); + printMethod($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + printMethod($"• Total Bans: \"{totalBans}\""); + printMethod($"• Total Mutes: \"{totalMutes}\""); + } - if (playerInfo.IpAddress != null) - printMethod($"• IP Address: \"{playerInfo.IpAddress}\""); - printMethod($"• Ping: \"{player.Ping}\""); - if (player.AuthorizedSteamID != null) - { - printMethod($"• Total Bans: \"{totalBans}\""); - printMethod($"• Total Mutes: \"{totalMutes}\""); - } - - printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); - }); + printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); }); + }); } - public static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) + private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) { - // TODO: Slap + CenterHtmlMenu menu = new CenterHtmlMenu($"Slap {player.PlayerName}"); + List options = new(); + + // options added in order + options.Add(new ChatMenuOptionData("0 hp", () => ApplySlapAndKeepMenu(admin, player, 0))); + options.Add(new ChatMenuOptionData("1 hp", () => ApplySlapAndKeepMenu(admin, player, 1))); + options.Add(new ChatMenuOptionData("5 hp", () => ApplySlapAndKeepMenu(admin, player, 5))); + options.Add(new ChatMenuOptionData("10 hp", () => ApplySlapAndKeepMenu(admin, player, 10))); + options.Add(new ChatMenuOptionData("50 hp", () => ApplySlapAndKeepMenu(admin, player, 50))); + options.Add(new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100))); + + foreach (ChatMenuOptionData menuOptionData in options) + { + string menuName = menuOptionData.name; + menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); } - public static void Slay(CCSPlayerController admin, CCSPlayerController player) + private static void ApplySlapAndKeepMenu(CCSPlayerController admin, CCSPlayerController player, int i) + { + CS2_SimpleAdmin.Instance.Slap(admin, player, i); + SlapMenu(admin, player); + } + + private static void Slay(CCSPlayerController admin, CCSPlayerController player) { // TODO: Slay } - public static void Kick(CCSPlayerController admin, CCSPlayerController player) + private static void Kick(CCSPlayerController admin, CCSPlayerController player) { // TODO: Kick } - public static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration) + private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Ban } - public static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration) + private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Gag } - public static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration) + private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Mute } - public static void ForceTeam(CCSPlayerController admin, CCSPlayerController player) + private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player) { // TODO: ForceTeam } From 232f487d01e18005aa7e8558d6011da7247eb44d Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 17:39:03 +0100 Subject: [PATCH 095/356] Fixed who --- BanManager.cs | 2 +- CS2-SimpleAdmin.cs | 58 ++++++++++++++++++++++++++++++++++++-- Menus/ManagePlayersMenu.cs | 48 +------------------------------ 3 files changed, 58 insertions(+), 50 deletions(-) diff --git a/BanManager.cs b/BanManager.cs index a11f949..aec7fde 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -3,7 +3,7 @@ using MySqlConnector; namespace CS2_SimpleAdmin { - internal class BanManager + public class BanManager { private readonly MySqlConnection _dbConnection; private readonly CS2_SimpleAdminConfig _config; diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 02c0533..dc7c3f1 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -306,16 +306,70 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); - + + BanManager banManager = new(dbConnectionString, Config); + MuteManager muteManager = new(dbConnectionString); + playersToTarget.ForEach(player => { if (caller!.CanTarget(player)) { - ManagePlayersMenu.WhoIs(caller, player); + Who(caller, player, banManager, muteManager); } }); } + public void Who(CCSPlayerController? caller, CCSPlayerController player, BanManager banManager = null, MuteManager muteManager = null) + { + banManager ??= new(dbConnectionString, Config); + muteManager ??= new(dbConnectionString); + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Index = (int)player.Index, + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + int totalBans = 0; + int totalMutes = 0; + + totalBans = await banManager.GetPlayerBans(playerInfo); + totalMutes = await muteManager.GetPlayerMutes(playerInfo.SteamId!); + + Server.NextFrame(() => + { + Action printMethod = caller == null ? Server.PrintToConsole : caller.PrintToConsole; + printMethod($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); + + printMethod($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); + printMethod($"• UserID: \"{playerInfo.UserId}\""); + if (playerInfo.SteamId != null) + printMethod($"• SteamID64: \"{playerInfo.SteamId}\""); + if (player.AuthorizedSteamID != null) + { + printMethod($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); + printMethod($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); + } + + if (playerInfo.IpAddress != null) + printMethod($"• IP Address: \"{playerInfo.IpAddress}\""); + printMethod($"• Ping: \"{player.Ping}\""); + if (player.AuthorizedSteamID != null) + { + printMethod($"• Total Bans: \"{totalBans}\""); + printMethod($"• Total Mutes: \"{totalMutes}\""); + } + + printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); + }); + }); + } + [ConsoleCommand("css_players")] [CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [RequiresPermissions("@css/generic")] diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs index b8cc902..be9fa08 100644 --- a/Menus/ManagePlayersMenu.cs +++ b/Menus/ManagePlayersMenu.cs @@ -69,53 +69,7 @@ namespace CS2_SimpleAdmin.Menus private static void WhoIs(CCSPlayerController admin, CCSPlayerController player) { - BanManager banManager = new(CS2_SimpleAdmin.Instance.dbConnectionString, CS2_SimpleAdmin.Instance.Config); - MuteManager muteManager = new(CS2_SimpleAdmin.Instance.dbConnectionString); - - PlayerInfo playerInfo = new PlayerInfo - { - UserId = player.UserId, - Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - int totalBans = 0; - int totalMutes = 0; - - totalBans = await banManager.GetPlayerBans(playerInfo); - totalMutes = await muteManager.GetPlayerMutes(playerInfo.SteamId!); - - Server.NextFrame(() => - { - Action printMethod = admin == null ? Server.PrintToConsole : admin.PrintToConsole; - printMethod($"--------- INFO ABOUT \"{playerInfo.Name}\" ---------"); - - printMethod($"• Clan: \"{player!.Clan}\" Name: \"{playerInfo.Name}\""); - printMethod($"• UserID: \"{playerInfo.UserId}\""); - if (playerInfo.SteamId != null) - printMethod($"• SteamID64: \"{playerInfo.SteamId}\""); - if (player.AuthorizedSteamID != null) - { - printMethod($"• SteamID2: \"{player.AuthorizedSteamID.SteamId2}\""); - printMethod($"• Community link: \"{player.AuthorizedSteamID.ToCommunityUrl()}\""); - } - - if (playerInfo.IpAddress != null) - printMethod($"• IP Address: \"{playerInfo.IpAddress}\""); - printMethod($"• Ping: \"{player.Ping}\""); - if (player.AuthorizedSteamID != null) - { - printMethod($"• Total Bans: \"{totalBans}\""); - printMethod($"• Total Mutes: \"{totalMutes}\""); - } - - printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------"); - }); - }); + CS2_SimpleAdmin.Instance.Who(admin, player); } private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) From 5fbd21aec2c78b6de29eb9aeb2bb3acc0fedc091 Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 18:03:08 +0100 Subject: [PATCH 096/356] Slay and kick done --- CS2-SimpleAdmin.cs | 72 ++++++++++++++++++++++---------------- Menus/ManagePlayersMenu.cs | 4 +-- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index dc7c3f1..fa1a209 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -404,7 +404,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnKickCommand(CCSPlayerController? caller, CommandInfo command) { - string reason = "Unknown"; + string reason = null; TargetResult? targets = GetTarget(command); if (targets == null) return; @@ -422,32 +422,37 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig= 2) - { - player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, reason)); - } - else - { - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); - } - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); - } + Kick(caller, player, reason); } }); } + public void Kick(CCSPlayerController? caller, CCSPlayerController player, string reason = null) + { + if (player.PawnIsAlive) + { + player.Pawn.Value!.Freeze(); + player.CommitSuicide(true, true); + } + + if (string.IsNullOrEmpty(reason) == false) + { + player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!, reason)); + } + else + { + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player.UserId!)); + } + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_kick_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + } + [ConsoleCommand("css_gag")] [RequiresPermissions("@css/chat")] [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1341,17 +1346,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - player.CommitSuicide(false, true); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_slay_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); - Server.PrintToChatAll(sb.ToString()); - } + Slay(caller, player); }); } + public void Slay(CCSPlayerController? caller, CCSPlayerController player) + { + player.CommitSuicide(false, true); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_slay_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName]); + Server.PrintToChatAll(sb.ToString()); + } + } + [ConsoleCommand("css_give")] [RequiresPermissions("@css/cheats")] [CommandHelper(minArgs: 2, usage: "<#userid or name> ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs index be9fa08..0c3a910 100644 --- a/Menus/ManagePlayersMenu.cs +++ b/Menus/ManagePlayersMenu.cs @@ -102,12 +102,12 @@ namespace CS2_SimpleAdmin.Menus private static void Slay(CCSPlayerController admin, CCSPlayerController player) { - // TODO: Slay + CS2_SimpleAdmin.Instance.Slay(admin, player); } private static void Kick(CCSPlayerController admin, CCSPlayerController player) { - // TODO: Kick + CS2_SimpleAdmin.Instance.Kick(admin, player); } private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration) From 60ebb698a373c0756b6e237bc97d64a7c434368b Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 21:44:38 +0100 Subject: [PATCH 097/356] ban/gag/mute --- CS2-SimpleAdmin.cs | 276 ++++++++++++++++++++----------------- Menus/ManagePlayersMenu.cs | 82 +++++++++-- 2 files changed, 222 insertions(+), 136 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index fa1a209..82cb430 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -459,7 +459,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time); + await muteManager.MutePlayer(playerInfo, adminInfo, reason, time); }); if (TagsDetected) @@ -550,8 +560,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - { - await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1); - }); - - - if (time > 0 && time <= 30) - { - AddTimer(time * 60, () => - { - if (player == null || !player.IsValid || player.AuthorizedSteamID == null) return; - - //MuteManager _muteManager = new(dbConnectionString); - //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); - - /* - if (mutedPlayers.Contains((int)player.Index)) - { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) - { - mutedPlayers.Add(removedItem); - } - } - */ - - player.VoiceFlags = VoiceFlags.Normal; - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - if (time == 0) - { - player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); - } - } - else - { - player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); - Server.PrintToChatAll(sb.ToString()); - } - } + Mute(caller, player, time, reason, _muteManager); } }); } + public void Mute(CCSPlayerController? caller, CCSPlayerController player, int time, string reason = null, MuteManager muteManager = null) + { + reason ??= "Unknown"; + muteManager ??= new(dbConnectionString); + + PlayerInfo playerInfo = new PlayerInfo + { + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + /* + if (!mutedPlayers.Contains((ushort)player.UserId)) + mutedPlayers.Add((ushort)player.UserId); + */ + + player!.VoiceFlags = VoiceFlags.Muted; + + Task.Run(async () => { await muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1); }); + + + if (time > 0 && time <= 30) + { + AddTimer(time * 60, () => + { + if (player == null || !player.IsValid || player.AuthorizedSteamID == null) + return; + + //MuteManager _muteManager = new(dbConnectionString); + //_ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); + + /* + if (mutedPlayers.Contains((int)player.Index)) + { + if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) + { + mutedPlayers.Add(removedItem); + } + } + */ + + player.VoiceFlags = VoiceFlags.Normal; + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + + if (time == 0) + { + player!.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + } + else + { + player!.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_mute_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + } + } + [ConsoleCommand("css_addmute")] [RequiresPermissions("@css/chat")] [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1098,59 +1112,67 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - { - await _banManager.BanPlayer(playerInfo, adminInfo, reason, time); - }); - - AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player!.UserId!)); - - if (time == 0) - { - player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); - Server.PrintToChatAll(sb.ToString()); - } - } - else - { - player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); - - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); - Server.PrintToChatAll(sb.ToString()); - } - } + Ban(caller, player, time, reason, _banManager); } }); } + public void Ban(CCSPlayerController? caller, CCSPlayerController player, int time, string reason = null, BanManager banManager = null) + { + reason ??= "Unknown"; + banManager ??= new(dbConnectionString, Config); + + if (player.PawnIsAlive) + { + player.Pawn.Value!.Freeze(); + player.CommitSuicide(true, true); + } + + PlayerInfo playerInfo = new PlayerInfo + { + SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.AuthorizedSteamID?.SteamId64.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + await banManager.BanPlayer(playerInfo, adminInfo, reason, time); + }); + + AddTimer(Config.KickTime, () => Helper.KickPlayer((ushort)player!.UserId!)); + + if (time == 0) + { + player!.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + Server.PrintToChatAll(sb.ToString()); + } + } + else + { + player!.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_ban_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + Server.PrintToChatAll(sb.ToString()); + } + } + } + [ConsoleCommand("css_addban")] [RequiresPermissions("@css/ban")] [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs index 0c3a910..dd41c53 100644 --- a/Menus/ManagePlayersMenu.cs +++ b/Menus/ManagePlayersMenu.cs @@ -44,13 +44,13 @@ namespace CS2_SimpleAdmin.Menus if (hasBan) { - options.Add(new ChatMenuOptionData("Ban", () => PlayersMenu.OpenMenu(admin, "Ban", (admin, player) => DurationMenu.OpenMenu(admin, "Ban", player, Ban)))); + options.Add(new ChatMenuOptionData("Ban", () => PlayersMenu.OpenMenu(admin, "Ban", (admin, player) => DurationMenu.OpenMenu(admin, "Ban", player, BanMenu)))); } if (hasChat) { - options.Add(new ChatMenuOptionData("Gag", () => PlayersMenu.OpenMenu(admin, "Gag", (admin, player) => DurationMenu.OpenMenu(admin, "Gag", player, Gag)))); - options.Add(new ChatMenuOptionData("Mute", () => PlayersMenu.OpenMenu(admin, "Mute", (admin, player) => DurationMenu.OpenMenu(admin, "Mute", player, Mute)))); + options.Add(new ChatMenuOptionData("Gag", () => PlayersMenu.OpenMenu(admin, "Gag", (admin, player) => DurationMenu.OpenMenu(admin, "Gag", player, GagMenu)))); + options.Add(new ChatMenuOptionData("Mute", () => PlayersMenu.OpenMenu(admin, "Mute", (admin, player) => DurationMenu.OpenMenu(admin, "Mute", player, MuteMenu)))); } if (hasKick) @@ -110,19 +110,83 @@ namespace CS2_SimpleAdmin.Menus CS2_SimpleAdmin.Instance.Kick(admin, player); } - private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration) + private static void BanMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { - // TODO: Ban + CenterHtmlMenu menu = new CenterHtmlMenu($"Ban {player.PlayerName}"); + List options = new() + { + "Hacking", + "Voice Abuse", + "Chat Abuse", + "Admin disrespect", + "Other" + }; + + foreach (string option in options) + { + menu.AddMenuOption(option, (_, _) => { Ban(admin, player, duration, option); }); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); } - private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration) + private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) { - // TODO: Gag + CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason); } - private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration) + private static void GagMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { - // TODO: Mute + CenterHtmlMenu menu = new CenterHtmlMenu($"Gag {player.PlayerName}"); + List options = new() + { + "Advertising", + "Spamming", + "Spectator camera abuse", + "Hate", + "Admin disrespect", + "Other" + }; + + foreach (string option in options) + { + menu.AddMenuOption(option, (_, _) => { Gag(admin, player, duration, option); }); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); + } + + private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) + { + CS2_SimpleAdmin.Instance.Gag(admin, player, duration, reason); + } + + private static void MuteMenu(CCSPlayerController admin, CCSPlayerController player, int duration) + { + CenterHtmlMenu menu = new CenterHtmlMenu($"Mute {player.PlayerName}"); + List options = new() + { + "Shouting", + "Playing music", + "Advertising", + "Spamming", + "Spectator camera abuse", + "Hate", + "Admin disrespect", + "Other" + }; + + foreach (string option in options) + { + menu.AddMenuOption(option, (_, _) => { Mute(admin, player, duration, option); }); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); + } + + private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) + { + CS2_SimpleAdmin.Instance.Mute(admin, player, duration, reason); } private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player) From a266f776a8f8c2f775f916c27bd8a8251fd805ef Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 21:45:42 +0100 Subject: [PATCH 098/356] Duration in minutes --- Menus/DurationMenu.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Menus/DurationMenu.cs b/Menus/DurationMenu.cs index 43bb701..5581153 100644 --- a/Menus/DurationMenu.cs +++ b/Menus/DurationMenu.cs @@ -8,11 +8,11 @@ namespace CS2_SimpleAdmin.Menus { public static Tuple[] _durations = new[] { - new Tuple("1 minute", 60), - new Tuple("5 minutes", 60 * 5), - new Tuple("15 minutes", 60 * 15), - new Tuple("1 hour", 60 * 60), - new Tuple("1 day", 60 * 60 * 24), + new Tuple("1 minute", 1), + new Tuple("5 minutes", 5), + new Tuple("15 minutes", 15), + new Tuple("1 hour", 60), + new Tuple("1 day", 60 * 24), new Tuple("Permanent", 0) }; From a80de2d7dced3fbda6510b9dc94ffb551cc6e774 Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 22:05:48 +0100 Subject: [PATCH 099/356] Change team down --- CS2-SimpleAdmin.cs | 57 +++++++++++++++++++++----------------- Menus/DurationMenu.cs | 1 + Menus/ManagePlayersMenu.cs | 26 +++++++++++++++-- 3 files changed, 57 insertions(+), 27 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 82cb430..1657b0e 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1627,39 +1627,46 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (!teamName.Equals("swap")) - { - if (player.PawnIsAlive && teamNum != CsTeam.Spectator && !command.GetArg(3).ToLower().Equals("-k")) - player.SwitchTeam(teamNum); - else - player.ChangeTeam(teamNum); - } + ChangeTeam(caller, player, _teamName, teamNum, kill); + }); + } + + public void ChangeTeam(CCSPlayerController? caller, CCSPlayerController player, string teamName, CsTeam teamNum, bool kill) + { + if (!teamName.Equals("swap")) + { + if (player.PawnIsAlive && teamNum != CsTeam.Spectator && !kill) + player.SwitchTeam(teamNum); else + player.ChangeTeam(teamNum); + } + else + { + if (player.TeamNum != (byte)CsTeam.Spectator) { - if (player.TeamNum != (byte)CsTeam.Spectator) + teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist; + teamName = teamNum == CsTeam.Terrorist ? "TT" : "CT"; + if (player.PawnIsAlive && !kill) { - CsTeam teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist; - _teamName = teamNum == CsTeam.Terrorist ? "TT" : "CT"; - if (player.PawnIsAlive && !command.GetArg(3).ToLower().Equals("-k")) - { - player.SwitchTeam(teamNum); - } - else - { - player.ChangeTeam(teamNum); - } + player.SwitchTeam(teamNum); + } + else + { + player.ChangeTeam(teamNum); } } + } - if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) - { - StringBuilder sb = new(_localizer!["sa_prefix"]); - sb.Append(_localizer["sa_admin_team_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, _teamName]); - Server.PrintToChatAll(sb.ToString()); - } - }); + if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains((ushort)caller.UserId)) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_team_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, teamName]); + Server.PrintToChatAll(sb.ToString()); + } } [ConsoleCommand("css_vote")] diff --git a/Menus/DurationMenu.cs b/Menus/DurationMenu.cs index 5581153..ead4bd0 100644 --- a/Menus/DurationMenu.cs +++ b/Menus/DurationMenu.cs @@ -6,6 +6,7 @@ namespace CS2_SimpleAdmin.Menus { public static class DurationMenu { + // TODO: Localize public static Tuple[] _durations = new[] { new Tuple("1 minute", 1), diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs index dd41c53..86b0255 100644 --- a/Menus/ManagePlayersMenu.cs +++ b/Menus/ManagePlayersMenu.cs @@ -28,6 +28,7 @@ namespace CS2_SimpleAdmin.Menus bool hasBan = AdminManager.PlayerHasPermissions(admin, "@css/ban"); bool hasChat = AdminManager.PlayerHasPermissions(admin, "@css/chat"); + // TODO: Localize options // options added in order options.Add(new ChatMenuOptionData("Who Is", () => PlayersMenu.OpenMenu(admin, "Who is", WhoIs))); @@ -55,7 +56,7 @@ namespace CS2_SimpleAdmin.Menus if (hasKick) { - options.Add(new ChatMenuOptionData("Force Team", () => PlayersMenu.OpenMenu(admin, "Force Team", ForceTeam))); + options.Add(new ChatMenuOptionData("Force Team", () => PlayersMenu.OpenMenu(admin, "Force Team", ForceTeamMenu))); } foreach (ChatMenuOptionData menuOptionData in options) @@ -137,6 +138,7 @@ namespace CS2_SimpleAdmin.Menus private static void GagMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { + // TODO: Localize and make options in config? CenterHtmlMenu menu = new CenterHtmlMenu($"Gag {player.PlayerName}"); List options = new() { @@ -163,6 +165,7 @@ namespace CS2_SimpleAdmin.Menus private static void MuteMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { + // TODO: Localize and make options in config? CenterHtmlMenu menu = new CenterHtmlMenu($"Mute {player.PlayerName}"); List options = new() { @@ -189,7 +192,26 @@ namespace CS2_SimpleAdmin.Menus CS2_SimpleAdmin.Instance.Mute(admin, player, duration, reason); } - private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player) + private static void ForceTeamMenu(CCSPlayerController admin, CCSPlayerController player) + { + // TODO: Localize + CenterHtmlMenu menu = new CenterHtmlMenu($"Force {player.PlayerName}'s Team"); + List options = new(); + options.Add(new ChatMenuOptionData("CT", () => ForceTeam(admin, player, "ct"))); + options.Add(new ChatMenuOptionData("T", () => ForceTeam(admin, player, "t"))); + options.Add(new ChatMenuOptionData("Swap", () => ForceTeam(admin, player, "swap"))); + options.Add(new ChatMenuOptionData("Spectator", () => ForceTeam(admin, player, "spec"))); + + foreach (ChatMenuOptionData menuOptionData in options) + { + string menuName = menuOptionData.name; + menu.AddMenuOption(menuName, (_, _) => { menuOptionData.action?.Invoke(); }, menuOptionData.disabled); + } + + MenuManager.OpenCenterHtmlMenu(CS2_SimpleAdmin.Instance, admin, menu); + } + + private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player, string teamName) { // TODO: ForceTeam } From 6848847f21207013adc102836d654c2ec0661e10 Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 22:10:45 +0100 Subject: [PATCH 100/356] default null instance --- CS2-SimpleAdmin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 1657b0e..c66cb91 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ namespace CS2_SimpleAdmin; [MinimumApiVersion(159)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - public static CS2_SimpleAdmin Instance { get; private set; } + public static CS2_SimpleAdmin Instance { get; private set; } = null; public static IStringLocalizer? _localizer; public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); From fb827f4f0d610900ed15c94ec3d8723e3abd7919 Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 23:04:11 +0100 Subject: [PATCH 101/356] Changed commands to open the menu --- CS2-SimpleAdmin.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index c66cb91..b8c1d8d 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -157,9 +157,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] From 0cd16531852eb1d992150ea5ebb3efd96eba07dd Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 23:06:04 +0100 Subject: [PATCH 102/356] Commented out css_who as its not relevant IMO --- Menus/ManagePlayersMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs index 86b0255..66b6243 100644 --- a/Menus/ManagePlayersMenu.cs +++ b/Menus/ManagePlayersMenu.cs @@ -30,7 +30,7 @@ namespace CS2_SimpleAdmin.Menus // TODO: Localize options // options added in order - options.Add(new ChatMenuOptionData("Who Is", () => PlayersMenu.OpenMenu(admin, "Who is", WhoIs))); + //options.Add(new ChatMenuOptionData("Who Is", () => PlayersMenu.OpenMenu(admin, "Who is", WhoIs))); if (hasSlay) { From 66f0ebe08cd32dbe4ba7679c2a0a10dea0fccbd2 Mon Sep 17 00:00:00 2001 From: Valentin Barat Date: Wed, 31 Jan 2024 23:08:26 +0100 Subject: [PATCH 103/356] Enabled other menus for visual screenshot --- Menus/AdminMenu.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Menus/AdminMenu.cs b/Menus/AdminMenu.cs index 3755569..c939570 100644 --- a/Menus/AdminMenu.cs +++ b/Menus/AdminMenu.cs @@ -23,10 +23,10 @@ namespace CS2_SimpleAdmin.Menus CenterHtmlMenu menu = new CenterHtmlMenu("Simple Admin"); ChatMenuOptionData[] options = new[] { - new ChatMenuOptionData("Manage Players", () => ManagePlayersMenu.OpenMenu(admin)) - //new ChatMenuOptionData("Manage Server", () => GiveXp.OpenMenu(admin, false)), - //new ChatMenuOptionData("Fun actions", () => GiveXp.OpenMenu(admin, true)), - //new ChatMenuOptionData("Manage Admins", () => GiveLevels.OpenMenu(admin, false)) + new ChatMenuOptionData("Manage Players", () => ManagePlayersMenu.OpenMenu(admin)), + new ChatMenuOptionData("Manage Server", null), + new ChatMenuOptionData("Fun actions", null), + new ChatMenuOptionData("Manage Admins", null) }; foreach (ChatMenuOptionData menuOptionData in options) From 9acab82f86933a53d30d484c91deff102c6226b6 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 31 Jan 2024 23:57:14 +0100 Subject: [PATCH 104/356] Small changes - Correct version - null warnings --- CS2-SimpleAdmin.cs | 831 +++++++++++++++++++++++++++------------------ 1 file changed, 496 insertions(+), 335 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index b8c1d8d..cb74684 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -8,6 +8,7 @@ using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Localization; @@ -15,15 +16,12 @@ using Microsoft.Extensions.Logging; using MySqlConnector; using System.Collections.Concurrent; using System.Text; -using CS2_SimpleAdmin.Menus; namespace CS2_SimpleAdmin; [MinimumApiVersion(159)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - public static CS2_SimpleAdmin Instance { get; private set; } = null; - public static IStringLocalizer? _localizer; public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); //public static ConcurrentBag mutedPlayers = new ConcurrentBag(); @@ -39,20 +37,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.3.0"; + public override string ModuleVersion => "1.2.9a"; + + private MemoryFunctionVoid? CBasePlayerController_SetPawnFunc; public CS2_SimpleAdminConfig Config { get; set; } = new(); public override void Load(bool hotReload) { - Instance = this; - registerEvents(); if (hotReload) { OnMapStart(string.Empty); } + + CBasePlayerController_SetPawnFunc = new MemoryFunctionVoid(@"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x49\x89\xFC\x53\x48\x89\xF3\x48\x81\xEC\xC8\x00\x00\x00"); } public void OnConfigParsed(CS2_SimpleAdminConfig config) @@ -157,9 +157,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -275,39 +265,44 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig