mirror of
https://github.com/daffyyyy/CS2-SimpleAdmin.git
synced 2026-02-17 18:39:07 +00:00
Compare commits
2 Commits
afb7d2898e
...
1dafc6b4e2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1dafc6b4e2 | ||
|
|
b2ebe136c3 |
@@ -82,4 +82,9 @@ public class CS2_SimpleAdminApi : ICS2_SimpleAdminApi
|
|||||||
{
|
{
|
||||||
Helper.LogCommand(caller, command);
|
Helper.LogCommand(caller, command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsAdminSilent(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
return CS2_SimpleAdmin.SilentPlayers.Contains(player.Slot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ using MySqlConnector;
|
|||||||
|
|
||||||
namespace CS2_SimpleAdmin;
|
namespace CS2_SimpleAdmin;
|
||||||
|
|
||||||
[MinimumApiVersion(284)]
|
[MinimumApiVersion(286)]
|
||||||
public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdminConfig>
|
public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdminConfig>
|
||||||
{
|
{
|
||||||
internal static CS2_SimpleAdmin Instance { get; private set; } = new();
|
internal static CS2_SimpleAdmin Instance { get; private set; } = new();
|
||||||
@@ -19,7 +19,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
|
|||||||
public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)");
|
public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)");
|
||||||
public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
|
public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
|
||||||
public override string ModuleAuthor => "daffyy & Dliix66";
|
public override string ModuleAuthor => "daffyy & Dliix66";
|
||||||
public override string ModuleVersion => "1.6.8a";
|
public override string ModuleVersion => "1.6.9a";
|
||||||
|
|
||||||
public override void Load(bool hotReload)
|
public override void Load(bool hotReload)
|
||||||
{
|
{
|
||||||
@@ -36,10 +36,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
|
|||||||
AddTimer(2.0f, () =>
|
AddTimer(2.0f, () =>
|
||||||
{
|
{
|
||||||
if (Database == null) return;
|
if (Database == null) return;
|
||||||
|
|
||||||
|
var playerManager = new PlayerManager();
|
||||||
|
|
||||||
Helper.GetValidPlayers().ForEach(player =>
|
Helper.GetValidPlayers().ForEach(player =>
|
||||||
{
|
{
|
||||||
var playerManager = new PlayerManager();
|
|
||||||
playerManager.LoadPlayerData(player);
|
playerManager.LoadPlayerData(player);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -56,9 +57,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
AddTimer(3.0f, () => ReloadAdmins(null));
|
AddTimer(3.0f, () => ReloadAdmins(null));
|
||||||
|
|
||||||
MenuApi = MenuCapability.Get();
|
try
|
||||||
if (MenuApi == null)
|
{
|
||||||
Logger.LogError("MenuManager Core not found...");
|
MenuApi = MenuCapability.Get();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError("Unable to load required plugins ... \n{exception}", ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
RegisterCommands.InitializeCommands();
|
RegisterCommands.InitializeCommands();
|
||||||
}
|
}
|
||||||
@@ -88,9 +94,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
|
|||||||
DbConnectionString = builder.ConnectionString;
|
DbConnectionString = builder.ConnectionString;
|
||||||
Database = new Database.Database(DbConnectionString);
|
Database = new Database.Database(DbConnectionString);
|
||||||
|
|
||||||
if (!Database.CheckDatabaseConnection())
|
if (!Database.CheckDatabaseConnection(out var exception))
|
||||||
{
|
{
|
||||||
Logger.LogError("Unable connect to database!");
|
if (exception != null)
|
||||||
|
Logger.LogError("Problem with database connection! \n{exception}", exception);
|
||||||
|
|
||||||
Unload(false);
|
Unload(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.286" />
|
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.287" />
|
||||||
<PackageReference Include="Dapper" Version="2.1.35" />
|
<PackageReference Include="Dapper" Version="2.1.35" />
|
||||||
<PackageReference Include="MySqlConnector" Version="2.4.0-beta.2" />
|
<PackageReference Include="MySqlConnector" Version="2.4.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="*" />
|
<PackageReference Include="Newtonsoft.Json" Version="*" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -171,6 +171,8 @@ public partial class CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
await BanManager.AddBanBySteamid(steamid, adminInfo, reason, time);
|
await BanManager.AddBanBySteamid(steamid, adminInfo, reason, time);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Helper.SendDiscordPenaltyMessage(caller, steamid, reason, time, PenaltyType.Ban, _localizer);
|
||||||
|
|
||||||
command.ReplyToCommand($"Player with steamid {steamid} is not online. Ban has been added offline.");
|
command.ReplyToCommand($"Player with steamid {steamid} is not online. Ban has been added offline.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -375,14 +375,14 @@ public partial class CS2_SimpleAdmin
|
|||||||
var adminsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/admins.json");
|
var adminsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/admins.json");
|
||||||
var groupsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/groups.json");
|
var groupsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/groups.json");
|
||||||
|
|
||||||
await Server.NextFrameAsync(() =>
|
await Server.NextWorldUpdateAsync(() =>
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(adminsFile))
|
if (!string.IsNullOrEmpty(adminsFile))
|
||||||
AddTimer(0.5f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
AddTimer(1.0f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
||||||
if (!string.IsNullOrEmpty(groupsFile))
|
if (!string.IsNullOrEmpty(groupsFile))
|
||||||
AddTimer(1.0f, () => AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"));
|
AddTimer(1.5f, () => AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"));
|
||||||
if (!string.IsNullOrEmpty(adminsFile))
|
if (!string.IsNullOrEmpty(adminsFile))
|
||||||
AddTimer(1.5f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
AddTimer(2.0f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,8 @@ public partial class CS2_SimpleAdmin
|
|||||||
await MuteManager.AddMuteBySteamid(steamid, adminInfo, reason, time);
|
await MuteManager.AddMuteBySteamid(steamid, adminInfo, reason, time);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Helper.SendDiscordPenaltyMessage(caller, steamid, reason, time, PenaltyType.Gag, _localizer);
|
||||||
|
|
||||||
command.ReplyToCommand($"Player with steamid {steamid} is not online. Gag has been added offline.");
|
command.ReplyToCommand($"Player with steamid {steamid} is not online. Gag has been added offline.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,6 +372,8 @@ public partial class CS2_SimpleAdmin
|
|||||||
await MuteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 1);
|
await MuteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Helper.SendDiscordPenaltyMessage(caller, steamid, reason, time, PenaltyType.Mute, _localizer);
|
||||||
|
|
||||||
command.ReplyToCommand($"Player with steamid {steamid} is not online. Mute has been added offline.");
|
command.ReplyToCommand($"Player with steamid {steamid} is not online. Mute has been added offline.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,6 +593,8 @@ public partial class CS2_SimpleAdmin
|
|||||||
await MuteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 2);
|
await MuteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Helper.SendDiscordPenaltyMessage(caller, steamid, reason, time, PenaltyType.Silence, _localizer);
|
||||||
|
|
||||||
command.ReplyToCommand($"Player with steamid {steamid} is not online. Silence has been added offline.");
|
command.ReplyToCommand($"Player with steamid {steamid} is not online. Silence has been added offline.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,16 +41,18 @@ public class Database(string dbConnectionString)
|
|||||||
migrator.ExecuteMigrations();
|
migrator.ExecuteMigrations();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CheckDatabaseConnection()
|
public bool CheckDatabaseConnection(out string? exception)
|
||||||
{
|
{
|
||||||
using var connection = GetConnection();
|
using var connection = GetConnection();
|
||||||
|
exception = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return connection.Ping();
|
return connection.Ping();
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
exception = ex.Message;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public partial class CS2_SimpleAdmin
|
|||||||
GravityPlayers.Remove(player);
|
GravityPlayers.Remove(player);
|
||||||
|
|
||||||
if (player.UserId.HasValue)
|
if (player.UserId.HasValue)
|
||||||
PlayersInfo.Remove(player.UserId.Value);
|
PlayersInfo.TryRemove(player.UserId.Value, out _);
|
||||||
|
|
||||||
var authorizedSteamId = player.AuthorizedSteamID;
|
var authorizedSteamId = player.AuthorizedSteamID;
|
||||||
if (authorizedSteamId == null || !PermissionManager.AdminCache.TryGetValue(authorizedSteamId,
|
if (authorizedSteamId == null || !PermissionManager.AdminCache.TryGetValue(authorizedSteamId,
|
||||||
@@ -132,7 +132,7 @@ public partial class CS2_SimpleAdmin
|
|||||||
public HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
public HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
Logger.LogCritical("[OnRoundEnd]");
|
Logger.LogCritical("[OnRoundStart]");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GodPlayers.Clear();
|
GodPlayers.Clear();
|
||||||
@@ -209,7 +209,9 @@ public partial class CS2_SimpleAdmin
|
|||||||
if (target == null || !target.IsValid || target.Connected != PlayerConnectedState.PlayerConnected)
|
if (target == null || !target.IsValid || target.Connected != PlayerConnectedState.PlayerConnected)
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
|
|
||||||
return !AdminManager.CanPlayerTarget(player, target) ? HookResult.Stop : HookResult.Continue;
|
Logger.LogInformation($"{player.PlayerName} {AdminManager.GetPlayerImmunity(player).ToString()} probuje wywalic {target.PlayerName} {AdminManager.GetPlayerImmunity(target).ToString()}");
|
||||||
|
|
||||||
|
return !player.CanTarget(target) ? HookResult.Stop : HookResult.Continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,12 +368,15 @@ public partial class CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
|
||||||
if (player?.UserId == null || player.IsBot || player.Connected != PlayerConnectedState.PlayerConnected)
|
if (player?.UserId == null || !player.IsValid || player.IsHLTV || player.Connected != PlayerConnectedState.PlayerConnected)
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
|
|
||||||
SpeedPlayers.Remove(player.Slot);
|
SpeedPlayers.Remove(player.Slot);
|
||||||
GravityPlayers.Remove(player);
|
GravityPlayers.Remove(player);
|
||||||
|
|
||||||
|
if (!PlayersInfo.ContainsKey(player.UserId.Value))
|
||||||
|
return HookResult.Continue;
|
||||||
|
|
||||||
PlayersInfo[player.UserId.Value].DiePosition = new DiePosition(
|
PlayersInfo[player.UserId.Value].DiePosition = new DiePosition(
|
||||||
new Vector(
|
new Vector(
|
||||||
player.PlayerPawn.Value?.AbsOrigin?.X ?? 0,
|
player.PlayerPawn.Value?.AbsOrigin?.X ?? 0,
|
||||||
|
|||||||
@@ -393,6 +393,102 @@ internal static class Helper
|
|||||||
var hostname = ConVar.Find("hostname")?.StringValue ?? localizer["sa_unknown"];
|
var hostname = ConVar.Find("hostname")?.StringValue ?? localizer["sa_unknown"];
|
||||||
var colorHex = penaltySetting.FirstOrDefault(s => s.Name.Equals("Color"))?.Value ?? "#FFFFFF";
|
var colorHex = penaltySetting.FirstOrDefault(s => s.Name.Equals("Color"))?.Value ?? "#FFFFFF";
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(colorHex))
|
||||||
|
colorHex = "#FFFFFF";
|
||||||
|
|
||||||
|
var embed = new Embed
|
||||||
|
{
|
||||||
|
Color = DiscordManager.ColorFromHex(colorHex),
|
||||||
|
Title = penalty switch
|
||||||
|
{
|
||||||
|
PenaltyType.Ban => localizer["sa_discord_penalty_ban"],
|
||||||
|
PenaltyType.Mute => localizer["sa_discord_penalty_mute"],
|
||||||
|
PenaltyType.Gag => localizer["sa_discord_penalty_gag"],
|
||||||
|
PenaltyType.Silence => localizer["sa_discord_penalty_silence"],
|
||||||
|
PenaltyType.Warn => localizer["sa_discord_penalty_warn"],
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(penalty), penalty, null)
|
||||||
|
},
|
||||||
|
Description = $"{hostname}",
|
||||||
|
ThumbnailUrl = penaltySetting.FirstOrDefault(s => s.Name.Equals("ThumbnailUrl"))?.Value,
|
||||||
|
ImageUrl = penaltySetting.FirstOrDefault(s => s.Name.Equals("ImageUrl"))?.Value,
|
||||||
|
Footer = new Footer
|
||||||
|
{
|
||||||
|
Text = penaltySetting.FirstOrDefault(s => s.Name.Equals("Footer"))?.Value
|
||||||
|
},
|
||||||
|
|
||||||
|
Timestamp = Time.ActualDateTime().ToUniversalTime().ToString("o"),
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var i = 0; i < fieldNames.Length; i++)
|
||||||
|
{
|
||||||
|
embed.AddField(fieldNames[i], fieldValues[i], inlineFlags[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await new DiscordManager(webhookUrl).SendEmbedAsync(embed);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Log or handle the exception
|
||||||
|
CS2_SimpleAdmin._logger?.LogError("Unable to send discord webhook: {exception}", ex.Message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SendDiscordPenaltyMessage(CCSPlayerController? caller, string steamId, string reason, int duration, PenaltyType penalty, IStringLocalizer? localizer)
|
||||||
|
{
|
||||||
|
if (localizer == null) return;
|
||||||
|
|
||||||
|
var penaltySetting = penalty switch
|
||||||
|
{
|
||||||
|
PenaltyType.Ban => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltyBanSettings,
|
||||||
|
PenaltyType.Mute => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltyMuteSettings,
|
||||||
|
PenaltyType.Gag => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltyGagSettings,
|
||||||
|
PenaltyType.Silence => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltySilenceSettings,
|
||||||
|
PenaltyType.Warn => CS2_SimpleAdmin.Instance.Config.Discord.DiscordPenaltyWarnSettings,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(penalty), penalty, null)
|
||||||
|
};
|
||||||
|
|
||||||
|
var webhookUrl = penaltySetting.FirstOrDefault(s => s.Name.Equals("Webhook"))?.Value;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(webhookUrl)) return;
|
||||||
|
const string defaultCommunityUrl = "<https://steamcommunity.com/profiles/0>";
|
||||||
|
var callerCommunityUrl = caller != null ? $"<{new SteamID(caller.SteamID).ToCommunityUrl()}>" : defaultCommunityUrl;
|
||||||
|
var targetCommunityUrl = $"<{new SteamID(ulong.Parse(steamId)).ToCommunityUrl()}>";
|
||||||
|
|
||||||
|
var callerName = caller?.PlayerName ?? CS2_SimpleAdmin._localizer?["sa_console"] ?? "Console";
|
||||||
|
var targetName = steamId;
|
||||||
|
var targetSteamId = steamId;
|
||||||
|
|
||||||
|
var futureTime = Time.ActualDateTime().AddMinutes(duration);
|
||||||
|
var futureUnixTimestamp = new DateTimeOffset(futureTime).ToUnixTimeSeconds();
|
||||||
|
|
||||||
|
string time;
|
||||||
|
|
||||||
|
if (penaltySetting.FirstOrDefault(s => s.Name.Equals("Time"))?.Value == "{relative}")
|
||||||
|
time = duration != 0 ? $"<t:{futureUnixTimestamp}:R>" : localizer["sa_permanent"];
|
||||||
|
else
|
||||||
|
time = duration != 0 ? ConvertMinutesToTime(duration) : localizer["sa_permanent"];
|
||||||
|
|
||||||
|
string[] fieldNames = [
|
||||||
|
localizer["sa_player"],
|
||||||
|
localizer["sa_steamid"],
|
||||||
|
localizer["sa_duration"],
|
||||||
|
localizer["sa_reason"],
|
||||||
|
localizer["sa_admin"]];
|
||||||
|
string[] fieldValues =
|
||||||
|
[
|
||||||
|
$"[{targetName}]({targetCommunityUrl})", $"||{targetSteamId}||", time, reason,
|
||||||
|
$"[{callerName}]({callerCommunityUrl})"
|
||||||
|
];
|
||||||
|
|
||||||
|
bool[] inlineFlags = [true, true, true, false, false];
|
||||||
|
var hostname = ConVar.Find("hostname")?.StringValue ?? localizer["sa_unknown"];
|
||||||
|
var colorHex = penaltySetting.FirstOrDefault(s => s.Name.Equals("Color"))?.Value ?? "#FFFFFF";
|
||||||
|
|
||||||
var embed = new Embed
|
var embed = new Embed
|
||||||
{
|
{
|
||||||
Color = DiscordManager.ColorFromHex(colorHex),
|
Color = DiscordManager.ColorFromHex(colorHex),
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ public class PermissionManager(Database.Database? database)
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
CS2_SimpleAdmin._logger?.LogError(ex.ToString());
|
CS2_SimpleAdmin._logger?.LogError("Unable to load admins from database! {exception}", ex.Message);
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,7 +224,7 @@ public class PermissionManager(Database.Database? database)
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
CS2_SimpleAdmin._logger?.LogError(ex.ToString());
|
CS2_SimpleAdmin._logger?.LogError("Unable to load groups from database! {exception}", ex.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
@@ -371,7 +371,6 @@ public class PermissionManager(Database.Database? database)
|
|||||||
public async Task DeleteAdminBySteamId(string playerSteamId, bool globalDelete = false)
|
public async Task DeleteAdminBySteamId(string playerSteamId, bool globalDelete = false)
|
||||||
{
|
{
|
||||||
if (database == null) return;
|
if (database == null) return;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(playerSteamId)) return;
|
if (string.IsNullOrEmpty(playerSteamId)) return;
|
||||||
|
|
||||||
//_adminCache.TryRemove(playerSteamId, out _);
|
//_adminCache.TryRemove(playerSteamId, out _);
|
||||||
@@ -453,7 +452,7 @@ public class PermissionManager(Database.Database? database)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
await Server.NextFrameAsync(() =>
|
await Server.NextWorldUpdateAsync(() =>
|
||||||
{
|
{
|
||||||
CS2_SimpleAdmin.Instance.ReloadAdmins(null);
|
CS2_SimpleAdmin.Instance.ReloadAdmins(null);
|
||||||
});
|
});
|
||||||
@@ -500,7 +499,7 @@ public class PermissionManager(Database.Database? database)
|
|||||||
|
|
||||||
await connection.ExecuteAsync(insertGroupServer, new { groupId, server_id = globalGroup ? null : CS2_SimpleAdmin.ServerId });
|
await connection.ExecuteAsync(insertGroupServer, new { groupId, server_id = globalGroup ? null : CS2_SimpleAdmin.ServerId });
|
||||||
|
|
||||||
await Server.NextFrameAsync(() =>
|
await Server.NextWorldUpdateAsync(() =>
|
||||||
{
|
{
|
||||||
CS2_SimpleAdmin.Instance.ReloadAdmins(null);
|
CS2_SimpleAdmin.Instance.ReloadAdmins(null);
|
||||||
});
|
});
|
||||||
@@ -508,7 +507,7 @@ public class PermissionManager(Database.Database? database)
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
CS2_SimpleAdmin._logger?.LogError(ex.ToString());
|
CS2_SimpleAdmin._logger?.LogError("Problem with loading admins: {exception}", ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,6 +86,11 @@ public class PlayerManager
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (!CS2_SimpleAdmin.PlayersInfo.ContainsKey(userId))
|
||||||
|
{
|
||||||
|
Helper.KickPlayer(userId, NetworkDisconnectionReason.NETWORK_DISCONNECT_REJECT_INVALIDCONNECTION);
|
||||||
|
}
|
||||||
|
|
||||||
// Check if the player is banned
|
// Check if the player is banned
|
||||||
var isBanned = await CS2_SimpleAdmin.Instance.BanManager.IsPlayerBanned(CS2_SimpleAdmin.PlayersInfo[userId]);
|
var isBanned = await CS2_SimpleAdmin.Instance.BanManager.IsPlayerBanned(CS2_SimpleAdmin.PlayersInfo[userId]);
|
||||||
|
|
||||||
@@ -194,7 +199,7 @@ public class PlayerManager
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
CS2_SimpleAdmin._logger?.LogError($"Error processing player connection: {ex}");
|
CS2_SimpleAdmin._logger?.LogError("Error processing player connection: {exception}", ex.Message);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -263,7 +268,7 @@ public class PlayerManager
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
CS2_SimpleAdmin._logger?.LogError($"Unexpected error: {ex.Message}");
|
CS2_SimpleAdmin._logger?.LogError("Unexpected error: {exception}", ex.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
CS2_SimpleAdmin.BannedPlayers.Clear();
|
CS2_SimpleAdmin.BannedPlayers.Clear();
|
||||||
|
|||||||
@@ -14,19 +14,23 @@ public class ServerManager
|
|||||||
CS2_SimpleAdmin.Instance.AddTimer(2.0f, () =>
|
CS2_SimpleAdmin.Instance.AddTimer(2.0f, () =>
|
||||||
{
|
{
|
||||||
if (CS2_SimpleAdmin.ServerLoaded || CS2_SimpleAdmin.ServerId != null || CS2_SimpleAdmin.Database == null) return;
|
if (CS2_SimpleAdmin.ServerLoaded || CS2_SimpleAdmin.ServerId != null || CS2_SimpleAdmin.Database == null) return;
|
||||||
|
|
||||||
|
if (_getIpTryCount > 16)
|
||||||
|
{
|
||||||
|
CS2_SimpleAdmin._logger?.LogError("Unable to load server data - can't fetch ip address!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var ipAddress = ConVar.Find("ip")?.StringValue;
|
var ipAddress = ConVar.Find("ip")?.StringValue;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(ipAddress) || ipAddress.StartsWith("0.0.0"))
|
if (string.IsNullOrEmpty(ipAddress) || ipAddress.StartsWith("0.0.0"))
|
||||||
{
|
{
|
||||||
ipAddress = Helper.GetServerIp();
|
ipAddress = Helper.GetServerIp();
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(ipAddress) || ipAddress.StartsWith("0.0.0"))
|
if (_getIpTryCount <= 16)
|
||||||
{
|
|
||||||
if (_getIpTryCount < 12)
|
|
||||||
{
|
{
|
||||||
_getIpTryCount++;
|
_getIpTryCount++;
|
||||||
|
|
||||||
LoadServerData();
|
LoadServerData();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -54,7 +58,7 @@ public class ServerManager
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
await connection.ExecuteAsync(
|
await connection.ExecuteAsync(
|
||||||
"UPDATE `sa_servers` SET `hostname` = @hostname, `id` = `id` WHERE `address` = @address",
|
"UPDATE `sa_servers` SET `hostname` = @hostname WHERE `address` = @address",
|
||||||
new { address, hostname });
|
new { address, hostname });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +70,7 @@ public class ServerManager
|
|||||||
|
|
||||||
if (CS2_SimpleAdmin.ServerId != null)
|
if (CS2_SimpleAdmin.ServerId != null)
|
||||||
{
|
{
|
||||||
await Server.NextFrameAsync(() => CS2_SimpleAdmin.Instance.ReloadAdmins(null));
|
await Server.NextWorldUpdateAsync(() => CS2_SimpleAdmin.Instance.ReloadAdmins(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
CS2_SimpleAdmin.ServerLoaded = true;
|
CS2_SimpleAdmin.ServerLoaded = true;
|
||||||
|
|||||||
@@ -143,10 +143,10 @@ public static class FunActionsMenu
|
|||||||
|
|
||||||
private static void Freeze(CCSPlayerController admin, CCSPlayerController player)
|
private static void Freeze(CCSPlayerController admin, CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (!(player?.PlayerPawn.Value?.IsValid ?? false))
|
if (!(player.PlayerPawn.Value?.IsValid ?? false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (player.PlayerPawn.Value.MoveType != MoveType_t.MOVETYPE_OBSOLETE)
|
if (player.PlayerPawn.Value.MoveType != MoveType_t.MOVETYPE_INVALID)
|
||||||
CS2_SimpleAdmin.Freeze(admin, player, -1);
|
CS2_SimpleAdmin.Freeze(admin, player, -1);
|
||||||
else
|
else
|
||||||
CS2_SimpleAdmin.Unfreeze(admin, player);
|
CS2_SimpleAdmin.Unfreeze(admin, player);
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.6.8a
|
1.6.9a
|
||||||
@@ -38,10 +38,10 @@ public partial class CS2_SimpleAdmin
|
|||||||
|
|
||||||
// Player Management
|
// Player Management
|
||||||
private static readonly HashSet<int> GodPlayers = [];
|
private static readonly HashSet<int> GodPlayers = [];
|
||||||
private static readonly HashSet<int> SilentPlayers = [];
|
internal static readonly HashSet<int> SilentPlayers = [];
|
||||||
internal static readonly ConcurrentBag<string?> BannedPlayers = [];
|
internal static readonly ConcurrentBag<string?> BannedPlayers = [];
|
||||||
internal static readonly Dictionary<ulong, string> RenamedPlayers = [];
|
internal static readonly Dictionary<ulong, string> RenamedPlayers = [];
|
||||||
internal static readonly Dictionary<int, PlayerInfo> PlayersInfo = [];
|
internal static readonly ConcurrentDictionary<int, PlayerInfo> PlayersInfo = [];
|
||||||
private static readonly List<DisconnectedPlayer> DisconnectedPlayers = [];
|
private static readonly List<DisconnectedPlayer> DisconnectedPlayers = [];
|
||||||
|
|
||||||
// Discord Integration
|
// Discord Integration
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.286" />
|
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.287" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -23,4 +23,6 @@ public interface ICS2_SimpleAdminApi
|
|||||||
public void IssuePenalty(CCSPlayerController player, CCSPlayerController? admin, PenaltyType penaltyType, string reason, int duration = -1);
|
public void IssuePenalty(CCSPlayerController player, CCSPlayerController? admin, PenaltyType penaltyType, string reason, int duration = -1);
|
||||||
public void LogCommand(CCSPlayerController? caller, string command);
|
public void LogCommand(CCSPlayerController? caller, string command);
|
||||||
public void LogCommand(CCSPlayerController? caller, CommandInfo command);
|
public void LogCommand(CCSPlayerController? caller, CommandInfo command);
|
||||||
|
|
||||||
|
public bool IsAdminSilent(CCSPlayerController player);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user