· 9 years ago · Jan 19, 2017, 06:20 PM
1/*
2** ATTENTION
3** THE PRODUCED CODE, IS NOT ABLE TO COMPILE!
4** THE DECOMPILER JUST TRIES TO GIVE YOU A POSSIBILITY
5** TO LOOK HOW A PLUGIN DOES IT'S JOB AND LOOK FOR
6** POSSIBLE MALICIOUS CODE.
7**
8** ALL CONVERSIONS ARE WRONG! AT EXAMPLE:
9** SetEntityRenderFx(client, RenderFx 0); → SetEntityRenderFx(client, view_as<RenderFx>0); → SetEntityRenderFx(client, RENDERFX_NONE);
10*/
11
12 PlVers __version = 5;
13 float NULL_VECTOR[3];
14 char NULL_STRING[1];
15 Extension __ext_core = 72;
16 int MaxClients;
17 Extension __ext_sdktools = 2228;
18 Extension __ext_cstrike = 2272;
19 Extension __ext_topmenus = 2320;
20 SharedPlugin __pl_adminmenu = 2364;
21 char color_t[13][0];
22 char color_c[13][4] =
23{
24 "\x01",
25 "\x02",
26 "\x03",
27 "\x04",
28 "\x05",
29 "\x06",
30 "\x07",
31 "\x08",
32 "\x09",
33 "\x16",
34 "\x11",
35 "\x12",
36 "\x14"
37}
38 Database g_hDatabase;
39 TopMenu g_hTopMenu;
40 TopMenuObject g_TopMenuObject_CT_Bans;
41 MenuEx g_hBanTimeMenu;
42 MenuEx g_hReasonsMenu;
43 MenuEx g_hCTBanInfoMenu[66];
44 bool g_bIsClientCTBanned[66];
45 int g_iClientCTBanID[66];
46 int g_iClientCTBanExpire[66];
47 StringMap g_TargetInfo[66];
48public Plugin myinfo =
49{
50 name = "CT Bans (PRIVATE)",
51 description = "",
52 author = "R1KO",
53 version = "1.0.0 dev",
54 url = ""
55};
56public int __ext_core_SetNTVOptional()
57{
58 MarkNativeAsOptional("GetFeatureStatus");
59 MarkNativeAsOptional("RequireFeature");
60 MarkNativeAsOptional("AddCommandListener");
61 MarkNativeAsOptional("RemoveCommandListener");
62 MarkNativeAsOptional("BfWriteBool");
63 MarkNativeAsOptional("BfWriteByte");
64 MarkNativeAsOptional("BfWriteChar");
65 MarkNativeAsOptional("BfWriteShort");
66 MarkNativeAsOptional("BfWriteWord");
67 MarkNativeAsOptional("BfWriteNum");
68 MarkNativeAsOptional("BfWriteFloat");
69 MarkNativeAsOptional("BfWriteString");
70 MarkNativeAsOptional("BfWriteEnt");
71 MarkNativeAsOptional("BfWriteAngle");
72 MarkNativeAsOptional("BfWriteCoord");
73 MarkNativeAsOptional("BfWriteVecCoord");
74 MarkNativeAsOptional("BfWriteVecNormal");
75 MarkNativeAsOptional("BfWriteAngles");
76 MarkNativeAsOptional("BfReadBool");
77 MarkNativeAsOptional("BfReadByte");
78 MarkNativeAsOptional("BfReadChar");
79 MarkNativeAsOptional("BfReadShort");
80 MarkNativeAsOptional("BfReadWord");
81 MarkNativeAsOptional("BfReadNum");
82 MarkNativeAsOptional("BfReadFloat");
83 MarkNativeAsOptional("BfReadString");
84 MarkNativeAsOptional("BfReadEntity");
85 MarkNativeAsOptional("BfReadAngle");
86 MarkNativeAsOptional("BfReadCoord");
87 MarkNativeAsOptional("BfReadVecCoord");
88 MarkNativeAsOptional("BfReadVecNormal");
89 MarkNativeAsOptional("BfReadAngles");
90 MarkNativeAsOptional("BfGetNumBytesLeft");
91 MarkNativeAsOptional("BfWrite.WriteBool");
92 MarkNativeAsOptional("BfWrite.WriteByte");
93 MarkNativeAsOptional("BfWrite.WriteChar");
94 MarkNativeAsOptional("BfWrite.WriteShort");
95 MarkNativeAsOptional("BfWrite.WriteWord");
96 MarkNativeAsOptional("BfWrite.WriteNum");
97 MarkNativeAsOptional("BfWrite.WriteFloat");
98 MarkNativeAsOptional("BfWrite.WriteString");
99 MarkNativeAsOptional("BfWrite.WriteEntity");
100 MarkNativeAsOptional("BfWrite.WriteAngle");
101 MarkNativeAsOptional("BfWrite.WriteCoord");
102 MarkNativeAsOptional("BfWrite.WriteVecCoord");
103 MarkNativeAsOptional("BfWrite.WriteVecNormal");
104 MarkNativeAsOptional("BfWrite.WriteAngles");
105 MarkNativeAsOptional("BfRead.ReadBool");
106 MarkNativeAsOptional("BfRead.ReadByte");
107 MarkNativeAsOptional("BfRead.ReadChar");
108 MarkNativeAsOptional("BfRead.ReadShort");
109 MarkNativeAsOptional("BfRead.ReadWord");
110 MarkNativeAsOptional("BfRead.ReadNum");
111 MarkNativeAsOptional("BfRead.ReadFloat");
112 MarkNativeAsOptional("BfRead.ReadString");
113 MarkNativeAsOptional("BfRead.ReadEntity");
114 MarkNativeAsOptional("BfRead.ReadAngle");
115 MarkNativeAsOptional("BfRead.ReadCoord");
116 MarkNativeAsOptional("BfRead.ReadVecCoord");
117 MarkNativeAsOptional("BfRead.ReadVecNormal");
118 MarkNativeAsOptional("BfRead.ReadAngles");
119 MarkNativeAsOptional("BfRead.GetNumBytesLeft");
120 MarkNativeAsOptional("PbReadInt");
121 MarkNativeAsOptional("PbReadFloat");
122 MarkNativeAsOptional("PbReadBool");
123 MarkNativeAsOptional("PbReadString");
124 MarkNativeAsOptional("PbReadColor");
125 MarkNativeAsOptional("PbReadAngle");
126 MarkNativeAsOptional("PbReadVector");
127 MarkNativeAsOptional("PbReadVector2D");
128 MarkNativeAsOptional("PbGetRepeatedFieldCount");
129 MarkNativeAsOptional("PbSetInt");
130 MarkNativeAsOptional("PbSetFloat");
131 MarkNativeAsOptional("PbSetBool");
132 MarkNativeAsOptional("PbSetString");
133 MarkNativeAsOptional("PbSetColor");
134 MarkNativeAsOptional("PbSetAngle");
135 MarkNativeAsOptional("PbSetVector");
136 MarkNativeAsOptional("PbSetVector2D");
137 MarkNativeAsOptional("PbAddInt");
138 MarkNativeAsOptional("PbAddFloat");
139 MarkNativeAsOptional("PbAddBool");
140 MarkNativeAsOptional("PbAddString");
141 MarkNativeAsOptional("PbAddColor");
142 MarkNativeAsOptional("PbAddAngle");
143 MarkNativeAsOptional("PbAddVector");
144 MarkNativeAsOptional("PbAddVector2D");
145 MarkNativeAsOptional("PbRemoveRepeatedFieldValue");
146 MarkNativeAsOptional("PbReadMessage");
147 MarkNativeAsOptional("PbReadRepeatedMessage");
148 MarkNativeAsOptional("PbAddMessage");
149 MarkNativeAsOptional("Protobuf.ReadInt");
150 MarkNativeAsOptional("Protobuf.ReadFloat");
151 MarkNativeAsOptional("Protobuf.ReadBool");
152 MarkNativeAsOptional("Protobuf.ReadString");
153 MarkNativeAsOptional("Protobuf.ReadColor");
154 MarkNativeAsOptional("Protobuf.ReadAngle");
155 MarkNativeAsOptional("Protobuf.ReadVector");
156 MarkNativeAsOptional("Protobuf.ReadVector2D");
157 MarkNativeAsOptional("Protobuf.GetRepeatedFieldCount");
158 MarkNativeAsOptional("Protobuf.SetInt");
159 MarkNativeAsOptional("Protobuf.SetFloat");
160 MarkNativeAsOptional("Protobuf.SetBool");
161 MarkNativeAsOptional("Protobuf.SetString");
162 MarkNativeAsOptional("Protobuf.SetColor");
163 MarkNativeAsOptional("Protobuf.SetAngle");
164 MarkNativeAsOptional("Protobuf.SetVector");
165 MarkNativeAsOptional("Protobuf.SetVector2D");
166 MarkNativeAsOptional("Protobuf.AddInt");
167 MarkNativeAsOptional("Protobuf.AddFloat");
168 MarkNativeAsOptional("Protobuf.AddBool");
169 MarkNativeAsOptional("Protobuf.AddString");
170 MarkNativeAsOptional("Protobuf.AddColor");
171 MarkNativeAsOptional("Protobuf.AddAngle");
172 MarkNativeAsOptional("Protobuf.AddVector");
173 MarkNativeAsOptional("Protobuf.AddVector2D");
174 MarkNativeAsOptional("Protobuf.RemoveRepeatedFieldValue");
175 MarkNativeAsOptional("Protobuf.ReadMessage");
176 MarkNativeAsOptional("Protobuf.ReadRepeatedMessage");
177 MarkNativeAsOptional("Protobuf.AddMessage");
178 VerifyCoreVersion();
179 return 0;
180}
181
182int ExplodeString(char text[], char split[], char buffers[][], int maxStrings, int maxStringLength, bool copyRemainder)
183{
184 int reloc_idx = 0;
185 int idx = 0;
186 int total = 0;
187 int var1;
188 if (maxStrings < 1)
189 {
190 return 0;
191 }
192 int var2 = SplitString(text[reloc_idx], split, buffers[total], maxStringLength);
193 idx = var2;
194 while (var2 != -1)
195 {
196 reloc_idx = idx + reloc_idx;
197 total++;
198 if (maxStrings == total)
199 {
200 if (copyRemainder)
201 {
202 strcopy(buffers[total + -1], maxStringLength, text[reloc_idx - idx]);
203 }
204 return total;
205 }
206 }
207 total++;
208 strcopy(buffers[total], maxStringLength, text[reloc_idx]);
209 return total;
210}
211
212int PrintToChatAll(char format[])
213{
214 char buffer[192];
215 int i = 1;
216 while (i <= MaxClients)
217 {
218 if (IsClientInGame(i))
219 {
220 SetGlobalTransTarget(i);
221 VFormat(buffer, 192, format, 2);
222 PrintToChat(i, "%s", buffer);
223 i++;
224 }
225 i++;
226 }
227 return 0;
228}
229
230
231/* ERROR! Unrecognized opcode stradjust_pri */
232 function "CGOPrintToChat" (number 3)
233
234/* ERROR! Unrecognized opcode stradjust_pri */
235 function "CGOPrintToChatAll" (number 4)
236MenuEx MenuEx.MenuEx(MenuHandler handler, MenuAction actions)
237{
238 return Menu.Menu(handler, actions);
239}
240
241bool MenuEx.AddDefaultItem(MenuEx this, int iNeedCount, char sItem[])
242{
243 if (Menu.ItemCount.get(this) < iNeedCount)
244 {
245 Menu.AddItem(this, "", sItem, 1);
246 return true;
247 }
248 return false;
249}
250
251void MenuEx.Reduction(MenuEx this, int iCount)
252{
253 int i = 0;
254 while (i < iCount)
255 {
256 Menu.AddItem(this, "", "", 4);
257 i++;
258 }
259 return void 0;
260}
261
262public void OnPluginStart()
263{
264 LoadTranslations("ct_bans.phrases");
265 LoadTranslations("common.phrases");
266 if (SQL_CheckConfig("ct_bans"))
267 {
268 Database.Connect(SQLConnectCallback 9, "ct_bans", any 0);
269 CreateMenus();
270 AddCommandListener(CommandListener 3, "jointeam");
271 HookEvent("player_team", EventHook 5, EventHookMode 1);
272 HookEvent("round_end", EventHook 7, EventHookMode 1);
273 TopMenu hTopMenu = 0;
274 int var1 = GetAdminTopMenu();
275 hTopMenu = var1;
276 if (var1)
277 {
278 OnAdminMenuReady(hTopMenu);
279 }
280 return void 0;
281 }
282 SetFailState("%T", "SECTION_NOT_FOUND", 0);
283 return void 0;
284}
285
286public int GotDatabase(Database db, char error[], any data)
287{
288 if (db)
289 {
290 g_hDatabase = db;
291 CreateTables();
292 }
293 else
294 {
295 SetFailState("Database failure: %s", error);
296 }
297 return 0;
298}
299
300void CreateTables()
301{
302 SQL_LockDatabase(g_hDatabase);
303 Database.Query(g_hDatabase, SQLQueryCallback 41, "SET NAMES `utf8`", any 0, DBPriority 1);
304 Database.Query(g_hDatabase, SQLQueryCallback 41, "CREATE TABLE IF NOT EXISTS `ct_bans` (`id` INT NOT NULL AUTO_INCREMENT,`auth` TEXT(32) NOT NULL,`ip` TEXT(32) NOT NULL,`name` TEXT(32) NOT NULL,`time_start` INT UNSIGNED NOT NULL,`time_end` INT UNSIGNED NOT NULL,`length` INT NOT NULL,`reason` VARCHAR(255) NOT NULL,`admin_auth` TEXT(32) NOT NULL,`admin_ip` TEXT(32) NOT NULL,`admin_name` TEXT(32) NOT NULL,`remove_type` INT NOT NULL default '0',`ban_count` INT NOT NULL default '0',PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;", any 0, DBPriority 1);
305 Database.Query(g_hDatabase, SQLQueryCallback 41, "CREATE TABLE IF NOT EXISTS `ct_offline` (`id` INT NOT NULL AUTO_INCREMENT,`auth` TEXT(32) NOT NULL,`ip` TEXT(32) NOT NULL,`name` TEXT(32) NOT NULL,`time_disconnect` TEXT(32) NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;", any 0, DBPriority 1);
306 SQL_UnlockDatabase(g_hDatabase);
307 return void 0;
308}
309
310public int SQL_Callback_CreateTable(Database hDatabase, DBResultSet results, char sError[], any data)
311{
312 if (sError[0])
313 {
314 LogError("SQL_Callback_CreateTable: %s", sError);
315 }
316 return 0;
317}
318
319public APLRes AskPluginLoad2(Handle myself, bool late, char error[], int err_max)
320{
321 CreateNative("CTB_IsClientBanned", Native_IsClientBanned);
322 CreateNative("CTB_SendClientBanInfoMenu", Native_SendClientBanInfoMenu);
323 RegPluginLibrary("ct_bans");
324 return APLRes 0;
325}
326
327public int Native_IsClientBanned(Handle hPlugin, int iNumParams)
328{
329 int iClient = GetNativeCell(1);
330 int var1;
331 if (iClient < 1)
332 {
333 return ThrowNativeError(23, "Invalid client index (%d)", iClient);
334 }
335 if (IsClientInGame(iClient))
336 {
337 return g_bIsClientCTBanned[iClient][0][0];
338 }
339 return ThrowNativeError(23, "Client %d is not connected", iClient);
340}
341
342public int Native_SendClientBanInfoMenu(Handle hPlugin, int iNumParams)
343{
344 int iClient = GetNativeCell(1);
345 int var1;
346 if (iClient < 1)
347 {
348 ThrowNativeError(23, "Invalid client index (%d)", iClient);
349 return 0;
350 }
351 if (IsClientInGame(iClient))
352 {
353 ShowCTBanInfo(iClient);
354 return 0;
355 }
356 ThrowNativeError(23, "Client %d is not connected", iClient);
357 return 0;
358}
359
360void CreateMenus()
361{
362 g_hBanTimeMenu = MenuEx.MenuEx(MenuHandler 13, MenuAction 6);
363 Menu.ExitBackButton.set(g_hBanTimeMenu, true);
364 g_hReasonsMenu = MenuEx.MenuEx(MenuHandler 27, MenuAction 6);
365 Menu.ExitBackButton.set(g_hReasonsMenu, true);
366 KeyValues hKeyValues = KeyValues.KeyValues("CT_Bans_Settings", "", "");
367 if (KeyValues.ImportFromFile(hKeyValues, "addons/sourcemod/configs/ct_bans_settings.cfg"))
368 {
369 LoadMenuFromKeyValues(hKeyValues, 2768, "BanTimeMenu");
370 LoadMenuFromKeyValues(hKeyValues, 2772, "ReasonsMenu");
371 }
372 CloseHandle(hKeyValues);
373 hKeyValues = 0;
374 return void 0;
375}
376
377void LoadMenuFromKeyValues(&KeyValues hKeyValues, &MenuEx hMenu, char sKey[])
378{
379 KeyValues.Rewind(hKeyValues);
380 int var1;
381 if (KeyValues.JumpToKey(hKeyValues, sKey, false))
382 {
383 int var2;
384 do
385{
386 KeyValues.GetSectionName(hKeyValues, var2 + var2, 128);
387 int var3 = var2 + 4;
388 KeyValues.GetString(hKeyValues, NULL_STRING, var3 + var3, 128, "");
389 int var4 = var2 + 4;
390 Menu.AddItem(hMenu, var2 + var2, var4 + var4, 0);
391 }
392 while (KeyValues.GotoNextKey(hKeyValues, false));
393 }
394 return void 0;
395}
396
397void RemoveTargetInfo(int iClient)
398{
399 if (g_TargetInfo[iClient][0][0])
400 {
401 int var1 = g_TargetInfo[iClient];
402 CloseHandle(var1[0][0]);
403 var1 = 0;
404 g_TargetInfo[iClient] = 0;
405 }
406 return void 0;
407}
408
409void RemoveCTBanInfoMenu(int iClient)
410{
411 if (g_hCTBanInfoMenu[iClient][0][0])
412 {
413 int var1 = g_hCTBanInfoMenu[iClient];
414 CloseHandle(var1[0][0]);
415 var1 = 0;
416 g_hCTBanInfoMenu[iClient] = 0;
417 }
418 return void 0;
419}
420
421void InitializationTargetInfo(int iClient)
422{
423 RemoveTargetInfo(iClient);
424 g_TargetInfo[iClient] = StringMap.StringMap();
425 return void 0;
426}
427
428public void OnClientDisconnect(int iClient)
429{
430 g_bIsClientCTBanned[iClient] = 0;
431 g_iClientCTBanExpire[iClient] = 0;
432 g_iClientCTBanID[iClient] = 0;
433 RemoveTargetInfo(iClient);
434 RemoveCTBanInfoMenu(iClient);
435 return void 0;
436}
437
438public void OnClientPostAdminCheck(int iClient)
439{
440 g_bIsClientCTBanned[iClient] = 0;
441 g_iClientCTBanExpire[iClient] = 0;
442 g_iClientCTBanID[iClient] = 0;
443 RemoveTargetInfo(iClient);
444 RemoveCTBanInfoMenu(iClient);
445 if (!(IsFakeClient(iClient)))
446 {
447 char sQuery[256];
448 char sAuth[32];
449 char sIP[24];
450 GetClientAuthId(iClient, AuthIdType 1, sAuth, 32, true);
451 GetClientIP(iClient, sIP, 24, true);
452 FormatEx(sQuery, 256, "SELECT `id`, `time_start`, `time_end`, `reason`, `admin_name`, `ban_count` FROM `ct_bans` WHERE `remove_type` = '0' AND (`auth` = '%s' OR `ip` = '%s');", sAuth, sIP);
453 Database.Query(g_hDatabase, SQLQueryCallback 53, sQuery, GetClientUserId(iClient), DBPriority 1);
454 }
455 return void 0;
456}
457
458public int SQL_Callback_SearchClientBan(Database hDatabase, DBResultSet results, char sError[], any iUserID)
459{
460 if (sError[0])
461 {
462 LogError("SQL_Callback_SearchClientBan: %s", sError);
463 return 0;
464 }
465 int iClient = GetClientOfUserId(iUserID);
466 if (0 < iClient)
467 {
468 if (DBResultSet.FetchRow(results))
469 {
470 g_iClientCTBanID[iClient] = DBResultSet.FetchInt(results, 0, 0);
471 g_iClientCTBanExpire[iClient] = DBResultSet.FetchInt(results, 2, 0);
472 if (g_iClientCTBanExpire[iClient][0][0] < GetTime({0,0}))
473 {
474 char sQuery[256];
475 FormatEx(sQuery, 256, "UPDATE `ct_bans` SET `remove_type` = '1' WHERE `id` = '%i';", g_iClientCTBanID[iClient]);
476 Database.Query(g_hDatabase, SQLQueryCallback 43, sQuery, GetClientUserId(iClient), DBPriority 1);
477 g_iClientCTBanExpire[iClient] = 0;
478 g_iClientCTBanID[iClient] = 0;
479 return 0;
480 }
481 g_bIsClientCTBanned[iClient] = 1;
482 char sStartBanTime[52];
483 char sEndBanTime[52];
484 char sReason[128];
485 char sAdminName[64];
486 FormatTime(sStartBanTime, 50, "%d/%m/%Y-%H:%M:%S", DBResultSet.FetchInt(results, 1, 0));
487 FormatTime(sEndBanTime, 50, "%d/%m/%Y-%H:%M:%S", g_iClientCTBanID[iClient][0][0]);
488 DBResultSet.FetchString(results, 3, sReason, 128, 0);
489 DBResultSet.FetchString(results, 4, sAdminName, 64, 0);
490 CreateCTBanInfoMenu(iClient, sReason, sStartBanTime, sEndBanTime, sAdminName, DBResultSet.FetchInt(results, 5, 0));
491 ShowCTBanInfo(iClient);
492 int iTimeLeft = 0;
493 int var1;
494 if (GetMapTimeLeft(iTimeLeft))
495 {
496 int iMapEndTime = GetTime({0,0}) + iTimeLeft;
497 if (g_iClientCTBanID[iClient][0][0] < iMapEndTime)
498 {
499 CreateTimer(FloatAdd(2, float(iMapEndTime - g_iClientCTBanID[iClient][0][0])), Timer_ReloadClient, iUserID, 2);
500 }
501 }
502 }
503 }
504 return 0;
505}
506
507void CreateCTBanInfoMenu(int iClient, char sReason[], char sStartBanTime[], char sEndBanTime[], char sAdminName[], int iBanCount)
508{
509 g_hCTBanInfoMenu[iClient] = MenuEx.MenuEx(MenuHandler 21, MenuAction 28);
510 Menu.ExitButton.set(g_hCTBanInfoMenu[iClient][0][0], true);
511 Menu.SetTitle(g_hCTBanInfoMenu[iClient][0][0], "%T", "MY_BAN_INFO_MENU_TITLE", iClient, sReason, sStartBanTime, sEndBanTime, sAdminName, iBanCount);
512 Menu.AddItem(g_hCTBanInfoMenu[iClient][0][0], "", "Ok", 0);
513 MenuEx.Reduction(g_hCTBanInfoMenu[iClient][0][0], 5);
514 return void 0;
515}
516
517void ShowCTBanInfo(int iClient)
518{
519 if (g_hCTBanInfoMenu[iClient][0][0])
520 {
521 Menu.Display(g_hCTBanInfoMenu[iClient][0][0], iClient, 0);
522 }
523 return void 0;
524}
525
526public int MenuHandler_MyCTBanInfoMenu(Menu hMenu, MenuAction action, int iClient, int Item)
527{
528 return 0;
529}
530
531public int SQL_Callback_ExpiredClientBan(Database hDatabase, DBResultSet results, char sError[], any iUserID)
532{
533 if (sError[0])
534 {
535 LogError("SQL_Callback_ExpiredClientBan: %s", sError);
536 return 0;
537 }
538 int iClient = GetClientOfUserId(iUserID);
539 if (0 < iClient)
540 {
541 MenuEx hMenu = MenuEx.MenuEx(MenuHandler 19, MenuAction 28);
542 Menu.SetTitle(hMenu, "%T:\n \n", "YOUR_CT_BAN_EXPIRED", iClient);
543 Menu.ExitBackButton.set(hMenu, true);
544 Menu.AddItem(hMenu, "", "Ok", 0);
545 Menu.Display(hMenu, iClient, 0);
546 }
547 return 0;
548}
549
550public int MenuHandler_ExpiredClientBanMenu(Menu hMenu, MenuAction action, int iClient, int Item)
551{
552 if (action == MenuAction 16)
553 {
554 CloseHandle(hMenu);
555 hMenu = 0;
556 }
557 return 0;
558}
559
560public int SQL_Callback_RemoveClientBan(Database hDatabase, DBResultSet results, char sError[], any iID)
561{
562 if (sError[0])
563 {
564 LogError("SQL_Callback_RemoveClientBan: %s", sError);
565 return 0;
566 }
567 int i = 1;
568 while (i <= MaxClients)
569 {
570 if (iID == g_iClientCTBanID[i][0][0])
571 {
572 OnClientPostAdminCheck(i);
573 return 0;
574 }
575 i++;
576 }
577 return 0;
578}
579
580public Action Timer_ReloadClient(Handle hTimer, any iUserID)
581{
582 int iClient = GetClientOfUserId(iUserID);
583 if (0 < iClient)
584 {
585 OnClientPostAdminCheck(iClient);
586 }
587 return Action 4;
588}
589
590public Action Command_JoinTeam(int iClient, char sCommand[], int args)
591{
592 int var1;
593 if (iClient)
594 {
595 char sTeam[4];
596 GetCmdArg(1, sTeam, 3);
597 int iTeam = StringToInt(sTeam, 10);
598 int var2;
599 if (iTeam == 3)
600 {
601 if (g_bIsClientCTBanned[iClient][0][0])
602 {
603 int var3;
604 if (g_iClientCTBanExpire[iClient][0][0] > 0)
605 {
606 OnClientPostAdminCheck(iClient);
607 return Action 0;
608 }
609 int var4;
610 if (GetClientTeam(iClient) > 1)
611 {
612 var4 = 2;
613 }
614 else
615 {
616 var4 = 1;
617 }
618 ChangeClientTeam(iClient, var4);
619 ShowCTBanInfo(iClient);
620 return Action 4;
621 }
622 }
623 }
624 return Action 0;
625}
626
627public int Event_RoundEnd(Event hEvent, char sEvName[], bool bDontBroadcast)
628{
629 int i = 1;
630 int iTime = GetTime({0,0});
631 while (i <= MaxClients)
632 {
633 int var1;
634 if (IsClientInGame(i))
635 {
636 int var2;
637 if (g_iClientCTBanExpire[i][0][0] > 0)
638 {
639 OnClientPostAdminCheck(i);
640 i++;
641 }
642 i++;
643 }
644 i++;
645 }
646 return 0;
647}
648
649public int Event_PlayerTeam(Event hEvent, char sEvName[], bool bDontBroadcast)
650{
651 int iClient = GetClientOfUserId(Event.GetInt(hEvent, "userid", 0));
652 int iTeam = Event.GetInt(hEvent, "team", 0);
653 int iOldTeam = Event.GetInt(hEvent, "oldteam", 0);
654 if (iTeam == 3)
655 {
656 if (g_bIsClientCTBanned[iClient][0][0])
657 {
658 int var1;
659 if (g_iClientCTBanExpire[iClient][0][0] > 0)
660 {
661 OnClientPostAdminCheck(iClient);
662 }
663 ChangeClientTeam(iClient, 1);
664 ShowCTBanInfo(iClient);
665 }
666 }
667 if (iOldTeam == 3)
668 {
669 char sQuery[256];
670 char sAuth[32];
671 char sIP[24];
672 GetClientAuthId(iClient, AuthIdType 1, sAuth, 32, true);
673 GetClientIP(iClient, sIP, 24, true);
674 FormatEx(sQuery, 256, "SELECT `id` FROM `ct_offline` WHERE `auth` = '%s' OR `ip` = '%s';", sAuth, sIP);
675 Database.Query(g_hDatabase, SQLQueryCallback 55, sQuery, GetClientUserId(iClient), DBPriority 1);
676 }
677 return 0;
678}
679
680public int SQL_Callback_SearchOfflineClient(Database hDatabase, DBResultSet results, char sError[], any iUserID)
681{
682 if (sError[0])
683 {
684 LogError("SQL_Callback_SearchOfflineClient: %s", sError);
685 return 0;
686 }
687 int iClient = GetClientOfUserId(iUserID);
688 if (0 < iClient)
689 {
690 char sQuery[256];
691 char sName[128];
692 char sAuth[32];
693 char sIP[24];
694 GetClientName(iClient, sName, 128);
695 EscapeString(sName, 128);
696 GetClientAuthId(iClient, AuthIdType 1, sAuth, 32, true);
697 GetClientIP(iClient, sIP, 24, true);
698 if (DBResultSet.FetchRow(results))
699 {
700 FormatEx(sQuery, 256, "UPDATE `ct_offline` SET `time_disconnect` = '%i', `auth` = '%s', `name` = '%s', `ip` = '%s' WHERE `id` = '%i';", GetTime({0,0}), sAuth, sName, sIP, DBResultSet.FetchInt(results, 0, 0));
701 Database.Query(g_hDatabase, SQLQueryCallback 49, sQuery, GetClientUserId(iClient), DBPriority 1);
702 return 0;
703 }
704 FormatEx(sQuery, 256, "INSERT INTO `ct_offline` (`auth`, `name`, `ip`, `time_disconnect`) VALUES ('%s', '%s', '%s', '%i');", sAuth, sName, sIP, GetTime({0,0}));
705 Database.Query(g_hDatabase, SQLQueryCallback 47, sQuery, any 0, DBPriority 1);
706 }
707 return 0;
708}
709
710public int SQL_Callback_InsertOfflineClient(Database hDatabase, DBResultSet results, char sError[], any data)
711{
712 if (sError[0])
713 {
714 LogError("SQL_Callback_InsertOfflineClient: %s", sError);
715 return 0;
716 }
717 return 0;
718}
719
720public int OnAdminMenuReady(Handle hTopMenu)
721{
722 TopMenu _hTopMenu = TopMenu.FromHandle(hTopMenu);
723 if (_hTopMenu != g_hTopMenu)
724 {
725 g_hTopMenu = _hTopMenu;
726 g_TopMenuObject_CT_Bans = TopMenu.FindCategory(g_hTopMenu, "ct_bans");
727 if (!g_TopMenuObject_CT_Bans)
728 {
729 g_TopMenuObject_CT_Bans = TopMenu.AddCategory(g_hTopMenu, "ct_bans", TopMenuHandler 73, "", 8, "");
730 }
731 TopMenu.AddItem(g_hTopMenu, "ct_ban", TopMenuHandler 67, g_TopMenuObject_CT_Bans, "", 8, "");
732 TopMenu.AddItem(g_hTopMenu, "ct_ban_offline", TopMenuHandler 71, g_TopMenuObject_CT_Bans, "", 8, "");
733 TopMenu.AddItem(g_hTopMenu, "ct_banlist", TopMenuHandler 69, g_TopMenuObject_CT_Bans, "", 8, "");
734 }
735 return 0;
736}
737
738public int TopMenuHandler_MainMenu(Handle hTopMenu, TopMenuAction action, TopMenuObject topobj_id, int iClient, char sBuffer[], int maxlength)
739{
740 switch (action)
741 {
742 case 0: {
743 FormatEx(sBuffer, maxlength, "%T", "CT_BANS", iClient);
744 }
745 case 1: {
746 FormatEx(sBuffer, maxlength, "%T\n \n", "CT_BANS", iClient);
747 }
748 default: {
749 }
750 }
751 return 0;
752}
753
754public int TopMenuHandler_Ban(Handle hTopMenu, TopMenuAction action, TopMenuObject topobj_id, int iClient, char sBuffer[], int maxlength)
755{
756 switch (action)
757 {
758 case 0: {
759 FormatEx(sBuffer, maxlength, "%T", "BAN_PLAYER", iClient);
760 }
761 case 2: {
762 SendCtBanMenu(iClient);
763 }
764 default: {
765 }
766 }
767 return 0;
768}
769
770void SendCtBanMenu(int iClient)
771{
772 MenuEx hMenu = MenuEx.MenuEx(MenuHandler 25, MenuAction 28);
773 Menu.SetTitle(hMenu, "%T:\n \n", "SELECT_PLAYER", iClient);
774 Menu.ExitBackButton.set(hMenu, true);
775 AddMenuItems(iClient, hMenu, 3, "CT");
776 AddMenuItems(iClient, hMenu, 2, "TT");
777 AddMenuItems(iClient, hMenu, 1, "SPEC");
778 char sBuffer[128];
779 FormatEx(sBuffer, 128, "%T", "NO_PLAYERS_AVAILABLE", iClient);
780 MenuEx.AddDefaultItem(hMenu, 1, sBuffer);
781 Menu.Display(hMenu, iClient, 0);
782 return void 0;
783}
784
785void AddMenuItems(int iClient, &MenuEx hMenu, int iNeedTeam, char sTeam[])
786{
787 char sName[32];
788 char sUserID[12];
789 int i = 1;
790 while (i <= MaxClients)
791 {
792 int var1;
793 if (iClient != i)
794 {
795 GetClientName(i, sName, 32);
796 Format(sName, 32, "[%s] %s", sTeam, sName);
797 IntToString(GetClientUserId(i), sUserID, 12);
798 Menu.AddItem(hMenu, sUserID, sName, 0);
799 i++;
800 }
801 i++;
802 }
803 return void 0;
804}
805
806public int MenuHandler_PlayerListMenu(Menu hMenu, MenuAction action, int iClient, int Item)
807{
808 switch (action)
809 {
810 case 4: {
811 char sInfo[128];
812 Menu.GetItem(hMenu, Item, sInfo, 128, 0, "", 0);
813 int iUserID = StringToInt(sInfo, 10);
814 int iTarget = GetClientOfUserId(iUserID);
815 int var2;
816 if (iTarget > 0)
817 {
818 InitializationTargetInfo(iClient);
819 SetTrieValue(g_TargetInfo[iClient][0][0], "TargetUserID", iUserID, true);
820 GetClientAuthId(iTarget, AuthIdType 1, sInfo, 128, true);
821 SetTrieString(g_TargetInfo[iClient][0][0], "TargetAuth", sInfo, true);
822 GetClientIP(iTarget, sInfo, 128, true);
823 SetTrieString(g_TargetInfo[iClient][0][0], "TargetIP", sInfo, true);
824 GetClientName(iTarget, sInfo, 128);
825 SetTrieString(g_TargetInfo[iClient][0][0], "TargetName", sInfo, true);
826 Menu.Display(g_hBanTimeMenu, iClient, 0);
827 return 0;
828 }
829 CGOPrintToChat(iClient, "[SM] %t", 6516);
830 SendCtBanMenu(iClient);
831 }
832 case 8: {
833 int var1;
834 if (Item == -6)
835 {
836 TopMenu.Display(g_hTopMenu, iClient, TopMenuPosition 3);
837 }
838 }
839 case 16: {
840 CloseHandle(hMenu);
841 hMenu = 0;
842 }
843 default: {
844 }
845 }
846 return 0;
847}
848
849public int TopMenuHandler_BanOffline(Handle hTopMenu, TopMenuAction action, TopMenuObject topobj_id, int iClient, char sBuffer[], int maxlength)
850{
851 switch (action)
852 {
853 case 0: {
854 FormatEx(sBuffer, maxlength, "%T", "BAN_PLAYER_OFFLINE", iClient);
855 }
856 case 2: {
857 SendCtBanOfflineMenu(iClient, 0, 20);
858 }
859 default: {
860 }
861 }
862 return 0;
863}
864
865int SendCtBanOfflineMenu(int iClient, int iOffset, int iRowCount)
866{
867 InitializationTargetInfo(iClient);
868 SetTrieValue(g_TargetInfo[iClient][0][0], "iOffset", iOffset, true);
869 char sQuery[256];
870 FormatEx(sQuery, 256, "SELECT `auth`, `name`, `time_disconnect` FROM `ct_offline` WHERE `time_disconnect` <= UNIX_TIMESTAMP() ORDER BY `time_disconnect` DESC LIMIT %i, %i;", iOffset, iRowCount);
871 Database.Query(g_hDatabase, SQLQueryCallback 63, sQuery, GetClientUserId(iClient), DBPriority 1);
872 return 0;
873}
874
875public int SQL_Callback_SelectOfflinePlayers(Database hDatabase, DBResultSet results, char sError[], any iUserID)
876{
877 if (sError[0])
878 {
879 LogError("SQL_Callback_SelectOfflinePlayers: %s", sError);
880 return 0;
881 }
882 int iClient = GetClientOfUserId(iUserID);
883 if (0 < iClient)
884 {
885 MenuEx hMenu = MenuEx.MenuEx(MenuHandler 23, MenuAction 28);
886 Menu.SetTitle(hMenu, "%T:\n \n", "SELECT_PLAYER", iClient);
887 Menu.ExitBackButton.set(hMenu, true);
888 char sName[256];
889 char sAuth[32];
890 char sTime[52];
891 while (DBResultSet.FetchRow(results))
892 {
893 DBResultSet.FetchString(results, 0, sAuth, 32, 0);
894 DBResultSet.FetchString(results, 1, sName, 256, 0);
895 Func_GetTimeFromStamp(sTime, 50, GetTime({0,0}) - DBResultSet.FetchInt(results, 2, 0), iClient);
896 Format(sName, 256, "%s (%s %T)", sName, sTime, "AGO", iClient);
897 Menu.AddItem(hMenu, sAuth, sName, 0);
898 }
899 FormatEx(sName, 256, "%T", "NO_PLAYERS_AVAILABLE", iClient);
900 if (!(MenuEx.AddDefaultItem(hMenu, 1, sName)))
901 {
902 int iRowCount;
903 GetTrieValue(g_TargetInfo[iClient][0][0], "iRowCount", iRowCount);
904 if (Menu.ItemCount.get(hMenu) >= iRowCount)
905 {
906 FormatEx(sName, 256, "%T", "SHOW_MORE", iClient);
907 Menu.AddItem(hMenu, "more", sName, 0);
908 }
909 }
910 Menu.Display(hMenu, iClient, 0);
911 }
912 return 0;
913}
914
915public int MenuHandler_OfflinePlayerListMenu(Menu hMenu, MenuAction action, int iClient, int Item)
916{
917 switch (action)
918 {
919 case 4: {
920 char sInfo[32];
921 Menu.GetItem(hMenu, Item, sInfo, 32, 0, "", 0);
922 if (strcmp(sInfo, "more", true))
923 {
924 char sQuery[256];
925 FormatEx(sQuery, 256, "SELECT `auth`, `ip`, `name` FROM `ct_offline` WHERE `auth` = '%s';", sInfo);
926 Database.Query(g_hDatabase, SQLQueryCallback 61, sQuery, GetClientUserId(iClient), DBPriority 1);
927 }
928 int iOffset;
929 GetTrieValue(g_TargetInfo[iClient][0][0], "iOffset", iOffset);
930 iOffset += 20;
931 SendCtBanOfflineMenu(iClient, iOffset, iOffset + 20);
932 return 0;
933 }
934 case 8: {
935 int var1;
936 if (Item == -6)
937 {
938 TopMenu.Display(g_hTopMenu, iClient, TopMenuPosition 3);
939 }
940 }
941 case 16: {
942 CloseHandle(hMenu);
943 hMenu = 0;
944 }
945 default: {
946 }
947 }
948 return 0;
949}
950
951public int SQL_Callback_SelectOfflinePlayerInfo(Database hDatabase, DBResultSet results, char sError[], any iUserID)
952{
953 if (sError[0])
954 {
955 LogError("SQL_Callback_SelectOfflinePlayerInfo: %s", sError);
956 return 0;
957 }
958 int iClient = GetClientOfUserId(iUserID);
959 if (0 < iClient)
960 {
961 if (DBResultSet.FetchRow(results))
962 {
963 SetTrieValue(g_TargetInfo[iClient][0][0], "TargetUserID", any 0, true);
964 char sInfo[128];
965 DBResultSet.FetchString(results, 0, sInfo, 128, 0);
966 SetTrieString(g_TargetInfo[iClient][0][0], "TargetAuth", sInfo, true);
967 DBResultSet.FetchString(results, 1, sInfo, 128, 0);
968 SetTrieString(g_TargetInfo[iClient][0][0], "TargetIP", sInfo, true);
969 DBResultSet.FetchString(results, 2, sInfo, 128, 0);
970 SetTrieString(g_TargetInfo[iClient][0][0], "TargetName", sInfo, true);
971 Menu.Display(g_hBanTimeMenu, iClient, 0);
972 }
973 }
974 return 0;
975}
976
977public int MenuHandler_BanTimeMenu(Menu hMenu, MenuAction action, int iClient, int Item)
978{
979 switch (action)
980 {
981 case 2: {
982 Panel hPanel = Item;
983 char sBuffer[64];
984 FormatEx(sBuffer, 64, "%T", "BAN_TERM", iClient);
985 Panel.SetTitle(hPanel, sBuffer, false);
986 }
987 case 4: {
988 char sTime[64];
989 char sInfo[128];
990 Menu.GetItem(hMenu, Item, sTime, 64, 0, sInfo, 128);
991 int iTime = StringToInt(sTime, 10);
992 SetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanTime", iTime, true);
993 SetTrieString(g_TargetInfo[iClient][0][0], "TargetBanTimeInfo", sInfo, true);
994 Menu.Display(g_hReasonsMenu, iClient, 0);
995 }
996 case 8: {
997 if (Item == -6)
998 {
999 SendCtBanMenu(iClient);
1000 SendCtBanOfflineMenu(iClient, 0, 20);
1001 }
1002 }
1003 default: {
1004 }
1005 }
1006 return 0;
1007}
1008
1009public int MenuHandler_ReasonsMenu(Menu hMenu, MenuAction action, int iClient, int Item)
1010{
1011 switch (action)
1012 {
1013 case 2: {
1014 Panel hPanel = Item;
1015 char sBuffer[64];
1016 FormatEx(sBuffer, 64, "%T", "BAN_REASON", iClient);
1017 Panel.SetTitle(hPanel, sBuffer, false);
1018 }
1019 case 4: {
1020 char sInfo[128];
1021 Menu.GetItem(hMenu, Item, sInfo, 128, 0, "", 0);
1022 SetTrieString(g_TargetInfo[iClient][0][0], "TargetReason", sInfo, true);
1023 SendConfirmMenu(iClient);
1024 }
1025 case 8: {
1026 if (Item == -6)
1027 {
1028 Menu.Display(g_hBanTimeMenu, iClient, 0);
1029 }
1030 }
1031 default: {
1032 }
1033 }
1034 return 0;
1035}
1036
1037int SendConfirmMenu(int iClient)
1038{
1039 MenuEx hMenu = MenuEx.MenuEx(MenuHandler 17, MenuAction 28);
1040 Menu.ExitBackButton.set(hMenu, true);
1041 char sName[32];
1042 char sReason[128];
1043 char sBanTime[128];
1044 GetTrieString(g_TargetInfo[iClient][0][0], "TargetReason", sReason, 128, 0);
1045 GetTrieString(g_TargetInfo[iClient][0][0], "TargetBanTimeInfo", sBanTime, 128, 0);
1046 GetTrieString(g_TargetInfo[iClient][0][0], "TargetName", sName, 32, 0);
1047 Menu.SetTitle(hMenu, "%T", "CONFIRMATION_REQUIRED_BAN", iClient, sName, sBanTime, sReason);
1048 FormatEx(sName, 32, "%T", "CONFIRM", iClient);
1049 Menu.AddItem(hMenu, "", sName, 0);
1050 FormatEx(sName, 32, "%T", "CANCEL", iClient);
1051 Menu.AddItem(hMenu, "", sName, 0);
1052 MenuEx.Reduction(hMenu, 4);
1053 Menu.Display(hMenu, iClient, 0);
1054 return 0;
1055}
1056
1057public int MenuHandler_ConfirmMenu(Menu hMenu, MenuAction action, int iClient, int Item)
1058{
1059 switch (action)
1060 {
1061 case 4: {
1062 switch (Item)
1063 {
1064 case 0: {
1065 CT_BanTargetClient(iClient);
1066 }
1067 case 1: {
1068 RemoveTargetInfo(iClient);
1069 TopMenu.DisplayCategory(g_hTopMenu, g_TopMenuObject_CT_Bans, iClient);
1070 }
1071 default: {
1072 }
1073 }
1074 }
1075 case 8: {
1076 if (Item == -6)
1077 {
1078 Menu.Display(g_hBanTimeMenu, iClient, 0);
1079 }
1080 }
1081 default: {
1082 }
1083 }
1084 return 0;
1085}
1086
1087int CT_BanTargetClient(int iClient)
1088{
1089 char sQuery[512];
1090 char sAuth[32];
1091 char sIP[24];
1092 GetTrieString(g_TargetInfo[iClient][0][0], "TargetAuth", sAuth, 32, 0);
1093 GetTrieString(g_TargetInfo[iClient][0][0], "TargetIP", sIP, 24, 0);
1094 FormatEx(sQuery, 512, "SELECT `id`, `remove_type`, `ban_count` FROM `ct_bans` WHERE `auth` = '%s' OR `ip` = '%s';", sAuth, sIP);
1095 LogMessage(sQuery);
1096 Database.Query(g_hDatabase, SQLQueryCallback 51, sQuery, GetClientUserId(iClient), DBPriority 1);
1097 return 0;
1098}
1099
1100public int SQL_Callback_SearchBan(Database hDatabase, DBResultSet results, char sError[], any iUserID)
1101{
1102 if (sError[0])
1103 {
1104 LogError("SQL_Callback_SearchBan: %s", sError);
1105 return 0;
1106 }
1107 int iClient = GetClientOfUserId(iUserID);
1108 if (0 < iClient)
1109 {
1110 char sQuery[512];
1111 char sAuth[32];
1112 char sIP[24];
1113 char sName[128];
1114 char sReason[256];
1115 char sAdminAuth[32];
1116 char sAdminIP[32];
1117 char sAdminName[128];
1118 int iBanTime = 0;
1119 int iTimeBanStart = 0;
1120 int iTimeBanEnd = 0;
1121 GetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanTime", iBanTime);
1122 iTimeBanStart = GetTime({0,0});
1123 iTimeBanEnd = iBanTime + iTimeBanStart;
1124 SetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanTimeStart", iTimeBanStart, true);
1125 SetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanTimeEnd", iTimeBanEnd, true);
1126 GetTrieString(g_TargetInfo[iClient][0][0], "TargetAuth", sAuth, 32, 0);
1127 GetTrieString(g_TargetInfo[iClient][0][0], "TargetIP", sIP, 24, 0);
1128 GetTrieString(g_TargetInfo[iClient][0][0], "TargetName", sName, 128, 0);
1129 EscapeString(sName, 128);
1130 GetTrieString(g_TargetInfo[iClient][0][0], "TargetReason", sReason, 256, 0);
1131 GetClientAuthId(iClient, AuthIdType 1, sAdminAuth, 32, true);
1132 GetClientIP(iClient, sAdminIP, 32, true);
1133 GetClientName(iClient, sAdminName, 128);
1134 if (DBResultSet.FetchRow(results))
1135 {
1136 if (DBResultSet.FetchInt(results, 1, 0))
1137 {
1138 int iBanCount = DBResultSet.FetchInt(results, 2, 0) + 1;
1139 FormatEx(sQuery, 512, "UPDATE `ct_bans` SET `auth` = '%s',`ip` = '%s',`name` = '%s',`time_start` = '%i',`time_end` = '%i',`length` = '%i',`reason` = '%s',`admin_auth` = '%s',`admin_ip` = '%s',`admin_name` = '%s',`ban_count` = '%i',`remove_type` = '0'WHERE `id` = '%i';", sAuth, sIP, sName, iTimeBanStart, iTimeBanEnd, iBanTime, sReason, sAdminAuth, sAdminIP, sAdminName, iBanCount, DBResultSet.FetchInt(results, 0, 0));
1140 SetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanCount", iBanCount, true);
1141 }
1142 CGOPrintToChat(iClient, "%t %t", 7508, 7520, sName);
1143 TopMenu.Display(g_hTopMenu, iClient, TopMenuPosition 3);
1144 return 0;
1145 }
1146 else
1147 {
1148 FormatEx(sQuery, 512, "INSERT INTO `ct_bans` (`auth`,`ip`,`name`,`time_start`,`time_end`,`length`,`reason`,`admin_auth`,`admin_ip`,`admin_name`) VALUES ('%s','%s','%s',%i,%i,%i,'%s','%s','%s','%s');", sAuth, sIP, sName, iTimeBanStart, iTimeBanEnd, iBanTime, sReason, sAdminAuth, sAdminIP, sAdminName);
1149 }
1150 LogMessage(sQuery);
1151 Database.Query(g_hDatabase, SQLQueryCallback 45, sQuery, iUserID, DBPriority 1);
1152 }
1153 return 0;
1154}
1155
1156public int SQL_Callback_InsertBan(Database hDatabase, DBResultSet results, char sError[], any iUserID)
1157{
1158 if (sError[0])
1159 {
1160 LogError("SQL_Callback_InsertBan: %s", sError);
1161 return 0;
1162 }
1163 int iClient = GetClientOfUserId(iUserID);
1164 if (0 < iClient)
1165 {
1166 char sBanTime[128];
1167 char sEndBanTime[64];
1168 char sAdminName[64];
1169 int iBanCount = 0;
1170 int iTarget = 0;
1171 int iTimeBanStart = 0;
1172 int iTimeBanEnd = 0;
1173 GetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanTimeStart", iTimeBanStart);
1174 GetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanTimeEnd", iTimeBanEnd);
1175 GetTrieValue(g_TargetInfo[iClient][0][0], "TargetBanCount", iBanCount);
1176 GetTrieString(g_TargetInfo[iClient][0][0], "TargetName", sAdminName, 64, 0);
1177 GetTrieString(g_TargetInfo[iClient][0][0], "TargetBanTimeInfo", sBanTime, 128, 0);
1178 FormatTime(sEndBanTime, 64, "%d/%m/%Y-%H:%M:%S", iTimeBanEnd);
1179 LogMessage(sEndBanTime);
1180 CGOPrintToChatAll("%t %t", 8128, 8140, iClient, sAdminName, sBanTime, sEndBanTime);
1181 TopMenu.DisplayCategory(g_hTopMenu, g_TopMenuObject_CT_Bans, iClient);
1182 GetTrieValue(g_TargetInfo[iClient][0][0], "TargetUserID", iTarget);
1183 iTarget = GetClientOfUserId(iTarget);
1184 int var1;
1185 if (iTarget > 0)
1186 {
1187 g_bIsClientCTBanned[iTarget] = 1;
1188 char sStartBanTime[64];
1189 char sReason[128];
1190 GetTrieString(g_TargetInfo[iClient][0][0], "TargetReason", sReason, 128, 0);
1191 FormatTime(sStartBanTime, 64, "%d/%m/%Y-%H:%M:%S", iTimeBanStart);
1192 GetClientName(iClient, sAdminName, 64);
1193 CreateCTBanInfoMenu(iTarget, sReason, sStartBanTime, sEndBanTime, sAdminName, iBanCount);
1194 if (GetClientTeam(iTarget) == 3)
1195 {
1196 ChangeClientTeam(iTarget, 2);
1197 ShowCTBanInfo(iTarget);
1198 }
1199 OnClientPostAdminCheck(iTarget);
1200 }
1201 RemoveTargetInfo(iClient);
1202 }
1203 return 0;
1204}
1205
1206public int TopMenuHandler_BanList(Handle hTopMenu, TopMenuAction action, TopMenuObject topobj_id, int iClient, char sBuffer[], int maxlength)
1207{
1208 switch (action)
1209 {
1210 case 0: {
1211 FormatEx(sBuffer, maxlength, "%T", "BANLIST", iClient);
1212 }
1213 case 2: {
1214 SendBanListOnlineMenu(iClient);
1215 }
1216 default: {
1217 }
1218 }
1219 return 0;
1220}
1221
1222void SendBanListOnlineMenu(int iClient)
1223{
1224 MenuEx hMenu = MenuEx.MenuEx(MenuHandler 11, MenuAction 28);
1225 Menu.SetTitle(hMenu, "%T:\n \n", "BANLIST", iClient);
1226 Menu.ExitBackButton.set(hMenu, true);
1227 char sName[32];
1228 char sBanID[12];
1229 int i = 1;
1230 while (i <= MaxClients)
1231 {
1232 int var1;
1233 if (IsClientInGame(i))
1234 {
1235 GetClientName(i, sName, 32);
1236 IntToString(g_iClientCTBanID[i][0][0], sBanID, 12);
1237 Menu.AddItem(hMenu, sBanID, sName, 0);
1238 i++;
1239 }
1240 i++;
1241 }
1242 FormatEx(sName, 32, "%T", "NO_PLAYERS_AVAILABLE", iClient);
1243 MenuEx.AddDefaultItem(hMenu, 1, sName);
1244 FormatEx(sName, 32, "%T", "SHOW_ALL", iClient);
1245 Menu.AddItem(hMenu, "all", sName, 0);
1246 Menu.Display(hMenu, iClient, 0);
1247 return void 0;
1248}
1249
1250void SendBanListMenu(int iClient, int iOffset, int iRowCount)
1251{
1252 InitializationTargetInfo(iClient);
1253 SetTrieValue(g_TargetInfo[iClient][0][0], "iOffset", iOffset, true);
1254 SetTrieValue(g_TargetInfo[iClient][0][0], "iRowCount", iRowCount, true);
1255 char sQuery[256];
1256 FormatEx(sQuery, 256, "SELECT `id`, `name`, `remove_type` FROM `ct_bans` ORDER BY `time_start` DESC LIMIT %i, %i;", iOffset, iRowCount);
1257 Database.Query(g_hDatabase, SQLQueryCallback 59, sQuery, GetClientUserId(iClient), DBPriority 1);
1258 return void 0;
1259}
1260
1261public int SQL_Callback_SelectBanList(Database hDatabase, DBResultSet results, char sError[], any iUserID)
1262{
1263 if (sError[0])
1264 {
1265 LogError("SQL_Callback_SelectBanList: %s", sError);
1266 return 0;
1267 }
1268 int iClient = GetClientOfUserId(iUserID);
1269 if (0 < iClient)
1270 {
1271 MenuEx hMenu = MenuEx.MenuEx(MenuHandler 11, MenuAction 28);
1272 Menu.SetTitle(hMenu, "%T:\n \n", "BANLIST", iClient);
1273 Menu.ExitBackButton.set(hMenu, true);
1274 char sName[256];
1275 char sID[16];
1276 while (DBResultSet.FetchRow(results))
1277 {
1278 DBResultSet.FetchString(results, 0, sID, 16, 0);
1279 DBResultSet.FetchString(results, 1, sName, 256, 0);
1280 int var1;
1281 if (DBResultSet.FetchInt(results, 2, 0))
1282 {
1283 var1 = 8460;
1284 }
1285 else
1286 {
1287 var1 = 8452;
1288 }
1289 Format(sName, 256, "%s [%T]", sName, var1, iClient);
1290 Menu.AddItem(hMenu, sID, sName, 0);
1291 }
1292 FormatEx(sName, 256, "%T", "NO_PLAYERS_AVAILABLE", iClient);
1293 if (!(MenuEx.AddDefaultItem(hMenu, 1, sName)))
1294 {
1295 int iRowCount;
1296 GetTrieValue(g_TargetInfo[iClient][0][0], "iRowCount", iRowCount);
1297 if (Menu.ItemCount.get(hMenu) >= iRowCount)
1298 {
1299 FormatEx(sName, 256, "%T", "SHOW_MORE", iClient);
1300 Menu.AddItem(hMenu, "more", sName, 0);
1301 }
1302 }
1303 Menu.Display(hMenu, iClient, 0);
1304 }
1305 return 0;
1306}
1307
1308public int MenuHandler_BanListMenu(Menu hMenu, MenuAction action, int iClient, int Item)
1309{
1310 switch (action)
1311 {
1312 case 4: {
1313 char sInfo[32];
1314 Menu.GetItem(hMenu, Item, sInfo, 32, 0, "", 0);
1315 if (strcmp(sInfo, "all", true))
1316 {
1317 if (strcmp(sInfo, "more", true))
1318 {
1319 if (!g_TargetInfo[iClient][0][0])
1320 {
1321 InitializationTargetInfo(iClient);
1322 }
1323 SetTrieValue(g_TargetInfo[iClient][0][0], "iBan_ID", StringToInt(sInfo, 10), true);
1324 char sQuery[256];
1325 FormatEx(sQuery, 256, "SELECT `name`, `auth`, `reason`, `time_start`, `time_end`, `admin_name`, `remove_type`, `ban_count` FROM `ct_bans` WHERE `id` = '%s';", sInfo);
1326 Database.Query(g_hDatabase, SQLQueryCallback 57, sQuery, GetClientUserId(iClient), DBPriority 1);
1327 }
1328 int iOffset = 0;
1329 GetTrieValue(g_TargetInfo[iClient][0][0], "iOffset", iOffset);
1330 iOffset += 20;
1331 SendBanListMenu(iClient, iOffset, iOffset + 20);
1332 return 0;
1333 }
1334 SendBanListMenu(iClient, 0, 20);
1335 return 0;
1336 }
1337 case 8: {
1338 int var1;
1339 if (Item == -6)
1340 {
1341 TopMenu.Display(g_hTopMenu, iClient, TopMenuPosition 3);
1342 }
1343 }
1344 case 16: {
1345 CloseHandle(hMenu);
1346 hMenu = 0;
1347 }
1348 default: {
1349 }
1350 }
1351 return 0;
1352}
1353
1354public int SQL_Callback_SelectBanInfo(Database hDatabase, DBResultSet results, char sError[], any iUserID)
1355{
1356 if (sError[0])
1357 {
1358 LogError("SQL_Callback_SelectBanInfo: %s", sError);
1359 return 0;
1360 }
1361 int iClient = GetClientOfUserId(iUserID);
1362 if (0 < iClient)
1363 {
1364 if (DBResultSet.FetchRow(results))
1365 {
1366 char sName[128];
1367 char sAuth[32];
1368 char sStartBanTime[52];
1369 char sEndBanTime[52];
1370 char sReason[128];
1371 char sAdminName[64];
1372 char sStatus[64];
1373 int iRemoveType = DBResultSet.FetchInt(results, 6, 0);
1374 int iTimeBanStart = DBResultSet.FetchInt(results, 3, 0);
1375 int iTimeBanEnd = DBResultSet.FetchInt(results, 4, 0);
1376 DBResultSet.FetchString(results, 0, sName, 128, 0);
1377 DBResultSet.FetchString(results, 1, sAuth, 32, 0);
1378 DBResultSet.FetchString(results, 2, sReason, 128, 0);
1379 DBResultSet.FetchString(results, 5, sAdminName, 64, 0);
1380 FormatTime(sStartBanTime, 50, "%d/%m/%Y-%H:%M:%S", iTimeBanStart);
1381 FormatTime(sEndBanTime, 50, "%d/%m/%Y-%H:%M:%S", iTimeBanEnd);
1382 switch (iRemoveType)
1383 {
1384 case 0: {
1385 FormatEx(sStatus, 64, "%T", "ACTIVE", iClient);
1386 }
1387 case 1: {
1388 FormatEx(sStatus, 64, "%T", "EXPIRED", iClient);
1389 }
1390 case 2: {
1391 FormatEx(sStatus, 64, "%T", "UNBANNED", iClient);
1392 }
1393 default: {
1394 }
1395 }
1396 MenuEx hMenu = MenuEx.MenuEx(MenuHandler 15, MenuAction 28);
1397 Menu.ExitBackButton.set(hMenu, true);
1398 Menu.SetTitle(hMenu, "%T", "BAN_INFO_MENU_TITLE", iClient, sName, sAuth, sReason, sStartBanTime, sEndBanTime, sAdminName, sStatus, DBResultSet.FetchInt(results, 7, 0));
1399 FormatEx(sStatus, 64, "%T", "UNBAN", iClient);
1400 int var1;
1401 if (iRemoveType)
1402 {
1403 var1 = 1;
1404 }
1405 else
1406 {
1407 var1 = 0;
1408 }
1409 Menu.AddItem(hMenu, "", sStatus, var1);
1410 FormatEx(sStatus, 64, "%T", "REMOVE", iClient);
1411 int var2;
1412 if (GetUserFlagBits(iClient) & 16384)
1413 {
1414 var2 = 0;
1415 }
1416 else
1417 {
1418 var2 = 1;
1419 }
1420 Menu.AddItem(hMenu, "", sStatus, var2);
1421 MenuEx.Reduction(hMenu, 4);
1422 Menu.Display(hMenu, iClient, 0);
1423 }
1424 }
1425 return 0;
1426}
1427
1428public int MenuHandler_CTBanInfoMenu(Menu hMenu, MenuAction action, int iClient, int Item)
1429{
1430 switch (action)
1431 {
1432 case 4: {
1433 int iID = 0;
1434 char sQuery[256];
1435 GetTrieValue(g_TargetInfo[iClient][0][0], "iBan_ID", iID);
1436 switch (Item)
1437 {
1438 case 0: {
1439 FormatEx(sQuery, 256, "UPDATE `ct_bans` SET `remove_type` = '2' WHERE `id` = '%i';", iID);
1440 CGOPrintToChat(iClient, "%t %t", 8944, 8956);
1441 }
1442 case 1: {
1443 FormatEx(sQuery, 256, "DELETE FROM `ct_bans` WHERE `id` = '%i';", iID);
1444 CGOPrintToChat(iClient, "%t %t", 9040, 9052);
1445 }
1446 default: {
1447 }
1448 }
1449 Database.Query(g_hDatabase, SQLQueryCallback 49, sQuery, iID, DBPriority 1);
1450 }
1451 case 8: {
1452 SendBanListOnlineMenu(iClient);
1453 }
1454 case 16: {
1455 CloseHandle(hMenu);
1456 hMenu = 0;
1457 }
1458 default: {
1459 }
1460 }
1461 return 0;
1462}
1463
1464int Func_GetTimeFromStamp(char sBuffer[], int maxlength, int iTimeStamp, int iClient)
1465{
1466 if (iTimeStamp > 31536000)
1467 {
1468 int years = iTimeStamp / 31536000;
1469 int days = iTimeStamp / 86400;
1470 if (0 < days)
1471 {
1472 FormatEx(sBuffer, maxlength, "%d%T %d%T", years, "y.", iClient, days, "d.", iClient);
1473 }
1474 else
1475 {
1476 FormatEx(sBuffer, maxlength, "%d%T", years, "y.");
1477 }
1478 return 0;
1479 }
1480 if (iTimeStamp > 86400)
1481 {
1482 int days = iTimeStamp / 86400;
1483 int hours = iTimeStamp / 3600;
1484 if (0 < hours)
1485 {
1486 FormatEx(sBuffer, maxlength, "%d%T %d%T", days, "d.", iClient, hours, "h.", iClient);
1487 }
1488 else
1489 {
1490 FormatEx(sBuffer, maxlength, "%d%T", days, "d.", iClient);
1491 }
1492 return 0;
1493 }
1494 int Hours = iTimeStamp / 3600;
1495 int Mins = iTimeStamp / 60;
1496 int Secs = iTimeStamp;
1497 if (0 < Hours)
1498 {
1499 FormatEx(sBuffer, maxlength, "%02d:%02d:%02d", Hours, Mins, Secs);
1500 }
1501 else
1502 {
1503 FormatEx(sBuffer, maxlength, "%02d:%02d", Mins, Secs);
1504 }
1505 return 0;
1506}
1507
1508void EscapeString(char sBuffer[], int maxlen)
1509{
1510 ReplaceString(sBuffer, maxlen, "'", "", true);
1511 ReplaceString(sBuffer, maxlen, "\"", "", true);
1512 return void 0;
1513}