- Fixed godmode
- Added logging commands to simpleadmin logs file
- Fixed votes?
- Added updating player_ip and player_name after connect with ban issued by css_addban
This commit is contained in:
Dawid Bepierszcz
2024-02-21 13:14:46 +01:00
parent 619bdfbb14
commit 5bf966f9cd
16 changed files with 213 additions and 88 deletions

View File

@@ -12,14 +12,13 @@ using System.Collections.Concurrent;
namespace CS2_SimpleAdmin;
[MinimumApiVersion(163)]
[MinimumApiVersion(168)]
public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdminConfig>
{
public static CS2_SimpleAdmin Instance { get; private set; } = new();
public static IStringLocalizer? _localizer;
public static Dictionary<string, int> voteAnswers = new Dictionary<string, int>();
public static HashSet<int> votePlayers = new HashSet<int>();
public static ConcurrentBag<int> godPlayers = new ConcurrentBag<int>();
public static ConcurrentBag<int> silentPlayers = new ConcurrentBag<int>();
public static ConcurrentBag<string> bannedPlayers = new ConcurrentBag<string>();
@@ -39,7 +38,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
public override string ModuleName => "CS2-SimpleAdmin";
public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
public override string ModuleAuthor => "daffyy & Dliix66";
public override string ModuleVersion => "1.3.2b";
public override string ModuleVersion => "1.3.3a";
public CS2_SimpleAdminConfig Config { get; set; } = new();

View File

@@ -10,7 +10,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.166" />
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.168" />
<PackageReference Include="Dapper" Version="*" />
<PackageReference Include="Discord.Net.Webhook" Version="3.13.1" />
<PackageReference Include="MySqlConnector" Version="2.3.5" />

View File

@@ -58,6 +58,7 @@ namespace CS2_SimpleAdmin
internal void Ban(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, BanManager? banManager = null)
{
if (_database == null) return;
callerName ??= caller == null ? "Console" : caller.PlayerName;
banManager ??= new BanManager(_database, Config);
@@ -80,6 +81,8 @@ namespace CS2_SimpleAdmin
IpAddress = caller?.IpAddress?.Split(":")[0]
};
Helper.LogCommand(caller, $"css_ban {player?.SteamID} {time} {reason}");
Task.Run(async () =>
{
await banManager.BanPlayer(playerInfo, adminInfo, reason, time);
@@ -177,6 +180,8 @@ namespace CS2_SimpleAdmin
IpAddress = caller?.IpAddress?.Split(":")[0]
};
Helper.LogCommand(caller, command);
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(steamid);
if (matches.Count == 1)
{
@@ -281,6 +286,8 @@ namespace CS2_SimpleAdmin
IpAddress = caller?.IpAddress?.Split(":")[0]
};
Helper.LogCommand(caller, command);
int.TryParse(command.GetArg(2), out int time);
if (command.ArgCount >= 3 && command.GetArg(3).Length > 0)
@@ -375,6 +382,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
string pattern = command.GetArg(1);
Database database = new Database(dbConnectionString);

View File

@@ -27,6 +27,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]);
string utf8String = Encoding.UTF8.GetString(utf8BytesString);
@@ -58,6 +60,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
{
using (new WithTemporaryCulture(_player.GetLanguage()))
@@ -78,6 +82,8 @@ namespace CS2_SimpleAdmin
if (targets == null) return;
List<CCSPlayerController> playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList();
Helper.LogCommand(caller, command);
int range = command.GetArg(0).Length + command.GetArg(1).Length + 2;
string message = command.GetCommandString[range..];
@@ -107,6 +113,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
Helper.PrintToCenterAll(Helper.ReplaceTags(utf8String));
}
@@ -125,6 +133,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
VirtualFunctions.ClientPrintAll(
HudDestination.Alert,
Helper.ReplaceTags(utf8String),

View File

@@ -116,6 +116,8 @@ namespace CS2_SimpleAdmin
AdminSQLManager _adminManager = new(_database);
_ = _adminManager.AddAdminBySteamId(steamid, name, flags, immunity, time, globalAdmin);
Helper.LogCommand(caller, $"css_addadmin {steamid} {name} {flags} {immunity} {time}");
string msg = $"Added '{flags}' flags to '{name}' ({steamid})";
if (command != null)
command.ReplyToCommand(msg);
@@ -171,6 +173,8 @@ namespace CS2_SimpleAdmin
}
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
Helper.LogCommand(caller, $"css_deladmin {steamid}");
string msg = $"Removed flags from '{steamid}'";
if (command != null)
command.ReplyToCommand(msg);
@@ -195,6 +199,7 @@ namespace CS2_SimpleAdmin
public void ReloadAdmins()
{
if (_database == null) return;
foreach (SteamID steamId in AdminSQLManager._adminCache.Keys.ToList())
{
if (AdminSQLManager._adminCache.TryRemove(steamId, out _))
@@ -216,6 +221,8 @@ namespace CS2_SimpleAdmin
{
if (caller == null) return;
Helper.LogCommand(caller, command);
if (silentPlayers.Contains(caller.Slot))
{
RemoveFromConcurrentBag(silentPlayers, caller.Slot);
@@ -226,16 +233,14 @@ namespace CS2_SimpleAdmin
{
silentPlayers.Add(caller.Slot);
Server.ExecuteCommand("sv_disable_teamselect_menu 1");
Server.NextFrame(() =>
{
if (caller.PlayerPawn.Value != null && caller.PawnIsAlive)
caller.PlayerPawn.Value.CommitSuicide(true, false);
AddTimer(1.0f, () => { caller.ChangeTeam(CsTeam.Spectator); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
AddTimer(1.15f, () => { caller.ChangeTeam(CsTeam.None); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
caller.PrintToChat($"You are hidden now!");
AddTimer(1.22f, () => { Server.ExecuteCommand("sv_disable_teamselect_menu 0"); });
});
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);
}
}
@@ -390,6 +395,8 @@ namespace CS2_SimpleAdmin
player.Pawn.Value!.Freeze();
}
Helper.LogCommand(caller, $"css_kick {player.PlayerName} {reason}");
if (string.IsNullOrEmpty(reason) == false)
{
if (!player.IsBot && !player.IsHLTV)
@@ -450,6 +457,8 @@ namespace CS2_SimpleAdmin
string commandName = command?.GetCommandString ?? "css_changemap";
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName]));
}
if (command is not null)
Helper.LogCommand(caller, command);
AddTimer(2.0f, () =>
{
@@ -537,6 +546,8 @@ namespace CS2_SimpleAdmin
string commandName = command?.GetCommandString ?? "css_changewsmap";
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName]));
}
if (command is not null)
Helper.LogCommand(caller, command);
AddTimer(2.0f, () =>
{
@@ -570,6 +581,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
var value = command.GetArg(2);
Server.ExecuteCommand($"{cvar.Name} {value}");
@@ -591,6 +604,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
Server.ExecuteCommand(command.ArgString);
command.ReplyToCommand($"{callerName} executed command {command.ArgString}.");
Logger.LogInformation($"{callerName} executed command ({command.ArgString}).");
@@ -609,9 +624,11 @@ namespace CS2_SimpleAdmin
public static void RestartGame(CCSPlayerController? admin)
{
Helper.LogCommand(admin, "css_restartgame");
// TODO: Localize
var name = admin == null ? "Console" : admin.PlayerName;
Server.PrintToChatAll($"[SimpleAdmin] {name}: Restarting game...");
Server.PrintToChatAll($"[SA] {name}: Restarting game...");
Server.ExecuteCommand("mp_restartgame 2");
}
}

View File

@@ -76,6 +76,8 @@ namespace CS2_SimpleAdmin
IpAddress = caller?.IpAddress?.Split(":")[0]
};
Helper.LogCommand(caller, $"css_gag {player?.SteamID} {time} {reason}");
Task.Run(async () =>
{
await muteManager.MutePlayer(playerInfo, adminInfo, reason, time);
@@ -179,6 +181,8 @@ namespace CS2_SimpleAdmin
IpAddress = caller?.IpAddress?.Split(":")[0]
};
Helper.LogCommand(caller, command);
List<CCSPlayerController> matches = Helper.GetPlayerFromSteamid64(steamid);
if (matches.Count == 1)
{
@@ -264,6 +268,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
bool found = false;
string pattern = command.GetArg(1);
@@ -405,6 +411,8 @@ namespace CS2_SimpleAdmin
IpAddress = caller?.IpAddress?.Split(":")[0]
};
Helper.LogCommand(caller, $"css_mute {player?.SteamID} {time} {reason}");
player!.VoiceFlags = VoiceFlags.Muted;
Task.Run(async () =>
@@ -483,6 +491,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
int time = 0;
string reason = "Unknown";
@@ -581,6 +591,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
string pattern = command.GetArg(1);
bool found = false;
MuteManager _muteManager = new(_database);
@@ -711,6 +723,8 @@ namespace CS2_SimpleAdmin
IpAddress = caller?.IpAddress?.Split(":")[0]
};
Helper.LogCommand(caller, $"css_silence {player?.SteamID} {time} {reason}");
Task.Run(async () =>
{
await muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 2);
@@ -797,6 +811,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
int time = 0;
string reason = "Unknown";
@@ -898,6 +914,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
string pattern = command.GetArg(1);
bool found = false;
MuteManager _muteManager = new(_database);

View File

@@ -26,6 +26,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
voteAnswers.Clear();
string question = command.GetArg(1);
@@ -33,25 +35,30 @@ namespace CS2_SimpleAdmin
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
ChatMenu voteMenu = new(_localizer!["sa_admin_vote_menu_title", question]);
for (int i = 2; i <= answersCount - 1; i++)
{
voteAnswers.Add(command.GetArg(i), 0);
voteMenu.AddMenuOption(command.GetArg(i), Helper.HandleVotes);
}
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
{
using (new WithTemporaryCulture(_player.GetLanguage()))
{
ChatMenu voteMenu = new(_localizer!["sa_admin_vote_menu_title", question]);
for (int i = 2; i <= answersCount - 1; i++)
{
voteMenu.AddMenuOption(command.GetArg(i), Helper.HandleVotes);
}
voteMenu.PostSelectAction = PostSelectAction.Close;
MenuManager.OpenChatMenu(_player, voteMenu);
Helper.PrintToCenterAll(_localizer!["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]);
StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_vote_message", caller == null ? "Console" : caller.PlayerName, question]);
_player.PrintToChat(sb.ToString());
}
MenuManager.OpenChatMenu(_player, voteMenu);
}
voteInProgress = true;
@@ -84,7 +91,6 @@ namespace CS2_SimpleAdmin
}
}
voteAnswers.Clear();
votePlayers.Clear();
voteInProgress = false;
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
}

View File

@@ -41,6 +41,8 @@ namespace CS2_SimpleAdmin
callerName ??= caller == null ? "Console" : caller.PlayerName;
player!.Pawn.Value!.ToggleNoclip();
Helper.LogCommand(caller, $"css_noclip {player?.PlayerName}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
@@ -90,6 +92,8 @@ namespace CS2_SimpleAdmin
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);
@@ -138,6 +142,8 @@ namespace CS2_SimpleAdmin
player!.Pawn.Value!.Unfreeze();
Helper.LogCommand(caller, $"css_unfreeze {player?.PlayerName}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())

View File

@@ -8,7 +8,6 @@ using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils;
using System.Collections.Concurrent;
using System.Text;
namespace CS2_SimpleAdmin
@@ -47,6 +46,8 @@ namespace CS2_SimpleAdmin
player.CommitSuicide(false, true);
Helper.LogCommand(caller, $"css_slay {player?.PlayerName}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
@@ -114,14 +115,18 @@ namespace CS2_SimpleAdmin
public void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, CsItem weapon, string? callerName = null)
{
player.GiveNamedItem(weapon);
SubGiveWeapon(caller, player, weapon.ToString(), callerName);
Helper.LogCommand(caller, $"css_give {player?.PlayerName} {weapon.ToString()}");
player?.GiveNamedItem(weapon);
SubGiveWeapon(caller, player!, weapon.ToString(), callerName);
}
public void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null)
{
player.GiveNamedItem(weaponName);
SubGiveWeapon(caller, player, weaponName, callerName);
Helper.LogCommand(caller, $"css_give {player?.PlayerName} {weaponName}");
player?.GiveNamedItem(weaponName);
SubGiveWeapon(caller, player!, weaponName, callerName);
}
public void SubGiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null)
@@ -177,6 +182,8 @@ namespace CS2_SimpleAdmin
player.RemoveWeapons();
Helper.LogCommand(caller, $"css_strip {player?.PlayerName}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
@@ -229,6 +236,8 @@ namespace CS2_SimpleAdmin
player.SetHp(health);
Helper.LogCommand(caller, $"css_hp {player?.PlayerName} {health}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
@@ -281,6 +290,8 @@ namespace CS2_SimpleAdmin
player.SetSpeed((float)speed);
Helper.LogCommand(caller, $"css_speed {player?.PlayerName} {speed}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
@@ -288,7 +299,7 @@ namespace CS2_SimpleAdmin
using (new WithTemporaryCulture(_player.GetLanguage()))
{
StringBuilder sb = new(_localizer!["sa_prefix"]);
sb.Append(_localizer["sa_admin_speed_message", callerName, player.PlayerName]);
sb.Append(_localizer["sa_admin_speed_message", callerName, player!.PlayerName]);
_player.PrintToChat(sb.ToString());
}
}
@@ -330,13 +341,15 @@ namespace CS2_SimpleAdmin
if (player != null)
{
Helper.LogCommand(caller, $"css_god {player.PlayerName}");
if (!godPlayers.Contains(player.Slot))
{
godPlayers.Add(player.Slot);
}
else
{
godPlayers = new ConcurrentBag<int>(godPlayers.Where(item => item != player.Slot));
RemoveFromConcurrentBag(godPlayers, player.Slot);
}
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
@@ -395,6 +408,8 @@ namespace CS2_SimpleAdmin
callerName ??= caller == null ? "Console" : caller.PlayerName;
player!.Pawn.Value!.Slap(damage);
Helper.LogCommand(caller, $"css_slap {player?.PlayerName} {damage}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
@@ -456,9 +471,12 @@ namespace CS2_SimpleAdmin
}
bool kill = command.GetArg(3).ToLower().Equals("-k");
Helper.LogCommand(caller, command);
playersToTarget.ForEach(player =>
{
ChangeTeam(caller, player, _teamName.ToLower(), teamNum, kill, callerName);
ChangeTeam(caller, player, _teamName, teamNum, kill, callerName);
});
}
@@ -527,6 +545,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
playersToTarget.ForEach(player =>
{
if (!player.IsBot && player.SteamID.ToString().Length != 17)
@@ -591,6 +611,8 @@ namespace CS2_SimpleAdmin
VirtualFunction.CreateVoid<CCSPlayerController>(player.Handle,
GameData.GetOffset("CCSPlayerController_Respawn"))(player);
Helper.LogCommand(caller, $"css_respawn {player.PlayerName}");
if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot))
{
foreach (CCSPlayerController _player in Helper.GetValidPlayers())
@@ -629,6 +651,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
playersToTarget.ForEach(player =>
{
if (!player.IsBot && player.SteamID.ToString().Length != 17 || !player.PawnIsAlive)
@@ -683,6 +707,8 @@ namespace CS2_SimpleAdmin
_discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString]));
}
Helper.LogCommand(caller, command);
playersToTarget.ForEach(player =>
{
if (!player.IsBot && player.SteamID.ToString().Length != 17 || !player.PawnIsAlive)

View File

@@ -206,7 +206,6 @@ public partial class CS2_SimpleAdmin
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
playerPenaltyManager.RemoveAllPenalties(player.Slot);
//RemoveFromConcurrentBag(gaggedPlayers, player.Slot);
RemoveFromConcurrentBag(silentPlayers, player.Slot);
RemoveFromConcurrentBag(godPlayers, player.Slot);
@@ -226,7 +225,6 @@ public partial class CS2_SimpleAdmin
private void OnMapStart(string mapName)
{
Random random = new Random();
//gaggedPlayers.Clear();
godPlayers.Clear();
silentPlayers.Clear();
@@ -290,7 +288,7 @@ public partial class CS2_SimpleAdmin
TagsDetected = true;
}
AddTimer(2.0f, async () =>
AddTimer(3.0f, async () =>
{
string? address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>()}";
string? hostname = ConVar.Find("hostname")!.StringValue;
@@ -300,68 +298,63 @@ public partial class CS2_SimpleAdmin
AdminSQLManager _adminManager = new(_database);
try
{
await using (var connection = await _database.GetConnectionAsync())
await using var connection = await _database.GetConnectionAsync();
bool addressExists = await connection.ExecuteScalarAsync<bool>(
"SELECT COUNT(*) FROM sa_servers WHERE address = @address",
new { address });
if (!addressExists)
{
bool addressExists = await connection.ExecuteScalarAsync<bool>(
"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 WHERE address = @address",
new { address, hostname });
}
int? serverId = await connection.ExecuteScalarAsync<int>(
"SELECT `id` FROM `sa_servers` WHERE `address` = @address",
new { address });
ServerId = serverId;
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 WHERE address = @address",
new { address, hostname });
}
int? serverId = await connection.ExecuteScalarAsync<int>(
"SELECT `id` FROM `sa_servers` WHERE `address` = @address",
new { address });
ServerId = serverId;
}
catch (Exception)
{
if (_logger != null)
_logger.LogCritical("Unable to create or get server_id");
_logger?.LogCritical("Unable to create or get server_id");
}
await _adminManager.GiveAllFlags();
});
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
AddTimer(2.0f, () =>
AddTimer(3.0f, () =>
{
ConVar? botQuota = ConVar.Find("bot_quota");
if (botQuota != null && botQuota.GetPrimitiveValue<int>() > 0)
{
Logger.LogInformation("Due to bugs with bots (game bug), consider disabling bots by setting `bot_quota 0` in the gamemode config if your server crashes after a map change.");
Logger.LogWarning("Due to bugs with bots (game bug), consider disabling bots by setting `bot_quota 0` in the gamemode config if your server crashes after a map change.");
Logger.LogCritical("Due to bugs with bots (game bug), consider disabling bots by setting `bot_quota 0` in the gamemode config if your server crashes after a map change.");
}
});
}
[GameEventHandler]
private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
public HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Userid;
if (player is null || @event.Attacker == null || !player.IsValid || !player.PlayerPawn.IsValid || player.PlayerPawn.Value == null
|| player.IsBot || player.IsHLTV || player.PlayerPawn.IsValid || player.Connected == PlayerConnectedState.PlayerDisconnecting
|| @event.Attacker.Connected == PlayerConnectedState.PlayerDisconnecting)
if (player is null || @event.Attacker is null || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE || player.PlayerPawn.Value == null
|| player.Connected != PlayerConnectedState.PlayerConnected)
return HookResult.Continue;
if (godPlayers.Contains(player.Slot) && player.PawnIsAlive)
if (godPlayers.Contains(player.Slot))
{
player.Health = 100;
player.PlayerPawn.Value.Health = 100;
player.PlayerPawn.Value.Health = player.PlayerPawn.Value.MaxHealth;
player.PlayerPawn.Value.ArmorValue = 100;
}
return HookResult.Continue;

View File

@@ -1,12 +1,14 @@
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 CounterStrikeSharp.API.Modules.Utils;
using Discord;
using Microsoft.Extensions.Logging;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
@@ -135,12 +137,37 @@ namespace CS2_SimpleAdmin
internal static void HandleVotes(CCSPlayerController player, ChatMenuOption option)
{
if (CS2_SimpleAdmin.voteInProgress && !CS2_SimpleAdmin.votePlayers.Contains(player.Slot))
{
option.Disabled = true;
CS2_SimpleAdmin.votePlayers.Add(player.Slot);
CS2_SimpleAdmin.voteAnswers[option.Text]++;
}
if (!CS2_SimpleAdmin.voteInProgress)
return;
option.Disabled = true;
CS2_SimpleAdmin.voteAnswers[option.Text]++;
}
internal static void LogCommand(CCSPlayerController? caller, CommandInfo command)
{
if (CS2_SimpleAdmin.Instance == null || CS2_SimpleAdmin._localizer == null)
return;
string playerName = caller?.PlayerName ?? "Console";
string? hostname = ConVar.Find("hostname")!.StringValue ?? "Unknown";
CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer["sa_discord_log_command",
playerName, command.GetCommandString]}".Replace("HOSTNAME", hostname).Replace("**", ""));
}
internal static void LogCommand(CCSPlayerController? caller, string command)
{
if (CS2_SimpleAdmin.Instance == null || CS2_SimpleAdmin._localizer == null)
return;
string playerName = caller?.PlayerName ?? "Console";
string? hostname = ConVar.Find("hostname")!.StringValue ?? "Unknown";
CS2_SimpleAdmin.Instance.Logger.LogInformation($"{CS2_SimpleAdmin._localizer["sa_discord_log_command",
playerName, command]}".Replace("HOSTNAME", hostname).Replace("**", ""));
}
public static IEnumerable<Embed> GenerateEmbedsDiscord(string title, string description, string thumbnailUrl, Color color, string[] fieldNames, string[] fieldValues, bool[] inlineFlags)
@@ -206,7 +233,7 @@ namespace CS2_SimpleAdmin
private static byte[] GetStringBytes(string str)
{
return Encoding.ASCII.GetBytes(str);
return Encoding.UTF8.GetBytes(str);
}
}
}

View File

@@ -101,19 +101,33 @@ namespace CS2_SimpleAdmin
CS2_SimpleAdmin._logger.LogCritical($"IsPlayerBanned for {player.Name}");
#endif
DateTime currentTimeUtc = DateTime.UtcNow;
string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)";
int banCount = 0;
DateTime currentTime = DateTime.Now;
try
{
string sql = @"
UPDATE sa_bans
SET player_ip = CASE WHEN player_ip IS NULL THEN @PlayerIP ELSE player_ip END,
player_name = CASE WHEN player_name IS NULL THEN @PlayerName ELSE player_name END
WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)
AND status = 'ACTIVE'
AND (duration = 0 OR ends > @CurrentTime);
SELECT COUNT(*) FROM sa_bans
WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)
AND status = 'ACTIVE'
AND (duration = 0 OR ends > @CurrentTime);";
await using var connection = await _database.GetConnectionAsync();
var parameters = new
{
PlayerSteamID = player.SteamId,
PlayerIP = !string.IsNullOrEmpty(player.IpAddress) ? player.IpAddress : (object)DBNull.Value,
CurrentTime = currentTimeUtc
PlayerName = !string.IsNullOrEmpty(player.Name) ? player.Name : string.Empty,
CurrentTime = currentTime
};
banCount = await connection.ExecuteScalarAsync<int>(sql, parameters);

View File

@@ -93,10 +93,10 @@ namespace CS2_SimpleAdmin
try
{
await using var connection = await _database.GetConnectionAsync();
DateTime currentTimeUtc = DateTime.UtcNow;
DateTime currentTime = DateTime.Now;
string sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)";
var parameters = new { PlayerSteamID = steamId, CurrentTime = currentTimeUtc };
var parameters = new { PlayerSteamID = steamId, CurrentTime = currentTime };
var activeMutes = (await connection.QueryAsync(sql, parameters)).ToList();
return activeMutes;
}

View File

@@ -62,7 +62,7 @@ Manage your Counter-Strike 2 server by simple commands :)
```
### Requirments
- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v166**
- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v168**
- MySQL **tested on MySQL (MariaDB) Server version: 10.11.4-MariaDB-1~deb12u1 Debian 12**

View File

@@ -1,6 +1,6 @@
{
"sa_prefix": "{lightred}[SA] {default}",
"sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Mostrar inpormações sobre o player\n- css_players - Mostrar a lista de players\n- css_ban <#userid or name> [time in minutos/0 perm] [reason] - Ban player\n- css_addban <steamid> [time in minutos/0 perm] [reason] - Banir o player através do steamid64\n- css_banip <ip> [time in minutos/0 perm] [reason] - Banir o player através do endereço IP\n- css_unban <steamid or name or ip> - Desbanir o player\n- css_kick <#userid or name> [reason] - Kikar player\n- css_gag <#userid or name> [time in minutos/0 perm] [reason] - Mutar pelo chat o player\n- css_addgag <steamid> [time in minutos/0 perm] [reason] - Mutar pelo chat o player pelo steamid64\n- css_unmute <steamid or name> - Desmutar pelo chat o player\n- css_mute <#userid or name> [time in minutos/0 perm] [reason] - Mutar na voice o player\n- css_addmute <steamid> [time in minutos/0 perm] [reason] - Mutar na voice o player pelo steamid64\n- css_give <#userid or name> <weapon> - Dar arma a um player\n- css_strip <#userid or name> <weapon> - Tirar arma de um player\n- css_hp <#userid or name> [health] - Setar vida de um player\n- css_god <#userid or name> - Alternar god no player\n- css_slay <#userid or name> - Matar player\n- css_slap <#userid or name> [damage] - Dâ uns tapa no player\n- css_vote <'Question?'> ['Answer1'] ['Answer2'] ... - Criar votação (pool)\n- css_map <mapname> - Mudar mapa\n- css_wsmap <name or id> - Mudar mapa da workshop\n- css_asay <message> - Mandar mensagem para todos os Admins\n- css_say <message> - Manda uma mensagem em modo adm no chat\n- css_psay <#userid or name> <message> - Manda uma mensagem privada para um player\n- css_csay <message> - Manda uma mensagem em modo admin de centro\n- css_hsay <message> - Manda uma mensagem em modo admin no HUD\n- css_noclip <#userid or name> - Alternar Noclip em player\n- css_freeze <#userid or name> [duration] - Congela um player\n- css_unfreeze <#userid or name> - Descongela um player\n- css_respawn <#userid or name> - Respawna um player\n- css_cvar <cvar> <value> - Muda valor de cvar\n- css_rcon <command> - Executar comando como servidor",
"sa_adminhelp": "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_who <#userid or name> - Mostrar inpormações sobre o player\n- css_players - Mostrar a lista de players\n- css_ban <#userid or name> [time in minutos/0 perm] [reason] - Ban player\n- css_addban <steamid> [time in minutos/0 perm] [reason] - Banir o player através do steamid64\n- css_banip <ip> [time in minutos/0 perm] [reason] - Banir o player através do endereço IP\n- css_unban <steamid or name or ip> - Desbanir o player\n- css_kick <#userid or name> [reason] - Kikar player\n- css_gag <#userid or name> [time in minutos/0 perm] [reason] - Mutar pelo chat o player\n- css_addgag <steamid> [time in minutos/0 perm] [reason] - Mutar pelo chat o player pelo steamid64\n- css_unmute <steamid or name> - Desmutar pelo chat o player\n- css_mute <#userid or name> [time in minutos/0 perm] [reason] - Mutar na voice o player\n- css_addmute <steamid> [time in minutos/0 perm] [reason] - Mutar na voice o player pelo steamid64\n- css_give <#userid or name> <weapon> - Dar arma a um player\n- css_strip <#userid or name> <weapon> - Tirar arma de um player\n- css_hp <#userid or name> [health] - Setar vida de um player\n- css_god <#userid or name> - Alternar god no player\n- css_slay <#userid or name> - Matar player\n- css_slap <#userid or name> [damage] - Dâ uns tapa no player\n-<'Question?'> [ 'Answer1' ] ['Answer2'] ... - Criar votação (pool)\n- css_map <mapname> - Mudar mapa\n- css_wsmap <name or id> - Mudar mapa da workshop\n- css_asay <message> - Mandar mensagem para todos os Admins\n- css_say <message> - Manda uma mensagem em modo adm no chat\n- css_psay <#userid or name> <message> - Manda uma mensagem privada para um player\n- css_csay <message> - Manda uma mensagem em modo admin de centro\n- css_hsay <message> - Manda uma mensagem em modo admin no HUD\n- css_noclip <#userid or name> - Alternar Noclip em player\n- css_freeze <#userid or name> [duration] - Congela um player\n- css_unfreeze <#userid or name> - Descongela um player\n- css_respawn <#userid or name> - Respawna um player\n- css_cvar <cvar> <value> - Muda valor de cvar\n- css_rcon <command> - Executar comando como servidor",
"sa_player_ban_message_time": "Você foi banido por {lightred}{0}{default} por {lightred}{1}{default} minutos por {lightred}{2}{default}!",
"sa_player_ban_message_perm": "Você foi banido permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!",
"sa_player_kick_message": "Você foi kikado por {lightred}{0}{default} por {lightred}{1}{default}!",
@@ -9,7 +9,7 @@
"sa_player_mute_message_time": "Você foi mutado na voice por {lightred}{0}{default} por {lightred}{1}{default} minutos por {lightred}{2}{default}!",
"sa_player_mute_message_perm": "Você foi mutado na voice permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!",
"sa_player_silence_message_time": "Você foi silenciado por {lightred}{0}{default} por {lightred}{1}{default} minutos pelo {green}Admin {lightred}{2}{default}!",
"sa_player_silence_message_perm": "Você foi sileciado permanentemente por {lightred}{0}{default} pelo {green}Admin {lightred}{1}{default}!",
"sa_player_silence_message_perm": "Você foi sileciado permanentemente por {lightred}{0}{default} pelo {green}Admin {lightred}{1}{default}!",
"sa_admin_ban_message_time": "Admin {lightred}{0}{default} baniu {lightred}{1}{default} por {lightred}{2}{default} por {lightred}{3}{default} minutos!",
"sa_admin_ban_message_perm": "Admin {lightred}{0}{default} baniu {lightred}{1}{default} permanentemente por {lightred}{2}{default}!",
"sa_admin_kick_message": "Admin {lightred}{0}{default} kikou {lightred}{1}{default} por {lightred}{2}{default}!",
@@ -18,7 +18,7 @@
"sa_admin_mute_message_time": "Admin {lightred}{0}{default} mutou na voice {lightred}{1}{default} por {lightred}{2}{default} por {lightred}{3}{default} minutos!",
"sa_admin_mute_message_perm": "Admin {lightred}{0}{default} mutou na voice {lightred}{1}{default} permanentemente por {lightred}{2}{default}!",
"sa_admin_silence_message_time": "Admin {lightred}{0}{default} silenciou {lightred}{1}{default} por {lightred}{2}{default} por {lightred}{3}{default} minutos!",
"sa_admin_silence_message_perm": "Admin {lightred}{0}{default} silenciou {lightred}{1}{default} permanentemente por {lightred}{2}{default}!",
"sa_admin_silence_message_perm": "Admin {lightred}{0}{default} silenciou {lightred}{1}{default} permanentemente por {lightred}{2}{default}!",
"sa_admin_give_message": "Admin {lightred}{0}{default} deu a arma {lightred}{1}{default} para {lightred}{2}{default}!",
"sa_admin_strip_message": "Admin {lightred}{0}{default} {lightred}removeu {default}a arma do player {lightred}{1}{default}!",
"sa_admin_hp_message": "Admin {lightred}{0}{default} mudou a {lightred}quantidade de HP {default}de {lightred}{1}{default}!",
@@ -30,7 +30,7 @@
"sa_admin_noclip_message": "Admin {lightred}{0}{default} alternou o {lightred}noclip {default}em {lightred}{1}{default}!",
"sa_admin_freeze_message": "Admin {lightred}{0}{default} congelou {lightred}{1}{default}!",
"sa_admin_unfreeze_message": "Admin {lightred}{0}{default} descongelou {lightred}{1}{default}!",
"sa_admin_rename_message": "Admin {lightred}{0}{default} mudou o nickname de {lightred}{1}{default} para {lightred}{2}{default}!",
"sa_admin_rename_message": "Admin {lightred}{0}{default} mudou o nickname de {lightred}{1}{default} para {lightred}{2}{default}!",
"sa_admin_respawn_message": "Admin {lightred}{0}{default} respawnou {lightred}{1}{default}!",
"sa_admin_tp_message": "Admin {lightred}{0}{default} teleleportou para {lightred}{1}{default}!",
"sa_admin_bring_message": "Admin {lightred}{0}{default} teleportou para si {lightred}{1}{default}!",

View File

@@ -8,8 +8,8 @@
"sa_player_gag_message_perm": "Администратор {lightred}{1}{default} выдал вам мут чата навсегда по причине {lightred}{0}{default}!",
"sa_player_mute_message_time": "Администратор {lightred}{2}{default} выдал вам мут голоса по причине {lightred}{0}{default} на {lightred}{1}{default} минут!",
"sa_player_mute_message_perm": "Администратор {lightred}{1}{default} выдал вам мут голоса навсегда по причине {lightred}{0}{default}!",
"sa_player_silence_message_time": "Вы были замьючены на {lightred}{0}{default} на {lightred}{1}{default} минут {lightred}{2}{default}!",
"sa_player_silence_message_perm": "Вы были замьючены навсегда для {lightred}{0}{default} по причине {lightred}{1}{default}!",
"sa_player_silence_message_time": "Вы были замьючены на {lightred}{0}{default} на {lightred}{1}{default} минут {lightred}{2}{default}!",
"sa_player_silence_message_perm": "Вы были замьючены навсегда для {lightred}{0}{default} по причине {lightred}{1}{default}!",
"sa_admin_ban_message_time": "Администратор {lightred}{0}{default} забанил {lightred}{1}{default} по причине {lightred}{2}{default} на {lightred}{3}{default} минут!",
"sa_admin_ban_message_perm": "Администратор {lightred}{0}{default} забанил {lightred}{1}{default} навсегда по причине {lightred}{2}{default}!",
"sa_admin_kick_message": "Администратор {lightred}{0}{default} кикнул {lightred}{1}{default} по причине {lightred}{2}{default}!",
@@ -18,7 +18,7 @@
"sa_admin_mute_message_time": "Администратор {lightred}{0}{default} выдал бан чата {lightred}{1}{default} по причине {lightred}{2}{default} на {lightred}{3}{default} минут!",
"sa_admin_mute_message_perm": "Администратор {lightred}{0}{default} выдал бан чата {lightred}{1}{default} навсегда игроку {lightred}{2}{default}!",
"sa_admin_silence_message_time": "Администратор {lightred}{0}{default} заглушил {lightred}{1}{default} по причине {lightred}{2}{default} на {lightred}{3}{default} минут",
"sa_admin_silence_message_perm": "Администратор {lightred}{0}{default} заглушил {lightred}{1}{default} навсегда по причине {lightred}{2}{default}!",
"sa_admin_silence_message_perm": "Администратор {lightred}{0}{default} заглушил {lightred}{1}{default} навсегда по причине {lightred}{2}{default}!",
"sa_admin_give_message": "Администратор {lightred}{0}{default} присвоил {lightred}{1}{default} значение {lightred}{2}{default}!",
"sa_admin_strip_message": "Администратор {lightred}{0}{default} забрал у игрока {lightred}{1}{default} всё оружие!",
"sa_admin_hp_message": "Администратор {lightred}{0}{default} измененил {lightred}{1}{default} количество здоровья{default}!",
@@ -30,7 +30,7 @@
"sa_admin_noclip_message": "Администратор {lightred}{0}{default} переключил режим полета для {lightred}{1}{default}!",
"sa_admin_freeze_message": "Администратор {lightred}{0}{default} заморозил {lightred}{1}{default}!",
"sa_admin_unfreeze_message": "Администратор {lightred}{0}{default} разморозил {lightred}{1}{default}!",
"sa_admin_rename_message": "Администратор {lightred}{0}{default} изменил ник {lightred}{1}{default} на {lightred}{2}{default}!",
"sa_admin_rename_message": "Администратор {lightred}{0}{default} изменил ник {lightred}{1}{default} на {lightred}{2}{default}!",
"sa_admin_respawn_message": "Администратор {lightred}{0}{default} заспавнил {lightred}{1}{default}!",
"sa_admin_team_message": "Администратор {lightred}{0}{default} переместил {lightred}{1}{default} в {lightred}{2}{default}!",
"sa_admin_vote_menu_title": "{lime}ГОЛОСУЙ ЗА {gold}{0}",
@@ -40,7 +40,7 @@
"sa_adminsay_prefix": "{RED}ADMIN: {lightred}{0}{default}",
"sa_adminchat_template_admin": "{LIME}(ADMIN) {lightred}{0}{default}: {lightred}{1}{default}",
"sa_admin_tp_message": "Администратор {lightred}{0}{default} телепортировался к {lightred}{1}{default}!",
"sa_admin_bring_message": "Администратор {lightred}{0}{default} телепортировал к себе {lightred}{1}{default}!",
"sa_admin_bring_message": "Администратор {lightred}{0}{default} телепортировал к себе {lightred}{1}{default}!",
"sa_adminchat_template_player": "{SILVER}(PLAYER) {lightred}{0}{default}: {lightred}{1}{default}",
"sa_discord_log_command": "**{0}** отправил команду `{1}` на сервере `HOSTNAME`"
}