From a3b8d8cfa734ab80fbb732810cd4b27c87b1921f Mon Sep 17 00:00:00 2001
From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com>
Date: Sat, 28 Sep 2024 17:50:47 +0200
Subject: [PATCH] .
---
.github/FUNDING.yml | 1 -
.github/workflows/build.yml | 71 --
.idea/.idea.CS2-SimpleAdmin/.idea/.gitignore | 13 -
.../.idea/indexLayout.xml | 8 -
.../.idea/sqldialects.xml | 6 -
.idea/.idea.CS2-SimpleAdmin/.idea/vcs.xml | 6 -
CS2-SimpleAdmin.cs | 166 ---
CS2-SimpleAdmin.csproj | 35 -
CS2-SimpleAdmin.sln | 25 -
Commands/basebans.cs | 582 ----------
Commands/basechat.cs | 114 --
Commands/basecommands.cs | 793 -------------
Commands/basecomms.cs | 1002 -----------------
Commands/basevotes.cs | 95 --
Commands/funcommands.cs | 135 ---
Commands/playercommands.cs | 784 -------------
Config.cs | 254 -----
Database/Database.cs | 57 -
Database/Migration.cs | 61 -
Database/Migrations/001_CreateTables.sql | 50 -
Database/Migrations/002_CreateFlagsTable.sql | 9 -
.../Migrations/003_ChangeColumnsPosition.sql | 4 -
.../004_MoveOldFlagsToFlagsTable.sql | 36 -
Database/Migrations/005_CreateUnbansTable.sql | 29 -
.../Migrations/006_ServerGroupsFeature.sql | 26 -
.../Migrations/007_ServerGroupsGlobal.sql | 1 -
.../Migrations/008_OnlineTimeInPenalties.sql | 1 -
.../Migrations/009_BanAllUsedIpAddress.sql | 8 -
Database/Migrations/010_CreateWarnsTable.sql | 14 -
Events.cs | 514 ---------
Extensions/PlayerExtensions.cs | 214 ----
Helper.cs | 513 ---------
LICENSE | 674 -----------
Managers/BanManager.cs | 464 --------
Managers/MuteManager.cs | 291 -----
Managers/PermissionManager.cs | 535 ---------
Managers/PlayerPenaltyManager.cs | 186 ---
Managers/WarnManager.cs | 157 ---
Menus/AdminMenu.cs | 68 --
Menus/ChatMenuOptionData.cs | 9 -
Menus/CustomCommandsMenu.cs | 51 -
Menus/DurationMenu.cs | 19 -
Menus/FunActionsMenu.cs | 267 -----
Menus/ManageAdminsMenu.cs | 72 --
Menus/ManagePlayersMenu.cs | 291 -----
Menus/ManageServerMenu.cs | 78 --
Menus/PlayersMenu.cs | 56 -
PlayerInfo.cs | 11 -
README.md | 101 --
VERSION | 1 -
admin_help.txt | 39 -
lang/ar.json | 114 --
lang/de.json | 114 --
lang/en.json | 113 --
lang/es.json | 114 --
lang/fa.json | 114 --
lang/fr.json | 114 --
lang/lv.json | 114 --
lang/pl.json | 114 --
lang/pt-BR.json | 114 --
lang/ru.json | 113 --
lang/tr.json | 113 --
lang/zh-Hans.json | 113 --
63 files changed, 10361 deletions(-)
delete mode 100644 .github/FUNDING.yml
delete mode 100644 .github/workflows/build.yml
delete mode 100644 .idea/.idea.CS2-SimpleAdmin/.idea/.gitignore
delete mode 100644 .idea/.idea.CS2-SimpleAdmin/.idea/indexLayout.xml
delete mode 100644 .idea/.idea.CS2-SimpleAdmin/.idea/sqldialects.xml
delete mode 100644 .idea/.idea.CS2-SimpleAdmin/.idea/vcs.xml
delete mode 100644 CS2-SimpleAdmin.cs
delete mode 100644 CS2-SimpleAdmin.csproj
delete mode 100644 CS2-SimpleAdmin.sln
delete mode 100644 Commands/basebans.cs
delete mode 100644 Commands/basechat.cs
delete mode 100644 Commands/basecommands.cs
delete mode 100644 Commands/basecomms.cs
delete mode 100644 Commands/basevotes.cs
delete mode 100644 Commands/funcommands.cs
delete mode 100644 Commands/playercommands.cs
delete mode 100644 Config.cs
delete mode 100644 Database/Database.cs
delete mode 100644 Database/Migration.cs
delete mode 100644 Database/Migrations/001_CreateTables.sql
delete mode 100644 Database/Migrations/002_CreateFlagsTable.sql
delete mode 100644 Database/Migrations/003_ChangeColumnsPosition.sql
delete mode 100644 Database/Migrations/004_MoveOldFlagsToFlagsTable.sql
delete mode 100644 Database/Migrations/005_CreateUnbansTable.sql
delete mode 100644 Database/Migrations/006_ServerGroupsFeature.sql
delete mode 100644 Database/Migrations/007_ServerGroupsGlobal.sql
delete mode 100644 Database/Migrations/008_OnlineTimeInPenalties.sql
delete mode 100644 Database/Migrations/009_BanAllUsedIpAddress.sql
delete mode 100644 Database/Migrations/010_CreateWarnsTable.sql
delete mode 100644 Events.cs
delete mode 100644 Extensions/PlayerExtensions.cs
delete mode 100644 Helper.cs
delete mode 100644 LICENSE
delete mode 100644 Managers/BanManager.cs
delete mode 100644 Managers/MuteManager.cs
delete mode 100644 Managers/PermissionManager.cs
delete mode 100644 Managers/PlayerPenaltyManager.cs
delete mode 100644 Managers/WarnManager.cs
delete mode 100644 Menus/AdminMenu.cs
delete mode 100644 Menus/ChatMenuOptionData.cs
delete mode 100644 Menus/CustomCommandsMenu.cs
delete mode 100644 Menus/DurationMenu.cs
delete mode 100644 Menus/FunActionsMenu.cs
delete mode 100644 Menus/ManageAdminsMenu.cs
delete mode 100644 Menus/ManagePlayersMenu.cs
delete mode 100644 Menus/ManageServerMenu.cs
delete mode 100644 Menus/PlayersMenu.cs
delete mode 100644 PlayerInfo.cs
delete mode 100644 README.md
delete mode 100644 VERSION
delete mode 100644 admin_help.txt
delete mode 100644 lang/ar.json
delete mode 100644 lang/de.json
delete mode 100644 lang/en.json
delete mode 100644 lang/es.json
delete mode 100644 lang/fa.json
delete mode 100644 lang/fr.json
delete mode 100644 lang/lv.json
delete mode 100644 lang/pl.json
delete mode 100644 lang/pt-BR.json
delete mode 100644 lang/ru.json
delete mode 100644 lang/tr.json
delete mode 100644 lang/zh-Hans.json
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 232867c..0000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1 +0,0 @@
-ko_fi: daffyy
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 403e2db..0000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,71 +0,0 @@
-name: Build
-
-on:
- push:
- branches: [ "main" ]
- paths-ignore:
- - '**/README.md'
- pull_request:
- branches: [ "main" ]
- paths-ignore:
- - '**/README.md'
-
-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@v4
- - name: Setup .NET
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: 8.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@v4
- - name: Setup .NET
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: 8.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.6
- with:
- type: 'zip'
- filename: '${{ env.PROJECT_NAME }}.zip'
- path: ${{ env.OUTPUT_PATH }}
- - name: CS2-SimpleAdmin
- uses: ncipollo/release-action@v1.14.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
diff --git a/.idea/.idea.CS2-SimpleAdmin/.idea/.gitignore b/.idea/.idea.CS2-SimpleAdmin/.idea/.gitignore
deleted file mode 100644
index 8565286..0000000
--- a/.idea/.idea.CS2-SimpleAdmin/.idea/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Rider ignored files
-/modules.xml
-/projectSettingsUpdater.xml
-/.idea.CS2-SimpleAdmin.iml
-/contentModel.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.idea/.idea.CS2-SimpleAdmin/.idea/indexLayout.xml b/.idea/.idea.CS2-SimpleAdmin/.idea/indexLayout.xml
deleted file mode 100644
index 7b08163..0000000
--- a/.idea/.idea.CS2-SimpleAdmin/.idea/indexLayout.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/.idea.CS2-SimpleAdmin/.idea/sqldialects.xml b/.idea/.idea.CS2-SimpleAdmin/.idea/sqldialects.xml
deleted file mode 100644
index 8aaaabe..0000000
--- a/.idea/.idea.CS2-SimpleAdmin/.idea/sqldialects.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/.idea.CS2-SimpleAdmin/.idea/vcs.xml b/.idea/.idea.CS2-SimpleAdmin/.idea/vcs.xml
deleted file mode 100644
index 35eb1dd..0000000
--- a/.idea/.idea.CS2-SimpleAdmin/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs
deleted file mode 100644
index 3e52cc5..0000000
--- a/CS2-SimpleAdmin.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes;
-using CounterStrikeSharp.API.Modules.Commands;
-using CounterStrikeSharp.API.Modules.Commands.Targeting;
-using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
-using Discord.Webhook;
-using Microsoft.Extensions.Localization;
-using Microsoft.Extensions.Logging;
-using MySqlConnector;
-using System.Collections.Concurrent;
-
-namespace CS2_SimpleAdmin;
-
-[MinimumApiVersion(253)]
-public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig
-{
- public static CS2_SimpleAdmin Instance { get; private set; } = new();
-
- public static IStringLocalizer? _localizer;
- public static readonly Dictionary VoteAnswers = [];
- private static bool _serverLoaded;
- private static readonly HashSet GodPlayers = [];
- private static readonly HashSet SilentPlayers = [];
- private static readonly ConcurrentBag BannedPlayers = [];
- private static readonly Dictionary RenamedPlayers = [];
- //private static readonly ConcurrentBag SilentPlayers = [];
- private static bool _tagsDetected;
- public static bool VoteInProgress = false;
- public static int? ServerId = null;
- private static readonly bool UnlockedCommands = CoreConfig.UnlockConCommands;
-
- public static DiscordWebhookClient? DiscordWebhookClientLog;
- // public static DiscordWebhookClient? DiscordWebhookClientPenalty;
-
- private string _dbConnectionString = string.Empty;
- private static Database.Database? _database;
-
- internal static ILogger? _logger;
-
- private static MemoryFunctionVoid? _cBasePlayerControllerSetPawnFunc;
- public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)");
- public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
- public override string ModuleAuthor => "daffyy & Dliix66";
- public override string ModuleVersion => "1.5.2c";
-
- public CS2_SimpleAdminConfig Config { get; set; } = new();
-
- public override void Load(bool hotReload)
- {
- Instance = this;
-
- RegisterEvents();
-
- if (hotReload)
- {
- _serverLoaded = false;
- OnGameServerSteamAPIActivated();
- OnMapStart(string.Empty);
- }
-
- _cBasePlayerControllerSetPawnFunc = new MemoryFunctionVoid(GameData.GetSignature("CBasePlayerController_SetPawn"));
- }
-
- public override void Unload(bool hotReload)
- {
- if (hotReload) return;
-
- RemoveListener(OnMapStart);
- RemoveCommandListener("say", OnCommandSay, HookMode.Post);
- RemoveCommandListener("say_team", OnCommandTeamSay, HookMode.Post);
- }
-
- public override void OnAllPluginsLoaded(bool hotReload)
- {
- AddTimer(3.0f, () => ReloadAdmins(null));
- }
-
- 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!");
- }
-
- Instance = this;
- _logger = Logger;
-
- MySqlConnectionStringBuilder builder = new()
- {
- Server = config.DatabaseHost,
- Database = config.DatabaseName,
- UserID = config.DatabaseUser,
- Password = config.DatabasePassword,
- Port = (uint)config.DatabasePort,
- Pooling = true,
- MinimumPoolSize = 0,
- MaximumPoolSize = 640,
- };
-
- _dbConnectionString = builder.ConnectionString;
- _database = new Database.Database(_dbConnectionString);
-
- if (!_database.CheckDatabaseConnection())
- {
- Logger.LogError("Unable connect to database!");
- Unload(false);
- return;
- }
-
- Task.Run(() => _database.DatabaseMigration());
-
- Config = config;
- Helper.UpdateConfig(config);
-
- if (!Directory.Exists(ModuleDirectory + "/data"))
- {
- Directory.CreateDirectory(ModuleDirectory + "/data");
- }
-
- _localizer = Localizer;
-
- if (!string.IsNullOrEmpty(Config.Discord.DiscordLogWebhook))
- DiscordWebhookClientLog = new DiscordWebhookClient(Config.Discord.DiscordLogWebhook);
-
- PluginInfo.ShowAd(ModuleVersion);
- if (Config.EnableUpdateCheck)
- Task.Run(async () => await PluginInfo.CheckVersion(ModuleVersion, _logger));
- }
-
- private static TargetResult? GetTarget(CommandInfo command)
- {
- var matches = command.GetArgTargetResult(1);
-
- if (!matches.Any())
- {
- command.ReplyToCommand($"Target {command.GetArg(1)} not found.");
- return null;
- }
-
- if (command.GetArg(1).StartsWith('@'))
- return matches;
-
- if (matches.Count() == 1)
- return matches;
-
- command.ReplyToCommand($"Multiple targets found for \"{command.GetArg(1)}\".");
- return null;
- }
-
- private static void RemoveFromConcurrentBag(ConcurrentBag bag, int playerSlot)
- {
- List tempList = [];
- while (!bag.IsEmpty)
- {
- if (bag.TryTake(out var item) && item != playerSlot)
- {
- tempList.Add(item);
- }
- }
-
- foreach (var item in tempList)
- {
- bag.Add(item);
- }
- }
-}
\ No newline at end of file
diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj
deleted file mode 100644
index a06ce03..0000000
--- a/CS2-SimpleAdmin.csproj
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
- net8.0
- CS2_SimpleAdmin
- enable
- enable
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/CS2-SimpleAdmin.sln b/CS2-SimpleAdmin.sln
deleted file mode 100644
index 0f0c027..0000000
--- a/CS2-SimpleAdmin.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-
-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/Commands/basebans.cs b/Commands/basebans.cs
deleted file mode 100644
index 3f3bb21..0000000
--- a/Commands/basebans.cs
+++ /dev/null
@@ -1,582 +0,0 @@
-using CounterStrikeSharp.API;
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Core.Translations;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Commands;
-using CounterStrikeSharp.API.Modules.Entities;
-
-namespace CS2_SimpleAdmin;
-
-public partial class CS2_SimpleAdmin
-{
- [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)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- if (command.ArgCount < 2)
- return;
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && !player.IsHLTV).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- Database.Database database = new(_dbConnectionString);
- BanManager banManager = new(database, Config);
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- Ban(caller, player, time, reason, callerName, banManager, command);
- }
- });
- }
-
- internal void Ban(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, BanManager? banManager = null, CommandInfo? command = null)
- {
- if (_database == null || player is null || !player.IsValid) return;
- if (!caller.CanTarget(player)) return;
-
- if (CheckValidBan(caller, time) == false)
- return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- if (player.PawnIsAlive)
- {
- player.Pawn.Value?.Freeze();
- }
-
- PlayerInfo playerInfo = new()
- {
- SteamId = player.SteamID.ToString(),
- Name = player.PlayerName,
- IpAddress = player.IpAddress?.Split(":")[0]
- };
-
- PlayerInfo adminInfo = new()
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- Task.Run(async () =>
- {
- banManager ??= new BanManager(_database, Config);
- await banManager.BanPlayer(playerInfo, adminInfo, reason, time);
- });
-
- if (playerInfo.IpAddress != null && !BannedPlayers.Contains(playerInfo.IpAddress))
- BannedPlayers.Add(playerInfo.IpAddress);
- if (!BannedPlayers.Contains(player.SteamID.ToString()))
- BannedPlayers.Add(player.SteamID.ToString());
-
- if (time == 0)
- {
- if (player is { IsBot: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_ban_message_perm",
- callerName,
- player.PlayerName ?? string.Empty,
- reason);
- }
- }
- }
- else
- {
- if (!player.IsBot)
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_ban_message_time",
- callerName,
- player.PlayerName ?? string.Empty,
- reason,
- time);
- }
- }
- }
-
- if (player.UserId.HasValue)
- AddTimer(Config.KickTime, () =>
- {
- if (player is null || !player.IsValid || !player.UserId.HasValue) return;
-
- Helper.KickPlayer(player.UserId.Value);
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
-
- if (UnlockedCommands)
- Server.ExecuteCommand($"banid 2 {new SteamID(player.SteamID).SteamId3}");
-
- Helper.LogCommand(caller, $"css_ban {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}");
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer);
- }
-
- [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 (_database == null) return;
-
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- if (command.ArgCount < 2)
- return;
- if (string.IsNullOrEmpty(command.GetArg(1))) return;
-
- if (!Helper.ValidateSteamId(command.GetArg(1), out var steamId) || steamId == null)
- {
- command.ReplyToCommand($"Invalid SteamID64.");
- return;
- }
-
- var steamid = steamId.SteamId64.ToString();
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (CheckValidBan(caller, time) == false)
- return;
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- var matches = Helper.GetPlayerFromSteamid64(steamid);
- if (matches.Count == 1)
- {
- var 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 (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_ban_message_perm",
- callerName,
- player.PlayerName ?? string.Empty,
- reason);
- }
- }
- }
- else
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_ban_message_time",
- callerName,
- player.PlayerName ?? string.Empty,
- reason,
- time);
- }
- }
- }
-
- player.Pawn.Value?.Freeze();
- if (player.UserId.HasValue)
- AddTimer(Config.KickTime, () =>
- {
- if (player is null || !player.IsValid || !player.UserId.HasValue) return;
-
- Helper.KickPlayer(player.UserId.Value);
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
-
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer);
- }
-
- Task.Run(async () =>
- {
- BanManager banManager = new(_database, Config);
- await banManager.AddBanBySteamid(steamid, adminInfo, reason, time);
- });
-
- Helper.LogCommand(caller, command);
- //Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer);
- if (UnlockedCommands)
- Server.ExecuteCommand($"banid 2 {steamId.SteamId3}");
-
- command.ReplyToCommand($"Banned player with steamid {steamid}.");
- }
-
- [ConsoleCommand("css_banip")]
- [RequiresPermissions("@css/ban")]
- [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnBanIp(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- if (command.ArgCount < 2)
- return;
- if (string.IsNullOrEmpty(command.GetArg(1))) return;
-
- var ipAddress = command.GetArg(1);
-
- if (!Helper.IsValidIp(ipAddress))
- {
- command.ReplyToCommand($"Invalid IP address.");
- return;
- }
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- int.TryParse(command.GetArg(2), out var time);
- if (CheckValidBan(caller, time) == false)
- return;
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- var matches = Helper.GetPlayerFromIp(ipAddress);
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- if (!caller!.CanTarget(player))
- {
- command.ReplyToCommand($"{player.PlayerName} is more powerful than you!");
- return;
- }
-
- player.Pawn.Value!.Freeze();
-
- if (time == 0)
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_ban_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_ban_message_perm",
- callerName,
- player.PlayerName ?? string.Empty,
- reason);
- }
- }
- }
- else
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_ban_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_ban_message_time",
- callerName,
- player.PlayerName ?? string.Empty,
- reason,
- time);
- }
- }
- }
-
- if (player.UserId.HasValue)
- AddTimer(Config.KickTime, () =>
- {
- if (player is null || !player.IsValid || !player.UserId.HasValue) return;
-
- Helper.KickPlayer(player.UserId.Value);
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
-
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _localizer);
- }
-
- Task.Run(async () =>
- {
- BanManager banManager = new(_database, Config);
- await banManager.AddBanByIp(ipAddress, adminInfo, reason, time);
- });
-
- Helper.LogCommand(caller, command);
-
- command.ReplyToCommand($"Banned player with IP address {ipAddress}.");
- }
-
- private bool CheckValidBan(CCSPlayerController? caller, int duration)
- {
- if (caller == null) return true;
-
- bool canPermBan = AdminManager.PlayerHasPermissions(caller, "@css/permban");
-
- if (duration == 0 && canPermBan == false)
- {
- caller.PrintToChat($"{_localizer!["sa_prefix"]} {_localizer["sa_ban_perm_restricted"]}");
- return false;
- }
-
- if (duration <= Config.MaxBanDuration || canPermBan) return true;
-
- caller.PrintToChat($"{_localizer!["sa_prefix"]} {_localizer["sa_ban_max_duration_exceeded", Config.MaxBanDuration]}");
- return false;
-
- }
-
- [ConsoleCommand("css_unban")]
- [RequiresPermissions("@css/unban")]
- [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
- var callerSteamId = caller?.SteamID.ToString() ?? "Console";
-
- if (command.GetArg(1).Length <= 1)
- {
- command.ReplyToCommand($"Too short pattern to search.");
- return;
- }
-
- var pattern = command.GetArg(1);
- var reason = command.GetArg(2);
-
- BanManager banManager = new(_database, Config);
- Task.Run(async () => await banManager.UnbanPlayer(pattern, callerSteamId, reason));
-
- Helper.LogCommand(caller, command);
-
- command.ReplyToCommand($"Unbanned player with pattern {pattern}.");
- }
-
- [ConsoleCommand("css_warn")]
- [RequiresPermissions("@css/kick")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnWarnCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- if (command.ArgCount < 2)
- return;
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && !player.IsHLTV).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- Database.Database database = new(_dbConnectionString);
- WarnManager warnManager = new(database);
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- Warn(caller, player, time, reason, callerName, warnManager, command);
- }
- });
- }
-
- internal void Warn(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, WarnManager? warnManager = null, CommandInfo? command = null)
- {
- if (_database == null || player is null || !player.IsValid) return;
- if (!caller.CanTarget(player)) return;
-
- /*
- if (CheckValidBan(caller, time) == false)
- return;
- */
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- if (player.PawnIsAlive)
- {
- player.Pawn.Value?.Freeze();
-
- AddTimer(5.0f, () =>
- {
- player.Pawn.Value?.Unfreeze();
- });
- }
-
- PlayerInfo playerInfo = new()
- {
- SteamId = player.SteamID.ToString(),
- UserId = player.UserId,
- Name = player.PlayerName,
- IpAddress = player.IpAddress?.Split(":")[0]
- };
-
- PlayerInfo adminInfo = new()
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- Task.Run(async () =>
- {
- warnManager ??= new WarnManager(_database);
- await warnManager.WarnPlayer(playerInfo, adminInfo, reason, time);
- });
-
- if (time == 0)
- {
- if (player is { IsBot: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_warn_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_warn_message_perm",
- callerName,
- player.PlayerName ?? string.Empty,
- reason);
- }
- }
- }
- else
- {
- if (!player.IsBot)
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_warn_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_warn_message_time",
- callerName,
- player.PlayerName ?? string.Empty,
- reason,
- time);
- }
- }
- }
-
- Task.Run(async () =>
- {
- if (warnManager == null) return;
- var totalWarns = await warnManager.GetPlayerWarnsCount(player.SteamID.ToString());
-
- if (Config.WarnThreshold.Count != 0)
- {
- var punishCommand = string.Empty;
-
- var lastKey = Config.WarnThreshold.Keys.MaxBy(key => key);
-
- if (totalWarns >= lastKey)
- punishCommand = Config.WarnThreshold[lastKey];
- else if (Config.WarnThreshold.TryGetValue(totalWarns, out var value))
- punishCommand = value;
-
- if (!string.IsNullOrEmpty(punishCommand))
- {
- await Server.NextFrameAsync(() =>
- {
- Server.PrintToChatAll(totalWarns.ToString());
- Server.ExecuteCommand(punishCommand.Replace("USERID", playerInfo.UserId?.ToString()).Replace("STEAMID64", playerInfo.SteamId));
- });
- }
- }
- });
-
- Helper.LogCommand(caller, $"css_warn {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}");
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Warn, _localizer);
- }
-}
\ No newline at end of file
diff --git a/Commands/basechat.cs b/Commands/basechat.cs
deleted file mode 100644
index ed7c521..0000000
--- a/Commands/basechat.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Core.Translations;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Commands;
-using CounterStrikeSharp.API.Modules.Memory;
-using CounterStrikeSharp.API.Modules.Utils;
-using System.Text;
-
-namespace CS2_SimpleAdmin
-{
- public partial class CS2_SimpleAdmin
- {
- [ConsoleCommand("css_asay", "Say to all admins.")]
- [CommandHelper(1, "")]
- [RequiresPermissions("@css/chat")]
- public void OnAdminToAdminSayCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (caller == null || !caller.IsValid || command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return;
-
- Helper.LogCommand(caller, command);
-
- var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
- var utf8String = Encoding.UTF8.GetString(utf8BytesString);
-
- foreach (var player in Helper.GetValidPlayers()
- .Where(p => AdminManager.PlayerHasPermissions(p, "@css/chat")))
- {
- if (_localizer != null)
- player.SendLocalizedMessage(_localizer,
- "sa_adminchat_template_admin",
- caller == null ? "Console" : caller.PlayerName,
- utf8String);
- }
- }
-
- [ConsoleCommand("css_say", "Say to all players.")]
- [CommandHelper(1, "")]
- [RequiresPermissions("@css/chat")]
- public void OnAdminSayCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return;
-
- var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
- var utf8String = Encoding.UTF8.GetString(utf8BytesString);
-
- Helper.LogCommand(caller, command);
-
- foreach (var player in Helper.GetValidPlayers())
- {
- if (_localizer != null)
- player.SendLocalizedMessage(_localizer,
- "sa_adminsay_prefix",
- utf8String);
- }
- }
-
- [ConsoleCommand("css_psay", "Private message a player.")]
- [CommandHelper(2, "<#userid or name> ")]
- [RequiresPermissions("@css/chat")]
- public void OnAdminPrivateSayCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- //Helper.LogCommand(caller, command);
-
- var range = command.GetArg(0).Length + command.GetArg(1).Length + 2;
- var message = command.GetCommandString[range..];
-
- var utf8BytesString = Encoding.UTF8.GetBytes(message);
- var utf8String = Encoding.UTF8.GetString(utf8BytesString);
-
- playersToTarget.ForEach(player =>
- {
- player.PrintToChat($"({callerName}) {utf8String}".ReplaceColorTags());
- });
-
- command.ReplyToCommand($" Private message sent!".ReplaceColorTags());
- }
-
- [ConsoleCommand("css_csay", "Say to all players (in center).")]
- [CommandHelper(1, "")]
- [RequiresPermissions("@css/chat")]
- public void OnAdminCenterSayCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
- var utf8String = Encoding.UTF8.GetString(utf8BytesString);
-
- Helper.LogCommand(caller, command);
-
- Helper.PrintToCenterAll(utf8String.ReplaceColorTags());
- }
-
- [ConsoleCommand("css_hsay", "Say to all players (in hud).")]
- [CommandHelper(1, "")]
- [RequiresPermissions("@css/chat")]
- public void OnAdminHudSayCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
- var utf8String = Encoding.UTF8.GetString(utf8BytesString);
-
- Helper.LogCommand(caller, command);
-
- VirtualFunctions.ClientPrintAll(
- HudDestination.Alert,
- utf8String.ReplaceColorTags(),
- 0, 0, 0, 0);
- }
- }
-}
\ No newline at end of file
diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs
deleted file mode 100644
index 51fa552..0000000
--- a/Commands/basecommands.cs
+++ /dev/null
@@ -1,793 +0,0 @@
-using CounterStrikeSharp.API;
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Core.Translations;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Commands;
-using CounterStrikeSharp.API.Modules.Cvars;
-using CounterStrikeSharp.API.Modules.Entities;
-using CounterStrikeSharp.API.Modules.Menu;
-using CounterStrikeSharp.API.Modules.Utils;
-using CS2_SimpleAdmin.Menus;
-using Microsoft.Extensions.Logging;
-using Newtonsoft.Json;
-
-namespace CS2_SimpleAdmin
-{
- public partial class CS2_SimpleAdmin
- {
- [ConsoleCommand("css_sa_upgrade")]
- [CommandHelper(whoCanExecute: CommandUsage.SERVER_ONLY)]
- public void OnSaUpgradeCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (caller != null || _database == null) return;
-
- Task.Run(async () =>
- {
- try
- {
- await using var connection = await _database.GetConnectionAsync();
- var commandText = "ALTER TABLE `sa_mutes` CHANGE `type` `type` ENUM('GAG','MUTE', 'SILENCE', '') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'GAG';";
-
- await using var commandSql = connection.CreateCommand();
- commandSql.CommandText = commandText;
- await commandSql.ExecuteNonQueryAsync();
-
- commandText = "ALTER TABLE `sa_servers` MODIFY COLUMN `hostname` varchar(128);";
- await using var commandSql1 = connection.CreateCommand();
- commandSql1.CommandText = commandText;
- await commandSql1.ExecuteNonQueryAsync();
-
- commandText = "ALTER TABLE `sa_bans` MODIFY `ends` TIMESTAMP NULL DEFAULT NULL;";
- await using var commandSql2 = connection.CreateCommand();
- commandSql2.CommandText = commandText;
- await commandSql2.ExecuteNonQueryAsync();
-
- await Server.NextFrameAsync(() =>
- {
- command.ReplyToCommand($"Successfully updated the database - {ModuleVersion}");
- });
- }
- catch (Exception ex)
- {
- Logger.LogError(ex.Message);
- }
- });
- }
-
- [ConsoleCommand("css_admin")]
- [RequiresPermissions("@css/generic")]
- [CommandHelper(whoCanExecute: CommandUsage.CLIENT_ONLY)]
- public void OnAdminCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (caller == null || caller.IsValid == false)
- return;
-
- AdminMenu.OpenMenu(caller);
- }
-
- [ConsoleCommand("css_adminhelp")]
- [RequiresPermissions("@css/generic")]
- public void OnAdminHelpCommand(CCSPlayerController? caller, CommandInfo command)
- {
- //if (caller == null ||!caller.IsValid) return;
-
- /*
- using (new WithTemporaryCulture(caller.GetLanguage()))
- {
- var splitMessage = _localizer!["sa_adminhelp"].ToString().Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
-
- foreach (var line in splitMessage)
- {
- caller.PrintToChat(Helper.ReplaceTags($" {line}"));
- }
- } */
-
- var lines = File.ReadAllLines(ModuleDirectory + "/admin_help.txt");
-
- foreach (var line in lines)
- {
- command.ReplyToCommand(string.IsNullOrWhiteSpace(line) ? " " : line.ReplaceColorTags());
- }
- }
-
- [ConsoleCommand("css_addadmin")]
- [CommandHelper(minArgs: 4, usage: " ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/root")]
- public void OnAddAdminCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
-
- if (!Helper.ValidateSteamId(command.GetArg(1), out var steamId) || steamId == null)
- {
- command.ReplyToCommand($"Invalid SteamID64.");
- return;
- }
-
- var steamid = steamId.SteamId64.ToString();
-
- if (command.GetArg(2).Length <= 0)
- {
- command.ReplyToCommand($"Invalid player name.");
- return;
- }
- if (!command.GetArg(3).Contains('@') && !command.GetArg(3).Contains('#'))
- {
- command.ReplyToCommand($"Invalid flag or group.");
- return;
- }
-
- var name = command.GetArg(2);
- var flags = command.GetArg(3);
- var globalAdmin = command.GetArg(4).ToLower().Equals("-g") || command.GetArg(5).ToLower().Equals("-g") ||
- command.GetArg(6).ToLower().Equals("-g");
- int.TryParse(command.GetArg(4), out var immunity);
- int.TryParse(command.GetArg(5), out var time);
-
- AddAdmin(caller, steamid, name, flags, immunity, time, globalAdmin, command);
- }
-
- public static void AddAdmin(CCSPlayerController? caller, string steamid, string name, string flags, int immunity, int time = 0, bool globalAdmin = false, CommandInfo? command = null)
- {
- if (_database == null) return;
- PermissionManager adminManager = new(_database);
-
- var flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList();
- _ = adminManager.AddAdminBySteamId(steamid, name, flagsList, immunity, time, globalAdmin);
-
- Helper.LogCommand(caller, $"css_addadmin {steamid} {name} {flags} {immunity} {time}");
-
- var msg = $"Added '{flags}' flags to '{name}' ({steamid})";
- if (command != null)
- command.ReplyToCommand(msg);
- else if (caller != null && caller.IsValid)
- caller.PrintToChat(msg);
- else
- Server.PrintToConsole(msg);
- }
-
- [ConsoleCommand("css_deladmin")]
- [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/root")]
- public void OnDelAdminCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
- if (!Helper.ValidateSteamId(command.GetArg(1), out var steamId) || steamId == null)
- {
- command.ReplyToCommand($"Invalid SteamID64.");
- return;
- }
-
- var globalDelete = command.GetArg(2).ToLower().Equals("-g");
-
- RemoveAdmin(caller, steamId.SteamId64.ToString(), globalDelete, command);
- }
-
- public void RemoveAdmin(CCSPlayerController? caller, string steamid, bool globalDelete = false, CommandInfo? command = null)
- {
- if (_database == null) return;
- PermissionManager adminManager = new(_database);
- _ = adminManager.DeleteAdminBySteamId(steamid, globalDelete);
-
- AddTimer(2, () =>
- {
- if (string.IsNullOrEmpty(steamid) || !SteamID.TryParse(steamid, out var steamId) ||
- steamId == null) return;
- if (PermissionManager.AdminCache.ContainsKey(steamId))
- {
- PermissionManager.AdminCache.TryRemove(steamId, out _);
- }
-
- AdminManager.ClearPlayerPermissions(steamId);
- AdminManager.RemovePlayerAdminData(steamId);
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
-
- Helper.LogCommand(caller, $"css_deladmin {steamid}");
-
- var msg = $"Removed flags from '{steamid}'";
- if (command != null)
- command.ReplyToCommand(msg);
- else if (caller != null && caller.IsValid)
- caller.PrintToChat(msg);
- else
- Server.PrintToConsole(msg);
- }
-
- [ConsoleCommand("css_addgroup")]
- [CommandHelper(minArgs: 3, usage: " ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/root")]
- public void OnAddGroup(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
- if (!command.GetArg(1).StartsWith("#"))
- {
- command.ReplyToCommand($"Group name must start with #.");
- return;
- }
-
- if (!command.GetArg(2).StartsWith($"@") && !command.GetArg(2).StartsWith($"#"))
- {
- command.ReplyToCommand($"Invalid flag or group.");
- return;
- }
-
- var groupName = command.GetArg(1);
- var flags = command.GetArg(2);
- int.TryParse(command.GetArg(3), out var immunity);
- var globalGroup = command.GetArg(4).ToLower().Equals("-g");
-
- AddGroup(caller, groupName, flags, immunity, globalGroup, command);
- }
-
- private static void AddGroup(CCSPlayerController? caller, string name, string flags, int immunity, bool globalGroup, CommandInfo? command = null)
- {
- if (_database == null) return;
- PermissionManager adminManager = new(_database);
-
- var flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList();
- _ = adminManager.AddGroup(name, flagsList, immunity, globalGroup);
-
- Helper.LogCommand(caller, $"css_addgroup {name} {flags} {immunity}");
-
- var msg = $"Created group '{name}' with flags '{flags}'";
- if (command != null)
- command.ReplyToCommand(msg);
- else if (caller != null && caller.IsValid)
- caller.PrintToChat(msg);
- else
- Server.PrintToConsole(msg);
- }
-
- [ConsoleCommand("css_delgroup")]
- [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/root")]
- public void OnDelGroupCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
- if (!command.GetArg(1).StartsWith($"#"))
- {
- command.ReplyToCommand($"Group name must start with #.");
- return;
- }
-
- var groupName = command.GetArg(1);
-
- RemoveGroup(caller, groupName, command);
- }
-
- private void RemoveGroup(CCSPlayerController? caller, string name, CommandInfo? command = null)
- {
- if (_database == null) return;
- PermissionManager adminManager = new(_database);
- _ = adminManager.DeleteGroup(name);
-
- AddTimer(2, () =>
- {
- ReloadAdmins(caller);
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
-
- Helper.LogCommand(caller, $"css_delgroup {name}");
-
- var msg = $"Removed group '{name}'";
- if (command != null)
- command.ReplyToCommand(msg);
- else if (caller != null && caller.IsValid)
- caller.PrintToChat(msg);
- else
- Server.PrintToConsole(msg);
- }
-
- [ConsoleCommand("css_reloadadmins")]
- [CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/root")]
- public void OnRelAdminCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
- ReloadAdmins(caller);
-
- command.ReplyToCommand("Reloaded sql admins and groups");
- }
-
- public void ReloadAdmins(CCSPlayerController? caller)
- {
- if (_database == null) return;
-
- for (var index = 0; index < PermissionManager.AdminCache.Keys.ToList().Count; index++)
- {
- var steamId = PermissionManager.AdminCache.Keys.ToList()[index];
- if (!PermissionManager.AdminCache.TryRemove(steamId, out _)) continue;
-
- AdminManager.ClearPlayerPermissions(steamId);
- AdminManager.RemovePlayerAdminData(steamId);
- }
-
- PermissionManager adminManager = new(_database);
-
- Task.Run(async () =>
- {
- await adminManager.CrateGroupsJsonFile();
- await adminManager.CreateAdminsJsonFile();
-
- var adminsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/admins.json") ?? "";
- var groupsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/groups.json") ?? "";
-
- await Server.NextFrameAsync(() =>
- {
- if (!string.IsNullOrEmpty(adminsFile))
- AddTimer(0.5f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
- if (!string.IsNullOrEmpty(groupsFile))
- AddTimer(1.0f, () => AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"));
- if (!string.IsNullOrEmpty(adminsFile))
- AddTimer(1.5f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
- });
- });
-
- //_ = _adminManager.GiveAllGroupsFlags();
- //_ = _adminManager.GiveAllFlags();
- }
-
- [ConsoleCommand("css_stealth")]
- [ConsoleCommand("css_hide")]
- [CommandHelper(whoCanExecute: CommandUsage.CLIENT_ONLY)]
- [RequiresPermissions("@css/kick")]
- public void OnHideCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (caller == null) return;
-
- Helper.LogCommand(caller, command);
-
- if (!SilentPlayers.Add(caller.Slot))
- {
- SilentPlayers.Remove(caller.Slot);
- caller.PrintToChat($"You aren't hidden now!");
- caller.ChangeTeam(CsTeam.Spectator);
- }
- else
- {
- Server.ExecuteCommand("sv_disable_teamselect_menu 1");
-
- if (caller.PlayerPawn.Value != null && caller.PawnIsAlive)
- caller.PlayerPawn.Value.CommitSuicide(true, false);
-
- AddTimer(1.0f, () => { Server.NextFrame(() => caller.ChangeTeam(CsTeam.Spectator)); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- AddTimer(1.4f, () => { Server.NextFrame(() => caller.ChangeTeam(CsTeam.None)); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- caller.PrintToChat($"You are hidden now!");
- AddTimer(2.0f, () => { Server.NextFrame(() => Server.ExecuteCommand("sv_disable_teamselect_menu 0")); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
- }
-
- [ConsoleCommand("css_who")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/generic")]
- public void OnWhoCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- Helper.LogCommand(caller, command);
- //Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer);
-
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- Database.Database database = new(_dbConnectionString);
- BanManager banManager = new(database, Config);
- MuteManager muteManager = new(_database);
-
- playersToTarget.ForEach(player =>
- {
- if (!player.UserId.HasValue) return;
- if (!caller!.CanTarget(player)) return;
- PlayerInfo playerInfo = new()
- {
- UserId = player.UserId.Value,
- SteamId = player.SteamID.ToString(),
- Name = player.PlayerName,
- IpAddress = player.IpAddress?.Split(":")[0]
- };
-
- Task.Run(async () =>
- {
- var totalBans = await banManager.GetPlayerBans(playerInfo);
- var totalMutes = await muteManager.GetPlayerMutes(playerInfo.SteamId);
-
- await Server.NextFrameAsync(() =>
- {
- 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.Connected == PlayerConnectedState.PlayerConnected)
- {
- printMethod($"• SteamID2: \"{player.SteamID}\"");
- printMethod($"• Community link: \"{new SteamID(player.SteamID).ToCommunityUrl()}\"");
- }
- if (playerInfo.IpAddress != null && AdminManager.PlayerHasPermissions(caller, "@css/showip"))
- printMethod($"• IP Address: \"{playerInfo.IpAddress}\"");
- printMethod($"• Ping: \"{player.Ping}\"");
- if (player.Connected == PlayerConnectedState.PlayerConnected)
- {
- printMethod($"• Total Bans: \"{totalBans}\"");
- printMethod($"• Total Mutes: \"{totalMutes}\"");
- }
-
- printMethod($"--------- END INFO ABOUT \"{player.PlayerName}\" ---------");
- });
- });
- });
- }
-
- [ConsoleCommand("css_warns")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/kick")]
- public void OnWarnsCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- Helper.LogCommand(caller, command);
-
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsBot: false }).ToList();
-
- if (playersToTarget.Count > 1)
- return;
-
- Database.Database database = new(_dbConnectionString);
- WarnManager warnManager = new(database);
-
- playersToTarget.ForEach(player =>
- {
- if (!player.UserId.HasValue) return;
- if (!caller!.CanTarget(player)) return;
-
- var steamid = player.SteamID.ToString();
-
- BaseMenu warnsMenu = Config.UseChatMenu
- ? new ChatMenu(_localizer!["sa_admin_warns_menu_title", player.PlayerName])
- : new CenterHtmlMenu(_localizer!["sa_admin_warns_menu_title", player.PlayerName], Instance);
-
- Task.Run(async () =>
- {
- var warnsList = await warnManager.GetPlayerWarns(steamid, false);
- var sortedWarns = warnsList
- .OrderBy(warn => (string)warn.status == "ACTIVE" ? 0 : 1)
- .ThenByDescending(warn => (int)warn.id)
- .ToList();
-
- sortedWarns.ForEach(w =>
- {
- warnsMenu.AddMenuOption($"[{((string)w.status == "ACTIVE" ? $"{ChatColors.LightRed}X" : $"{ChatColors.Lime}✔️")}{ChatColors.Default}] {(string)w.reason}",
- (controller, option) =>
- {
- _ = warnManager.UnwarnPlayer(steamid, (int)w.id);
- player.PrintToChat(_localizer["sa_admin_warns_unwarn", player.PlayerName, (string)w.reason]);
- });
- });
-
- await Server.NextFrameAsync(() =>
- {
- warnsMenu.Open(player);
- });
- });
- });
- }
-
- [ConsoleCommand("css_players")]
- [CommandHelper(whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- [RequiresPermissions("@css/generic")]
- public void OnPlayersCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var isJson = command.GetArg(1).ToLower().Equals("-json");
- var isDuplicate = command.GetArg(1).ToLower().Equals("-duplicate") || command.GetArg(2).ToLower().Equals("-duplicate");
-
- var playersToTarget = isDuplicate
- ? Helper.GetValidPlayers().GroupBy(player => player.IpAddress?.Split(":")[0] ?? "Unknown")
- .Where(group => group.Count() > 1)
- .SelectMany(group => group)
- .ToList()
- : Helper.GetValidPlayers();
-
- if (!isJson)
- {
- if (caller != null)
- {
- caller.PrintToConsole($"--------- PLAYER LIST ---------");
- playersToTarget.ForEach(player =>
- {
- caller.PrintToConsole(
- $"• [#{player.UserId}] \"{player.PlayerName}\" (IP Address: \"{(AdminManager.PlayerHasPermissions(caller, "@css/showip") ? player.IpAddress?.Split(":")[0] : "Unknown")}\" SteamID64: \"{player.SteamID}\")");
- });
- 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.SteamID}\")");
- });
- Server.PrintToConsole($"--------- END PLAYER LIST ---------");
- }
- }
- else
- {
- var playersJson = JsonConvert.SerializeObject(playersToTarget.Select((CCSPlayerController player) =>
- {
- var matchStats = player.ActionTrackingServices?.MatchStats;
-
- return new
- {
- player.UserId,
- Name = player.PlayerName,
- SteamId = player.SteamID.ToString(),
- IpAddress = AdminManager.PlayerHasPermissions(caller, "@css/showip") ? player.IpAddress?.Split(":")[0] ?? "Unknown" : "Unknown",
- player.Ping,
- IsAdmin = AdminManager.PlayerHasPermissions(player, "@css/ban") || AdminManager.PlayerHasPermissions(player, "@css/generic"),
- Stats = new
- {
- player.Score,
- Kills = matchStats?.Kills ?? 0,
- Deaths = matchStats?.Deaths ?? 0,
- player.MVPs
- }
- };
- }));
-
- if (caller != null)
- caller.PrintToConsole(playersJson);
- else
- Server.PrintToConsole(playersJson);
- }
- }
-
- [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)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- var targets = GetTarget(command);
-
- if (targets == null) return;
- var playersToTarget = targets.Players
- .Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- if (command.ArgCount >= 2 && command.GetArg(2).Length > 0)
- reason = command.GetArg(2);
-
- playersToTarget.ForEach(player =>
- {
- if (!player.IsValid)
- return;
-
- if (caller!.CanTarget(player))
- {
- Kick(caller, player, reason, callerName, command);
- }
- });
- }
-
- public void Kick(CCSPlayerController? caller, CCSPlayerController? player, string? reason = "Unknown", string? callerName = null, CommandInfo? command = null)
- {
- if (player == null || !player.IsValid) return;
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
- reason ??= _localizer?["sa_unknown"] ?? "Unknown";
-
- player.Pawn.Value!.Freeze();
-
- Helper.LogCommand(caller, $"css_kick {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {reason}");
-
- if (string.IsNullOrEmpty(reason) == false)
- {
- if (!player.IsBot)
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_kick_message", reason, callerName]);
- }
- if (player.UserId.HasValue)
- AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason),
- CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
- else
- {
- if (player.UserId.HasValue)
- AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value),
- CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
-
- if (caller != null && (caller.UserId == null || SilentPlayers.Contains(caller.Slot))) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_kick_message",
- callerName,
- player?.PlayerName ?? string.Empty,
- reason);
- }
- }
-
- [ConsoleCommand("css_changemap")]
- [ConsoleCommand("css_map")]
- [RequiresPermissions("@css/changemap")]
- [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnMapCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var map = command.GetCommandString.Split(" ")[1];
- ChangeMap(caller, map, command);
- }
-
- public void ChangeMap(CCSPlayerController? caller, string map, CommandInfo? command = null)
- {
- map = map.ToLower();
-
- if (map.StartsWith("ws:"))
- {
- var issuedCommand = long.TryParse(map.Replace("ws:", ""), out var mapId)
- ? $"host_workshop_map {mapId}"
- : $"ds_workshop_changelevel {map.Replace("ws:", "")}";
-
- AddTimer(3.0f, () =>
- {
- Server.ExecuteCommand(issuedCommand);
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
- else
- {
- if (!Server.IsMapValid(map))
- {
- var msg = $"Map {map} not found.";
- if (command != null)
- command.ReplyToCommand(msg);
- else if (caller != null && caller.IsValid)
- caller.PrintToChat(msg);
- else
- Server.PrintToConsole(msg);
- return;
- }
-
- AddTimer(3.0f, () =>
- {
- Server.ExecuteCommand($"changelevel {map}");
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var player in Helper.GetValidPlayers())
- {
- if (_localizer != null)
- player.SendLocalizedMessage(_localizer,
- "sa_admin_changemap_message",
- caller == null ? "Console" : caller.PlayerName,
- map);
- }
- }
-
- Helper.LogCommand(caller, command?.GetCommandString ?? $"css_map {map}");
- }
-
- [ConsoleCommand("css_changewsmap", "Change workshop map.")]
- [ConsoleCommand("css_wsmap", "Change workshop map.")]
- [ConsoleCommand("css_workshop", "Change workshop map.")]
- [CommandHelper(1, "")]
- [RequiresPermissions("@css/changemap")]
- public void OnWorkshopMapCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var map = command.GetArg(1);
- ChangeWorkshopMap(caller, map, command);
- }
-
- public void ChangeWorkshopMap(CCSPlayerController? caller, string map, CommandInfo? command = null)
- {
- map = map.ToLower();
-
- var issuedCommand = long.TryParse(map, out var mapId) ? $"host_workshop_map {mapId}" : $"ds_workshop_changelevel {map}";
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var player in Helper.GetValidPlayers())
- {
- if (_localizer != null)
- player.SendLocalizedMessage(_localizer,
- "sa_admin_changemap_message",
- caller == null ? "Console" : caller.PlayerName,
- map);
- }
- }
-
- AddTimer(3.0f, () =>
- {
- Server.ExecuteCommand(issuedCommand);
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
-
- Helper.LogCommand(caller, command?.GetCommandString ?? $"css_wsmap {map}");
- }
-
- [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));
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- 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;
- }
-
- Helper.LogCommand(caller, command);
-
- var value = command.GetArg(2);
-
- Server.ExecuteCommand($"{cvar.Name} {value}");
-
- command.ReplyToCommand($"{callerName} changed cvar {cvar.Name} to {value}.");
- Logger.LogInformation($"{callerName} changed cvar {cvar.Name} to {value}.");
- }
-
- [ConsoleCommand("css_rcon", "Run a server console command.")]
- [CommandHelper(1, "")]
- [RequiresPermissions("@css/rcon")]
- public void OnRconCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- Helper.LogCommand(caller, command);
-
- Server.ExecuteCommand(command.ArgString);
- command.ReplyToCommand($"{callerName} executed command {command.ArgString}.");
- Logger.LogInformation($"{callerName} executed command ({command.ArgString}).");
- }
-
- [ConsoleCommand("css_rr")]
- [ConsoleCommand("css_rg")]
- [ConsoleCommand("css_restart")]
- [ConsoleCommand("css_restartgame")]
- [RequiresPermissions("@css/generic")]
- [CommandHelper(minArgs: 0, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnRestartCommand(CCSPlayerController? caller, CommandInfo command)
- {
- RestartGame(caller);
- }
-
- public static void RestartGame(CCSPlayerController? admin)
- {
- Helper.LogCommand(admin, "css_restartgame");
-
- // TODO: Localize
- var name = admin == null ? "Console" : admin.PlayerName;
- Server.PrintToChatAll($"[SA] {name}: Restarting game...");
- Server.ExecuteCommand("mp_restartgame 2");
- }
- }
-}
\ No newline at end of file
diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs
deleted file mode 100644
index 182ba3d..0000000
--- a/Commands/basecomms.cs
+++ /dev/null
@@ -1,1002 +0,0 @@
-using CounterStrikeSharp.API;
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Core.Translations;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Commands;
-
-namespace CS2_SimpleAdmin
-{
- public partial class CS2_SimpleAdmin
- {
- [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 (_database == null) return;
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- MuteManager muteManager = new(_database);
- var playerPenaltyManager = new PlayerPenaltyManager();
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- Gag(caller, player, time, reason, callerName, muteManager, playerPenaltyManager, command);
- }
- });
- }
-
- internal static void Gag(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null)
- {
- if (_database == null) return;
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
- muteManager ??= new MuteManager(_database);
-
- var playerInfo = new PlayerInfo
- {
- SteamId = player?.SteamID.ToString(),
- Name = player?.PlayerName,
- IpAddress = player?.IpAddress?.Split(":")[0]
- };
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- Task.Run(async () =>
- {
- await muteManager.MutePlayer(playerInfo, adminInfo, reason, time);
- });
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_mute {player!.SteamID}");
-
- PlayerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time);
- if (time == 0)
- {
- if (!player.IsBot)
- {
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_gag_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_gag_message_perm",
- callerName,
- player.PlayerName,
- reason);
- }
- }
- }
- else
- {
- if (!player.IsBot)
- {
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_gag_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_gag_message_time",
- callerName,
- player.PlayerName,
- reason,
- time);
- }
- }
- }
-
- Helper.LogCommand(caller, $"css_gag {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}");
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _localizer);
- }
-
- [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 (_database == null) return;
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- if (command.ArgCount < 2)
- return;
-
- if (string.IsNullOrEmpty(command.GetArg(1))) return;
-
- if (!Helper.ValidateSteamId(command.GetArg(1), out var steamId) || steamId == null)
- {
- command.ReplyToCommand($"Invalid SteamID64.");
- return;
- }
-
- var steamid = steamId.SteamId64.ToString();
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- MuteManager muteManager = new(_database);
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- var matches = Helper.GetPlayerFromSteamid64(steamid);
- if (matches.Count == 1)
- {
- var 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 (!player.IsBot)
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_gag_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_gag_message_perm",
- callerName,
- player.PlayerName,
- reason);
- }
- }
- }
- else
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_gag_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_gag_message_time",
- callerName,
- player.PlayerName,
- reason,
- time);
- }
- }
- }
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_mute {player.SteamID}");
-
- PlayerPenaltyManager.AddPenalty(player.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time);
- }
-
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _localizer);
- }
-
- Task.Run(async () =>
- {
- await muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time);
- });
-
- Helper.LogCommand(caller, command);
-
- command.ReplyToCommand($"Gagged player with steamid {steamid}.");
- }
-
- [ConsoleCommand("css_ungag")]
- [RequiresPermissions("@css/chat")]
- [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnUngagCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
- var callerSteamId = caller?.SteamID.ToString() ?? "Console";
-
- var foundPlayerName = string.Empty;
- var foundPlayerSteamId64 = string.Empty;
- var reason = command.GetArg(2);
-
- if (command.GetArg(1).Length <= 1)
- {
- command.ReplyToCommand($"Too short pattern to search.");
- return;
- }
-
- var found = false;
-
- var pattern = command.GetArg(1);
-
- Helper.LogCommand(caller, command);
-
- MuteManager muteManager = new(_database);
-
- if (Helper.ValidateSteamId(pattern, out var steamId) && steamId != null)
- {
- var matches = Helper.GetPlayerFromSteamid64(steamId.SteamId64.ToString());
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- PlayerPenaltyManager.RemovePenaltiesByType(player.Slot, PenaltyType.Gag);
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player.SteamID}");
-
- found = true;
- foundPlayerName = player.PlayerName;
- foundPlayerSteamId64 = player.SteamID.ToString();
- }
- }
- }
- else
- {
- var matches = Helper.GetPlayerFromName(pattern);
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- PlayerPenaltyManager.RemovePenaltiesByType(player.Slot, PenaltyType.Gag);
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player.SteamID.ToString()}");
-
- pattern = player.SteamID.ToString();
-
- found = true;
- foundPlayerName = player.PlayerName;
- foundPlayerSteamId64 = player.SteamID.ToString();
- }
- }
- }
-
- if (found)
- {
- Task.Run(async () => { await muteManager.UnmutePlayer(foundPlayerSteamId64, callerSteamId, reason); }); // Unmute by type 0 (gag)
- command.ReplyToCommand($"Ungaged player {foundPlayerName}.");
- }
- else
- {
- Task.Run(async () => { await muteManager.UnmutePlayer(pattern, callerSteamId, reason); }); // Unmute by type 0 (gag)
- command.ReplyToCommand($"Ungaged offline player with pattern {pattern}.");
- }
-
- /*
- TargetResult? targets = GetTarget(command);
- if (targets == null) return;
- List playersToTarget = targets!.Players.Where(player => player!= null && player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected &&!player.IsHLTV).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- if (playersToTarget.Count > 1)
- {
- playersToTarget.ForEach(player =>
- {
- playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag);
-
- if (player!.SteamID.ToString().Length == 17)
- Task.Run(async () =>
- {
- await _muteManager.UnmutePlayer(player.SteamID.ToString(), 0); // Unmute by type 0 (gag)
- });
-
- if (TagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}");
- });
-
- command.ReplyToCommand($"Ungaged player with pattern {pattern}.");
- return;
- */
- }
-
- [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 OnMuteCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- MuteManager muteManager = new(_database);
- var playerPenaltyManager = new PlayerPenaltyManager();
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- Mute(caller, player, time, reason, callerName, muteManager, playerPenaltyManager, command);
- }
- });
- }
-
- internal void Mute(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null)
- {
- if (_database == null) return;
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
- muteManager ??= new MuteManager(_database);
-
- var playerInfo = new PlayerInfo
- {
- SteamId = player?.SteamID.ToString(),
- Name = player?.PlayerName,
- IpAddress = player?.IpAddress?.Split(":")[0]
- };
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- player!.VoiceFlags = VoiceFlags.Muted;
-
- Task.Run(async () =>
- {
- await muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1);
- });
-
- PlayerPenaltyManager.AddPenalty(player.Slot, PenaltyType.Mute, DateTime.Now.AddMinutes(time), time);
-
- if (time == 0)
- {
- if (!player.IsBot)
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_mute_message_perm",
- callerName,
- player.PlayerName,
- reason);
- }
- }
- }
- else
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_mute_message_time",
- callerName,
- player.PlayerName,
- reason,
- time);
- }
- }
- }
-
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _localizer);
- Helper.LogCommand(caller, $"css_mute {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}");
- }
-
- [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 (_database == null) return;
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- if (command.ArgCount < 2)
- return;
-
- if (string.IsNullOrEmpty(command.GetArg(1))) return;
-
- if (!Helper.ValidateSteamId(command.GetArg(1), out var steamId) || steamId == null)
- {
- command.ReplyToCommand($"Invalid SteamID64.");
- return;
- }
-
- var steamid = steamId.SteamId64.ToString();
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- MuteManager muteManager = new(_database);
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- var matches = Helper.GetPlayerFromSteamid64(steamid);
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- if (!caller!.CanTarget(player))
- {
- command.ReplyToCommand($"{player.PlayerName} is more powerful than you!");
- return;
- }
-
- PlayerPenaltyManager.AddPenalty(player.Slot, PenaltyType.Mute, DateTime.Now.AddMinutes(time), time);
-
- if (time == 0)
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_mute_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_mute_message_perm",
- callerName,
- player.PlayerName,
- reason);
- }
- }
- }
- else
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_mute_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_mute_message_time",
- callerName,
- player.PlayerName,
- reason,
- time);
- }
- }
- }
- }
-
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _localizer);
- }
-
- Task.Run(async () =>
- {
- await muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 1);
- });
-
- Helper.LogCommand(caller, command);
-
- 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 (_database == null) return;
- var callerSteamId = caller?.SteamID.ToString() ?? "Console";
-
- var foundPlayerName = string.Empty;
- var foundPlayerSteamId64 = string.Empty;
- var reason = command.GetArg(2);
-
- if (command.GetArg(1).Length <= 1)
- {
- command.ReplyToCommand($"Too short pattern to search.");
- return;
- }
-
- Helper.LogCommand(caller, command);
-
- var pattern = command.GetArg(1);
- var found = false;
- MuteManager muteManager = new(_database);
-
- if (Helper.ValidateSteamId(pattern, out var steamId) && steamId != null)
- {
- var matches = Helper.GetPlayerFromSteamid64(steamId.SteamId64.ToString());
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- PlayerPenaltyManager.RemovePenaltiesByType(player.Slot, PenaltyType.Mute);
- player.VoiceFlags = VoiceFlags.Normal;
- found = true;
- foundPlayerName = player.PlayerName;
- foundPlayerSteamId64 = player.SteamID.ToString();
- }
- }
- }
- else
- {
- var matches = Helper.GetPlayerFromName(pattern);
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- PlayerPenaltyManager.RemovePenaltiesByType(player.Slot, PenaltyType.Mute);
- player.VoiceFlags = VoiceFlags.Normal;
- pattern = player.SteamID.ToString();
- found = true;
- foundPlayerName = player.PlayerName;
- foundPlayerSteamId64 = player.SteamID.ToString();
- }
- }
- }
-
- if (found)
- {
- Task.Run(async () => { await muteManager.UnmutePlayer(foundPlayerSteamId64, callerSteamId, reason, 1); }); // Unmute by type 1 (mute)
- command.ReplyToCommand($"Unmuted player {foundPlayerName}.");
- }
- else
- {
- Task.Run(async () => { await muteManager.UnmutePlayer(pattern, callerSteamId, reason, 1); }); // Unmute by type 1 (mute)
- command.ReplyToCommand($"Unmuted offline player with pattern {pattern}.");
- }
-
- /*
- TargetResult? targets = GetTarget(command);
- if (targets == null) return;
- List playersToTarget = targets!.Players.Where(player => player!= null && player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected &&!player.IsHLTV).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- if (playersToTarget.Count > 1)
- {
- playersToTarget.ForEach(player =>
- {
- if (player.Connected == PlayerConnectedState.PlayerConnected)
- Task.Run(async () =>
- {
- await _muteManager.UnmutePlayer(player.SteamID.ToString(), 1); // Unmute by type 1 (mute)
- });
-
- playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute);
- player.VoiceFlags = VoiceFlags.Normal;
- });
- */
- }
-
- [ConsoleCommand("css_silence")]
- [RequiresPermissions("@css/chat")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnSilenceCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- MuteManager muteManager = new(_database);
- var playerPenaltyManager = new PlayerPenaltyManager();
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- Silence(caller, player, time, reason, callerName, muteManager, playerPenaltyManager, command);
- }
- });
- }
-
- internal void Silence(CCSPlayerController? caller, CCSPlayerController? player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null)
- {
- if (_database == null) return;
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
- muteManager ??= new MuteManager(_database);
-
- var playerInfo = new PlayerInfo
- {
- SteamId = player?.SteamID.ToString(),
- Name = player?.PlayerName,
- IpAddress = player?.IpAddress?.Split(":")[0]
- };
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- Task.Run(async () =>
- {
- await muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 2);
- });
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_mute {player!.SteamID}");
-
- player!.VoiceFlags = VoiceFlags.Muted;
- PlayerPenaltyManager.AddPenalty(player.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time);
-
- if (time == 0)
- {
- if (!player.IsBot)
- {
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_silence_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_silence_message_perm",
- callerName,
- player.PlayerName,
- reason);
- }
- }
- }
- else
- {
- if (!player.IsBot)
- {
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_silence_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_silence_message_time",
- callerName,
- player.PlayerName,
- reason,
- time);
- }
- }
- }
-
- if (command == null) return;
-
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Silence, _localizer);
- Helper.LogCommand(caller, $"css_silence {(string.IsNullOrEmpty(player.PlayerName) ? player.SteamID.ToString() : player.PlayerName)} {time} {reason}");
- }
-
- [ConsoleCommand("css_addsilence")]
- [RequiresPermissions("@css/chat")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnAddSilenceCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- if (command.ArgCount < 2)
- return;
- if (string.IsNullOrEmpty(command.GetArg(1))) return;
-
- if (!Helper.ValidateSteamId(command.GetArg(1), out var steamId) || steamId == null)
- {
- command.ReplyToCommand($"Invalid SteamID64.");
- return;
- }
-
- var steamid = steamId.SteamId64.ToString();
-
- var reason = _localizer?["sa_unknown"] ?? "Unknown";
-
- MuteManager muteManager = new(_database);
-
- int.TryParse(command.GetArg(2), out var time);
-
- if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
- reason = command.GetArg(3);
-
- var adminInfo = new PlayerInfo
- {
- SteamId = caller?.SteamID.ToString(),
- Name = caller?.PlayerName,
- IpAddress = caller?.IpAddress?.Split(":")[0]
- };
-
- var matches = Helper.GetPlayerFromSteamid64(steamid);
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- if (!caller!.CanTarget(player))
- {
- command.ReplyToCommand($"{player.PlayerName} is more powerful than you!");
- return;
- }
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_mute {player.SteamID}");
-
- PlayerPenaltyManager.AddPenalty(player.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time);
-
- if (time == 0)
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_silence_message_perm", reason, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_silence_message_perm",
- callerName,
- player.PlayerName,
- reason);
- }
- }
- }
- else
- {
- if (player is { IsBot: false, IsHLTV: false })
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- player.PrintToCenter(_localizer!["sa_player_silence_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]);
- }
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_silence_message_time",
- callerName,
- player.PlayerName,
- reason,
- time);
- }
- }
- }
-
- Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Silence, _localizer);
- }
- }
- Task.Run(async () =>
- {
- await muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 2);
- });
-
- Helper.LogCommand(caller, command);
-
- command.ReplyToCommand($"Silenced player with steamid {steamid}.");
- }
-
- [ConsoleCommand("css_unsilence")]
- [RequiresPermissions("@css/chat")]
- [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnUnsilenceCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (_database == null) return;
- var callerSteamId = caller?.SteamID.ToString() ?? "Console";
-
- var foundPlayerName = string.Empty;
- var foundPlayerSteamId64 = string.Empty;
- var reason = command.GetArg(2);
-
- if (command.GetArg(1).Length <= 1)
- {
- command.ReplyToCommand($"Too short pattern to search.");
- return;
- }
-
- Helper.LogCommand(caller, command);
-
- var pattern = command.GetArg(1);
- var found = false;
- MuteManager muteManager = new(_database);
-
- if (Helper.ValidateSteamId(pattern, out var steamId) && steamId != null)
- {
- var matches = Helper.GetPlayerFromSteamid64(steamId.SteamId64.ToString());
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player.SteamID}");
-
- PlayerPenaltyManager.RemovePenaltiesByType(player.Slot, PenaltyType.Silence);
- player.VoiceFlags = VoiceFlags.Normal;
- found = true;
- foundPlayerName = player.PlayerName;
- foundPlayerSteamId64 = player.SteamID.ToString();
- }
- }
- }
- else
- {
- var matches = Helper.GetPlayerFromName(pattern);
- if (matches.Count == 1)
- {
- var player = matches.FirstOrDefault();
- if (player != null && player.IsValid)
- {
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player.SteamID}");
-
- PlayerPenaltyManager.RemovePenaltiesByType(player.Slot, PenaltyType.Silence);
- player.VoiceFlags = VoiceFlags.Normal;
- pattern = player.SteamID.ToString();
- found = true;
- foundPlayerName = player.PlayerName;
- foundPlayerSteamId64 = player.SteamID.ToString();
- }
- }
- }
-
- if (found)
- {
- Task.Run(async () => { await muteManager.UnmutePlayer(foundPlayerSteamId64, callerSteamId, reason, 2); }); // Unmute by type 2 (silence)
- command.ReplyToCommand($"Unsilenced player {foundPlayerName}.");
- }
- else
- {
- Task.Run(async () => { await muteManager.UnmutePlayer(pattern, callerSteamId, reason, 2); }); // Unmute by type 2 (silence)
- command.ReplyToCommand($"Unsilenced offline player with pattern {pattern}.");
- }
- /*
- TargetResult? targets = GetTarget(command);
- if (targets == null) return;
- List playersToTarget = targets!.Players.Where(player => player!= null && player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected &&!player.IsHLTV).ToList();
-
- if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0)
- {
- return;
- }
-
- if (playersToTarget.Count > 1)
- {
- playersToTarget.ForEach(player =>
- {
- if (player.Connected == PlayerConnectedState.PlayerConnected)
- Task.Run(async () => { await _muteManager.UnmutePlayer(player.SteamID.ToString(), 2); }); // Unmute by type 2 (silence)
-
- if (TagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}");
-
- playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence);
- player.VoiceFlags = VoiceFlags.Normal;
- });
-
- command.ReplyToCommand($"Unsilenced player with pattern {pattern}.");
- return;
- */
- }
- }
-}
\ No newline at end of file
diff --git a/Commands/basevotes.cs b/Commands/basevotes.cs
deleted file mode 100644
index 17d3aa1..0000000
--- a/Commands/basevotes.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Core.Translations;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Commands;
-using CounterStrikeSharp.API.Modules.Menu;
-
-namespace CS2_SimpleAdmin
-{
- public partial class CS2_SimpleAdmin
- {
- [ConsoleCommand("css_vote")]
- [RequiresPermissions("@css/generic")]
- [CommandHelper(minArgs: 2, usage: " [... options ...]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnVoteCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (command.ArgCount < 2)
- return;
-
- Helper.LogCommand(caller, command);
-
- VoteAnswers.Clear();
-
- var question = command.GetArg(1);
- var answersCount = command.ArgCount;
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- for (var i = 2; i <= answersCount - 1; i++)
- {
- VoteAnswers.Add(command.GetArg(i), 0);
- }
-
- foreach (var player in Helper.GetValidPlayers())
- {
- using (new WithTemporaryCulture(player.GetLanguage()))
- {
- BaseMenu voteMenu = Config.UseChatMenu
- ? new ChatMenu(_localizer!["sa_admin_vote_menu_title", question])
- : new CenterHtmlMenu(_localizer!["sa_admin_vote_menu_title", question], Instance);
- //ChatMenu voteMenu = new(_localizer!["sa_admin_vote_menu_title", question]);
-
- for (var i = 2; i <= answersCount - 1; i++)
- {
- voteMenu.AddMenuOption(command.GetArg(i), Helper.HandleVotes);
- }
-
- voteMenu.PostSelectAction = PostSelectAction.Close;
-
- Helper.PrintToCenterAll(_localizer["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]);
-
- player.SendLocalizedMessage(_localizer,
- "sa_admin_vote_message",
- caller == null ? "Console" : caller.PlayerName,
- question);
-
- voteMenu.Open(player);
-
- //MenuManager.OpenChatMenu(player, voteMenu);
- }
- }
-
- VoteInProgress = true;
- }
-
- if (VoteInProgress)
- {
- AddTimer(30, () =>
- {
- foreach (var player in Helper.GetValidPlayers())
- {
- if (_localizer != null)
- player.SendLocalizedMessage(_localizer,
- "sa_admin_vote_message_results",
- question);
- }
-
- foreach (var (key, value) in VoteAnswers)
- {
- foreach (var player in Helper.GetValidPlayers())
- {
- if (_localizer != null)
- player.SendLocalizedMessage(_localizer,
- "sa_admin_vote_message_results_answer",
- key,
- value);
- }
- }
- VoteAnswers.Clear();
- VoteInProgress = false;
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Commands/funcommands.cs b/Commands/funcommands.cs
deleted file mode 100644
index e9e73e7..0000000
--- a/Commands/funcommands.cs
+++ /dev/null
@@ -1,135 +0,0 @@
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Commands;
-
-namespace CS2_SimpleAdmin
-{
- public partial class CS2_SimpleAdmin
- {
- [ConsoleCommand("css_noclip", "Noclip a player.")]
- [CommandHelper(1, "<#userid or name>")]
- [RequiresPermissions("@css/cheats")]
- public void OnNoclipCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player =>
- player.IsValid &&
- player is { PawnIsAlive: true, IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- NoClip(caller, player, callerName);
- }
- });
- }
-
- public void NoClip(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
- player!.Pawn.Value!.ToggleNoclip();
-
- Helper.LogCommand(caller, $"css_noclip {player.PlayerName}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_noclip_message",
- callerName,
- player.PlayerName);
- }
- }
-
- [ConsoleCommand("css_freeze", "Freeze a player.")]
- [CommandHelper(1, "<#userid or name> [duration]")]
- [RequiresPermissions("@css/slay")]
- public void OnFreezeCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- int.TryParse(command.GetArg(2), out var time);
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- Freeze(caller, player, time, callerName);
- }
- });
- }
-
- public void Freeze(CCSPlayerController? caller, CCSPlayerController? player, int time, string? callerName = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- player?.Pawn.Value!.Freeze();
-
- Helper.LogCommand(caller, $"css_freeze {player?.PlayerName}");
-
- if (time > 0)
- AddTimer(time, () => player?.Pawn.Value!.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_freeze_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [ConsoleCommand("css_unfreeze", "Unfreeze a player.")]
- [CommandHelper(1, "<#userid or name>")]
- [RequiresPermissions("@css/slay")]
- public void OnUnfreezeCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- Unfreeze(caller, player, callerName, command);
- });
- }
-
- public void Unfreeze(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- player!.Pawn.Value!.Unfreeze();
-
- Helper.LogCommand(caller, $"css_unfreeze {player?.PlayerName}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_unfreeze_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Commands/playercommands.cs b/Commands/playercommands.cs
deleted file mode 100644
index 2e619e7..0000000
--- a/Commands/playercommands.cs
+++ /dev/null
@@ -1,784 +0,0 @@
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Commands;
-using CounterStrikeSharp.API.Modules.Entities.Constants;
-using CounterStrikeSharp.API.Modules.Memory;
-using CounterStrikeSharp.API.Modules.Utils;
-
-namespace CS2_SimpleAdmin
-{
- public partial class CS2_SimpleAdmin
- {
- [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)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- Slay(caller, player, callerName, command);
- });
- }
-
- public void Slay(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
- {
- if (player == null || !player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected)
- return;
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- player?.CommitSuicide(false, true);
-
- Helper.LogCommand(caller, $"css_slay {player?.PlayerName}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_slay_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [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)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
- var weaponName = command.GetArg(2);
-
- // check if item is typed
- if (weaponName.Length < 5)
- {
- command.ReplyToCommand($"No weapon typed.");
- return;
- }
-
- // check if item is valid
- if (!weaponName.Contains("weapon_") && !weaponName.Contains("item_"))
- {
- command.ReplyToCommand($"{weaponName} is not a valid item.");
- return;
- }
-
- // 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;
- }
- }
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- GiveWeapon(caller, player, weaponName, callerName, command);
- });
- }
-
- public void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, CsItem weapon, string? callerName = null)
- {
- if (!caller.CanTarget(player)) return;
-
- Helper.LogCommand(caller, $"css_give {player.PlayerName} {weapon.ToString()}");
-
- player.GiveNamedItem(weapon);
- SubGiveWeapon(caller, player, weapon.ToString(), callerName);
- }
-
- private void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- Helper.LogCommand(caller, $"css_give {player.PlayerName} {weaponName}");
-
- player.GiveNamedItem(weaponName);
- SubGiveWeapon(caller, player, weaponName, callerName);
- }
-
- private void SubGiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- if (caller != null && (SilentPlayers.Contains(caller.Slot))) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_give_message",
- callerName,
- player?.PlayerName ?? string.Empty,
- weaponName);
- }
- }
-
- [ConsoleCommand("css_strip")]
- [RequiresPermissions("@css/slay")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name>", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnStripCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- StripWeapons(caller, player, callerName, command);
- }
- });
- }
-
- public void StripWeapons(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- if (player == null || !player.IsValid || !player.PawnIsAlive || player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- player.RemoveWeapons();
-
- Helper.LogCommand(caller, $"css_strip {player.PlayerName}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_strip_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [ConsoleCommand("css_hp")]
- [RequiresPermissions("@css/slay")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name> ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnHpCommand(CCSPlayerController? caller, CommandInfo command)
- {
- int.TryParse(command.GetArg(2), out var health);
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (caller!.CanTarget(player))
- {
- SetHp(caller, player, health, command);
- }
- });
- }
-
- public void SetHp(CCSPlayerController? caller, CCSPlayerController? player, int health, CommandInfo? command = null)
- {
- if (player == null || !player.IsValid || player.IsHLTV)
- return;
-
- if (!caller.CanTarget(player)) return;
-
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- player.SetHp(health);
-
- Helper.LogCommand(caller, $"css_hp {player.PlayerName} {health}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_hp_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [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)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- double.TryParse(command.GetArg(2), out var speed);
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (caller!.CanTarget(player))
- {
- SetSpeed(caller, player, speed, callerName, command);
- }
- });
- }
-
- public void SetSpeed(CCSPlayerController? caller, CCSPlayerController? player, double speed, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- player.SetSpeed((float)speed);
-
- Helper.LogCommand(caller, $"css_speed {player?.PlayerName} {speed}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_speed_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [ConsoleCommand("css_gravity")]
- [RequiresPermissions("@css/slay")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name> ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnGravityCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- double.TryParse(command.GetArg(2), out var gravity);
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (caller!.CanTarget(player))
- {
- SetGravity(caller, player, gravity, callerName, command);
- }
- });
- }
-
- public void SetGravity(CCSPlayerController? caller, CCSPlayerController? player, double gravity, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- player.SetGravity((float)gravity);
-
- Helper.LogCommand(caller, $"css_gravity {player?.PlayerName} {gravity}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_gravity_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [ConsoleCommand("css_money")]
- [RequiresPermissions("@css/slay")]
- [CommandHelper(minArgs: 1, usage: "<#userid or name> ", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnMoneyCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- int.TryParse(command.GetArg(2), out var money);
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (caller!.CanTarget(player))
- {
- SetMoney(caller, player, money, callerName, command);
- }
- });
- }
-
- public void SetMoney(CCSPlayerController? caller, CCSPlayerController? player, int money, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- player.SetMoney(money);
-
- Helper.LogCommand(caller, $"css_money {player?.PlayerName} {money}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_money_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [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)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (caller!.CanTarget(player))
- {
- God(caller, player, callerName, command);
- }
- });
- }
-
- public void God(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- if (player == null) return;
-
- Helper.LogCommand(caller, $"css_god {player.PlayerName}");
-
- if (!GodPlayers.Add(player.Slot))
- {
- GodPlayers.Remove(player.Slot);
- }
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_god_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [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)
- {
- var damage = 0;
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList();
-
- if (command.ArgCount >= 2)
- {
- int.TryParse(command.GetArg(2), out damage);
- }
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (caller!.CanTarget(player))
- {
- Slap(caller, player, damage, command);
- }
- });
- }
-
- public void Slap(CCSPlayerController? caller, CCSPlayerController? player, int damage, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- var callerName = caller == null ? "Console" : caller.PlayerName;
- player!.Pawn.Value!.Slap(damage);
-
- Helper.LogCommand(caller, $"css_slap {player?.PlayerName} {damage}");
-
- if (_localizer == null)
- return;
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
-
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_slap_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [ConsoleCommand("css_team")]
- [RequiresPermissions("@css/kick")]
- [CommandHelper(minArgs: 2, usage: "<#userid or name> [] [-k]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public void OnTeamCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var teamName = command.GetArg(2).ToLower();
- var _teamName = "SPEC";
- var teamNum = CsTeam.Spectator;
-
- var targets = GetTarget(command);
- if (targets == null) return;
-
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- switch (teamName)
- {
- case "ct":
- case "counterterrorist":
- teamNum = CsTeam.CounterTerrorist;
- _teamName = "CT";
- break;
-
- case "t":
- case "tt":
- case "terrorist":
- teamNum = CsTeam.Terrorist;
- _teamName = "TT";
- break;
-
- case "swap":
- _teamName = "SWAP";
- break;
-
- default:
- teamNum = CsTeam.Spectator;
- _teamName = "SPEC";
- break;
- }
-
- var kill = command.GetArg(3).ToLower().Equals("-k");
-
- playersToTarget.ForEach(player =>
- {
- ChangeTeam(caller, player, _teamName, teamNum, kill, callerName, command);
- });
- }
-
- public void ChangeTeam(CCSPlayerController? caller, CCSPlayerController? player, string teamName, CsTeam teamNum, bool kill, string? callerName = null, CommandInfo? command = null)
- {
- if (player == null || !player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- if (!teamName.Equals("swap"))
- {
- if (player.PawnIsAlive && teamNum != CsTeam.Spectator && !kill && Config.TeamSwitchType == 1)
- player.SwitchTeam(teamNum);
- else
- player?.ChangeTeam(teamNum);
- }
- else
- {
- if (player.TeamNum != (byte)CsTeam.Spectator)
- {
- var _teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist;
- teamName = _teamNum == CsTeam.Terrorist ? "TT" : "CT";
- if (player.PawnIsAlive && !kill && Config.TeamSwitchType == 1)
- {
- player.SwitchTeam(_teamNum);
- }
- else
- {
- player.ChangeTeam(_teamNum);
- }
- }
- }
-
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_team_message",
- callerName,
- player?.PlayerName ?? string.Empty,
- teamName);
- }
- }
-
- Helper.LogCommand(caller, $"css_team {player?.PlayerName} {teamName}");
- }
-
- [ConsoleCommand("css_rename", "Rename a player.")]
- [CommandHelper(1, "<#userid or name> ")]
- [RequiresPermissions("@css/kick")]
- public void OnRenameCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var newName = command.GetArg(2);
-
- if (string.IsNullOrEmpty(newName))
- return;
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- Helper.LogCommand(caller, command);
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (!caller!.CanTarget(player)) return;
- if (caller == null || !SilentPlayers.Contains(caller.Slot))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_rename_message",
- callerName,
- player?.PlayerName ?? string.Empty,
- newName);
- }
- }
-
- player.Rename(newName);
- });
- }
-
- [ConsoleCommand("css_prename", "Permanent rename a player.")]
- [CommandHelper(1, "<#userid or name> ")]
- [RequiresPermissions("@css/ban")]
- public void OnPRenameCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
- var newName = command.GetArg(2);
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- Helper.LogCommand(caller, command);
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (!caller!.CanTarget(player)) return;
- if (caller == null || !SilentPlayers.Contains(caller.Slot) && !string.IsNullOrEmpty(newName))
- {
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_rename_message",
- callerName,
- player.PlayerName ?? string.Empty,
- newName);
- }
- }
-
- if (!string.IsNullOrEmpty(newName))
- {
- RenamedPlayers[player.SteamID] = newName;
- }
- else
- {
- RenamedPlayers.Remove(player.SteamID);
- }
-
- player.Rename(newName);
- });
- }
-
- [ConsoleCommand("css_respawn", "Respawn a dead player.")]
- [CommandHelper(1, "<#userid or name>")]
- [RequiresPermissions("@css/cheats")]
- public void OnRespawnCommand(CCSPlayerController? caller, CommandInfo command)
- {
- var callerName = caller == null ? "Console" : caller.PlayerName;
-
- var targets = GetTarget(command);
- if (targets == null) return;
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return;
-
- if (caller!.CanTarget(player))
- {
- Respawn(caller, player, callerName, command);
- }
- });
- }
-
- public void Respawn(CCSPlayerController? caller, CCSPlayerController? player, string? callerName = null, CommandInfo? command = null)
- {
- if (!caller.CanTarget(player)) return;
-
- callerName ??= caller == null ? "Console" : caller.PlayerName;
-
- if (_cBasePlayerControllerSetPawnFunc == null || player?.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) return;
-
- var playerPawn = player.PlayerPawn.Value;
- _cBasePlayerControllerSetPawnFunc.Invoke(player, playerPawn, true, false);
- VirtualFunction.CreateVoid(player.Handle,
- GameData.GetOffset("CCSPlayerController_Respawn"))(player);
-
- Helper.LogCommand(caller, $"css_respawn {player?.PlayerName}");
-
- if (caller != null && SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_respawn_message",
- callerName,
- player?.PlayerName ?? string.Empty);
- }
- }
-
- [ConsoleCommand("css_tp", "Teleport to a player.")]
- [ConsoleCommand("css_tpto", "Teleport to a player.")]
- [ConsoleCommand("css_goto", "Teleport to a player.")]
- [CommandHelper(1, "<#userid or name>")]
- [RequiresPermissions("@css/kick")]
- public void OnGotoCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (caller == null || !caller.PawnIsAlive) return;
-
- var targets = GetTarget(command);
-
- if (targets == null || targets.Count() > 1)
- return;
-
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- Helper.LogCommand(caller, command);
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected || !player.PawnIsAlive)
- return;
-
- if (!caller.CanTarget(player)) return;
- caller.TeleportPlayer(player);
- caller.Pawn.Value!.ToggleNoclip();
-
- AddTimer(3, () =>
- {
- caller.Pawn.Value!.ToggleNoclip();
- });
-
- if (SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_tp_message",
- caller.PlayerName,
- player.PlayerName ?? string.Empty);
- }
- });
- }
-
- [ConsoleCommand("css_bring", "Teleport a player to you.")]
- [ConsoleCommand("css_tphere", "Teleport a player to you.")]
- [CommandHelper(1, "<#userid or name>")]
- [RequiresPermissions("@css/kick")]
- public void OnBringCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (caller == null || !caller.PawnIsAlive) return;
-
- var targets = GetTarget(command);
-
- if (targets == null || targets.Count() > 1)
- return;
-
- var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false }).ToList();
-
- Helper.LogCommand(caller, command);
-
- playersToTarget.ForEach(player =>
- {
- if (player.Connected != PlayerConnectedState.PlayerConnected || !player.PawnIsAlive)
- return;
-
- if (!caller.CanTarget(player)) return;
- player.TeleportPlayer(caller);
- caller.Pawn.Value!.ToggleNoclip();
-
- AddTimer(3, () =>
- {
- caller.Pawn.Value!.ToggleNoclip();
- });
-
- if (SilentPlayers.Contains(caller.Slot)) return;
- foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false }))
- {
- if (_localizer != null)
- controller.SendLocalizedMessage(_localizer,
- "sa_admin_bring_message",
- caller.PlayerName,
- player.PlayerName ?? string.Empty);
- }
- });
- }
- }
-}
\ No newline at end of file
diff --git a/Config.cs b/Config.cs
deleted file mode 100644
index bf3d8a5..0000000
--- a/Config.cs
+++ /dev/null
@@ -1,254 +0,0 @@
-using CounterStrikeSharp.API.Core;
-using System.Text.Json.Serialization;
-
-namespace CS2_SimpleAdmin
-{
- public class DurationItem
- {
- [JsonPropertyName("name")]
- public required string Name { get; set; }
-
- [JsonPropertyName("duration")]
- public int Duration { get; set; }
- }
-
- public class AdminFlag
- {
- [JsonPropertyName("name")]
- public required string Name { get; set; }
-
- [JsonPropertyName("flag")]
- public required string Flag { get; set; }
- }
-
- public class DiscordPenaltySetting
- {
- [JsonPropertyName("name")]
- public required string Name { get; set; }
-
- [JsonPropertyName("value")]
- public string Value { get; set; } = "";
- }
-
- public class Discord
- {
- [JsonPropertyName("DiscordLogWebhook")]
- public string DiscordLogWebhook { get; set; } = "";
-
- [JsonPropertyName("DiscordPenaltyBanSettings")]
- public DiscordPenaltySetting[] DiscordPenaltyBanSettings { get; set; } =
- [
- new DiscordPenaltySetting { Name = "Color", Value = "" },
- new DiscordPenaltySetting { Name = "Webhook", Value = "" },
- new DiscordPenaltySetting { Name = "ThumbnailUrl", Value = "" },
- new DiscordPenaltySetting { Name = "ImageUrl", Value = "" },
- new DiscordPenaltySetting { Name = "Footer", Value = "" },
- ];
-
- [JsonPropertyName("DiscordPenaltyMuteSettings")]
- public DiscordPenaltySetting[] DiscordPenaltyMuteSettings { get; set; } =
- [
- new DiscordPenaltySetting { Name = "Color", Value = "" },
- new DiscordPenaltySetting { Name = "Webhook", Value = "" },
- new DiscordPenaltySetting { Name = "ThumbnailUrl", Value = "" },
- new DiscordPenaltySetting { Name = "ImageUrl", Value = "" },
- new DiscordPenaltySetting { Name = "Footer", Value = "" },
- ];
-
- [JsonPropertyName("DiscordPenaltyGagSettings")]
- public DiscordPenaltySetting[] DiscordPenaltyGagSettings { get; set; } =
- [
- new DiscordPenaltySetting { Name = "Color", Value = "" },
- new DiscordPenaltySetting { Name = "Webhook", Value = "" },
- new DiscordPenaltySetting { Name = "ThumbnailUrl", Value = "" },
- new DiscordPenaltySetting { Name = "ImageUrl", Value = "" },
- new DiscordPenaltySetting { Name = "Footer", Value = "" },
- ];
-
- [JsonPropertyName("DiscordPenaltySilenceSettings")]
- public DiscordPenaltySetting[] DiscordPenaltySilenceSettings { get; set; } =
- [
- new DiscordPenaltySetting { Name = "Color", Value = "" },
- new DiscordPenaltySetting { Name = "Webhook", Value = "" },
- new DiscordPenaltySetting { Name = "ThumbnailUrl", Value = "" },
- new DiscordPenaltySetting { Name = "ImageUrl", Value = "" },
- new DiscordPenaltySetting { Name = "Footer", Value = "" },
- ];
-
- [JsonPropertyName("DiscordPenaltyWarnSettings")]
- public DiscordPenaltySetting[] DiscordPenaltyWarnSettings { get; set; } =
- [
- new DiscordPenaltySetting { Name = "Color", Value = "" },
- new DiscordPenaltySetting { Name = "Webhook", Value = "" },
- new DiscordPenaltySetting { Name = "ThumbnailUrl", Value = "" },
- new DiscordPenaltySetting { Name = "ImageUrl", Value = "" },
- new DiscordPenaltySetting { Name = "Footer", Value = "" },
- ];
- }
-
- public class CustomServerCommandData
- {
- [JsonPropertyName("Flag")]
- public string Flag { get; set; } = "@css/generic";
-
- [JsonPropertyName("DisplayName")]
- public string DisplayName { get; set; } = "";
-
- [JsonPropertyName("Command")]
- public string Command { get; set; } = "";
-
- [JsonPropertyName("ExecuteOnClient")]
- public bool ExecuteOnClient { get; set; } = false;
- }
-
- public class MenuConfig
- {
- [JsonPropertyName("Durations")]
- public DurationItem[] Durations { get; set; } =
- [
- new DurationItem { Name = "1 minute", Duration = 1 },
- new DurationItem { Name = "5 minutes", Duration = 5 },
- new DurationItem { Name = "15 minutes", Duration = 15 },
- new DurationItem { Name = "1 hour", Duration = 60 },
- new DurationItem { Name = "1 day", Duration = 60 * 24 },
- new DurationItem { Name = "7 days", Duration = 60 * 24 * 7 },
- new DurationItem { Name = "14 days", Duration = 60 * 24 * 14 },
- new DurationItem { Name = "30 days", Duration = 60 * 24 * 30 },
- new DurationItem { Name = "Permanent", Duration = 0 }
- ];
-
- [JsonPropertyName("BanReasons")]
- public List BanReasons { get; set; } =
- [
- "Hacking",
- "Voice Abuse",
- "Chat Abuse",
- "Admin disrespect",
- "Other"
- ];
-
- [JsonPropertyName("KickReasons")]
- public List KickReasons { get; set; } =
- [
- "Voice Abuse",
- "Chat Abuse",
- "Admin disrespect",
- "Other"
- ];
-
- [JsonPropertyName("WarnReasons")]
- public List WarnReasons { get; set; } =
- [
- "Voice Abuse",
- "Chat Abuse",
- "Admin disrespect",
- "Other"
- ];
-
- [JsonPropertyName("MuteReasons")]
- public List MuteReasons { get; set; } =
- [
- "Advertising",
- "Spamming",
- "Spectator camera abuse",
- "Hate",
- "Admin disrespect",
- "Other"
- ];
-
- [JsonPropertyName("AdminFlags")]
- public AdminFlag[] AdminFlags { get; set; } =
- [
- new AdminFlag { Name = "Generic", Flag = "@css/generic" },
- new AdminFlag { Name = "Chat", Flag = "@css/chat" },
- new AdminFlag { Name = "Change Map", Flag = "@css/changemap" },
- new AdminFlag { Name = "Slay", Flag = "@css/slay" },
- new AdminFlag { Name = "Kick", Flag = "@css/kick" },
- new AdminFlag { Name = "Ban", Flag = "@css/ban" },
- new AdminFlag { Name = "Perm Ban", Flag = "@css/permban" },
- new AdminFlag { Name = "Unban", Flag = "@css/unban" },
- new AdminFlag { Name = "Show IP", Flag = "@css/showip" },
- new AdminFlag { Name = "Cvar", Flag = "@css/cvar" },
- new AdminFlag { Name = "Rcon", Flag = "@css/rcon" },
- new AdminFlag { Name = "Root (all flags)", Flag = "@css/root" }
- ];
- }
-
- public class CS2_SimpleAdminConfig : BasePluginConfig
- {
- [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 18;
-
- [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("EnableMetrics")]
- public bool EnableMetrics { get; set; } = true;
-
- [JsonPropertyName("EnableUpdateCheck")]
- public bool EnableUpdateCheck { get; set; } = true;
-
- [JsonPropertyName("ReloadAdminsEveryMapChange")]
- public bool ReloadAdminsEveryMapChange { get; set; } = false;
-
- [JsonPropertyName("UseChatMenu")]
- public bool UseChatMenu { get; set; } = false;
-
- [JsonPropertyName("KickTime")]
- public int KickTime { get; set; } = 5;
-
- [JsonPropertyName("WarnThreshold")]
- public Dictionary WarnThreshold { get; set; } = new()
- {
- { 998, "css_addban STEAMID64 60 \"3/4 Warn\"" },
- { 999, "css_ban #USERID 120 \"4/4 Warn\"" },
- };
-
- [JsonPropertyName("DisableDangerousCommands")]
- public bool DisableDangerousCommands { get; set; } = true;
-
- [JsonPropertyName("BanType")]
- public int BanType { get; set; } = 1;
-
- [JsonPropertyName("TimeMode")]
- public int TimeMode { get; set; } = 1;
-
- [JsonPropertyName("MaxBanDuration")]
- public int MaxBanDuration { get; set; } = 60 * 24 * 7;
-
- [JsonPropertyName("MultiServerMode")]
- public bool MultiServerMode { get; set; } = true;
-
- [JsonPropertyName("ExpireOldIpBans")]
- public int ExpireOldIpBans { get; set; } = 0;
-
- [JsonPropertyName("TeamSwitchType")]
- public int TeamSwitchType { get; set; } = 1;
-
- [JsonPropertyName("Discord")]
- public Discord Discord { get; set; } = new();
-
- [JsonPropertyName("DefaultMaps")]
- public List DefaultMaps { get; set; } = new();
-
- [JsonPropertyName("WorkshopMaps")]
- public Dictionary WorkshopMaps { get; set; } = new();
-
- [JsonPropertyName("CustomServerCommands")]
- public List CustomServerCommands { get; set; } = new();
-
- [JsonPropertyName("MenuConfig")]
- public MenuConfig MenuConfigs { get; set; } = new();
- }
-}
\ No newline at end of file
diff --git a/Database/Database.cs b/Database/Database.cs
deleted file mode 100644
index 250dc50..0000000
--- a/Database/Database.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using Microsoft.Extensions.Logging;
-using MySqlConnector;
-
-namespace CS2_SimpleAdmin.Database;
-
-public class Database(string dbConnectionString)
-{
- public MySqlConnection GetConnection()
- {
- try
- {
- var connection = new MySqlConnection(dbConnectionString);
- connection.Open();
- return connection;
- }
- catch (Exception ex)
- {
- CS2_SimpleAdmin._logger?.LogCritical($"Unable to connect to database: {ex.Message}");
- throw;
- }
- }
-
- public async Task GetConnectionAsync()
- {
- try
- {
- var connection = new MySqlConnection(dbConnectionString);
- await connection.OpenAsync();
- return connection;
- }
- catch (Exception ex)
- {
- CS2_SimpleAdmin._logger?.LogCritical($"Unable to connect to database: {ex.Message}");
- throw;
- }
- }
-
- public void DatabaseMigration()
- {
- Migration migrator = new(this);
- migrator.ExecuteMigrations();
- }
-
- public bool CheckDatabaseConnection()
- {
- using var connection = GetConnection();
-
- try
- {
- return connection.Ping();
- }
- catch
- {
- return false;
- }
- }
-}
diff --git a/Database/Migration.cs b/Database/Migration.cs
deleted file mode 100644
index 56954f4..0000000
--- a/Database/Migration.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using Microsoft.Extensions.Logging;
-using MySqlConnector;
-
-namespace CS2_SimpleAdmin.Database;
-
-public class Migration(Database database)
-{
- public void ExecuteMigrations()
- {
- var migrationsDirectory = CS2_SimpleAdmin.Instance.ModuleDirectory + "/Database/Migrations";
-
- var files = Directory.GetFiles(migrationsDirectory, "*.sql")
- .OrderBy(f => f);
-
- using var connection = database.GetConnection();
-
- // Create sa_migrations table if not exists
- using var cmd = new MySqlCommand("""
- CREATE TABLE IF NOT EXISTS `sa_migrations` (
- `id` INT PRIMARY KEY AUTO_INCREMENT,
- `version` VARCHAR(255) NOT NULL
- );
- """, connection);
-
- cmd.ExecuteNonQuery();
-
- // Get the last applied migration version
- var lastAppliedVersion = GetLastAppliedVersion(connection);
-
- foreach (var file in files)
- {
- var version = Path.GetFileNameWithoutExtension(file);
-
- // Check if the migration has already been applied
- if (string.Compare(version, lastAppliedVersion, StringComparison.OrdinalIgnoreCase) <= 0) continue;
- var sqlScript = File.ReadAllText(file);
-
- using var cmdMigration = new MySqlCommand(sqlScript, connection);
- cmdMigration.ExecuteNonQuery();
-
- // Update the last applied migration version
- UpdateLastAppliedVersion(connection, version);
-
- CS2_SimpleAdmin._logger?.LogInformation($"Migration \"{version}\" successfully applied.");
- }
- }
-
- private static string GetLastAppliedVersion(MySqlConnection connection)
- {
- using var cmd = new MySqlCommand("SELECT `version` FROM `sa_migrations` ORDER BY `id` DESC LIMIT 1;", connection);
- var result = cmd.ExecuteScalar();
- return result?.ToString() ?? string.Empty;
- }
-
- private static void UpdateLastAppliedVersion(MySqlConnection connection, string version)
- {
- using var cmd = new MySqlCommand("INSERT INTO `sa_migrations` (`version`) VALUES (@Version);", connection);
- cmd.Parameters.AddWithValue("@Version", version);
- cmd.ExecuteNonQuery();
- }
-}
diff --git a/Database/Migrations/001_CreateTables.sql b/Database/Migrations/001_CreateTables.sql
deleted file mode 100644
index fb8292f..0000000
--- a/Database/Migrations/001_CreateTables.sql
+++ /dev/null
@@ -1,50 +0,0 @@
-CREATE TABLE IF NOT EXISTS `sa_bans` (
- `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- `player_name` VARCHAR(128),
- `player_steamid` VARCHAR(64),
- `player_ip` VARCHAR(128),
- `admin_steamid` VARCHAR(64) NOT NULL,
- `admin_name` VARCHAR(128) NOT NULL,
- `reason` VARCHAR(255) NOT NULL,
- `duration` INT NOT NULL,
- `ends` TIMESTAMP NULL,
- `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `server_id` INT NULL,
- `status` ENUM('ACTIVE', 'UNBANNED', 'EXPIRED', '') NOT NULL DEFAULT 'ACTIVE'
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-CREATE TABLE IF NOT EXISTS `sa_mutes` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `player_name` varchar(128) NULL,
- `player_steamid` varchar(64) NOT NULL,
- `admin_steamid` varchar(64) NOT NULL,
- `admin_name` varchar(128) NOT NULL,
- `reason` varchar(255) NOT NULL,
- `duration` int(11) NOT NULL,
- `ends` timestamp NULL,
- `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `type` enum('GAG','MUTE','SILENCE','') NOT NULL DEFAULT 'GAG',
- `server_id` INT NULL,
- `status` enum('ACTIVE','UNMUTED','EXPIRED','') NOT NULL DEFAULT 'ACTIVE',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-CREATE TABLE IF NOT EXISTS `sa_admins` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `player_name` varchar(128) NOT NULL,
- `player_steamid` varchar(64) NOT NULL,
- `flags` TEXT NULL,
- `immunity` int(11) NOT NULL DEFAULT 0,
- `server_id` INT NULL,
- `ends` timestamp NULL,
- `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-CREATE TABLE IF NOT EXISTS `sa_servers` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `hostname` varchar(128) NOT NULL,
- `address` varchar(64) NOT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `address` (`address`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
diff --git a/Database/Migrations/002_CreateFlagsTable.sql b/Database/Migrations/002_CreateFlagsTable.sql
deleted file mode 100644
index 3c9b75b..0000000
--- a/Database/Migrations/002_CreateFlagsTable.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE IF NOT EXISTS `sa_admins_flags` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `admin_id` int(11) NOT NULL,
- `flag` varchar(64) NOT NULL,
- PRIMARY KEY (`id`),
- FOREIGN KEY (`admin_id`) REFERENCES `sa_admins` (`id`) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-ALTER TABLE `sa_admins` CHANGE `flags` `flags` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL;
diff --git a/Database/Migrations/003_ChangeColumnsPosition.sql b/Database/Migrations/003_ChangeColumnsPosition.sql
deleted file mode 100644
index d25915a..0000000
--- a/Database/Migrations/003_ChangeColumnsPosition.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE `sa_bans` CHANGE `player_name` `player_name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`;
-ALTER TABLE `sa_mutes` CHANGE `player_name` `player_name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`;
-ALTER TABLE `sa_admins` CHANGE `player_name` `player_name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`;
-ALTER TABLE `sa_servers` CHANGE `hostname` `hostname` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`;
\ No newline at end of file
diff --git a/Database/Migrations/004_MoveOldFlagsToFlagsTable.sql b/Database/Migrations/004_MoveOldFlagsToFlagsTable.sql
deleted file mode 100644
index 71ca42b..0000000
--- a/Database/Migrations/004_MoveOldFlagsToFlagsTable.sql
+++ /dev/null
@@ -1,36 +0,0 @@
-INSERT INTO sa_admins_flags (admin_id, flag)
-SELECT
- min_admins.admin_id,
- TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(sa_admins.flags, ',', numbers.n), ',', -1)) AS flag
-FROM (
- SELECT MIN(id) AS admin_id, player_steamid, server_id
- FROM sa_admins
- WHERE player_steamid != 'Console'
- GROUP BY player_steamid, server_id
-) AS min_admins
-JOIN sa_admins ON min_admins.player_steamid = sa_admins.player_steamid
-JOIN (
- SELECT 1 AS n UNION ALL
- SELECT 2 UNION ALL
- SELECT 3 UNION ALL
- SELECT 4 UNION ALL
- SELECT 5 UNION ALL
- SELECT 6 UNION ALL
- SELECT 7 UNION ALL
- SELECT 8 UNION ALL
- SELECT 9 UNION ALL
- SELECT 10 UNION ALL
- SELECT 11 UNION ALL
- SELECT 12 UNION ALL
- SELECT 13 UNION ALL
- SELECT 14 UNION ALL
- SELECT 15 UNION ALL
- SELECT 16 UNION ALL
- SELECT 17 UNION ALL
- SELECT 18 UNION ALL
- SELECT 19 UNION ALL
- SELECT 20
-) AS numbers
-ON CHAR_LENGTH(sa_admins.flags) - CHAR_LENGTH(REPLACE(sa_admins.flags, ',', '')) >= numbers.n - 1
-AND (min_admins.server_id = sa_admins.server_id OR (min_admins.server_id IS NULL AND sa_admins.server_id IS NULL))
-WHERE sa_admins.id IS NOT NULL;
diff --git a/Database/Migrations/005_CreateUnbansTable.sql b/Database/Migrations/005_CreateUnbansTable.sql
deleted file mode 100644
index 6666539..0000000
--- a/Database/Migrations/005_CreateUnbansTable.sql
+++ /dev/null
@@ -1,29 +0,0 @@
-CREATE TABLE IF NOT EXISTS `sa_unbans` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `ban_id` int(11) NOT NULL,
- `admin_id` int(11) NOT NULL DEFAULT 0,
- `reason` varchar(255) NOT NULL DEFAULT 'Unknown',
- `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-CREATE TABLE IF NOT EXISTS `sa_unmutes` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `mute_id` int(11) NOT NULL,
- `admin_id` int(11) NOT NULL DEFAULT 0,
- `reason` varchar(255) NOT NULL DEFAULT 'Unknown',
- `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-INSERT INTO `sa_admins` (`id`, `player_name`, `player_steamid`, `flags`, `immunity`, `server_id`, `ends`, `created`)
-VALUES (-1, 'Console', 'Console', '', '0', NULL, NULL, NOW());
-
-UPDATE `sa_admins` SET `id` = 0 WHERE `id` = -1;
-
-ALTER TABLE `sa_bans` ADD `unban_id` INT NULL AFTER `server_id`;
-ALTER TABLE `sa_mutes` ADD `unmute_id` INT NULL AFTER `server_id`;
-ALTER TABLE `sa_bans` ADD FOREIGN KEY (`unban_id`) REFERENCES `sa_unbans`(`id`) ON DELETE CASCADE;
-ALTER TABLE `sa_mutes` ADD FOREIGN KEY (`unmute_id`) REFERENCES `sa_unmutes`(`id`) ON DELETE CASCADE;
-ALTER TABLE `sa_unbans` ADD FOREIGN KEY (`admin_id`) REFERENCES `sa_admins`(`id`) ON DELETE CASCADE;
-ALTER TABLE `sa_unmutes` ADD FOREIGN KEY (`admin_id`) REFERENCES `sa_admins`(`id`) ON DELETE CASCADE;
diff --git a/Database/Migrations/006_ServerGroupsFeature.sql b/Database/Migrations/006_ServerGroupsFeature.sql
deleted file mode 100644
index 4424189..0000000
--- a/Database/Migrations/006_ServerGroupsFeature.sql
+++ /dev/null
@@ -1,26 +0,0 @@
-CREATE TABLE IF NOT EXISTS `sa_groups` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(255) NOT NULL,
- `immunity` int(11) NOT NULL DEFAULT 0,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-CREATE TABLE IF NOT EXISTS `sa_groups_flags` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `group_id` int(11) NOT NULL,
- `flag` varchar(64) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-CREATE TABLE IF NOT EXISTS `sa_groups_servers` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `group_id` int(11) NOT NULL,
- `server_id` int(11) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
-ALTER TABLE `sa_admins` ADD `group_id` INT NULL AFTER `created`;
-
-ALTER TABLE `sa_groups_flags` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE;
-ALTER TABLE `sa_groups_servers` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE;
-ALTER TABLE `sa_admins` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE SET NULL;
\ No newline at end of file
diff --git a/Database/Migrations/007_ServerGroupsGlobal.sql b/Database/Migrations/007_ServerGroupsGlobal.sql
deleted file mode 100644
index 34d1945..0000000
--- a/Database/Migrations/007_ServerGroupsGlobal.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE `sa_groups_servers` CHANGE `server_id` `server_id` INT(11) NULL;
\ No newline at end of file
diff --git a/Database/Migrations/008_OnlineTimeInPenalties.sql b/Database/Migrations/008_OnlineTimeInPenalties.sql
deleted file mode 100644
index d22934f..0000000
--- a/Database/Migrations/008_OnlineTimeInPenalties.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE `sa_mutes` ADD `passed` INT NULL AFTER `duration`;
diff --git a/Database/Migrations/009_BanAllUsedIpAddress.sql b/Database/Migrations/009_BanAllUsedIpAddress.sql
deleted file mode 100644
index 2fa6688..0000000
--- a/Database/Migrations/009_BanAllUsedIpAddress.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE IF NOT EXISTS `sa_players_ips` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `steamid` bigint(20) NOT NULL,
- `address` varchar(64) NOT NULL,
- `used_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`),
- UNIQUE KEY `steamid` (`steamid`,`address`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
diff --git a/Database/Migrations/010_CreateWarnsTable.sql b/Database/Migrations/010_CreateWarnsTable.sql
deleted file mode 100644
index de1afa5..0000000
--- a/Database/Migrations/010_CreateWarnsTable.sql
+++ /dev/null
@@ -1,14 +0,0 @@
-CREATE TABLE IF NOT EXISTS `sa_warns` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `player_name` varchar(128) DEFAULT NULL,
- `player_steamid` varchar(64) NOT NULL,
- `admin_steamid` varchar(64) NOT NULL,
- `admin_name` varchar(128) NOT NULL,
- `reason` varchar(255) NOT NULL,
- `duration` int(11) NOT NULL,
- `ends` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `server_id` int(11) DEFAULT NULL,
- `status` enum('ACTIVE','EXPIRED','') NOT NULL DEFAULT 'ACTIVE',
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
diff --git a/Events.cs b/Events.cs
deleted file mode 100644
index 2117e3d..0000000
--- a/Events.cs
+++ /dev/null
@@ -1,514 +0,0 @@
-using CounterStrikeSharp.API;
-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 Dapper;
-using Microsoft.Extensions.Logging;
-using System.Text;
-
-namespace CS2_SimpleAdmin;
-
-public partial class CS2_SimpleAdmin
-{
- private int _getIpTryCount = 0;
-
- private void RegisterEvents()
- {
- RegisterListener(OnMapStart);
- RegisterListener(OnGameServerSteamAPIActivated);
- AddCommandListener("say", OnCommandSay);
- AddCommandListener("say_team", OnCommandTeamSay);
- }
-
- private void OnGameServerSteamAPIActivated()
- {
- AddTimer(2.0f, () =>
- {
- if (_serverLoaded || ServerId != null || _database == null) return;
-
- var ipAddress = ConVar.Find("ip")?.StringValue;
-
- if (string.IsNullOrEmpty(ipAddress) || ipAddress.StartsWith("0.0.0"))
- {
- ipAddress = Helper.GetServerIp();
- }
-
- if (string.IsNullOrEmpty(ipAddress) || ipAddress.StartsWith("0.0.0"))
- {
- if (_getIpTryCount < 12)
- {
- _getIpTryCount++;
- OnGameServerSteamAPIActivated();
- return;
- }
- }
-
- var address = $"{ipAddress}:{ConVar.Find("hostport")?.GetPrimitiveValue()}";
- var hostname = ConVar.Find("hostname")!.StringValue;
-
- Task.Run(async () =>
- {
- try
- {
- await using var connection = await _database.GetConnectionAsync();
- var addressExists = await connection.ExecuteScalarAsync(
- "SELECT COUNT(*) FROM sa_servers WHERE address = @address",
- new { address });
-
- if (!addressExists)
- {
- await connection.ExecuteAsync(
- "INSERT INTO sa_servers (address, hostname) VALUES (@address, @hostname)",
- new { address, hostname });
- }
- else
- {
- await connection.ExecuteAsync(
- "UPDATE `sa_servers` SET `hostname` = @hostname, `id` = `id` WHERE `address` = @address",
- new { address, hostname });
- }
-
- int? serverId = await connection.ExecuteScalarAsync(
- "SELECT `id` FROM `sa_servers` WHERE `address` = @address",
- new { address });
-
- ServerId = serverId;
-
- if (ServerId != null)
- {
- await Server.NextFrameAsync(() => ReloadAdmins(null));
- }
-
- _serverLoaded = true;
- }
- catch (Exception ex)
- {
- _logger?.LogCritical("Unable to create or get server_id: " + ex.Message);
- }
-
- if (Config.EnableMetrics)
- {
- var queryString = $"?address={address}&hostname={hostname}";
- using HttpClient client = new();
-
- try
- {
- await client.GetAsync($"https://api.daffyy.love/index.php{queryString}");
- }
- catch (HttpRequestException ex)
- {
- Logger.LogWarning($"Unable to make metrics call: {ex.Message}");
- }
- }
- });
- });
-
- _getIpTryCount = 0;
- }
-
- [GameEventHandler]
- public HookResult OnClientDisconnect(EventPlayerDisconnect @event, GameEventInfo info)
- {
- CCSPlayerController? player = @event.Userid;
-
-#if DEBUG
- Logger.LogCritical("[OnClientDisconnect] Before");
-#endif
-
- if (player == null || !player.IsValid || player.IsBot)
- {
- return HookResult.Continue;
- }
-
-#if DEBUG
- Logger.LogCritical("[OnClientDisconnect] After Check");
-#endif
- try
- {
- PlayerPenaltyManager.RemoveAllPenalties(player.Slot);
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player.SteamID}");
-
- SilentPlayers.Remove(player.Slot);
- GodPlayers.Remove(player.Slot);
-
- var authorizedSteamId = player.AuthorizedSteamID;
- if (authorizedSteamId == null || !PermissionManager.AdminCache.TryGetValue(authorizedSteamId,
- out var expirationTime)
- || !(expirationTime <= DateTime.UtcNow.ToLocalTime())) return HookResult.Continue;
-
- AdminManager.ClearPlayerPermissions(authorizedSteamId);
- AdminManager.RemovePlayerAdminData(authorizedSteamId);
-
- return HookResult.Continue;
- }
- catch (Exception ex)
- {
- Logger.LogError($"An error occurred in OnClientDisconnect: {ex.Message}");
- return HookResult.Continue;
- }
- }
-
- [GameEventHandler]
- public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info)
- {
- CCSPlayerController? player = @event.Userid;
-
- if (player == null || string.IsNullOrEmpty(player.IpAddress) || player.IpAddress.Contains("127.0.0.1")
- || player.IsBot || !player.UserId.HasValue)
- return HookResult.Continue;
-
- var ipAddress = player.IpAddress.Split(":")[0];
-
- // Check if the player's IP or SteamID is in the bannedPlayers list
- if (Config.BanType > 0 && BannedPlayers.Contains(ipAddress) || BannedPlayers.Contains(player.SteamID.ToString()))
- {
- // Kick the player if banned
- if (player.UserId.HasValue)
- Helper.KickPlayer(player.UserId.Value, "Banned");
-
- return HookResult.Continue;
- }
-
- if (_database == null) return HookResult.Continue;
-
- var playerInfo = new PlayerInfo
- {
- UserId = player.UserId.Value,
- Slot = player.Slot,
- SteamId = player.SteamID.ToString(),
- Name = player.PlayerName,
- IpAddress = ipAddress
- };
-
- // Perform asynchronous database operations within a single method
- Task.Run(async () =>
- {
- // Initialize managers
- BanManager banManager = new(_database, Config);
- MuteManager muteManager = new(_database);
-
- try
- {
- await using var connection = await _database.GetConnectionAsync();
-
- const string query = """
- INSERT INTO `sa_players_ips` (steamid, address)
- VALUES (@SteamID, @IPAddress) ON DUPLICATE KEY UPDATE `used_at` = CURRENT_TIMESTAMP
- """;
-
- await connection.ExecuteAsync(query, new
- {
- SteamID = playerInfo.SteamId,
- IPAddress = playerInfo.IpAddress,
- });
- }
- catch { }
-
- try
- {
- // Check if the player is banned
- bool isBanned = await banManager.IsPlayerBanned(playerInfo);
- if (isBanned)
- {
- // Add player's IP and SteamID to bannedPlayers list if not already present
- if (Config.BanType > 0 && playerInfo.IpAddress != null &&
- !BannedPlayers.Contains(playerInfo.IpAddress))
- {
- BannedPlayers.Add(playerInfo.IpAddress);
- }
-
- if (playerInfo.SteamId != null && !BannedPlayers.Contains(playerInfo.SteamId))
- {
- BannedPlayers.Add(playerInfo.SteamId);
- }
-
- // Kick the player if banned
- await Server.NextFrameAsync(() =>
- {
- var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId.Value);
-
- if (victim?.UserId != null)
- {
- if (UnlockedCommands)
- Server.ExecuteCommand($"banid 2 {playerInfo.UserId}");
-
- Helper.KickPlayer(victim.UserId.Value, "Banned");
- }
- });
-
- return;
- }
-
- // Check if the player is muted
- var activeMutes = await muteManager.IsPlayerMuted(playerInfo.SteamId);
- if (activeMutes.Count > 0)
- {
- foreach (var mute in activeMutes)
- {
- string muteType = mute.type;
- DateTime ends = mute.ends;
- int duration = mute.duration;
- switch (muteType)
- {
- // Apply mute penalty based on mute type
- case "GAG":
- PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration);
- await Server.NextFrameAsync(() =>
- {
- if (_tagsDetected)
- {
- Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
- }
- });
- break;
- case "MUTE":
- PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration);
- await Server.NextFrameAsync(() =>
- {
- player.VoiceFlags = VoiceFlags.Muted;
- });
- break;
- default:
- PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration);
- await Server.NextFrameAsync(() =>
- {
- player.VoiceFlags = VoiceFlags.Muted;
- if (_tagsDetected)
- {
- Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
- }
- });
- break;
- }
- }
- }
- }
- catch (Exception ex)
- {
- Logger.LogError($"Error processing player connection: {ex}");
- }
- });
-
- if (RenamedPlayers.TryGetValue(player.SteamID, out var name))
- {
- player.Rename(name);
- }
-
- return HookResult.Continue;
- }
-
- [GameEventHandler]
- public HookResult OnRoundEnd(EventRoundStart @event, GameEventInfo info)
- {
-#if DEBUG
- Logger.LogCritical("[OnRoundEnd]");
-#endif
-
- GodPlayers.Clear();
- return HookResult.Continue;
- }
-
- public HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info)
- {
- if (player is null || !player.IsValid || player.IsBot)
- return HookResult.Continue;
-
- if (info.GetArg(1).StartsWith($"/")
- || info.GetArg(1).StartsWith($"!"))
- return HookResult.Continue;
-
- if (info.GetArg(1).Length == 0)
- return HookResult.Handled;
-
- if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
- return HookResult.Handled;
-
- return HookResult.Continue;
- }
-
- public HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info)
- {
- if (player is null || !player.IsValid || player.IsBot)
- return HookResult.Continue;
-
- if (info.GetArg(1).StartsWith($"/")
- || info.GetArg(1).StartsWith($"!"))
- return HookResult.Continue;
-
- if (info.GetArg(1).Length == 0)
- return HookResult.Handled;
-
- if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
- return HookResult.Handled;
-
- if (!info.GetArg(1).StartsWith($"@")) return HookResult.Continue;
-
- 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 is { IsBot: false, IsHLTV: false } && 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 is { IsValid: true, IsBot: false, IsHLTV: false } && AdminManager.PlayerHasPermissions(p, "@css/chat")))
- {
- p.PrintToChat(sb.ToString());
- }
- }
-
- return HookResult.Handled;
- }
-
- private void OnMapStart(string mapName)
- {
- if (Config.ReloadAdminsEveryMapChange && _serverLoaded && ServerId != null)
- AddTimer(3.0f, () => ReloadAdmins(null));
-
- AddTimer(34, () =>
- {
- if (!_serverLoaded)
- OnGameServerSteamAPIActivated();
- });
-
- var path = Path.GetDirectoryName(ModuleDirectory);
- if (Directory.Exists(path + "/CS2-Tags"))
- {
- _tagsDetected = true;
- }
-
- GodPlayers.Clear();
- SilentPlayers.Clear();
-
- PlayerPenaltyManager.RemoveAllPenalties();
-
- _database = new Database.Database(_dbConnectionString);
-
- AddTimer(61.0f, () =>
- {
-#if DEBUG
- Logger.LogCritical("[OnMapStart] Expired check");
-#endif
-
- var players = Helper.GetValidPlayers();
- var onlinePlayers = players
- .Where(player => player.IpAddress != null)
- .Select(player => (player.IpAddress, player.SteamID, player.UserId, player.Slot))
- .ToList();
-
- Task.Run(async () =>
- {
- PermissionManager adminManager = new(_database);
- BanManager banManager = new(_database, Config);
- MuteManager muteManager = new(_database);
- WarnManager warnManager = new(_database);
-
- await muteManager.ExpireOldMutes();
- await banManager.ExpireOldBans();
- await warnManager.ExpireOldWarns();
- await adminManager.DeleteOldAdmins();
-
- BannedPlayers.Clear();
-
- if (onlinePlayers.Count > 0)
- {
- try
- {
- await banManager.CheckOnlinePlayers(onlinePlayers);
-
- if (Config.TimeMode == 0)
- {
- await muteManager.CheckOnlineModeMutes(onlinePlayers);
- }
- }
- catch(Exception)
- {
- Logger.LogError("Unable to check bans for online players");
-
- }
- }
-
-
- await Server.NextFrameAsync(() =>
- {
- if (onlinePlayers.Count > 0)
- {
- try
- {
- foreach (var player in players.Where(player => PlayerPenaltyManager.IsSlotInPenalties(player.Slot)))
- {
- if (!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
- player.VoiceFlags = VoiceFlags.Normal;
-
- if (!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) && !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
- {
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player.SteamID}");
- }
-
- if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) ||
- PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) ||
- PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag)) continue;
- player.VoiceFlags = VoiceFlags.Normal;
-
- if (_tagsDetected)
- Server.ExecuteCommand($"css_tag_unmute {player.SteamID}");
- }
-
- PlayerPenaltyManager.RemoveExpiredPenalties();
- }
- catch(Exception)
- {
- Logger.LogError("Unable to remove old penalties");
- }
- }
- });
- });
- }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
- }
-
- [GameEventHandler]
- public HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
- {
- CCSPlayerController? player = @event.Userid;
-
- if (player is null || @event.Attacker is null || !player.PawnIsAlive || player.PlayerPawn.Value == null)
- return HookResult.Continue;
-
- if (!GodPlayers.Contains(player.Slot)) return HookResult.Continue;
-
- player.PlayerPawn.Value.Health = player.PlayerPawn.Value.MaxHealth;
- player.PlayerPawn.Value.ArmorValue = 100;
-
- return HookResult.Continue;
- }
-
- [GameEventHandler]
- public HookResult OnChangedName(EventPlayerChangename @event, GameEventInfo _)
- {
- CCSPlayerController? player = @event.Userid;
-
- if (player is null || !player.IsValid || player.IsBot)
- return HookResult.Continue;
-
- if (RenamedPlayers.TryGetValue(player.SteamID, out var name))
- {
- if (@event.Newname.Equals(name))
- return HookResult.Continue;
-
- player.Rename(name);
- }
-
- return HookResult.Continue;
- }
-}
\ No newline at end of file
diff --git a/Extensions/PlayerExtensions.cs b/Extensions/PlayerExtensions.cs
deleted file mode 100644
index 7cebb2b..0000000
--- a/Extensions/PlayerExtensions.cs
+++ /dev/null
@@ -1,214 +0,0 @@
-using CounterStrikeSharp.API;
-using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Translations;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Entities;
-using CounterStrikeSharp.API.Modules.Memory;
-using Microsoft.Extensions.Localization;
-using System.Text;
-using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
-
-namespace CS2_SimpleAdmin;
-
-public static class PlayerExtensions
-{
- public static void Slap(this CBasePlayerPawn pawn, int damage = 0)
- {
- 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 (controller is null || target is null) return true;
- if (target.IsBot) return true;
-
- return AdminManager.CanPlayerTarget(controller, target) ||
- AdminManager.CanPlayerTarget(new SteamID(controller.SteamID),
- new SteamID(target.SteamID));
- }
-
- public static void SetSpeed(this CCSPlayerController? controller, float speed)
- {
- var playerPawnValue = controller?.PlayerPawn.Value;
- if (playerPawnValue == null) return;
-
- playerPawnValue.VelocityModifier = speed;
- }
-
- public static void SetGravity(this CCSPlayerController? controller, float gravity)
- {
- var playerPawnValue = controller?.PlayerPawn.Value;
- if (playerPawnValue == null) return;
-
- playerPawnValue.GravityScale = gravity;
- }
-
- public static void SetMoney(this CCSPlayerController? controller, int money)
- {
- var moneyServices = controller?.InGameMoneyServices;
- if (moneyServices == null) return;
-
- moneyServices.Account = money;
-
- if (controller != null) Utilities.SetStateChanged(controller, "CCSPlayerController", "m_pInGameMoneyServices");
- }
-
- public static void SetHp(this CCSPlayerController? controller, int health = 100)
- {
- if (controller == null) return;
- if ((health <= 0 || !controller.PawnIsAlive || controller.PlayerPawn.Value == null)) return;
-
- controller.PlayerPawn.Value.Health = health;
-
- if (health > 100)
- {
- controller.PlayerPawn.Value.MaxHealth = health;
- }
-
- Utilities.SetStateChanged(controller.PlayerPawn.Value, "CBaseEntity", "m_iHealth");
- }
-
- 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_OBSOLETE;
- Schema.SetSchemaValue(pawn.Handle, "CBaseEntity", "m_nActualMoveType", 1); // obsolete
- Utilities.SetStateChanged(pawn, "CBaseEntity", "m_MoveType");
- }
-
- public static void Unfreeze(this CBasePlayerPawn pawn)
- {
- pawn.MoveType = MoveType_t.MOVETYPE_WALK;
- Schema.SetSchemaValue(pawn.Handle, "CBaseEntity", "m_nActualMoveType", 2); // walk
- Utilities.SetStateChanged(pawn, "CBaseEntity", "m_MoveType");
- }
-
- public static void ToggleNoclip(this CBasePlayerPawn pawn)
- {
- if (pawn.MoveType == MoveType_t.MOVETYPE_NOCLIP)
- {
- pawn.MoveType = MoveType_t.MOVETYPE_WALK;
- Schema.SetSchemaValue(pawn.Handle, "CBaseEntity", "m_nActualMoveType", 2); // walk
- Utilities.SetStateChanged(pawn, "CBaseEntity", "m_MoveType");
- }
- else
- {
- pawn.MoveType = MoveType_t.MOVETYPE_NOCLIP;
- Schema.SetSchemaValue(pawn.Handle, "CBaseEntity", "m_nActualMoveType", 8); // noclip
- Utilities.SetStateChanged(pawn, "CBaseEntity", "m_MoveType");
- }
- }
-
- public static void Rename(this CCSPlayerController? controller, string newName = "Unknown")
- {
- newName ??= CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown";
-
- if (controller != null)
- {
- var playerName = new SchemaString(controller, "m_iszPlayerName");
- playerName.Set(newName + " ");
-
- CS2_SimpleAdmin.Instance.AddTimer(0.25f, () =>
- {
- Utilities.SetStateChanged(controller, "CCSPlayerController", "m_szClan");
- Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName");
- });
-
- CS2_SimpleAdmin.Instance.AddTimer(0.3f, () =>
- {
- playerName.Set(newName);
- });
- }
-
- CS2_SimpleAdmin.Instance.AddTimer(0.4f, () =>
- {
- if (controller != null) Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName");
- });
- }
-
- public static void TeleportPlayer(this CCSPlayerController? controller, CCSPlayerController? target)
- {
- if (controller?.PlayerPawn?.Value == null && target!.PlayerPawn?.Value == null)
- return;
-
- if (
- controller?.PlayerPawn?.Value?.AbsOrigin != null &&
- controller?.PlayerPawn?.Value?.AbsRotation != null &&
- target?.PlayerPawn?.Value?.AbsOrigin != null &&
- target?.PlayerPawn?.Value?.AbsRotation != null
- )
- {
- controller.PlayerPawn.Value.Teleport(
- target.PlayerPawn.Value.AbsOrigin,
- target.PlayerPawn.Value.AbsRotation,
- target.PlayerPawn.Value.AbsVelocity
- );
- }
- }
-
- 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.AbsVelocity.X = vel.X;
- pawn.AbsVelocity.Y = vel.Y;
- pawn.AbsVelocity.Z = vel.Z;
-
- if (damage <= 0)
- return;
-
- pawn.Health -= damage;
- Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
-
- if (pawn.Health <= 0)
- pawn.CommitSuicide(true, true);
- }
-
- public static void SendLocalizedMessage(this CCSPlayerController? controller, IStringLocalizer localizer, string messageKey, params object[] messageArgs)
- {
- if (controller == null) return;
-
- using (new WithTemporaryCulture(controller.GetLanguage()))
- {
- StringBuilder sb = new(localizer["sa_prefix"]);
- sb.Append(localizer[messageKey, messageArgs]);
- foreach (var part in Helper.SeparateLines(sb.ToString()))
- {
- controller.PrintToChat(part);
- }
- }
- }
-
-}
\ No newline at end of file
diff --git a/Helper.cs b/Helper.cs
deleted file mode 100644
index a91ca84..0000000
--- a/Helper.cs
+++ /dev/null
@@ -1,513 +0,0 @@
-using System.Drawing;
-using CounterStrikeSharp.API;
-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 CounterStrikeSharp.API.Modules.Memory;
-using CounterStrikeSharp.API.Modules.Menu;
-using Discord;
-using Discord.Webhook;
-using Microsoft.Extensions.Localization;
-using Microsoft.Extensions.Logging;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Text.Json;
-using System.Text.RegularExpressions;
-using Color = Discord.Color;
-
-namespace CS2_SimpleAdmin
-{
- internal class Helper
- {
- private static readonly string AssemblyName = Assembly.GetExecutingAssembly().GetName().Name ?? "";
- private static readonly string CfgPath = $"{Server.GameDirectory}/csgo/addons/counterstrikesharp/configs/plugins/{AssemblyName}/{AssemblyName}.json";
-
- public delegate nint CNetworkSystem_UpdatePublicIp(nint a1);
- public static CNetworkSystem_UpdatePublicIp? _networkSystemUpdatePublicIp;
-
- internal static CS2_SimpleAdminConfig? Config { get; set; }
-
- public static bool IsDebugBuild
- {
- get
- {
-#if DEBUG
- return true;
-#else
- return false;
-#endif
- }
- }
-
- public static List GetPlayerFromName(string name)
- {
- return Utilities.GetPlayers().FindAll(x => x.PlayerName.Equals(name, StringComparison.OrdinalIgnoreCase));
- }
-
- public static List GetPlayerFromSteamid64(string steamid)
- {
- return GetValidPlayers().FindAll(x =>
- x.SteamID.ToString().Equals(steamid, StringComparison.OrdinalIgnoreCase)
- );
- }
-
- public static List GetPlayerFromIp(string ipAddress)
- {
- return GetValidPlayers().FindAll(x =>
- x.IpAddress != null &&
- x.IpAddress.Split(":")[0].Equals(ipAddress)
- );
- }
-
- public static List GetValidPlayers()
- {
- return Utilities.GetPlayers().FindAll(p => p is
- { IsValid: true, IsBot: false, Connected: PlayerConnectedState.PlayerConnected });
- }
-
- public static IEnumerable GetValidPlayersWithBots()
- {
- return Utilities.GetPlayers().FindAll(p =>
- p is { IsValid: true, IsBot: false, IsHLTV: false } or { IsValid: true, IsBot: true, IsHLTV: false }
- );
- }
-
- public static bool IsValidSteamId64(string input)
- {
- const string pattern = @"^\d{17}$";
- return Regex.IsMatch(input, pattern);
- }
-
- public static bool ValidateSteamId(string input, out SteamID? steamId)
- {
- steamId = null;
-
- if (string.IsNullOrEmpty(input))
- {
- return false;
- }
-
- if (!SteamID.TryParse(input, out var parsedSteamId)) return false;
-
- steamId = parsedSteamId;
- return true;
- }
-
- public static bool IsValidIp(string input)
- {
- const 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 void GivePlayerFlags(SteamID? steamid, List? flags = null, uint immunity = 0)
- {
- try
- {
- if (steamid == null || (flags == null && immunity == 0))
- {
- return;
- }
-
- if (flags == null) return;
- foreach (var flag in flags.Where(flag => !string.IsNullOrEmpty(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);
- }
- }
-
- AdminManager.SetPlayerImmunity(steamid, immunity);
- }
- catch
- {
- }
- }
-
- public static void KickPlayer(int userId, string? reason = null)
- {
- if (!string.IsNullOrEmpty(reason))
- {
- var escapeChars = reason.IndexOfAny([';', '|']);
-
- if (escapeChars != -1)
- {
- reason = reason[..escapeChars];
- }
- }
-
- Server.ExecuteCommand($"kickid {userId} {reason}");
- }
-
- public static void PrintToCenterAll(string message)
- {
- Utilities.GetPlayers().Where(p => p is { IsValid: true, IsBot: false, IsHLTV: false }).ToList().ForEach(controller =>
- {
- controller.PrintToCenter(message);
- });
- }
-
- internal static void HandleVotes(CCSPlayerController player, ChatMenuOption option)
- {
- if (!CS2_SimpleAdmin.VoteInProgress)
- return;
-
- option.Disabled = true;
- CS2_SimpleAdmin.VoteAnswers[option.Text]++;
- }
-
- internal static void LogCommand(CCSPlayerController? caller, CommandInfo command)
- {
- if (CS2_SimpleAdmin._localizer == null)
- return;
-
- var playerName = caller?.PlayerName ?? "Console";
-
- var hostname = ConVar.Find("hostname")?.StringValue ?? CS2_SimpleAdmin._localizer["sa_unknown"];
-
- CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer[
- "sa_discord_log_command",
- playerName, command.GetCommandString]}".Replace("HOSTNAME", hostname).Replace("**", ""));
-
- SendDiscordLogMessage(caller, command, CS2_SimpleAdmin.DiscordWebhookClientLog, CS2_SimpleAdmin._localizer);
- }
-
- internal static void LogCommand(CCSPlayerController? caller, string command)
- {
- if (CS2_SimpleAdmin._localizer == null)
- return;
-
- var playerName = caller?.PlayerName ?? "Console";
- var hostnameCvar = ConVar.Find("hostname");
-
- var hostname = hostnameCvar?.StringValue ?? CS2_SimpleAdmin._localizer["sa_unknown"];
-
- CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer["sa_discord_log_command",
- playerName, command]}".Replace("HOSTNAME", hostname).Replace("**", ""));
-
- SendDiscordLogMessage(caller, command, CS2_SimpleAdmin.DiscordWebhookClientLog, CS2_SimpleAdmin._localizer);
- }
-
- /*public static IEnumerable