diff --git a/.gitignore b/.gitignore index 0bd57ef..377b3ef 100644 --- a/.gitignore +++ b/.gitignore @@ -11,52 +11,21 @@ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml -LRMini/.idea *.user *.cache *.editorconfig -LRMini/obj/Debug/net7.0/LRMini.AssemblyInfo.cs -LRMini/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs -LRMini/obj/Debug/net7.0/LRMini.GlobalUsings.g.cs -LRMini/obj/LRMini.csproj.nuget.dgspec.json -LRMini/obj/LRMini.csproj.nuget.g.props -LRMini/obj/LRMini.csproj.nuget.g.targets -LRMini/obj/project.assets.json -LRMini/obj/project.packagespec.json -LRMini/obj/rider.project.restore.info *.dll -*.json *.pdb *.CopyComplete *.txt -LRMini/obj/release/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs -LRMini/obj/release/net7.0/LRMini.AssemblyInfo.cs -LRMini/obj/release/net7.0/LRMini.GlobalUsings.g.cs -MiniAdmin/.idea/.idea.MiniAdmin.dir/.idea/indexLayout.xml -MiniAdmin/.idea/.idea.MiniAdmin.dir/.idea/projectSettingsUpdater.xml -MiniAdmin/.idea/.idea.MiniAdmin.dir/.idea/vcs.xml -MiniAdmin/.idea/.idea.MiniAdmin.dir/.idea/workspace.xml -MiniAdmin/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs -MiniAdmin/obj/Debug/net7.0/MiniAdmin.AssemblyInfo.cs -MiniAdmin/obj/MiniAdmin.csproj.nuget.g.props -MiniAdmin/obj/MiniAdmin.csproj.nuget.g.targets -*.info -MiniAdmin/.idea/.idea.MiniAdmin.dir/.idea/discord.xml -MiniAdmin/obj/release/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs -MiniAdmin/obj/release/net7.0/MiniAdmin.AssemblyInfo.cs -MiniAdmin/bin/release/net7.0/publish/MiniAdmin.zip -Old/.idea/.idea.MiniAdmin.dir/.idea/projectSettingsUpdater.xml -Old/.idea/.idea.MiniAdmin.dir/.idea/indexLayout.xml *.xml -Old/bin/release/net7.0/publish/MiniAdmin.zip -Old/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs -Old/obj/Debug/net7.0/MiniAdmin.AssemblyInfo.cs -Old/obj/MiniAdmin.csproj.nuget.g.targets -Old/obj/MiniAdmin.csproj.nuget.g.props -Old/obj/release/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs -Old/obj/release/net7.0/MiniAdmin.AssemblyInfo.cs -MiniAdmin/bin/release/net7.0/publish/BaseAdmin.zip -MiniAdmin/obj/release/net7.0/BaseAdmin.AssemblyInfo.cs -MiniAdmin/obj/Debug/net7.0/BaseAdmin.AssemblyInfo.cs -MiniAdmin/obj/BaseAdmin.csproj.nuget.g.targets -MiniAdmin/obj/BaseAdmin.csproj.nuget.g.props +Old +MiniAdmin/BaseAdmin/bin +MiniAdmin/BaseAdmin/obj +MiniAdmin/BaseAdmin/.idea + +MiniAdmin/BaseAdminApi/bin +MiniAdmin/BaseAdminApi/obj +MiniAdmin/BaseAdminApi/.idea +MiniAdmin/Modules +MiniAdmin/.idea diff --git a/MiniAdmin/AdminChat.cs b/MiniAdmin/AdminChat.cs deleted file mode 100644 index 56c5812..0000000 --- a/MiniAdmin/AdminChat.cs +++ /dev/null @@ -1,26 +0,0 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Utils; - -namespace BaseAdmin; - -public class AdminChat -{ - public void SendToAdminChat(CCSPlayerController player, string message) - { - player.PrintToChat( - $"[{ChatColors.Blue} AdminChat {ChatColors.Default}]{message}"); - } - - public void SendToAdminChatFromPlayer(CCSPlayerController player, string message) - { - player.PrintToChat( - $"[{ChatColors.Blue} From Players {ChatColors.Default}]{message}"); - } - - public void SendToAllFromAdmin(string message) - { - Server.PrintToChatAll( - $"[{ChatColors.Blue}ALL{ChatColors.Default}] {ChatColors.Blue}ADMIN{ChatColors.Default}: {message}"); - } -} \ No newline at end of file diff --git a/MiniAdmin/BaseAdmin.cs b/MiniAdmin/BaseAdmin.cs deleted file mode 100644 index 51eed45..0000000 --- a/MiniAdmin/BaseAdmin.cs +++ /dev/null @@ -1,1370 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.Serialization; -using System.Text.Json; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Core.Attributes.Registration; -using CounterStrikeSharp.API.Modules.Commands; -using CounterStrikeSharp.API.Modules.Cvars; -using CounterStrikeSharp.API.Modules.Entities; -using CounterStrikeSharp.API.Modules.Memory; -using CounterStrikeSharp.API.Modules.Timers; -using CounterStrikeSharp.API.Modules.Utils; -using Dapper; -using Microsoft.Extensions.Logging; -using MySqlConnector; - -namespace BaseAdmin; - -public class BaseAdmin : BasePlugin -{ - public override string ModuleAuthor => "thesamefabius"; - public override string ModuleName => "Mini Admin"; - public override string ModuleVersion => "v1.0.5"; - - private static string _dbConnectionString = string.Empty; - - //MENU - public readonly string Prefix = "[\x0C Admin Menu \x01]"; - - private readonly DateTime[] _playerPlayTime = new DateTime[65]; - private readonly MuteUserLocal?[] _muteUsers = new MuteUserLocal[65]; - private readonly Admins?[] _adminUsers = new Admins[65]; - - public Database Database = null!; - private AdminChat _adminChat = null!; - private Config _config; - - public enum MuteType - { - Micro = 0, - Chat, - All - } - - public enum AdminFlag - { - Reservation = 'a', - Generic = 'b', - Kick = 'c', - Ban = 'd', - Unban = 'e', - Slay = 'f', - Changemap = 'g', - Cvar = 'h', - Config = 'i', - Chat = 'j', - Vote = 'k', - Password = 'l', - Rcon = 'm', - Cheats = 'n', - Vip = 'o', - Root = 'z' - } - - public override void Load(bool hotReload) - { - _config = LoadConfig(); - _dbConnectionString = BuildConnectionString(); - Database = new Database(this, _dbConnectionString); - _adminChat = new AdminChat(); - new Menu(this).CreateMenu(); - - Task.Run(Database.CreateTable); - Task.Run(Database.CreateAdminsTable); - Task.Run(Database.CreateMuteTable); - - RegisterListener((slot, id) => - { - OnClientConnectedAsync(slot, Utilities.GetPlayerFromSlot(slot), id); - OnClientAuthorizedAsync(slot, id); - }); - - RegisterListener(slot => - { - _muteUsers[slot + 1] = null; - _adminUsers[slot + 1] = null; - _playerPlayTime[slot + 1] = DateTime.MinValue; - }); - - AddCommandListener("say", CommandListener_Say); - AddCommandListener("say_team", CommandListener_SayTeam); - - AddTimer(300, () => Task.Run(Database.DeleteExpiredAdminsAsync), TimerFlags.REPEAT); - AddTimer(60, () => - { - foreach (var player in Utilities.GetPlayers().Where(u => !u.IsBot)) - { - var user = _muteUsers[player.Index]; - - if (user == null) continue; - - var endTime = DateTimeOffset.FromUnixTimeSeconds(user.EndMuteTime).UtcDateTime; - - if (endTime <= DateTime.UtcNow) - { - if (user.MuteType is (int)MuteType.Micro or (int)MuteType.All) - player.VoiceFlags = VoiceFlags.Normal; - - _muteUsers[player.Index] = null; - } - } - }, TimerFlags.REPEAT); - } - - private HookResult ProcessChatMessage(CCSPlayerController? controller, CommandInfo info, bool sendToAllAdmins) - { - if (controller == null) return HookResult.Continue; - - var msg = GetTextInsideQuotes(info.ArgString); - var entityIndex = controller.Index; - - if (msg.StartsWith('@')) - { - if (CheckingForAdminAndFlag(controller, AdminFlag.Chat)) - { - if (sendToAllAdmins) - { - _adminChat.SendToAllFromAdmin(msg.Trim('@')); - return HookResult.Handled; - } - - foreach (var player in Utilities.GetPlayers() - .Where(player => CheckingForAdminAndFlag(player, AdminFlag.Chat))) - { - _adminChat.SendToAdminChat(player, - $" {ChatColors.Blue}{controller.PlayerName}{ChatColors.Default}: {msg.Trim('@')}"); - } - - return HookResult.Handled; - } - else - { - if (!IsUserMute(entityIndex)) - { - foreach (var player in Utilities.GetPlayers()) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Chat)) continue; - - _adminChat.SendToAdminChatFromPlayer(player, - $" {ChatColors.Blue}{controller.PlayerName}{ChatColors.Default}: {msg.Trim('@')}"); - return HookResult.Handled; - } - } - } - } - - if (IsUserMute(entityIndex)) - return CheckMuteStatus(controller, MuteType.Chat) ? HookResult.Handled : HookResult.Continue; - - return HookResult.Continue; - } - - private HookResult CommandListener_SayTeam(CCSPlayerController? controller, CommandInfo info) - { - return ProcessChatMessage(controller, info, sendToAllAdmins: false); - } - - private HookResult CommandListener_Say(CCSPlayerController? controller, CommandInfo info) - { - return ProcessChatMessage(controller, info, sendToAllAdmins: true); - } - - // private bool CheckMute(CCSPlayerController controller) - // { - // return CheckMuteStatus(controller, MuteType.Chat, "You cannot write a message because you have chat disabled. End via: "); - // } - // - // private bool CheckMicrophoneMute(CCSPlayerController controller) - // { - // return CheckMuteStatus(controller, MuteType.Micro, "You cannot use the microphone because it is muted. End via: "); - // } - - private bool CheckMuteStatus(CCSPlayerController controller, MuteType requiredMuteType) - { - var user = _muteUsers[controller.Index]; - - if (user == null) return false; - - if (user.MuteType != (int)MuteType.All && user.MuteType != (int)requiredMuteType) return false; - - var endTime = DateTimeOffset.FromUnixTimeSeconds(user.EndMuteTime).UtcDateTime; - var timeEnd = endTime - DateTime.UtcNow; - - var message = requiredMuteType == MuteType.Chat - ? "You cannot write a message because you have chat disabled. End via: " - : "You cannot use the microphone because it is muted. End via: "; - var time = - $"{(timeEnd.Days == 0 ? "" : $"{timeEnd.Days}d, ")}{timeEnd.Hours:00}:{timeEnd.Minutes:00}:{timeEnd.Seconds:00}"; - PrintToChat(controller, message + time); - return true; - } - - private async Task OnClientAuthorizedAsync(int playerSlot, SteamID steamId) - { - await LoadAdminUserAsync(steamId, playerSlot); - - var userMuted = await Database.GetActiveMuteAsync(steamId.SteamId2); - - if (userMuted != null) - { - _muteUsers[playerSlot + 1] = new MuteUserLocal - { - MuteType = userMuted.mute_type, - SteamId = userMuted.steamid, - EndMuteTime = userMuted.end_mute_time, - MuteActive = userMuted.mute_active - }; - - if (userMuted.mute_type is (int)MuteType.Micro or (int)MuteType.All) - { - Server.NextFrame(() => Utilities.GetPlayerFromSlot(playerSlot).VoiceFlags = VoiceFlags.Muted); - } - } - } - - public async Task LoadAdminUserAsync(SteamID steamId, int playerSlot) - { - var userAdmin = await Database.GetAdminFromDb(steamId.SteamId2); - - if (userAdmin != null) - { - _adminUsers[playerSlot + 1] = new Admins - { - username = userAdmin.username, - steamid = userAdmin.steamid, - start_time = userAdmin.start_time, - end_time = userAdmin.end_time, - immunity = userAdmin.immunity, - flags = userAdmin.flags - }; - } - } - - private async Task OnClientConnectedAsync(int slot, CCSPlayerController player, SteamID steamId) - { - try - { - await using var connection = new MySqlConnection(_dbConnectionString); - - var unbanUsers = await connection.QueryFirstOrDefaultAsync( - "SELECT * FROM miniadmin_bans WHERE steamid64 = @SteamId64 AND end_ban_time <= @CurrentTime AND ban_active = 1 AND end_ban_time != 0", - new { CurrentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), steamId.SteamId64 }); - - if (unbanUsers != null) - { - PrintLogInfo("Unban: {steamid}", unbanUsers.steamid); - await Database.UnbanUser(_config.BanFromConsoleName, _config.BanFromConsoleName, unbanUsers.steamid, "The deadline has passed"); - } - - var unmuteUsers = await connection.QueryFirstOrDefaultAsync( - "SELECT * FROM miniadmin_mute WHERE steamid64 = @SteamId64 AND end_mute_time <= @CurrentTime AND mute_active = 1 AND end_mute_time != 0", - new { CurrentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), steamId.SteamId64 }); - - if (unmuteUsers != null) - { - PrintLogInfo("Unmute: {steamid}", unmuteUsers.steamid); - await Database.UnmuteUser(-1, _config.BanFromConsoleName, _config.BanFromConsoleName, unmuteUsers.steamid, "The deadline has passed"); - - if (unmuteUsers.mute_type is (int)MuteType.All or (int)MuteType.Micro) - Server.NextFrame(() => player.VoiceFlags = VoiceFlags.Normal); - } - - await Database.DeleteExpiredAdminsAsync(); - - var banUser = await connection.QueryFirstOrDefaultAsync( - "SELECT * FROM miniadmin_bans WHERE steamid64 = @SteamId64 AND ban_active = 1", - new { steamId.SteamId64 }); - - if (banUser != null) - player.Kick("Ban"); - else - _playerPlayTime[slot + 1] = DateTime.Now; - } - catch (Exception e) - { - PrintLogError(e.ToString()); - } - } - - [CommandHelper(0, "<#userid or username>", CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_noclip")] - public void OnCmdNoclip(CCSPlayerController? controller, CommandInfo command) - { - if (controller == null || !CheckingForAdminAndFlag(controller, AdminFlag.Cheats)) return; - - var msg = GetTextInsideQuotes(command.ArgString); - if (msg.StartsWith('#')) - { - GiveNoclip(controller, GetPlayerFromUserIdOrName(msg)); - return; - } - - GiveNoclip(controller); - } - - private void GiveNoclip(CCSPlayerController player, CCSPlayerController? target = null) - { - var playerPawn = target == null ? player.PlayerPawn.Value : target.PlayerPawn.Value; - if (playerPawn != null) - playerPawn.MoveType = playerPawn.MoveType switch - { - MoveType_t.MOVETYPE_NOCLIP => MoveType_t.MOVETYPE_WALK, - MoveType_t.MOVETYPE_WALK => MoveType_t.MOVETYPE_NOCLIP, - _ => playerPawn.MoveType - }; - - PrintToChatAll( - $"Admin '{player.PlayerName}' has issued a noclip to player '{(target == null ? $"{player.PlayerName}" : $"{target.PlayerName}")}'"); - } - - // [ConsoleCommand("css_refresh_admins")] - // public void OnCmdRefreshAdmins(CCSPlayerController? controller, CommandInfo command) - // { - // if (controller != null && !CheckingForAdminAndFlag(controller, AdminFlag.Root)) return; - // - // foreach (var players in Utilities.GetPlayers() - // .Where(u => u.AuthorizedSteamID != null && u.PlayerPawn.Value != null)) - // { - // Server.NextFrame(() => LoadAdminUserAsync(players.AuthorizedSteamID, players.Slot)); - // } - // - // const string msg = "The list of administrators has been successfully reloaded"; - // - // ReplyToCommand(controller, msg); - // } - // - // [CommandHelper(1, "")] - // [ConsoleCommand("css_reload_infractions")] - // public void OnCmdReloadInfractions(CCSPlayerController? controller, CommandInfo command) - // { - // if (controller == null) return; - // var target = GetPlayerFromSteamId(command.GetArg(1)); - // - // if (target == null) return; - // - // Server.NextFrame(() => LoadAdminUserAsync(target.AuthorizedSteamID, target.Slot)); - // - // const string msg = "The list of administrators has been successfully reloaded"; - // - // ReplyToCommand(controller, msg); - // } - - [CommandHelper(1, "<#userid or username> [-k]", CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_team")] - public void OnCmdChangeTeam(CCSPlayerController? controller, CommandInfo command) - { - if (controller == null || !CheckingForAdminAndFlag(controller, AdminFlag.Kick)) return; - - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (target == null) - { - ReplyToCommand(controller, "Player not found"); - return; - } - - if (command.ArgCount >= 3) - { - var team = GetTeam(command.GetArg(2)); - - if (command.ArgCount is 4) - target.ChangeTeam(team); - else - target.SwitchTeam(team); - - PrintToChatAll($"An administrator has moved a player {target.PlayerName} to another team"); - } - } - - private CsTeam GetTeam(string name) - { - return name switch - { - "ct" => CsTeam.CounterTerrorist, - "t" => CsTeam.Terrorist, - "tt" => CsTeam.Terrorist, - "none" => CsTeam.None, - _ => CsTeam.Spectator - }; - } - - [CommandHelper(1, "", CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_say")] - public void OnCmdSay(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Chat)) return; - - PrintToChatAll($"{ChatColors.Blue}Admin\x01: {command.ArgString}"); - } - - [CommandHelper(1, "<#userid or username> ", CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_psay")] - public void OnCmdPSay(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Chat)) return; - - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (target == null) - { - ReplyToCommand(controller, "Player not found"); - return; - } - - PrintToChat(target, - $"Private message from - {ChatColors.Blue}{(controller == null ? _config.BanFromConsoleName : controller.PlayerName)}\x01: {command.ArgString}"); - ReplyToCommand(controller, - $"Private message from - {ChatColors.Blue}{(controller == null ? _config.BanFromConsoleName : controller.PlayerName)}\x01: {command.ArgString}"); - } - - - [CommandHelper(1, "", CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_csay")] - public void OnCmdCSay(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Chat)) return; - - PrintToCenterAll($"{command.ArgString}"); - } - - [CommandHelper(usage: "[#userid or name]", whoCanExecute: CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_god")] - public void OnCmdGod(CCSPlayerController? controller, CommandInfo command) - { - if (controller == null || !CheckingForAdminAndFlag(controller, AdminFlag.Cheats)) return; - - if (command.ArgCount >= 2) - { - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (target == null) - { - ReplyToCommand(controller, "Player not found"); - return; - } - - var targetPawn = target.PlayerPawn.Value; - if (targetPawn == null) return; - - targetPawn.TakesDamage ^= true; - PrintToChat(target, "The administrator has given you immortality"); - } - else - { - var playerPawn = controller.PlayerPawn.Value; - if (playerPawn == null) return; - playerPawn.TakesDamage ^= true; - PrintToChat(controller, "You've established immortality"); - } - } - - [CommandHelper(2, " ")] - [ConsoleCommand("css_cvar")] - public void OnCmdCvar(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Cvar)) return; - - var cvar = command.GetArg(1); - var value = command.GetArg(2); - - var conVar = ConVar.Find(cvar); - - if (conVar == null) - { - ReplyToCommand(controller, $"ConVar: {cvar} not found"); - return; - } - - conVar.SetValue(value); - } - - [CommandHelper(1, "", CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_rcon")] - public void OnCmdRcon(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Rcon)) return; - - Server.ExecuteCommand(command.ArgString); - } - - [CommandHelper(1, "<#userid or username> [damage]", CommandUsage.CLIENT_ONLY)] - [ConsoleCommand("css_slap")] - public void OnCmdSlap(CCSPlayerController? controller, CommandInfo command) - { - if (controller == null || !CheckingForAdminAndFlag(controller, AdminFlag.Slay)) return; - - var player = GetPlayerFromUserIdOrName(command.GetArg(1)); - - var damage = 0; - if (command.ArgCount >= 3) - damage = int.Parse(command.GetArg(2)); - - if (!IsPlayerValid(controller, player, true)) return; - - if (player != null) - { - var playerPawn = player.PlayerPawn.Value; - - if (playerPawn == null) return; - - playerPawn.AbsVelocity.X += Random.Shared.Next(100, 200); - playerPawn.AbsVelocity.Y += Random.Shared.Next(100, 200); - playerPawn.AbsVelocity.Z += Random.Shared.Next(200, 300); - playerPawn.Health -= damage; - - var random = Random.Shared.Next(3); - - player.ExecuteClientCommand($"play {GetMusicChoice(random)}"); - - if (playerPawn.Health <= 0) playerPawn.CommitSuicide(true, true); - } - } - - private string GetMusicChoice(int randomNumber) - { - return randomNumber switch - { - 0 => "sounds/player/damage1.vsnd", - 1 => "sounds/player/damage2.vsnd", - 2 => "sounds/player/damage3.vsnd", - _ => string.Empty - }; - } - - [ConsoleCommand("css_who")] - public void OnCmdWho(CCSPlayerController? controller, CommandInfo command) - { - if (controller != null) - if (!IsAdmin(controller.Index)) - { - PrintToChat(controller, "you do not have access to this command"); - return; - } - - var maxNameLength = 0; - - var id = 0; - foreach (var client in Utilities.GetPlayers() - .Where(u => u.PlayerPawn.Value != null && u.PlayerPawn.Value.IsValid)) - { - var playerName = !string.IsNullOrWhiteSpace(client.PlayerName) ? client.PlayerName : "unknown"; - var playerNameLength = playerName.Length; - maxNameLength = Math.Max(maxNameLength, playerNameLength); - - var adminStatus = IsAdmin(client.Index) ? "admin " : "player"; - - var index = client.Index; - var playTime = DateTime.Now - _playerPlayTime[index]; - - id ++; - var formattedOutput = - $"{id,-1} - {playerName,-15} || UserId: {client.UserId,-2} || {adminStatus,-6} || Playtime: {playTime.Hours:D2}:{playTime.Minutes:D2}:{playTime.Seconds:D2} | {(client.AuthorizedSteamID == null ? "none" : client.AuthorizedSteamID)}"; - - if (controller == null) - { - Console.ForegroundColor = Random.Shared.Next(2) == 1 ? ConsoleColor.Cyan : ConsoleColor.DarkMagenta; - Console.WriteLine(formattedOutput); - Console.ResetColor(); - } - else - PrintToConsole(controller, formattedOutput); - - // PrintLogInfo("{id} - {playerName} | {adminStatus} | Playtime: {playTime} | {SteamID}", - // $"{id,-1}", $"{playerName,-15}", $"{adminStatus,-6}", - // $"{playTime.Hours:D2}:{playTime.Minutes:D2}:{playTime.Seconds:D2}", $"{new SteamID(client.SteamID)}"); - } - } - - [CommandHelper(1, "")] - [ConsoleCommand("css_map", "change map")] - public void OnCmdChangeMap(CCSPlayerController? controller, CommandInfo command) - { - if (controller == null) return; - - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Changemap)) return; - - foreach (var t in GetMapFromMaps()) - { - var isWorkshopMap = t.Trim().StartsWith("ws:", StringComparison.OrdinalIgnoreCase); - - if (!t.Trim().Contains(cmdArg.Trim(), StringComparison.OrdinalIgnoreCase)) continue; - - var map = t.StartsWith("ws:") ? t.Split("ws:")[1] : t; - PrintToChatAll($"{controller.PlayerName}: changing the map to {map}"); - AddTimer(3.0f, () => ChangeMap(map, isWorkshopMap)); - return; - } - - PrintToChat(controller, "This map doesn't exist"); - } - - [CommandHelper(1, "<#userid or username>")] - [ConsoleCommand("css_slay", "kill a player")] - public void OnCmdSlay(CCSPlayerController? controller, CommandInfo command) - { - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Slay)) return; - - ExtractValueInQuotes(cmdArg); - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (!IsPlayerValid(controller, target, true)) return; - - if (target.PlayerPawn.Value != null) target.PlayerPawn.Value.CommitSuicide(true, true); - - if (controller == null) - PrintToChatAll($"Console: Player '{target.PlayerName}' has been killed"); - - ReplyToCommand(controller, - $"{(controller != null ? controller.PlayerName : _config.BanFromConsoleName)}: Player '{target.PlayerName}' has been killed"); - } - - [CommandHelper(1, "<#userid or username>")] - [ConsoleCommand("css_kick", "Kick a player")] - public void OnCmdKick(CCSPlayerController? controller, CommandInfo command) - { - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Kick)) return; - - var target = GetPlayerFromUserIdOrName(ExtractValueInQuotes(cmdArg)); - - if (!IsPlayerValid(controller, target)) return; - - if (controller != null) - if (IsAdmin(target.Index) && !PlayerImmunityComparison(controller, target)) - { - ReplyToCommand(controller, "You can't ban this player"); - return; - } - - target.Kick("Test"); - - var msg = - $"{(controller != null ? controller.PlayerName : _config.BanFromConsoleName)}: Player '{target.PlayerName}' kicked by admin"; - ReplyToCommand(controller, msg); - } - - [CommandHelper(2, "<#userid or username> [reason]")] - [ConsoleCommand("css_ban", "ban")] - public void OnCmdBan(CCSPlayerController? controller, CommandInfo command) - { - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Ban)) return; - - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (!IsPlayerValid(controller, target)) return; - - if (controller != null) - if (IsAdmin(target.Index) && !PlayerImmunityComparison(controller, target)) - { - ReplyToCommand(controller, "You can't ban this player"); - return; - } - - var endBanTime = Convert.ToInt32(command.GetArg(2)); - - var startBanTimeUnix = DateTime.UtcNow.GetUnixEpoch(); - var endBanTimeUnix = DateTime.UtcNow.AddSeconds(endBanTime).GetUnixEpoch(); - - var reason = "none"; - if (command.ArgCount > 3) - reason = command.GetArg(3); - - Server.NextFrame(() => - { - var msg = Database.AddBan(new User - { - admin_username = controller != null ? controller.PlayerName : _config.BanFromConsoleName, - admin_steamid = controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - username = target.PlayerName, - steamid64 = target.SteamID, - steamid = new SteamID(target.SteamID).SteamId2, - reason = reason, - unban_reason = "", - admin_unlocked_username = "", - admin_unlocked_steamid = "", - start_ban_time = startBanTimeUnix, - end_ban_time = endBanTime == 0 ? 0 : endBanTimeUnix, - ban_active = true - }).Result; - //KickClient($"{target.UserId}"); - target.Kick("Ban"); - - ReplyToCommand(controller, msg); - }); - } - - [CommandHelper(2, "<#userid or username> [reason]")] - [ConsoleCommand("css_mute", "mute")] - public void OnCmdMute(CCSPlayerController? controller, CommandInfo command) - { - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Generic)) return; - - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (!IsPlayerValid(controller, target)) return; - - if (controller != null) - if (IsAdmin(target.Index) && !PlayerImmunityComparison(controller, target)) - { - ReplyToCommand(controller, "You can't ban this player"); - return; - } - - var endMuteTime = Convert.ToInt32(command.GetArg(2)); - - var startMuteTimeUnix = DateTime.UtcNow.GetUnixEpoch(); - var endMuteTimeUnix = DateTime.UtcNow.AddSeconds(endMuteTime).GetUnixEpoch(); - - if (target.VoiceFlags.HasFlag(VoiceFlags.Muted)) - { - ReplyToCommand(controller, $"Player \x02'{target.PlayerName}'\x01 has already had his microphone cut off"); - return; - } - - var reason = "none"; - if (command.ArgCount > 3) - reason = command.GetArg(3); - - Server.NextFrame(() => - { - Database.AddMute(new MuteUser - { - mute_type = (int)MuteType.Micro, - admin_username = controller != null ? controller.PlayerName : _config.BanFromConsoleName, - admin_steamid = controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - username = target.PlayerName, - steamid64 = target.SteamID, - steamid = new SteamID(target.SteamID).SteamId2, - reason = reason, - unmute_reason = "", - admin_unlocked_username = "", - admin_unlocked_steamid = "", - start_mute_time = startMuteTimeUnix, - end_mute_time = endMuteTime == 0 ? 0 : endMuteTimeUnix, - mute_active = true - }, controller == null ? null : controller); - }); - target.VoiceFlags = VoiceFlags.Muted; - - UpdateUserMuteLocal(target, endMuteTime, endMuteTimeUnix, (int)MuteType.Micro); - } - - [CommandHelper(1, " [reason]")] - [ConsoleCommand("css_unmute", "unmute")] - public void OnCmdUnmute(CCSPlayerController? controller, CommandInfo command) - { - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Unban)) return; - - var arg1 = command.GetArg(1); - var steamId = arg1; - CCSPlayerController? player = null; - - if (arg1.StartsWith('#')) - { - player = GetPlayerFromUserIdOrName(arg1); - } - - var reason = "none"; - if (command.ArgCount > 2) - reason = command.GetArg(2); - - Server.NextFrame(() => - { - var msg = Database.UnmuteUser((int)MuteType.Micro, - controller != null ? controller.PlayerName : _config.BanFromConsoleName, - controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - player == null ? steamId : new SteamID(player.SteamID).SteamId2, reason).Result; - - ReplyToCommand(controller, msg); - }); - - //var player = Utilities.GetPlayers().FirstOrDefault(u => new SteamID(u.SteamID).SteamId2 == steamId); - if (player != null) - { - UpdateUserMuteLocal(player, isAdded: false); - player.VoiceFlags = VoiceFlags.Normal; - } - } - - [CommandHelper(2, "<#userid or username> [reason]")] - [ConsoleCommand("css_gag", "mute")] - public void OnCmdGag(CCSPlayerController? controller, CommandInfo command) - { - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Generic)) return; - - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (!IsPlayerValid(controller, target)) return; - - if (target == null) - { - ReplyToCommand(controller, "Player not found"); - return; - } - - if (controller != null) - if (IsAdmin(target.Index) && !PlayerImmunityComparison(controller, target)) - { - ReplyToCommand(controller, "You can't ban this player"); - return; - } - - var endMuteTime = Convert.ToInt32(command.GetArg(2)); - - var startMuteTimeUnix = DateTime.UtcNow.GetUnixEpoch(); - var endMuteTimeUnix = DateTime.UtcNow.AddSeconds(endMuteTime).GetUnixEpoch(); - - var reason = "none"; - if (command.ArgCount > 3) - reason = command.GetArg(3); - - Server.NextFrame(() => - { - Database.AddMute(new MuteUser - { - mute_type = (int)MuteType.Chat, - admin_username = controller != null ? controller.PlayerName : _config.BanFromConsoleName, - admin_steamid = controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - username = target.PlayerName, - steamid64 = target.SteamID, - steamid = new SteamID(target.SteamID).SteamId2, - reason = reason, - unmute_reason = "", - admin_unlocked_username = "", - admin_unlocked_steamid = "", - start_mute_time = startMuteTimeUnix, - end_mute_time = endMuteTime == 0 ? 0 : endMuteTimeUnix, - mute_active = true - }, controller == null ? null : controller); - }); - - UpdateUserMuteLocal(target, endMuteTime, endMuteTimeUnix, (int)MuteType.Chat); - } - - [CommandHelper(1, " [reason]")] - [ConsoleCommand("css_ungag", "ungag")] - public void OnCmdUngag(CCSPlayerController? controller, CommandInfo command) - { - var cmdArg = command.ArgString; - - if (!CheckingForAdminAndFlag(controller, AdminFlag.Unban)) return; - - var arg1 = command.GetArg(1); - var steamId = arg1; - CCSPlayerController? player = null; - - if (arg1.StartsWith('#')) - { - player = GetPlayerFromUserIdOrName(arg1); - } - - var reason = "none"; - if (command.ArgCount > 2) - reason = command.GetArg(2); - - Server.NextFrame(() => - { - var msg = Database.UnmuteUser((int)MuteType.Chat, - controller != null ? controller.PlayerName : _config.BanFromConsoleName, - controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - player == null ? steamId : new SteamID(player.SteamID).SteamId2, reason).Result; - - ReplyToCommand(controller, msg); - }); - - if (player != null) - UpdateUserMuteLocal(player, isAdded: false); - } - - public void UpdateUserMuteLocal(CCSPlayerController? player = null, int endTime = -1, int endTimeUnix = -1, - int type = -1, - bool isAdded = true) - { - if (player != null) - { - var entityIndex = player.Index; - var user = _muteUsers[entityIndex]; - - if (isAdded) - { - _muteUsers[entityIndex] = new MuteUserLocal - { - MuteType = user == null ? type : (int)MuteType.All, - SteamId = new SteamID(player.SteamID).SteamId2, - EndMuteTime = endTime == 0 ? 0 : endTimeUnix, - MuteActive = true - }; - } - else _muteUsers[entityIndex] = null; - } - } - - [CommandHelper(1, " [username] [immunity] [flags] [time_seconds]\nif you don't want to update something, don't leave it blank, write `-` or `-s`\nExample of updating flags: css_updateadmin \"STEAM_0:0:123456\" -s -s bcd -s", CommandUsage.SERVER_ONLY)] - [ConsoleCommand("css_updateadmin")] - public void OnCmdUpdateAdmin(CCSPlayerController? controller, CommandInfo command) - { - Database.UpdateAdmin(new Admins - { - username = command.GetArg(2), - steamid = command.GetArg(1), - start_time = -1, - end_time = int.TryParse(command.GetArg(5), out var time) ? time : -1, - immunity = int.TryParse(command.GetArg(3), out var i) ? i : -1, - flags = command.GetArg(4) - }); - } - - [CommandHelper(5, " ", CommandUsage.SERVER_ONLY)] - [ConsoleCommand("css_addadmin")] - public void OnCmdAddAdmin(CCSPlayerController? controller, CommandInfo command) - { - var username = command.GetArg(1); - var steamId = command.GetArg(2); - var immunity = command.GetArg(3); - var flags = command.GetArg(4); - - var time = int.TryParse(command.GetArg(5), out var endTime) ? endTime : 3600; - var startTimeUnix = DateTime.UtcNow.GetUnixEpoch(); - var endTimeUnix = DateTime.UtcNow.AddSeconds(time).GetUnixEpoch(); - - Server.NextFrame(() => - { - Database.AddAdmin(new Admins - { - username = username, - steamid = steamId, - start_time = startTimeUnix, - end_time = time == 0 ? 0 : endTimeUnix, - immunity = int.TryParse(immunity, out var i) ? i : 10, - flags = flags - }, controller); - }); - } - - [CommandHelper(1, " [reason]")] - [ConsoleCommand("css_unban", "unban")] - public void OnCmdUnban(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Unban)) return; - - var steamId = command.GetArg(1); - - var reason = "none"; - if (command.ArgCount > 2) - reason = command.GetArg(2); - - Server.NextFrame(() => - { - var msg = Database.UnbanUser( - controller != null ? controller.PlayerName : _config.BanFromConsoleName, - controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - steamId, reason).Result; - - ReplyToCommand(controller, msg); - }); - } - - [CommandHelper(1, "", CommandUsage.SERVER_ONLY)] - [ConsoleCommand("css_deleteadmin", "delete admin")] - public void OnCmdDeleteAdmin(CCSPlayerController? controller, CommandInfo command) - { - if (controller != null) return; - - var cmdArg = command.ArgString; - - var steamId = ExtractValueInQuotes(cmdArg); - - Task.Run(() => Database.DeleteAdminAsync(steamId)); - } - - [CommandHelper(2, "<#userid or username> [reason]")] - [ConsoleCommand("css_silence")] - public void OnCmdSilence(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Generic)) return; - - var target = GetPlayerFromUserIdOrName(command.GetArg(1)); - - if (!IsPlayerValid(controller, target)) return; - - if (controller != null) - if (IsAdmin(target.Index) && !PlayerImmunityComparison(controller, target)) - { - ReplyToCommand(controller, "You can't ban this player"); - return; - } - - var endMuteTime = Convert.ToInt32(command.GetArg(2)); - - var startMuteTimeUnix = DateTime.UtcNow.GetUnixEpoch(); - var endMuteTimeUnix = DateTime.UtcNow.AddSeconds(endMuteTime).GetUnixEpoch(); - - if (target.VoiceFlags.HasFlag(VoiceFlags.All)) - { - ReplyToCommand(controller, $"Player \x02'{target.PlayerName}'\x01 has already had all chat disabled"); - return; - } - - var reason = "none"; - if (command.ArgCount > 3) - reason = command.GetArg(3); - - Server.NextFrame(() => - { - Database.AddMute(new MuteUser - { - mute_type = (int)MuteType.All, - admin_username = controller != null ? controller.PlayerName : _config.BanFromConsoleName, - admin_steamid = controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - username = target.PlayerName, - steamid64 = target.SteamID, - steamid = new SteamID(target.SteamID).SteamId2, - reason = reason, - unmute_reason = "", - admin_unlocked_username = "", - admin_unlocked_steamid = "", - start_mute_time = startMuteTimeUnix, - end_mute_time = endMuteTime == 0 ? 0 : endMuteTimeUnix, - mute_active = true - }, controller); - }); - target.VoiceFlags = VoiceFlags.Muted; - - UpdateUserMuteLocal(target, endMuteTime, endMuteTimeUnix, (int)MuteType.All); - } - - [CommandHelper(1, "<#userid or steamid> [reason]")] - [ConsoleCommand("css_unsilence", "unmute")] - public void OnCmdUnSilence(CCSPlayerController? controller, CommandInfo command) - { - if (!CheckingForAdminAndFlag(controller, AdminFlag.Unban)) return; - - var arg1 = command.GetArg(1); - var steamId = arg1; - CCSPlayerController? player = null; - - if (arg1.StartsWith('#')) - { - player = GetPlayerFromUserIdOrName(arg1); - } - - var reason = "none"; - if (command.ArgCount > 2) - reason = command.GetArg(2); - - Server.NextFrame(() => - { - var msg = Database.UnmuteUser((int)MuteType.All, - controller != null ? controller.PlayerName : _config.BanFromConsoleName, - controller != null ? new SteamID(controller.SteamID).SteamId2 : _config.BanFromConsoleName, - player == null ? steamId : new SteamID(player.SteamID).SteamId2, reason).Result; - - ReplyToCommand(controller, msg); - }); - - //var player = Utilities.GetPlayers().FirstOrDefault(u => new SteamID(u.SteamID).SteamId2 == steamId); - if (player != null) - { - UpdateUserMuteLocal(player, isAdded: false); - player.VoiceFlags = VoiceFlags.Normal; - } - } - - private CCSPlayerController? GetPlayerFromUserIdOrName(string player) - { - if (player.StartsWith('#') && int.TryParse(player.Trim('#'), out var index)) - return Utilities.GetPlayerFromUserid(index); - - return Utilities.GetPlayers().FirstOrDefault(u => u.PlayerName.Contains(player)); - } - - public bool CheckingForAdminAndFlag(CCSPlayerController? controller, AdminFlag flag) - { - if (controller == null) return true; - var entityIndex = controller.Index; - - if (IsAdmin(entityIndex) && HasLetterInUserFlags(entityIndex, (char)flag)) return true; - - PrintToChat(controller, "you do not have access to this command"); - return false; - } - - private string GetTextInsideQuotes(string input) - { - var startIndex = input.IndexOf('"'); - var endIndex = input.LastIndexOf('"'); - - if (startIndex != -1 && endIndex != -1 && startIndex < endIndex) - { - return input.Substring(startIndex + 1, endIndex - startIndex - 1); - } - - return string.Empty; - } - - private string[] ParseCommandArguments(string argString) - { - var parse = Regex.Matches(argString, @"[\""].+?[\""]|[^ ]+") - .Select(m => m.Value.Trim('"')) - .ToArray(); - - return parse; - } - - private bool IsPlayerValid(CCSPlayerController? player, CCSPlayerController? target, bool isKickOrSlap = false) - { - if (target == null || !target.IsValid) - { - ReplyToCommand(player, "Player not found"); - return false; - } - - if (isKickOrSlap) - { - if (!target.PawnIsAlive) - { - ReplyToCommand(player, "The player is invalid"); - return false; - } - } - - return true; - } - - private string BuildConnectionString() - { - var dbConfig = _config.Connection; - - Console.WriteLine("Building connection string"); - var builder = new MySqlConnectionStringBuilder - { - Database = dbConfig.Database, - UserID = dbConfig.User, - Password = dbConfig.Password, - Server = dbConfig.Host, - Port = (uint)dbConfig.Port, - }; - - Console.WriteLine("OK!"); - return builder.ConnectionString; - } - - private static CCSPlayerController? GetPlayerFromSteamId(string steamId) - { - return Utilities.GetPlayers().FirstOrDefault(u => - u.AuthorizedSteamID != null && - (u.AuthorizedSteamID.SteamId2.ToString().Equals(steamId, StringComparison.OrdinalIgnoreCase) || - u.AuthorizedSteamID.SteamId64.ToString().Equals(steamId, StringComparison.OrdinalIgnoreCase))); - } - - private Config LoadConfig() - { - var configPath = Path.Combine(ModuleDirectory, "database.json"); - if (!File.Exists(configPath)) return CreateConfig(configPath); - - var config = JsonSerializer.Deserialize(File.ReadAllText(configPath))!; - - return config; - } - - private Config CreateConfig(string configPath) - { - var config = new Config - { - BanFromConsoleName = "Console", - Connection = new BaseAdminDb - { - Host = "", - Database = "", - User = "", - Password = "", - Port = 3306 - } - }; - - var mapsConfig = Path.Combine(ModuleDirectory, "maps.txt"); - if (!File.Exists(mapsConfig)) - File.WriteAllLines(mapsConfig, new[] { "de_dust2", "ws:awp_lego_2" }); - - File.WriteAllText(configPath, - JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true })); - return config; - } - - public IEnumerable ReadAllBanReasons() - { - var path = Path.Combine(ModuleDirectory, "admin/ban_reasons.txt"); - - if (!File.Exists(path)) - File.WriteAllLines(path, new[] { "Aim", "Wallhack", "Violation" }); - - return File.ReadAllLines(path); - } - - public IEnumerable ReadAllMuteReasons() - { - var path = Path.Combine(ModuleDirectory, "admin/mute_reasons.txt"); - - if (!File.Exists(path)) - File.WriteAllLines(path, new[] { "Spam Mic/Chat", "Inappropriate behavior", "16+" }); - - return File.ReadAllLines(path); - } - - public IEnumerable ReadAllTime() - { - var path = Path.Combine(ModuleDirectory, "admin/times.txt"); - - if (!File.Exists(path)) - File.WriteAllLines(path, new[] { "permanently:0", "1 hours:3600", "1 day:86400", "1 week:604800" }); - - return File.ReadAllLines(path); - } - - public string[] GetMapFromMaps() - { - var mapText = File.ReadAllText(Path.Combine(ModuleDirectory, "maps.txt")); - var mapList = mapText.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) - .Select(s => s.Trim()).ToArray(); - - return mapList; - } - - public IEnumerable ReadAllImmunity() - { - var path = Path.Combine(ModuleDirectory, "admin/immunity.txt"); - - if (!File.Exists(path)) - File.WriteAllLines(path, new[] { "1", "10", "20", "30" }); - - return File.ReadAllLines(path); - } - - public bool HasLetterInUserFlags(uint index, char letter) - { - if (_adminUsers[index] == null) return false; - - var adminUser = _adminUsers[index]!.flags; - - if (adminUser.Contains((char)AdminFlag.Root)) return true; - - return !string.IsNullOrEmpty(adminUser) && adminUser.Contains(letter); - } - - private bool PlayerImmunityComparison(CCSPlayerController player, CCSPlayerController target) - { - if (_adminUsers[target.Index] == null) return false; - - return _adminUsers[player.Index]!.immunity >= _adminUsers[target.Index]!.immunity; - } - - public bool IsAdmin(uint index) - { - var user = _adminUsers[index]; - if (user == null) return false; - - if (user.end_time != 0 && DateTime.UtcNow.GetUnixEpoch() > user.end_time) return false; - - return user.end_time == 0 || DateTime.UtcNow.GetUnixEpoch() < user.end_time; - } - - private bool IsUserMute(uint index) - { - var user = _muteUsers[index]; - if (user == null) return false; - - if (DateTime.UtcNow.GetUnixEpoch() > user.EndMuteTime) return false; - - return user.EndMuteTime == 0 || DateTime.UtcNow.GetUnixEpoch() < user.EndMuteTime; - } - - public string ExtractValueInQuotes(string input) - { - var match = Regex.Match(input, @"""([^""]*)"""); - - return match.Success ? match.Groups[1].Value : input; - } - - public void ReplyToCommand(CCSPlayerController? controller, string message, params object?[] args) - { - if (controller != null) - PrintToChat(controller, message); - else - PrintLogInfo(message, args); - } - - public void ChangeMap(string mapName, bool isWorkshop = false) - { - Server.ExecuteCommand($"{(isWorkshop ? "ds_workshop_changelevel" : "map")} {mapName}"); - } - - public void PrintToChat(CCSPlayerController controller, string msg) - { - controller.PrintToChat($"[ {ChatColors.Blue}Admin \x01] {msg}"); - } - - public void PrintToCenterAll(string msg) - { - VirtualFunctions.ClientPrintAll(HudDestination.Center, $"Admin: {msg}", 0, 0, 0, 0); - } - - public void PrintToChatAll(string msg) - { - Server.PrintToChatAll($"[ {ChatColors.Blue}Admin \x01] {msg}"); - } - - private void PrintToConsole(CCSPlayerController client, string msg) - { - VirtualFunctions.ClientPrint(client.Handle, HudDestination.Console, msg, 0, 0, 0, 0); - } - - public void PrintLogInfo(string? message, params object?[] args) - { - Logger.LogInformation($"{message}", args); - } - - public void PrintLogError(string? message, params object?[] args) - { - Logger.LogError($"{message}", args); - } -} - -public class Config -{ - public string BanFromConsoleName { get; init; } = "Console"; - public BaseAdminDb Connection { get; init; } = null!; -} - -public class BaseAdminDb -{ - public required string Host { get; init; } - public required string Database { get; init; } - public required string User { get; init; } - public required string Password { get; init; } - public int Port { get; init; } -} - -public class AdminData -{ - public ulong SteamId { get; set; } - public bool TagEnabled { get; set; } -} \ No newline at end of file diff --git a/MiniAdmin/BaseAdmin.sln b/MiniAdmin/BaseAdmin.sln new file mode 100644 index 0000000..6390f6d --- /dev/null +++ b/MiniAdmin/BaseAdmin.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BaseAdmin", "BaseAdmin\BaseAdmin.csproj", "{C1A01DD4-983A-4654-9CA5-B757180B081A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BaseAdminApi", "BaseAdminApi\BaseAdminApi.csproj", "{369B6842-6EFE-4EF6-B6B8-D4D0D36170E7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestPluginF", "Modules\TestPluginF\TestPluginF.csproj", "{B2D46AAC-1D04-4F1A-9F6A-939C09C8B6FA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C1A01DD4-983A-4654-9CA5-B757180B081A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1A01DD4-983A-4654-9CA5-B757180B081A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1A01DD4-983A-4654-9CA5-B757180B081A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1A01DD4-983A-4654-9CA5-B757180B081A}.Release|Any CPU.Build.0 = Release|Any CPU + {369B6842-6EFE-4EF6-B6B8-D4D0D36170E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {369B6842-6EFE-4EF6-B6B8-D4D0D36170E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {369B6842-6EFE-4EF6-B6B8-D4D0D36170E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {369B6842-6EFE-4EF6-B6B8-D4D0D36170E7}.Release|Any CPU.Build.0 = Release|Any CPU + {B2D46AAC-1D04-4F1A-9F6A-939C09C8B6FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B2D46AAC-1D04-4F1A-9F6A-939C09C8B6FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2D46AAC-1D04-4F1A-9F6A-939C09C8B6FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B2D46AAC-1D04-4F1A-9F6A-939C09C8B6FA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/MiniAdmin/BaseAdmin/BaseAdmin.cs b/MiniAdmin/BaseAdmin/BaseAdmin.cs new file mode 100644 index 0000000..0d5cf3b --- /dev/null +++ b/MiniAdmin/BaseAdmin/BaseAdmin.cs @@ -0,0 +1,472 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using BaseAdmin.Commands; +using BaseAdmin.Commands.Commands; +using BaseAdmin.Menu; +using BaseAdminApi; +using BaseAdminApi.Enums; +using BaseAdminApi.Models; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core.Capabilities; +using CounterStrikeSharp.API.Modules.Commands; +using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Modules.Timers; +using CounterStrikeSharp.API.Modules.Utils; +using Dapper; +using Microsoft.Extensions.Logging; +using MySqlConnector; + +namespace BaseAdmin; + +public class BaseAdmin : BasePlugin +{ + public override string ModuleAuthor => "thesamefabius"; + public override string ModuleName => "Base Admin"; + public override string ModuleVersion => "v2.0.0"; + + private static string _dbConnectionString = string.Empty; + + private readonly DateTime[] _playerPlayTime = new DateTime[66]; + public readonly Dictionary AdminUsers = new(); + public readonly Dictionary MuteUsers = new(); + + public Database Database = null!; + public Config Config = new(); + public BaseConfig BaseConfig = new(); + public MenuService Menu = null!; + + private IBaseAdminApi? _api; + + public new CommandManager CommandManager = null!; + public BaseCommands BaseCommands = null!; + public FunCommands FunCommands = null!; + + public override void Load(bool hotReload) + { + _api = new BaseAdminApi(this); + Capabilities.RegisterPluginCapability(IBaseAdminApi.Capability, () => _api); + LoadConfig(); + + Menu = new MenuService(this); + + CommandManager = new CommandManager(this); + CommandManager.RegisterCommands(this); + + BaseCommands = new BaseCommands(this); + CommandManager.RegisterCommands(BaseCommands); + + FunCommands = new FunCommands(this); + CommandManager.RegisterCommands(FunCommands); + + _dbConnectionString = BuildConnectionString(); + Database = new Database(this, _dbConnectionString); + + Task.Run(Database.CreateTable); + Task.Run(Database.CreateAdminsTable); + Task.Run(Database.CreateMuteTable); + + RegisterListener((slot, id) => + { + var player = Utilities.GetPlayerFromSlot(slot); + Task.Run(() => OnClientAuthorizedAsync(slot, player, id)); + }); + + RegisterEventHandler((@event, _) => + { + var player = @event.Userid; + if (player == null || player.IsBot) return HookResult.Continue; + + AdminUsers.Remove(player.SteamID); + MuteUsers.Remove(player.SteamID); + _playerPlayTime[player.Slot] = DateTime.MinValue; + + return HookResult.Continue; + }); + + AddTimer(10, () => { Task.Run(Database.DeleteExpiredAdminsAsync); }, TimerFlags.REPEAT); + + AddCommandListener("say", Listener_Say); + AddCommandListener("say_team", Listener_Say); + } + + private HookResult Listener_Say(CCSPlayerController? player, CommandInfo info) + { + if (player == null) return HookResult.Continue; + var command = info.GetArg(0); + + if (command is "say_team") + { + } + else + { + } + + if (IsPlayerMuted(player.SteamID, MuteType.Chat)) + { + if (!MuteUsers.TryGetValue(player.SteamID, out var muteUser)) return HookResult.Continue; + + if (!muteUser.IsTimerActive) + { + var endTime = DateTimeOffset.FromUnixTimeSeconds(muteUser.end_mute_time).UtcDateTime; + var timeEnd = endTime - DateTime.UtcNow; + + var time = + $"{(timeEnd.Days == 0 ? "" : $"{timeEnd.Days}d, ")}{timeEnd.Hours:00}:{timeEnd.Minutes:00}:{timeEnd.Seconds:00}"; + + PrintToChat(player, Localizer["player.mute.chat_disabled", time]); + muteUser.IsTimerActive = true; + AddTimer(5.0f, () => muteUser.IsTimerActive = false); + } + + return HookResult.Handled; + } + + return HookResult.Continue; + } + + private async Task OnClientAuthorizedAsync(int slot, CCSPlayerController player, SteamID steamId) + { + try + { + await LoadAdminUserAsync(steamId); + await LoadMuteUserAsync(steamId); + await using var connection = new MySqlConnection(_dbConnectionString); + await connection.OpenAsync(); + + var unbanUsers = await connection.QueryFirstOrDefaultAsync( + "SELECT * FROM miniadmin_bans WHERE steamid64 = @SteamId64 AND end_ban_time <= @CurrentTime AND ban_active = 1 AND end_ban_time != 0", + new { CurrentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), steamId.SteamId64 }); + + if (unbanUsers != null) + { + PrintLogInfo("Unban: {steamid}", unbanUsers.steamid); + await Database.UnbanUser(null, Config.BanFromConsoleName, Config.BanFromConsoleName, unbanUsers.steamid, + "The deadline has passed"); + } + + var unmuteUsers = await connection.QueryFirstOrDefaultAsync( + "SELECT * FROM miniadmin_mute WHERE steamid64 = @SteamId64 AND end_mute_time <= @CurrentTime AND mute_active = 1 AND end_mute_time != 0", + new { CurrentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), steamId.SteamId64 }); + + if (unmuteUsers != null) + { + PrintLogInfo("Unmute: {steamid}", unmuteUsers.steamid); + await Database.UnmuteUser(null, -1, Config.BanFromConsoleName, Config.BanFromConsoleName, + unmuteUsers.steamid, "The deadline has passed"); + + if (unmuteUsers.mute_type is (int)MuteType.All or (int)MuteType.Micro) + await Server.NextFrameAsync(() => player.VoiceFlags = VoiceFlags.Normal); + } + + var banUser = await connection.QueryFirstOrDefaultAsync( + "SELECT * FROM miniadmin_bans WHERE steamid64 = @SteamId64 AND ban_active = 1", + new { steamId.SteamId64 }); + + if (banUser != null) + await Server.NextFrameAsync(() => player.Kick("Ban")); + else + _playerPlayTime[slot] = DateTime.Now; + } + catch (Exception e) + { + PrintLogError(e.ToString()); + } + } + + private async Task LoadMuteUserAsync(SteamID steamId) + { + try + { + var muteUser = await Database.GetActiveMuteAsync(steamId.SteamId2); + if (muteUser != null) + { + MuteUsers[steamId.SteamId64] = new MuteUser + { + admin_username = muteUser.admin_username, + admin_steamid = muteUser.admin_steamid, + username = muteUser.username, + steamid = muteUser.steamid, + reason = muteUser.reason, + unmute_reason = muteUser.unmute_reason + }; + } + } + catch (Exception e) + { + Console.WriteLine(e); + } + } + + public async Task LoadAdminUserAsync(SteamID steamId) + { + try + { + var userAdmin = await Database.GetAdminFromDb(steamId.SteamId2); + + if (userAdmin != null) + { + AdminUsers[steamId.SteamId64] = new Admin + { + username = userAdmin.username, + steamid = userAdmin.steamid, + start_time = userAdmin.start_time, + end_time = userAdmin.end_time, + immunity = userAdmin.immunity, + flags = userAdmin.flags + }; + } + } + catch (Exception e) + { + Console.WriteLine(e); + } + } + + public CsTeam GetTeam(string name) + { + return name switch + { + "ct" => CsTeam.CounterTerrorist, + "t" => CsTeam.Terrorist, + "tt" => CsTeam.Terrorist, + "none" => CsTeam.None, + _ => CsTeam.Spectator + }; + } + + public (string name, string id) GetNameAndId(CCSPlayerController? player) + { + var adminName = Config.BanFromConsoleName; + var adminSteamId = Config.BanFromConsoleName; + + if (player != null) + { + adminName = player.PlayerName; + adminSteamId = new SteamID(player.SteamID).SteamId2; + } + + return (adminName, adminSteamId); + } + + public bool CheckingForAdminAndFlag(CCSPlayerController? controller, AdminFlag flag) + { + if (controller == null) return true; + + if (IsPlayerAdmin(controller.SteamID) && HasLetterInUserFlags(controller.SteamID, (char)flag)) return true; + + PrintToChat(controller, Localizer["not_have_access"]); + return false; + } + + public bool IsPlayerAdmin(ulong steamId) + { + if (!AdminUsers.TryGetValue(steamId, out var admin)) return false; + + if (admin.end_time != 0 && DateTime.UtcNow.GetUnixEpoch() > admin.end_time) return false; + + return admin.end_time == 0 || DateTime.UtcNow.GetUnixEpoch() < admin.end_time; + } + + public bool IsPlayerMuted(ulong steamId, MuteType muteType) + { + if (!MuteUsers.TryGetValue(steamId, out var muteUser)) return false; + if (!muteUser.mute_active) return false; + + if (muteUser.end_mute_time != 0 && DateTime.UtcNow.GetUnixEpoch() > muteUser.end_mute_time) + return false; + + return (muteUser.end_mute_time == 0 || DateTime.UtcNow.GetUnixEpoch() < muteUser.end_mute_time) && + (muteUser.mute_type == (int)muteType || muteUser.mute_type == (int)MuteType.All); + } + + public bool HasLetterInUserFlags(ulong steam, char letter) + { + if (!AdminUsers.TryGetValue(steam, out var admin)) return false; + + var flags = admin.flags; + + if (flags.Contains((char)AdminFlag.Root)) return true; + + return !string.IsNullOrEmpty(flags) && flags.Contains(letter); + } + + public bool PlayerImmunityComparison(CCSPlayerController? player, CCSPlayerController target) + { + if (player == null) return true; + + if (!AdminUsers.TryGetValue(target.SteamID, out var admin)) return false; + + return AdminUsers[player.SteamID].immunity >= admin.immunity; + } + + private string BuildConnectionString() + { + var dbConfig = Config.Connection!; + + Console.WriteLine("Building connection string"); + var builder = new MySqlConnectionStringBuilder + { + Database = dbConfig.Database, + UserID = dbConfig.User, + Password = dbConfig.Password, + Server = dbConfig.Host, + Port = (uint)dbConfig.Port, + Pooling = true, + MinimumPoolSize = 0, + MaximumPoolSize = 640, + ConnectionIdleTimeout = 30 + }; + + Console.WriteLine("OK!"); + return builder.ConnectionString; + } + + private void LoadConfig() + { + Config = Utils.LoadConfig("database", ModuleDirectory); + BaseConfig = Utils.LoadConfig("base", ModuleDirectory); + } + + public void ReplyToCommand(CCSPlayerController? controller, string message, params object?[] args) + { + if (controller != null) + PrintToChat(controller, message); + else + PrintLogInfo(message, args); + } + + public void ChangeMap(string mapName, bool isWorkshop = false) + { + AddTimer(2.0f, () => Server.ExecuteCommand($"{(isWorkshop ? "ds_workshop_changelevel" : "map")} {mapName}")); + } + + public async Task AddBanAsync(CCSPlayerController? admin, CCSPlayerController target, int time, string reason) + { + await Server.NextFrameAsync(() => + { + var adminInfo = GetNameAndId(admin); + + var targetId = new SteamID(target.SteamID); + Database.AddBan(admin, new BanUser + { + admin_username = adminInfo.name, + admin_steamid = adminInfo.id, + username = target.PlayerName, + steamid64 = targetId.SteamId64, + steamid = targetId.SteamId2, + reason = reason, + start_ban_time = DateTime.UtcNow.GetUnixEpoch(), + end_ban_time = time == 0 ? 0 : DateTime.UtcNow.AddSeconds(time).GetUnixEpoch(), + ban_active = true + }); + target.Kick("ban"); + }); + } + + public async Task UnBanAsync(CCSPlayerController? admin, string targetSteamId, string reason) + { + await Server.NextFrameAsync(() => + { + var adminInfo = GetNameAndId(admin); + + Database.UnbanUser(admin, adminInfo.name, adminInfo.id, targetSteamId, reason); + }); + } + + public async Task AddMuteAsync(CCSPlayerController? admin, CCSPlayerController target, MuteType type, int time, string reason) + { + await Server.NextFrameAsync(() => + { + var adminInfo = GetNameAndId(admin); + var targetId = new SteamID(target.SteamID); + + var user = new MuteUser + { + mute_type = (int)type, + admin_username = adminInfo.name, + admin_steamid = adminInfo.id, + username = target.PlayerName, + steamid64 = targetId.SteamId64, + steamid = targetId.SteamId2, + reason = reason, + unmute_reason = "", + admin_unlocked_username = "", + admin_unlocked_steamid = "", + start_mute_time = DateTime.UtcNow.GetUnixEpoch(), + end_mute_time = time == 0 ? 0 : DateTime.UtcNow.AddSeconds(time).GetUnixEpoch(), + mute_active = true + }; + + Database.AddMute(admin, user); + MuteUsers[target.SteamID] = user; + }); + } + + public async Task UnMuteAsync(CCSPlayerController? admin, MuteType type, string targetSteamId, string reason) + { + await Server.NextFrameAsync(() => + { + var adminInfo = GetNameAndId(admin); + + Database.UnmuteUser(admin, (int)type, adminInfo.name, adminInfo.id, targetSteamId, reason); + }); + } + + public void PrintToChat(CCSPlayerController controller, string msg) + { + controller.PrintToChat($"{Localizer["prefix"]} {msg}"); + } + + public void PrintToCenterAll(string msg) + { + VirtualFunctions.ClientPrintAll(HudDestination.Center, $"Admin: {msg}", 0, 0, 0, 0); + } + + public void PrintToChatAll(string msg) + { + Server.PrintToChatAll($"{Localizer["prefix"]} {msg}"); + } + + private void PrintToConsole(CCSPlayerController client, string msg) + { + VirtualFunctions.ClientPrint(client.Handle, HudDestination.Console, msg, 0, 0, 0, 0); + } + + public void PrintLogInfo(string? message, params object?[] args) + { + Logger.LogInformation($"{message}", args); + } + + public void PrintLogError(string? message, params object?[] args) + { + Logger.LogError($"{message}", args); + } +} + +public class BaseConfig +{ + public List Maps { get; set; } = new(); + public List BanReasons { get; set; } = new(); + public List MuteReasons { get; set; } = new(); + public List Immunity { get; set; } = new(); + public Dictionary Times { get; set; } = new(); +} + +public class Config +{ + public bool UseCenterHtmlMenu { get; init; } = true; + public string BanFromConsoleName { get; init; } = "Console"; + public BaseAdminDb? Connection { get; init; } +} + +public class BaseAdminDb +{ + public required string Host { get; init; } = "Host"; + public required string Database { get; init; } = "Database name"; + public required string User { get; init; } = "Username"; + public required string Password { get; init; } = "Password"; + public int Port { get; init; } = 3306; +} \ No newline at end of file diff --git a/MiniAdmin/BaseAdmin.csproj b/MiniAdmin/BaseAdmin/BaseAdmin.csproj similarity index 67% rename from MiniAdmin/BaseAdmin.csproj rename to MiniAdmin/BaseAdmin/BaseAdmin.csproj index d0b0def..9e471bc 100644 --- a/MiniAdmin/BaseAdmin.csproj +++ b/MiniAdmin/BaseAdmin/BaseAdmin.csproj @@ -1,21 +1,19 @@ - net7.0 - AnyCPU;x86 + net8.0 true enable + - - ..\CounterStrikeSharp.API.dll - + diff --git a/MiniAdmin/BaseAdmin/BaseAdminApi.cs b/MiniAdmin/BaseAdmin/BaseAdminApi.cs new file mode 100644 index 0000000..4114f2a --- /dev/null +++ b/MiniAdmin/BaseAdmin/BaseAdminApi.cs @@ -0,0 +1,85 @@ +using System; +using System.Threading.Tasks; +using BaseAdminApi; +using BaseAdminApi.Enums; +using BaseAdminApi.Models; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Commands; +using CounterStrikeSharp.API.Modules.Menu; + +namespace BaseAdmin; + +public class BaseAdminApi : IBaseAdminApi +{ + private readonly BaseAdmin _baseAdmin; + + public BaseAdminApi(BaseAdmin baseAdmin) + { + _baseAdmin = baseAdmin; + } + + public void BanPlayer(CCSPlayerController? admin, CCSPlayerController target, int time, string reason) + { + Task.Run(() => _baseAdmin.AddBanAsync(admin, target, time, reason)); + } + + public async Task BanPlayerAsync(CCSPlayerController? admin, CCSPlayerController target, int time, string reason) + { + await _baseAdmin.AddBanAsync(admin, target, time, reason); + } + + public void UnBanPlayer(CCSPlayerController? admin, string steamId, string reason) + { + Task.Run(() => _baseAdmin.UnBanAsync(admin, steamId, reason)); + } + + public async Task UnBanPlayerAsync(CCSPlayerController? admin, string steamId, string reason) + { + await _baseAdmin.UnBanAsync(admin, steamId, reason); + } + + public bool IsPlayerMute(CCSPlayerController player, MuteType type = MuteType.All) + { + return _baseAdmin.IsPlayerMuted(player.SteamID, type); + } + + public bool CheckingForAdminAndFlag(CCSPlayerController? player, AdminFlag flag) + { + return _baseAdmin.CheckingForAdminAndFlag(player, flag); + } + + public void ReplyToCommand(CCSPlayerController? controller, string message, params object?[] args) + { + _baseAdmin.ReplyToCommand(controller, message, args); + } + + public void RegisterCommand(string command, AdminFlag flag, int args, string usage, Action handler) + { + _baseAdmin.CommandManager.RegisterCommand(command, flag, args, usage, handler); + } + + public void RegisterCommand(string command, AdminFlag flag, Action handler) + { + RegisterCommand(command, flag, 0, string.Empty, handler); + } + + public void RegisterMenuItem(string display, Action handler, bool disabled) + { + _baseAdmin.Menu.AddMenuOptions(display, (controller, option) => + { + if (!_baseAdmin.AdminUsers.TryGetValue(controller.SteamID, out var value)) return; + + handler(controller, value); + }, disabled); + } + + public void RegisterNewMenuItem(MenuItem type, string display, Action handler, bool disabled) + { + _baseAdmin.Menu.AddMenuOptions(type, display, (controller, option) => + { + if (!_baseAdmin.AdminUsers.TryGetValue(controller.SteamID, out var value)) return; + + handler(controller, value); + }, disabled); + } +} \ No newline at end of file diff --git a/MiniAdmin/BaseAdmin/Commands/CommandManager.cs b/MiniAdmin/BaseAdmin/Commands/CommandManager.cs new file mode 100644 index 0000000..f9f3a7b --- /dev/null +++ b/MiniAdmin/BaseAdmin/Commands/CommandManager.cs @@ -0,0 +1,61 @@ +using System; +using System.Reflection; +using BaseAdminApi; +using BaseAdminApi.Enums; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Commands; + +namespace BaseAdmin.Commands; + +public class CommandManager +{ + private readonly BaseAdmin _baseAdmin; + + public CommandManager(BaseAdmin baseAdmin) + { + _baseAdmin = baseAdmin; + } + + public void RegisterCommand(string command, string description, AdminFlag flag, int args, string usage, + Action handler) + { + _baseAdmin.AddCommand(command, description, (player, info) => + { + if (!_baseAdmin.CheckingForAdminAndFlag(player, flag)) return; + + if (info.ArgCount - 1 < args) + { + _baseAdmin.ReplyToCommand(player, $"{(player == null ? command : command.Replace("css_", "!"))} {usage}"); + return; + } + + handler(player, info); + }); + } + + public void RegisterCommand(string command, AdminFlag flag, int args, string usage, + Action handler) + { + RegisterCommand(command, "", flag, args, usage, handler); + } + + public void RegisterCommands(object obj) + { + var methods = obj.GetType().GetMethods(); + foreach (var method in methods) + { + var attribute = method.GetCustomAttribute(); + if (attribute == null) continue; + + var command = attribute.Command; + var description = attribute.Description; + var flag = attribute.Flag; + var usage = attribute.Usage; + var minArgs = attribute.MinArgs; + + var handler = (Action)Delegate.CreateDelegate(typeof(Action), obj, method); + + RegisterCommand(command, description, flag, minArgs, usage, handler); + } + } +} \ No newline at end of file diff --git a/MiniAdmin/BaseAdmin/Commands/Commands/BaseCommands.cs b/MiniAdmin/BaseAdmin/Commands/Commands/BaseCommands.cs new file mode 100644 index 0000000..54945a3 --- /dev/null +++ b/MiniAdmin/BaseAdmin/Commands/Commands/BaseCommands.cs @@ -0,0 +1,272 @@ +using System; +using System.Threading.Tasks; +using BaseAdminApi; +using BaseAdminApi.Enums; +using BaseAdminApi.Models; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Commands; +using CounterStrikeSharp.API.Modules.Cvars; +using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API.Modules.Utils; + +namespace BaseAdmin.Commands.Commands; + +public class BaseCommands +{ + private readonly BaseAdmin _baseAdmin; + + public BaseCommands(BaseAdmin baseAdmin) + { + _baseAdmin = baseAdmin; + } + + [RegisterCommand("css_admin", AdminFlag.Generic)] + public void OnCmdOpenMenu(CCSPlayerController? controller, CommandInfo command) + { + if (controller == null) return; + + _baseAdmin.Menu.AdminMenu.Open(controller); + } + + [RegisterCommand("css_noclip", AdminFlag.Cheats)] + public void OnCmdNoclip(CCSPlayerController? controller, CommandInfo command) + { + if (controller == null) return; + + if (command.ArgCount >= 1) + { + if (!Utils.GetPlayer(command.GetArg(1), out var target)) return; + + GiveNoclip(controller, target); + return; + } + + GiveNoclip(controller); + } + + private void GiveNoclip(CCSPlayerController player, CCSPlayerController? target = null) + { + var playerPawn = target == null ? player.PlayerPawn.Value : target.PlayerPawn.Value; + if (playerPawn != null) + playerPawn.MoveType = playerPawn.MoveType switch + { + MoveType_t.MOVETYPE_NOCLIP => MoveType_t.MOVETYPE_WALK, + MoveType_t.MOVETYPE_WALK => MoveType_t.MOVETYPE_NOCLIP, + _ => playerPawn.MoveType + }; + + _baseAdmin.PrintToChatAll(_baseAdmin.Localizer["give_noclip", player.PlayerName, + target == null ? $"{player.PlayerName}" : $"{target.PlayerName}"]); + } + + [RegisterCommand("css_team", AdminFlag.Kick, 1, "<#userid or username> [-k]")] + public void OnCmdChangeTeam(CCSPlayerController? controller, CommandInfo command) + { + if (controller == null) return; + + if (!Utils.GetPlayer(command.GetArg(1), out var target)) + { + _baseAdmin.ReplyToCommand(controller, _baseAdmin.Localizer["player.not_found"]); + return; + } + + if (command.ArgCount >= 3) + { + var team = _baseAdmin.GetTeam(command.GetArg(2)); + + if (command.ArgCount is 4) + target.ChangeTeam(team); + else + target.SwitchTeam(team); + + _baseAdmin.PrintToChatAll(_baseAdmin.Localizer["move_team", target.PlayerName]); + } + } + + [RegisterCommand("css_say", AdminFlag.Chat, 1, "")] + public void OnCmdSay(CCSPlayerController? controller, CommandInfo command) + { + _baseAdmin.PrintToChatAll($"{ChatColors.Blue}Admin\x01: {command.ArgString}"); + } + + [RegisterCommand("css_psay", AdminFlag.Chat, 1, "<#userid or username> ")] + public void OnCmdPSay(CCSPlayerController? controller, CommandInfo command) + { + if (!Utils.GetPlayer(command.GetArg(1), out var target)) + { + _baseAdmin.ReplyToCommand(controller, _baseAdmin.Localizer["player.not_found"]); + return; + } + + var fromName = controller == null ? _baseAdmin.Config.BanFromConsoleName : controller.PlayerName; + var message = _baseAdmin.Localizer["private_message", fromName, command.ArgString].Value; + + _baseAdmin.PrintToChat(target, message); + _baseAdmin.ReplyToCommand(controller, message); + } + + [RegisterCommand("css_csay", AdminFlag.Chat, 1, "")] + public void OnCmdCSay(CCSPlayerController? controller, CommandInfo command) + { + _baseAdmin.PrintToCenterAll($"{command.ArgString}"); + } + + [RegisterCommand("css_cvar", AdminFlag.Cvar, 2, " ")] + public void OnCmdCvar(CCSPlayerController? controller, CommandInfo command) + { + var cvar = command.GetArg(1); + var value = command.GetArg(2); + + var conVar = ConVar.Find(cvar); + + if (conVar == null) + { + _baseAdmin.ReplyToCommand(controller, _baseAdmin.Localizer["cvar.not_found", cvar]); + return; + } + + conVar.SetValue(value); + _baseAdmin.ReplyToCommand(controller, _baseAdmin.Localizer["cvar.change_cvar", cvar, value]); + } + + [RegisterCommand("css_rcon", AdminFlag.Rcon, 1, "")] + public void OnCmdRcon(CCSPlayerController? controller, CommandInfo command) + { + Server.ExecuteCommand(command.ArgString); + } + + [RegisterCommand("css_slay", AdminFlag.Slay, 1, "")] + public void OnCmdSlay(CCSPlayerController? controller, CommandInfo command) + { + if (!Utils.GetPlayer(command.GetArg(1), out var target)) return; + if (!_baseAdmin.PlayerImmunityComparison(controller, target)) return; + + if (!target.PawnIsAlive || target.Team is CsTeam.None or CsTeam.Spectator) + { + _baseAdmin.ReplyToCommand(controller, _baseAdmin.Localizer["player.slay.is_invalid"]); + return; + } + + var playerPawn = target.PlayerPawn.Value; + if (playerPawn != null) + { + playerPawn.CommitSuicide(true, true); + } + + _baseAdmin.ReplyToCommand(controller, + _baseAdmin.Localizer["player.slay.has_been_killed", + controller != null ? controller.PlayerName : _baseAdmin.Config.BanFromConsoleName, target.PlayerName]); + } + + + [RegisterCommand("css_kick", AdminFlag.Kick, 1, " [reason]")] + public void OnCmdKick(CCSPlayerController? controller, CommandInfo command) + { + if (!Utils.GetPlayer(command.GetArg(1), out var target)) return; + if (!_baseAdmin.PlayerImmunityComparison(controller, target)) return; + + var kickReason = "None"; + if (command.ArgCount > 1) + kickReason = command.GetArg(2); + + target.Kick(kickReason); + } + + [RegisterCommand("css_ban", AdminFlag.Ban, 2, "