· 8 years ago · Nov 21, 2017, 01:26 AM
1#pragma semicolon 1
2
3#define PLUGIN_AUTHOR "Totenfluch"
4#define PLUGIN_VERSION "2.1"
5
6#include <sourcemod>
7#include <sdktools>
8#include <multicolors>
9#include <autoexecconfig>
10
11#pragma newdecls required
12
13char dbconfig[] = "tVip";
14Database g_DB;
15
16/*
17 https://wiki.alliedmods.net/Checking_Admin_Flags_(SourceMod_Scripting)
18 19 -> Custom5
19 20 -> Custom6
20*/
21
22Handle g_hTestVipDuration;
23int g_iTestVipDuration;
24
25Handle g_hFlag;
26int g_iFlags[20];
27int g_iFlagCount = 0;
28
29Handle g_hForward_OnClientLoadedPre;
30Handle g_hForward_OnClientLoadedPost;
31
32bool g_bIsVip[MAXPLAYERS + 1];
33
34public Plugin myinfo =
35{
36 name = "tVIP",
37 author = PLUGIN_AUTHOR,
38 description = "VIP functionality for the GGC",
39 version = PLUGIN_VERSION,
40 url = "https://totenfluch.de"
41};
42
43
44public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
45{
46 //Create natives
47 CreateNative("tVip_GrantVip", NativeGrantVip);
48 CreateNative("tVip_DeleteVip", NativeDeleteVip);
49 return APLRes_Success;
50}
51
52
53public void OnPluginStart() {
54 char error[255];
55 g_DB = SQL_Connect(dbconfig, true, error, sizeof(error));
56 SQL_SetCharset(g_DB, "utf8");
57
58 char createTableQuery[4096];
59 Format(createTableQuery, sizeof(createTableQuery),
60 "CREATE TABLE IF NOT EXISTS `tVip` ( \
61 `Id` bigint(20) NOT NULL AUTO_INCREMENT, \
62 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, \
63 `playername` varchar(36) COLLATE utf8_bin NOT NULL, \
64 `playerid` varchar(20) COLLATE utf8_bin NOT NULL, \
65 `enddate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', \
66 `admin_playername` varchar(36) COLLATE utf8_bin NOT NULL, \
67 `admin_playerid` varchar(20) COLLATE utf8_bin NOT NULL, \
68 PRIMARY KEY (`Id`), \
69 UNIQUE KEY `playerid` (`playerid`) \
70 ) ENGINE = InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;"
71 );
72 SQL_TQuery(g_DB, SQLErrorCheckCallback, createTableQuery);
73
74 AutoExecConfig_SetFile("tVip");
75 AutoExecConfig_SetCreateFile(true);
76
77 g_hFlag = AutoExecConfig_CreateConVar("tVip_flag", "19", "20=Custom6, 19=Custom5 etc. Numeric Flag See: 'https://wiki.alliedmods.net/Checking_Admin_Flags_(SourceMod_Scripting)' for Definitions ---- Multiple flags seperated with Space: '16 17 18 19' !!");
78 g_hTestVipDuration = AutoExecConfig_CreateConVar("tVip_testVipDuration", "15", "Test Vip duration in minutes");
79
80 AutoExecConfig_CleanFile();
81 AutoExecConfig_ExecuteFile();
82
83 RegAdminCmd("sm_tvip", cmdtVIP, ADMFLAG_ROOT, "Opens the tVIP menu");
84 RegAdminCmd("sm_addvip", cmdAddVip, ADMFLAG_ROOT, "Adds a VIP Usage: sm_addvip \"<SteamID>\" <Duration in Month> \"<Name>\"");
85 RegAdminCmd("sm_removevip", removeVip, ADMFLAG_ROOT, "Removes a VIP Usage: sm_removevip \"<SteamID>\"");
86 RegConsoleCmd("sm_vips", cmdListVips, "Shows all VIPs");
87 RegConsoleCmd("sm_vip", openVipPanel, "Opens the Vip Menu");
88
89 g_hForward_OnClientLoadedPre = CreateGlobalForward( "tVip_OnClientLoadedPre", ET_Event, Param_Cell);
90 g_hForward_OnClientLoadedPost = CreateGlobalForward( "tVip_OnClientLoadedPost", ET_Event, Param_Cell);
91
92 reloadVIPs();
93}
94
95public void OnConfigsExecuted() {
96 g_iFlagCount = 0;
97 g_iTestVipDuration = GetConVarInt(g_hTestVipDuration);
98 char cFlags[256];
99 GetConVarString(g_hFlag, cFlags, sizeof(cFlags));
100 char cSplinters[20][6];
101 for (int i = 0; i < 20; i++)
102 strcopy(cSplinters[i], 6, "");
103 ExplodeString(cFlags, " ", cSplinters, 20, 6);
104 for (int i = 0; i < 20; i++) {
105 if (StrEqual(cSplinters[i], ""))
106 break;
107 g_iFlags[g_iFlagCount++] = StringToInt(cSplinters[i]);
108 }
109}
110
111public Action openVipPanel(int client, int args) {
112 if (g_bIsVip[client]) {
113 char playerid[20];
114 GetClientAuthId(client, AuthId_Steam2, playerid, sizeof(playerid));
115 if (StrContains(playerid, "STEAM_") != -1)
116 strcopy(playerid, sizeof(playerid), playerid[8]);
117
118 char getDatesQuery[1024];
119 Format(getDatesQuery, sizeof(getDatesQuery), "SELECT timestamp,enddate,DATEDIFF(enddate, NOW()) as timeleft FROM tVip WHERE playerid = '%s';", playerid);
120
121 SQL_TQuery(g_DB, getDatesQueryCallback, getDatesQuery, client);
122 }
123 return Plugin_Handled;
124
125}
126
127public void getDatesQueryCallback(Handle owner, Handle hndl, const char[] error, any data) {
128 int client = data;
129 char ends[128];
130 char started[128];
131 char left[64];
132 while (SQL_FetchRow(hndl)) {
133 SQL_FetchString(hndl, 0, started, sizeof(started));
134 SQL_FetchString(hndl, 1, ends, sizeof(ends));
135 SQL_FetchString(hndl, 2, left, sizeof(left));
136 }
137
138 Menu VipPanelMenu = CreateMenu(VipPanelMenuHandler);
139 char m_started[256];
140 char m_ends[256];
141 Format(m_started, sizeof(m_started), "Started: %s", started);
142 Format(m_ends, sizeof(m_ends), "Ends: %s (%s Days)", ends, left);
143 SetMenuTitle(VipPanelMenu, "VIP Panel");
144 AddMenuItem(VipPanelMenu, "x", m_started, ITEMDRAW_DISABLED);
145 AddMenuItem(VipPanelMenu, "x", m_ends, ITEMDRAW_DISABLED);
146 DisplayMenu(VipPanelMenu, client, 60);
147}
148
149public int VipPanelMenuHandler(Handle menu, MenuAction action, int client, int item) {
150 char cValue[32];
151 GetMenuItem(menu, item, cValue, sizeof(cValue));
152 if (action == MenuAction_Select) {
153 // TODO ?
154 }
155}
156
157public Action removeVip(int client, int args) {
158 if (args != 1) {
159 if (client != 0)
160 CPrintToChat(client, "{olive}[-T-] {lightred}Invalid Params Usage: sm_removevip \"<SteamID>\"");
161 else
162 PrintToServer("[-T-] Invalid Params Usage: sm_removevip \"<SteamID>\"");
163 return Plugin_Handled;
164 }
165
166 char playerid[20];
167 GetCmdArg(1, playerid, sizeof(playerid));
168 StripQuotes(playerid);
169 if (StrContains(playerid, "STEAM_") != -1)
170 strcopy(playerid, sizeof(playerid), playerid[8]);
171
172 deleteVip(playerid);
173
174 if (client != 0)
175 CPrintToChat(client, "{green}Deleted {orange}%s{green} from the Database", playerid);
176 else
177 PrintToServer("Deleted %s from the Database", playerid);
178
179 return Plugin_Handled;
180}
181
182public Action cmdAddVip(int client, int args) {
183 if (args != 3) {
184 if (client != 0)
185 CPrintToChat(client, "{olive}[-T-] {lightred}Invalid Params Usage: sm_addvip \"<SteamID>\" <Duration in Month> \"<Name>\"");
186 else
187 PrintToServer("[-T-] Invalid Params Usage: sm_addvip \"<SteamID>\" <Duration in Month> \"<Name>\"");
188 return Plugin_Handled;
189 }
190
191 char input[22];
192 GetCmdArg(1, input, sizeof(input));
193 StripQuotes(input);
194 if (StrContains(input, "STEAM_") != -1)
195 strcopy(input, sizeof(input), input[8]);
196
197 char duration[8];
198 GetCmdArg(2, duration, sizeof(duration));
199 int d1 = StringToInt(duration);
200
201 char input2[20];
202 strcopy(input2, sizeof(input2), input);
203 StripQuotes(input2);
204
205 char name[MAX_NAME_LENGTH + 8];
206 GetCmdArg(3, name, sizeof(name));
207 StripQuotes(name);
208 char clean_name[MAX_NAME_LENGTH * 2 + 16];
209 SQL_EscapeString(g_DB, name, clean_name, sizeof(clean_name));
210
211 grantVipEx(client, input2, d1, clean_name);
212 return Plugin_Handled;
213}
214
215public Action cmdtVIP(int client, int args) {
216 Menu mainChooser = CreateMenu(mainChooserHandler);
217 SetMenuTitle(mainChooser, "Totenfluchs tVIP Control");
218 AddMenuItem(mainChooser, "add", "Add VIP");
219 AddMenuItem(mainChooser, "remove", "Remove VIP");
220 AddMenuItem(mainChooser, "extend", "Extend VIP");
221 AddMenuItem(mainChooser, "list", "List VIPs (Info)");
222 DisplayMenu(mainChooser, client, 60);
223 return Plugin_Handled;
224}
225
226public Action cmdListVips(int client, int args) {
227 char showOffVIPQuery[1024];
228 Format(showOffVIPQuery, sizeof(showOffVIPQuery), "SELECT playername,playerid FROM tVip WHERE NOW() < enddate;");
229 SQL_TQuery(g_DB, SQLShowOffVipQuery, showOffVIPQuery, client);
230}
231
232public void SQLShowOffVipQuery(Handle owner, Handle hndl, const char[] error, any data) {
233 int client = data;
234 Menu showOffMenu = CreateMenu(noMenuHandler);
235 SetMenuTitle(showOffMenu, ">>> VIPs <<<");
236 while (SQL_FetchRow(hndl)) {
237 char playerid[20];
238 char playername[MAX_NAME_LENGTH + 8];
239 SQL_FetchString(hndl, 0, playername, sizeof(playername));
240 SQL_FetchString(hndl, 1, playerid, sizeof(playerid));
241 AddMenuItem(showOffMenu, playerid, playername, ITEMDRAW_DISABLED);
242 }
243 DisplayMenu(showOffMenu, client, 60);
244}
245
246public int noMenuHandler(Handle menu, MenuAction action, int client, int item) { }
247
248public int mainChooserHandler(Handle menu, MenuAction action, int client, int item) {
249 char cValue[32];
250 GetMenuItem(menu, item, cValue, sizeof(cValue));
251 if (action == MenuAction_Select) {
252 if (StrEqual(cValue, "add")) {
253 showDurationSelect(client, 1);
254 } else if (StrEqual(cValue, "remove")) {
255 showAllVIPsToAdmin(client);
256 } else if (StrEqual(cValue, "extend")) {
257 extendSelect(client);
258 } else if (StrEqual(cValue, "list")) {
259 listUsers(client);
260 }
261 }
262}
263
264int g_iReason[MAXPLAYERS + 1];
265public void showDurationSelect(int client, int reason) {
266 Menu selectDuration = CreateMenu(selectDurationHandler);
267 SetMenuTitle(selectDuration, "Select the Duration");
268 AddMenuItem(selectDuration, "testVip", "Test Vip");
269 AddMenuItem(selectDuration, "1", "1 Month");
270 AddMenuItem(selectDuration, "2", "2 Month");
271 AddMenuItem(selectDuration, "3", "3 Month");
272 AddMenuItem(selectDuration, "4", "4 Month");
273 AddMenuItem(selectDuration, "5", "5 Month");
274 AddMenuItem(selectDuration, "6", "6 Month");
275 AddMenuItem(selectDuration, "9", "9 Month");
276 AddMenuItem(selectDuration, "12", "12 Month");
277 g_iReason[client] = reason;
278 DisplayMenu(selectDuration, client, 60);
279}
280
281int g_iDurationSelected[MAXPLAYERS + 1];
282public int selectDurationHandler(Handle menu, MenuAction action, int client, int item) {
283 char cValue[32];
284 GetMenuItem(menu, item, cValue, sizeof(cValue));
285 if (action == MenuAction_Select) {
286 if (StrEqual(cValue, "testVip")) {
287 g_iDurationSelected[client] = g_iTestVipDuration;
288 g_iReason[client] = 3;
289 showPlayerSelectMenu(client, g_iReason[client]);
290 } else {
291 g_iDurationSelected[client] = StringToInt(cValue);
292 showPlayerSelectMenu(client, g_iReason[client]);
293 }
294 }
295}
296
297public void showPlayerSelectMenu(int client, int reason) {
298 Handle menu;
299 char menuTitle[255];
300 if (reason == 1) {
301 menu = CreateMenu(targetChooserMenuHandler);
302 Format(menuTitle, sizeof(menuTitle), "Select a Player to grant %i Month", g_iDurationSelected[client]);
303 } else if (reason == 2) {
304 menu = CreateMenu(extendChooserMenuHandler);
305 Format(menuTitle, sizeof(menuTitle), "Select a Player to extend %i Month", g_iDurationSelected[client]);
306 } else if (reason == 3) {
307 menu = CreateMenu(targetChooserMenuHandler);
308 Format(menuTitle, sizeof(menuTitle), "Select a Player to grant Test Vip (%i Minutes)", g_iDurationSelected[client]);
309 }
310 if (menu == INVALID_HANDLE)
311 return;
312 SetMenuTitle(menu, menuTitle);
313 int pAmount = 0;
314 for (int i = 1; i <= MAXPLAYERS; i++) {
315 if (i == client)
316 continue;
317
318 if (!isValidClient(i))
319 continue;
320
321 if (IsFakeClient(i))
322 continue;
323
324 if (reason == 2) {
325 if (!g_bIsVip[i])
326 continue;
327 } else if (reason == 1) {
328 if (g_bIsVip[i])
329 continue;
330 }
331
332 char Id[64];
333 IntToString(i, Id, sizeof(Id));
334
335 char targetName[MAX_NAME_LENGTH + 1];
336 GetClientName(i, targetName, sizeof(targetName));
337
338 AddMenuItem(menu, Id, targetName);
339 pAmount++;
340 }
341 if (pAmount == 0)
342 CPrintToChat(client, "{red}No matching clients found (Noone there or everyone is already VIP/Admin)");
343
344 DisplayMenu(menu, client, 30);
345}
346
347public int targetChooserMenuHandler(Handle menu, MenuAction action, int client, int item) {
348 if (action == MenuAction_Select) {
349 char info[64];
350 GetMenuItem(menu, item, info, sizeof(info));
351
352 int target = StringToInt(info);
353 if (!isValidClient(target) || !IsClientInGame(target)) {
354 CPrintToChat(client, "{red}Invalid Target");
355 return;
356 }
357
358 grantVip(client, target, g_iDurationSelected[client], g_iReason[client]);
359 }
360 if (action == MenuAction_End) {
361 delete menu;
362 }
363}
364
365public void grantVip(int admin, int client, int duration, int reason) {
366 char admin_playerid[20];
367 GetClientAuthId(admin, AuthId_Steam2, admin_playerid, sizeof(admin_playerid));
368 if (StrContains(admin_playerid, "STEAM_") != -1)
369 strcopy(admin_playerid, sizeof(admin_playerid), admin_playerid[8]);
370 char admin_playername[MAX_NAME_LENGTH + 8];
371 if (admin != 0)
372 GetClientName(admin, admin_playername, sizeof(admin_playername));
373 else
374 strcopy(admin_playername, sizeof(admin_playername), "SERVER-CONSOLE");
375 char clean_admin_playername[MAX_NAME_LENGTH * 2 + 16];
376 SQL_EscapeString(g_DB, admin_playername, clean_admin_playername, sizeof(clean_admin_playername));
377
378
379 char playerid[20];
380 GetClientAuthId(client, AuthId_Steam2, playerid, sizeof(playerid));
381 if (StrContains(playerid, "STEAM_") != -1)
382 strcopy(playerid, sizeof(playerid), playerid[8]);
383 char playername[MAX_NAME_LENGTH + 8];
384 GetClientName(client, playername, sizeof(playername));
385 char clean_playername[MAX_NAME_LENGTH * 2 + 16];
386 SQL_EscapeString(g_DB, playername, clean_playername, sizeof(clean_playername));
387
388
389 char addVipQuery[4096];
390 Format(addVipQuery, sizeof(addVipQuery), "INSERT IGNORE INTO `tVip` (`Id`, `timestamp`, `playername`, `playerid`, `enddate`, `admin_playername`, `admin_playerid`) VALUES (NULL, CURRENT_TIMESTAMP, '%s', '%s', CURRENT_TIMESTAMP, '%s', '%s');", clean_playername, playerid, clean_admin_playername, admin_playerid);
391 SQL_TQuery(g_DB, SQLErrorCheckCallback, addVipQuery);
392
393 char updateTime[1024];
394 if (reason != 3)
395 Format(updateTime, sizeof(updateTime), "UPDATE tVip SET enddate = DATE_ADD(enddate, INTERVAL %i MONTH) WHERE playerid = '%s';", duration, playerid);
396 else
397 Format(updateTime, sizeof(updateTime), "UPDATE tVip SET enddate = DATE_ADD(enddate, INTERVAL %i MINUTE) WHERE playerid = '%s';", duration, playerid);
398 SQL_TQuery(g_DB, SQLErrorCheckCallback, updateTime);
399
400 CPrintToChat(admin, "{green}Added {orange}%s{green} as VIP for {orange}%i{green} %s", playername, duration, reason == 3 ? "Minutes":"Month");
401 CPrintToChat(client, "{green}You've been granted {orange}%i{green} %s of {orange}VIP{green} by {orange}%N", duration, reason == 3 ? "Minutes":"Month", admin);
402 setFlags(client);
403}
404
405public void grantVipEx(int admin, char playerid[20], int duration, char[] pname) {
406 char admin_playerid[20];
407 if (admin != 0) {
408 GetClientAuthId(admin, AuthId_Steam2, admin_playerid, sizeof(admin_playerid));
409 if (StrContains(admin_playerid, "STEAM_") != -1)
410 strcopy(admin_playerid, sizeof(admin_playerid), admin_playerid[8]);
411 } else
412 strcopy(admin_playerid, sizeof(admin_playerid), "SERVER-CONSOLE");
413 char admin_playername[MAX_NAME_LENGTH + 8];
414
415 if (admin != 0)
416 GetClientName(admin, admin_playername, sizeof(admin_playername));
417 else
418 strcopy(admin_playername, sizeof(admin_playername), "SERVER-CONSOLE");
419 char clean_admin_playername[MAX_NAME_LENGTH * 2 + 16];
420 SQL_EscapeString(g_DB, admin_playername, clean_admin_playername, sizeof(clean_admin_playername));
421
422 char addVipQuery[4096];
423 Format(addVipQuery, sizeof(addVipQuery), "INSERT IGNORE INTO `tVip` (`Id`, `timestamp`, `playername`, `playerid`, `enddate`, `admin_playername`, `admin_playerid`) VALUES (NULL, CURRENT_TIMESTAMP, '%s', '%s', CURRENT_TIMESTAMP, '%s', '%s');", pname, playerid, clean_admin_playername, admin_playerid);
424 SQL_TQuery(g_DB, SQLErrorCheckCallback, addVipQuery);
425
426 char updateTime[1024];
427 Format(updateTime, sizeof(updateTime), "UPDATE tVip SET enddate = DATE_ADD(enddate, INTERVAL %i MONTH) WHERE playerid = '%s';", duration, playerid);
428 SQL_TQuery(g_DB, SQLErrorCheckCallback, updateTime);
429
430 if (admin != 0)
431 CPrintToChat(admin, "{green}Added {orange}%s{green} as VIP for {orange}%i{green} Month", playerid, duration);
432 else
433 PrintToServer("Added %s as VIP for %i Month", playerid, duration);
434}
435
436public void OnClientPostAdminCheck(int client) {
437 g_bIsVip[client] = false;
438 char cleanUp[256];
439 Format(cleanUp, sizeof(cleanUp), "DELETE FROM tVip WHERE enddate < NOW();");
440 SQL_TQuery(g_DB, SQLErrorCheckCallback, cleanUp);
441
442 loadVip(client);
443}
444
445public void loadVip(int client) {
446 char playerid[20];
447 GetClientAuthId(client, AuthId_Steam2, playerid, sizeof(playerid));
448 if (StrContains(playerid, "STEAM_") != -1)
449 strcopy(playerid, sizeof(playerid), playerid[8]);
450 char isVipQuery[1024];
451 Format(isVipQuery, sizeof(isVipQuery), "SELECT * FROM tVip WHERE playerid = '%s' AND enddate > NOW();", playerid);
452
453 //Pass the userid to prevent assigning flags to a wrong client
454 SQL_TQuery(g_DB, SQLCheckVIPQuery, isVipQuery, GetClientUserId(client));
455}
456
457public void SQLCheckVIPQuery(Handle owner, Handle hndl, const char[] error, any data) {
458 int client = GetClientOfUserId(data);
459
460 Action result = Plugin_Continue;
461 Call_StartForward(g_hForward_OnClientLoadedPre);
462 Call_PushCell(client);
463 Call_Finish(result);
464
465 if(result != Plugin_Continue && result != Plugin_Changed)
466 {
467 return;
468 }
469
470 //Check if the user is still ingame
471 if (isValidClient(client)) {
472 while (SQL_FetchRow(hndl)) {
473 setFlags(client);
474 }
475 }
476
477 Call_StartForward(g_hForward_OnClientLoadedPost);
478 Call_PushCell(client);
479 Call_Finish();
480
481}
482
483public void setFlags(int client) {
484 g_bIsVip[client] = true;
485 for (int i = 0; i < g_iFlagCount; i++)
486 SetUserFlagBits(client, GetUserFlagBits(client) | (1 << g_iFlags[i]));
487}
488
489public void OnRebuildAdminCache(AdminCachePart part) {
490 if (part == AdminCache_Admins)
491 reloadVIPs();
492}
493
494public void reloadVIPs() {
495 for (int i = 1; i < MAXPLAYERS; i++) {
496 if (!isValidClient(i))
497 continue;
498 loadVip(i);
499 }
500}
501
502public void showAllVIPsToAdmin(int client) {
503 char selectAllVIPs[1024];
504 Format(selectAllVIPs, sizeof(selectAllVIPs), "SELECT playername,playerid FROM tVip WHERE NOW() < enddate;");
505 SQL_TQuery(g_DB, SQLListVIPsForRemoval, selectAllVIPs, client);
506}
507
508public void SQLListVIPsForRemoval(Handle owner, Handle hndl, const char[] error, any data) {
509 int client = data;
510 Menu menuToRemoveClients = CreateMenu(menuToRemoveClientsHandler);
511 SetMenuTitle(menuToRemoveClients, "Delete a VIP");
512 while (SQL_FetchRow(hndl)) {
513 char playerid[20];
514 char playername[MAX_NAME_LENGTH + 8];
515 SQL_FetchString(hndl, 0, playername, sizeof(playername));
516 SQL_FetchString(hndl, 1, playerid, sizeof(playerid));
517 AddMenuItem(menuToRemoveClients, playerid, playername);
518 }
519 DisplayMenu(menuToRemoveClients, client, 60);
520}
521
522public int menuToRemoveClientsHandler(Handle menu, MenuAction action, int client, int item) {
523 if (action == MenuAction_Select) {
524 char info[20];
525 char display[MAX_NAME_LENGTH + 8];
526 int flags;
527 GetMenuItem(menu, item, info, sizeof(info), flags, display, sizeof(display));
528 deleteVip(info);
529 showAllVIPsToAdmin(client);
530 CPrintToChat(client, "{green}Removed {orange}%ss{green} VIP Status {green}({orange}%s{green})", display, info);
531 }
532}
533
534public void deleteVip(char[] playerid) {
535 char deleteVipQuery[512];
536 Format(deleteVipQuery, sizeof(deleteVipQuery), "DELETE FROM tVip WHERE playerid = '%s';", playerid);
537 SQL_TQuery(g_DB, SQLErrorCheckCallback, deleteVipQuery);
538}
539
540public void extendSelect(int client) {
541 showDurationSelect(client, 2);
542}
543
544public int extendChooserMenuHandler(Handle menu, MenuAction action, int client, int item) {
545 if (action == MenuAction_Select) {
546 char info[64];
547 GetMenuItem(menu, item, info, sizeof(info));
548
549 int target = StringToInt(info);
550 if (!isValidClient(target) || !IsClientInGame(target)) {
551 CPrintToChat(client, "{red}Invalid Target");
552 return;
553 }
554
555 int userTarget = GetClientUserId(target);
556 extendVip(client, userTarget, g_iDurationSelected[client]);
557 }
558 if (action == MenuAction_End) {
559 delete menu;
560 }
561}
562
563public void extendVip(int client, int userTarget, int duration) {
564 int theUserTarget = GetClientOfUserId(userTarget);
565 char playerid[20];
566 GetClientAuthId(theUserTarget, AuthId_Steam2, playerid, sizeof(playerid));
567 if (StrContains(playerid, "STEAM_") != -1)
568 strcopy(playerid, sizeof(playerid), playerid[8]);
569 char playername[MAX_NAME_LENGTH + 8];
570 GetClientName(theUserTarget, playername, sizeof(playername));
571 char clean_playername[MAX_NAME_LENGTH * 2 + 16];
572 SQL_EscapeString(g_DB, playername, clean_playername, sizeof(clean_playername));
573
574 char updateQuery[1024];
575 Format(updateQuery, sizeof(updateQuery), "UPDATE tVip SET enddate = DATE_ADD(enddate, INTERVAL %i MONTH) WHERE playerid = '%s';", duration, playerid);
576 SQL_TQuery(g_DB, SQLErrorCheckCallback, updateQuery);
577
578 Format(updateQuery, sizeof(updateQuery), "UPDATE tVip SET playername = '%s' WHERE playerid = '%s';", clean_playername, playerid);
579 SQL_TQuery(g_DB, SQLErrorCheckCallback, updateQuery);
580
581 CPrintToChat(client, "{green}Extended {orange}%s{green} VIP Status by {orange}%i{green} Month", playername, duration);
582}
583
584public void listUsers(int client) {
585 char listVipsQuery[1024];
586 Format(listVipsQuery, sizeof(listVipsQuery), "SELECT playername,playerid FROM tVip WHERE enddate > NOW();");
587 SQL_TQuery(g_DB, SQLListVIPsQuery, listVipsQuery, client);
588}
589
590public void SQLListVIPsQuery(Handle owner, Handle hndl, const char[] error, any data) {
591 int client = data;
592 Menu menuToRemoveClients = CreateMenu(listVipsMenuHandler);
593 SetMenuTitle(menuToRemoveClients, "All VIPs");
594 while (SQL_FetchRow(hndl)) {
595 char playerid[20];
596 char playername[MAX_NAME_LENGTH + 8];
597 SQL_FetchString(hndl, 0, playername, sizeof(playername));
598 SQL_FetchString(hndl, 1, playerid, sizeof(playerid));
599 AddMenuItem(menuToRemoveClients, playerid, playername);
600 }
601 DisplayMenu(menuToRemoveClients, client, 60);
602}
603
604public int listVipsMenuHandler(Handle menu, MenuAction action, int client, int item) {
605 if (action == MenuAction_Select) {
606 char cValue[20];
607 GetMenuItem(menu, item, cValue, sizeof(cValue));
608 char detailsQuery[512];
609 Format(detailsQuery, sizeof(detailsQuery), "SELECT playername,playerid,enddate,timestamp,admin_playername,admin_playerid FROM tVip WHERE playerid = '%s';", cValue);
610 SQL_TQuery(g_DB, SQLDetailsQuery, detailsQuery, client);
611 }
612}
613
614public void SQLDetailsQuery(Handle owner, Handle hndl, const char[] error, any data) {
615 int client = data;
616 Menu detailsMenu = CreateMenu(detailsMenuHandler);
617 bool hasData = false;
618 while (SQL_FetchRow(hndl) && !hasData) {
619 char playerid[20];
620 char playername[MAX_NAME_LENGTH + 8];
621 char startDate[128];
622 char endDate[128];
623 char adminname[MAX_NAME_LENGTH + 8];
624 char adminplayerid[20];
625 SQL_FetchString(hndl, 0, playername, sizeof(playername));
626 SQL_FetchString(hndl, 1, playerid, sizeof(playerid));
627 SQL_FetchString(hndl, 2, endDate, sizeof(endDate));
628 SQL_FetchString(hndl, 3, startDate, sizeof(startDate));
629 SQL_FetchString(hndl, 4, adminname, sizeof(adminname));
630 SQL_FetchString(hndl, 5, adminplayerid, sizeof(adminplayerid));
631
632 char title[64];
633 Format(title, sizeof(title), "Details: %s", playername);
634 SetMenuTitle(detailsMenu, title);
635
636 char playeridItem[64];
637 Format(playeridItem, sizeof(playeridItem), "STEAM_ID: %s", playerid);
638 AddMenuItem(detailsMenu, "x", playeridItem, ITEMDRAW_DISABLED);
639
640 char endItem[64];
641 Format(endItem, sizeof(endItem), "Ends: %s", endDate);
642 AddMenuItem(detailsMenu, "x", endItem, ITEMDRAW_DISABLED);
643
644 char startItem[64];
645 Format(startItem, sizeof(startItem), "Started: %s", startDate);
646 AddMenuItem(detailsMenu, "x", startItem, ITEMDRAW_DISABLED);
647
648 char adminNItem[64];
649 Format(adminNItem, sizeof(adminNItem), "By Admin: %s", adminname);
650 AddMenuItem(detailsMenu, "x", adminNItem, ITEMDRAW_DISABLED);
651
652 char adminIItem[64];
653 Format(adminIItem, sizeof(adminIItem), "Admin ID: %s", adminplayerid);
654 AddMenuItem(detailsMenu, "x", adminIItem, ITEMDRAW_DISABLED);
655
656 hasData = true;
657 }
658 DisplayMenu(detailsMenu, client, 60);
659}
660
661public int detailsMenuHandler(Handle menu, MenuAction action, int client, int item) {
662 if (action == MenuAction_Select) {
663
664 } else if (action == MenuAction_Cancel) {
665 listUsers(client);
666 }
667}
668
669stock bool isValidClient(int client) {
670 return (1 <= client <= MaxClients && IsClientInGame(client));
671}
672
673stock bool isVipCheck(int client) {
674 return CheckCommandAccess(client, "sm_amIVip", (1 << g_iFlag), true);
675}
676
677public void SQLErrorCheckCallback(Handle owner, Handle hndl, const char[] error, any data) {
678 if (!StrEqual(error, ""))
679 LogError(error);
680}
681
682
683
684//Natives
685
686public int NativeGrantVip(Handle myplugin, int argc)
687{
688 int client = GetNativeCell(1);
689 int admin = GetNativeCell(2);
690 int duration = GetNativeCell(3);
691 int format = GetNativeCell(4);
692 if (format == 1)
693 format = 3;
694 else if (format == 0)
695 format = 1;
696 else
697 {
698 ThrowNativeError(SP_ERROR_NATIVE, "Invalid time format (%d)", format);
699 return;
700 }
701
702 if (admin == 0)
703 {
704 grantVip(admin, client, duration, format);
705 return;
706 }
707 if (admin < 1 || admin > MaxClients)
708 {
709 ThrowNativeError(SP_ERROR_NATIVE, "Invalid admin index (%d)", admin);
710 return;
711 }
712 if (!IsClientConnected(admin))
713 {
714 ThrowNativeError(SP_ERROR_NATIVE, "Admin %d is not connected", admin);
715 return;
716 }
717 if (client < 1 || client > MaxClients)
718 {
719
720 ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d)", client);
721 return;
722 }
723 if (!IsClientConnected(client))
724 {
725 ThrowNativeError(SP_ERROR_NATIVE, "Client %d is not connected", client);
726 return;
727 }
728 grantVip(admin, client, duration, format);
729}
730
731
732public int NativeDeleteVip(Handle myplugin, int argc)
733{
734 char playerid[20];
735 GetNativeString(1, playerid, sizeof(playerid));
736 StripQuotes(playerid);
737 if (StrContains(playerid, "STEAM_") != -1)
738 strcopy(playerid, sizeof(playerid), playerid[8]);
739
740 deleteVip(playerid);
741}