-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSimpleAdminMode.cs
More file actions
154 lines (126 loc) · 5.55 KB
/
SimpleAdminMode.cs
File metadata and controls
154 lines (126 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// SimpleAdminMode.cs
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Events;
using CounterStrikeSharp.API.Modules.Utils;
namespace SimpleAdminMode;
public partial class SimpleAdminMode : BasePlugin, IPluginConfig<PluginConfig>
{
public override string ModuleName => "SimpleAdminMode";
public override string ModuleVersion => "0.2.0";
public override string ModuleAuthor => "t.me/kotyarakryt";
public override string ModuleDescription => "A lightweight and powerful admin system for CS2 servers built on CounterStrikeSharp.";
public PluginConfig Config { get; set; } = new();
internal Database _database = null!;
private TelegramService _telegram = null!;
private AdminMenu _adminMenu = null!;
// In-memory caches for active gags and mutes.
// Populated on plugin load and kept in sync with the database.
internal Dictionary<ulong, GagEntry> _gagsCache = new();
internal Dictionary<ulong, MuteEntry> _mutesCache = new();
// Cache timer to prevent duplicate warn message
internal Dictionary<ulong, CounterStrikeSharp.API.Modules.Timers.Timer> _warnTimers = new();
public override void Load(bool hotReload)
{
// Database
string connString = $"Server={Config.Host};Port={Config.Port};Database={Config.Database};User={Config.Username};Password={Config.Password};";
_database = new Database(connString);
_ = _database.InitializeAsync();
// Cache
_ = LoadGagCacheAsync();
_ = LoadMuteCacheAsync();
// AdminMenu
_adminMenu = new AdminMenu(this);
// Events
RegisterEventHandler<EventPlayerConnectFull>((@event, info) =>
{
_ = OnPlayerConnect(@event, info);
return HookResult.Continue;
});
RegisterEventHandler<EventPlayerChat>(OnPlayerChat);
RegisterListener<Listeners.OnClientVoice>(OnPlayerVoice);
// Commands
AddCommand("css_admin", "Open admin menu", OnAdminMenuCommand);
AddCommand("css_slay", "Kill a player", OnSlayCommand);
AddCommand("css_kick", "Kick a player", OnKickCommand);
AddCommand("css_ban", "Ban a player", OnBanCommand);
AddCommand("css_unban", "Unban a player", OnUnBanCommand);
AddCommand("css_gag", "Block text chat", OnGagCommand);
AddCommand("css_ungag", "Unblock text chat", OnUnGagCommand);
AddCommand("css_mute", "Block voice chat", OnMuteCommand);
AddCommand("css_unmute", "Unblock voice chat", OnUnMuteCommand);
AddCommand("css_silence", "Block all communication", OnSilenceCommand);
AddCommand("css_unsilence", "Unblock all communication", OnUnSilenceCommand);
AddCommand("css_rename", "Rename a player", OnRenameCommand);
AddCommand("css_report", "Report a player to Telegram", OnReportCommand);
AddCommand("css_freeze", "Freeze a player", OnFreezeCommand);
AddCommand("css_unfreeze", "Unfreeze a player", OnUnFreezeCommand);
AddCommand("css_warn", "Warn a player", OnWarnCommand);
AddCommand("css_unwarn", "Remove last warn", OnUnWarnCommand);
AddCommand("css_warnlist", "Show warns for a player", OnWarnListCommand);
}
public override void OnAllPluginsLoaded(bool hotReload)
{
_adminMenu.Initialize();
}
public void OnConfigParsed(PluginConfig config)
{
Config = config;
_telegram = new TelegramService(config.TelegramBotToken, config.TelegramChatId);
}
private async Task OnPlayerConnect(EventPlayerConnectFull @event, GameEventInfo info)
{
var player = @event.Userid;
if(player == null || !player.IsValid) return;
var ban = await _database.Bans.GetActiveAsync(player.SteamID);
var gag = await _database.Gags.GetActiveAsync(player.SteamID);
var mute = await _database.Mutes.GetActiveAsync(player.SteamID);
Server.NextFrame(() =>
{
if(!player.IsValid) return;
if(ban != null)
Server.ExecuteCommand($"kickid {player.UserId} You are banned! Reason: {ban.Reason}");
if(gag != null) _gagsCache[player.SteamID] = gag;
if(mute != null) _mutesCache[player.SteamID] = mute;
});
}
private HookResult OnPlayerChat(EventPlayerChat @event, GameEventInfo info)
{
var player = Utilities.GetPlayerFromUserid(@event.Userid);
if(player == null) return HookResult.Continue;
// Handle custom reason input for admin menu
if(_adminMenu.IsInitialized && _adminMenu.HandleChatInput(player, @event.Text))
return HookResult.Handled;
if(_gagsCache.TryGetValue(player.SteamID, out var gag) && gag.ExpiredAt > DateTime.Now)
{
bool isPermanent = gag.ExpiredAt == new DateTime(9999, 12, 31, 23, 59, 59);
string duration = isPermanent ? "Indefinitely" : $"until {gag.ExpiredAt:yyyy-MM-dd HH:mm}";
player.PrintToChat($" {ChatColors.Red}[SAM] {ChatColors.Default}You are gagged. {ChatColors.Grey}({duration})");
return HookResult.Handled;
}
return HookResult.Continue;
}
private void OnPlayerVoice(int clientSlot)
{
var player = Utilities.GetPlayerFromSlot(clientSlot);
if(player == null) return;
if(_mutesCache.TryGetValue(player.SteamID, out var mute) && mute.ExpiredAt > DateTime.Now)
player.VoiceFlags = VoiceFlags.Muted;
}
private async Task LoadGagCacheAsync()
{
var gags = await _database.Gags.GetAllActiveAsync();
_gagsCache = gags.ToDictionary(g => g.PlayerSteamID);
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"[SAM] ✓ Loaded {_gagsCache.Count} active gags into cache.");
Console.ResetColor();
}
private async Task LoadMuteCacheAsync()
{
var mutes = await _database.Mutes.GetAllActiveAsync();
_mutesCache = mutes.ToDictionary(m => m.PlayerSteamID);
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"[SAM] ✓ Loaded {_mutesCache.Count} active mutes into cache.");
Console.ResetColor();
}
}