· 6 years ago · Jun 11, 2019, 06:02 PM
1public PlVers:__version =
2{
3 version = 5,
4 filevers = "1.7.3-dev+5229",
5 date = "08/11/2016",
6 time = "00:57:46"
7};
8new Float:NULL_VECTOR[3];
9new String:NULL_STRING[4];
10public Extension:__ext_core =
11{
12 name = "Core",
13 file = "core",
14 autoload = 0,
15 required = 0,
16};
17new MaxClients;
18new String:g_sConfigFile[256];
19new String:g_sRawFileName[256];
20new String:g_sFolderPath[256];
21new bool:g_bCreateFile;
22new Handle:g_hPluginHandle;
23new g_iLastFindResult;
24new g_iLastAppendResult;
25public SharedPlugin:__pl_calladmin =
26{
27 name = "calladmin",
28 file = "calladmin.smx",
29 required = 1,
30};
31public SharedPlugin:__pl_updater =
32{
33 name = "updater",
34 file = "updater.smx",
35 required = 0,
36};
37new ConVar:g_hEntryPruning;
38public __ext_core_SetNTVOptional()
39{
40 MarkNativeAsOptional("GetFeatureStatus");
41 MarkNativeAsOptional("RequireFeature");
42 MarkNativeAsOptional("AddCommandListener");
43 MarkNativeAsOptional("RemoveCommandListener");
44 MarkNativeAsOptional("BfWriteBool");
45 MarkNativeAsOptional("BfWriteByte");
46 MarkNativeAsOptional("BfWriteChar");
47 MarkNativeAsOptional("BfWriteShort");
48 MarkNativeAsOptional("BfWriteWord");
49 MarkNativeAsOptional("BfWriteNum");
50 MarkNativeAsOptional("BfWriteFloat");
51 MarkNativeAsOptional("BfWriteString");
52 MarkNativeAsOptional("BfWriteEntity");
53 MarkNativeAsOptional("BfWriteAngle");
54 MarkNativeAsOptional("BfWriteCoord");
55 MarkNativeAsOptional("BfWriteVecCoord");
56 MarkNativeAsOptional("BfWriteVecNormal");
57 MarkNativeAsOptional("BfWriteAngles");
58 MarkNativeAsOptional("BfReadBool");
59 MarkNativeAsOptional("BfReadByte");
60 MarkNativeAsOptional("BfReadChar");
61 MarkNativeAsOptional("BfReadShort");
62 MarkNativeAsOptional("BfReadWord");
63 MarkNativeAsOptional("BfReadNum");
64 MarkNativeAsOptional("BfReadFloat");
65 MarkNativeAsOptional("BfReadString");
66 MarkNativeAsOptional("BfReadEntity");
67 MarkNativeAsOptional("BfReadAngle");
68 MarkNativeAsOptional("BfReadCoord");
69 MarkNativeAsOptional("BfReadVecCoord");
70 MarkNativeAsOptional("BfReadVecNormal");
71 MarkNativeAsOptional("BfReadAngles");
72 MarkNativeAsOptional("BfGetNumBytesLeft");
73 MarkNativeAsOptional("BfWrite.WriteBool");
74 MarkNativeAsOptional("BfWrite.WriteByte");
75 MarkNativeAsOptional("BfWrite.WriteChar");
76 MarkNativeAsOptional("BfWrite.WriteShort");
77 MarkNativeAsOptional("BfWrite.WriteWord");
78 MarkNativeAsOptional("BfWrite.WriteNum");
79 MarkNativeAsOptional("BfWrite.WriteFloat");
80 MarkNativeAsOptional("BfWrite.WriteString");
81 MarkNativeAsOptional("BfWrite.WriteEntity");
82 MarkNativeAsOptional("BfWrite.WriteAngle");
83 MarkNativeAsOptional("BfWrite.WriteCoord");
84 MarkNativeAsOptional("BfWrite.WriteVecCoord");
85 MarkNativeAsOptional("BfWrite.WriteVecNormal");
86 MarkNativeAsOptional("BfWrite.WriteAngles");
87 MarkNativeAsOptional("BfRead.ReadBool");
88 MarkNativeAsOptional("BfRead.ReadByte");
89 MarkNativeAsOptional("BfRead.ReadChar");
90 MarkNativeAsOptional("BfRead.ReadShort");
91 MarkNativeAsOptional("BfRead.ReadWord");
92 MarkNativeAsOptional("BfRead.ReadNum");
93 MarkNativeAsOptional("BfRead.ReadFloat");
94 MarkNativeAsOptional("BfRead.ReadString");
95 MarkNativeAsOptional("BfRead.ReadEntity");
96 MarkNativeAsOptional("BfRead.ReadAngle");
97 MarkNativeAsOptional("BfRead.ReadCoord");
98 MarkNativeAsOptional("BfRead.ReadVecCoord");
99 MarkNativeAsOptional("BfRead.ReadVecNormal");
100 MarkNativeAsOptional("BfRead.ReadAngles");
101 MarkNativeAsOptional("BfRead.GetNumBytesLeft");
102 MarkNativeAsOptional("PbReadInt");
103 MarkNativeAsOptional("PbReadFloat");
104 MarkNativeAsOptional("PbReadBool");
105 MarkNativeAsOptional("PbReadString");
106 MarkNativeAsOptional("PbReadColor");
107 MarkNativeAsOptional("PbReadAngle");
108 MarkNativeAsOptional("PbReadVector");
109 MarkNativeAsOptional("PbReadVector2D");
110 MarkNativeAsOptional("PbGetRepeatedFieldCount");
111 MarkNativeAsOptional("PbSetInt");
112 MarkNativeAsOptional("PbSetFloat");
113 MarkNativeAsOptional("PbSetBool");
114 MarkNativeAsOptional("PbSetString");
115 MarkNativeAsOptional("PbSetColor");
116 MarkNativeAsOptional("PbSetAngle");
117 MarkNativeAsOptional("PbSetVector");
118 MarkNativeAsOptional("PbSetVector2D");
119 MarkNativeAsOptional("PbAddInt");
120 MarkNativeAsOptional("PbAddFloat");
121 MarkNativeAsOptional("PbAddBool");
122 MarkNativeAsOptional("PbAddString");
123 MarkNativeAsOptional("PbAddColor");
124 MarkNativeAsOptional("PbAddAngle");
125 MarkNativeAsOptional("PbAddVector");
126 MarkNativeAsOptional("PbAddVector2D");
127 MarkNativeAsOptional("PbRemoveRepeatedFieldValue");
128 MarkNativeAsOptional("PbReadMessage");
129 MarkNativeAsOptional("PbReadRepeatedMessage");
130 MarkNativeAsOptional("PbAddMessage");
131 MarkNativeAsOptional("Protobuf.ReadInt");
132 MarkNativeAsOptional("Protobuf.ReadFloat");
133 MarkNativeAsOptional("Protobuf.ReadBool");
134 MarkNativeAsOptional("Protobuf.ReadString");
135 MarkNativeAsOptional("Protobuf.ReadColor");
136 MarkNativeAsOptional("Protobuf.ReadAngle");
137 MarkNativeAsOptional("Protobuf.ReadVector");
138 MarkNativeAsOptional("Protobuf.ReadVector2D");
139 MarkNativeAsOptional("Protobuf.GetRepeatedFieldCount");
140 MarkNativeAsOptional("Protobuf.SetInt");
141 MarkNativeAsOptional("Protobuf.SetFloat");
142 MarkNativeAsOptional("Protobuf.SetBool");
143 MarkNativeAsOptional("Protobuf.SetString");
144 MarkNativeAsOptional("Protobuf.SetColor");
145 MarkNativeAsOptional("Protobuf.SetAngle");
146 MarkNativeAsOptional("Protobuf.SetVector");
147 MarkNativeAsOptional("Protobuf.SetVector2D");
148 MarkNativeAsOptional("Protobuf.AddInt");
149 MarkNativeAsOptional("Protobuf.AddFloat");
150 MarkNativeAsOptional("Protobuf.AddBool");
151 MarkNativeAsOptional("Protobuf.AddString");
152 MarkNativeAsOptional("Protobuf.AddColor");
153 MarkNativeAsOptional("Protobuf.AddAngle");
154 MarkNativeAsOptional("Protobuf.AddVector");
155 MarkNativeAsOptional("Protobuf.AddVector2D");
156 MarkNativeAsOptional("Protobuf.RemoveRepeatedFieldValue");
157 MarkNativeAsOptional("Protobuf.ReadMessage");
158 MarkNativeAsOptional("Protobuf.ReadRepeatedMessage");
159 MarkNativeAsOptional("Protobuf.AddMessage");
160 VerifyCoreVersion();
161 return 0;
162}
163
164bool:StrEqual(String:str1[], String:str2[], bool:caseSensitive)
165{
166 return strcmp(str1, str2, caseSensitive) == 0;
167}
168
169StrCat(String:buffer[], maxlength, String:source[])
170{
171 new len = strlen(buffer);
172 if (len >= maxlength)
173 {
174 return 0;
175 }
176 return Format(buffer[len], maxlength - len, "%s", source);
177}
178
179ExplodeString(String:text[], String:split[], String:buffers[][], maxStrings, maxStringLength, bool:copyRemainder)
180{
181 new reloc_idx;
182 new idx;
183 new total;
184 new var1;
185 if (maxStrings < 1 || !split[0])
186 {
187 return 0;
188 }
189 while ((idx = SplitString(text[reloc_idx], split, buffers[total], maxStringLength)) != -1)
190 {
191 reloc_idx = idx + reloc_idx;
192 total++;
193 if (maxStrings == total)
194 {
195 if (copyRemainder)
196 {
197 strcopy(buffers[total + -1], maxStringLength, text[reloc_idx - idx]);
198 }
199 return total;
200 }
201 }
202 total++;
203 strcopy(buffers[total], maxStringLength, text[reloc_idx]);
204 return total;
205}
206
207void:File.Close(File:this)
208{
209 CloseHandle(this);
210 return void:0;
211}
212
213bool:AutoExecConfig_SetFile(String:file[], String:folder[])
214{
215 Format(g_sConfigFile, 256, "%s", file);
216 strcopy(g_sRawFileName, 256, file);
217 strcopy(g_sFolderPath, 256, folder);
218 return AutoExecConfig_FormatFileName(g_sConfigFile, 256, folder) == 41;
219}
220
221ConVar:AutoExecConfig_CreateConVar(String:name[], String:defaultValue[], String:description[], flags, bool:hasMin, Float:min, bool:hasMax, Float:max)
222{
223 new var1;
224 if (!flags & 131072 && strlen(g_sConfigFile) > 0)
225 {
226 g_iLastFindResult = -1;
227 g_iLastAppendResult = -1;
228 new String:buffer[64];
229 g_iLastFindResult = AutoExecConfig_FindValue(name, buffer, 64, true);
230 new var3;
231 if (g_iLastFindResult == 13 || (g_iLastFindResult == 11 && g_bCreateFile))
232 {
233 g_iLastAppendResult = AutoExecConfig_AppendValue(name, defaultValue, description, flags, hasMin, min, hasMax, max);
234 }
235 }
236 return CreateConVar(name, defaultValue, description, flags, hasMin, min, hasMax, max);
237}
238
239AutoExecConfig_FormatFileName(String:buffer[], size, String:folder[])
240{
241 if (strlen(g_sConfigFile) < 1)
242 {
243 return 30;
244 }
245 new var1;
246 if (StrContains(g_sConfigFile, ".cfg", true) == -1 && strlen(g_sConfigFile) < 4)
247 {
248 return 40;
249 }
250 new String:pathprefixbuffer[256];
251 if (0 < strlen(folder))
252 {
253 Format(pathprefixbuffer, 256, "cfg/%s/", folder);
254 }
255 else
256 {
257 Format(pathprefixbuffer, 256, "cfg/");
258 }
259 new String:filebuffer[256];
260 filebuffer[0] = MissingTAG:0;
261 if (StrContains(buffer, pathprefixbuffer, true))
262 {
263 StrCat(filebuffer, 256, pathprefixbuffer);
264 }
265 StrCat(filebuffer, 256, g_sConfigFile);
266 if (StrContains(filebuffer[strlen(filebuffer) + -4], ".cfg", true))
267 {
268 StrCat(filebuffer, 256, ".cfg");
269 }
270 strcopy(buffer, size, filebuffer);
271 return 41;
272}
273
274AutoExecConfig_AppendValue(String:name[], String:defaultValue[], String:description[], flags, bool:hasMin, Float:min, bool:hasMax, Float:max)
275{
276 if (strlen(g_sConfigFile) < 1)
277 {
278 return 30;
279 }
280 new String:filebuffer[256];
281 strcopy(filebuffer, 256, g_sConfigFile);
282 new bool:bFileExists = FileExists(filebuffer, false, "GAME");
283 new var1;
284 if (g_bCreateFile || bFileExists)
285 {
286 decl File:fFile;
287 new var2;
288 if (bFileExists)
289 {
290 var2[0] = 3064;
291 }
292 else
293 {
294 var2[0] = 3068;
295 }
296 fFile = OpenFile(filebuffer, var2, false, "GAME");
297 new String:writebuffer[2048];
298 if (fFile)
299 {
300 new var3;
301 if (g_bCreateFile && !bFileExists)
302 {
303 File.WriteLine(fFile, "// This file was auto-generated by AutoExecConfig read and append beta");
304 GetPluginFilename(g_hPluginHandle, writebuffer, 2048);
305 Format(writebuffer, 2048, "// ConVars for plugin \"%s\"", writebuffer);
306 File.WriteLine(fFile, writebuffer);
307 }
308 File.WriteLine(fFile, "\n");
309 new newlines = GetCharCountInStr(10, description);
310 if (newlines)
311 {
312 new newlineBuf[newlines + 1][2048];
313 ExplodeString(description, "\n", newlineBuf, newlines + 1, 2048, false);
314 new i;
315 while (i <= newlines)
316 {
317 if (0 < strlen(newlineBuf[i]))
318 {
319 File.WriteLine(fFile, "// %s", newlineBuf[i]);
320 }
321 i++;
322 }
323 }
324 else
325 {
326 Format(writebuffer, 2048, "// %s", description);
327 File.WriteLine(fFile, writebuffer);
328 }
329 File.WriteLine(fFile, "// -");
330 Format(writebuffer, 2048, "// Default: \"%s\"", defaultValue);
331 File.WriteLine(fFile, writebuffer);
332 if (hasMin)
333 {
334 Format(writebuffer, 2048, "// Minimum: \"%f\"", min);
335 File.WriteLine(fFile, writebuffer);
336 }
337 if (hasMax)
338 {
339 Format(writebuffer, 2048, "// Maximum: \"%f\"", max);
340 File.WriteLine(fFile, writebuffer);
341 }
342 Format(writebuffer, 2048, "%s \"%s\"", name, defaultValue);
343 File.WriteLine(fFile, writebuffer);
344 File.Close(fFile);
345 return 3;
346 }
347 return 2;
348 }
349 return 1;
350}
351
352AutoExecConfig_FindValue(String:cvar[], String:value[], size, bool:caseSensitive)
353{
354 value[0] = MissingTAG:0;
355 if (strlen(g_sConfigFile) < 1)
356 {
357 return 30;
358 }
359 new String:filebuffer[256];
360 strcopy(filebuffer, 256, g_sConfigFile);
361 new bool:bFileExists = FileExists(filebuffer, false, "GAME");
362 new var1;
363 if (g_bCreateFile && !bFileExists)
364 {
365 return 11;
366 }
367 if (bFileExists)
368 {
369 new File:fFile = OpenFile(filebuffer, "r", false, "GAME");
370 new valuestart;
371 new valueend;
372 new cvarend;
373 new String:sConvar[64];
374 new String:sValue[64];
375 new String:readbuffer[2048];
376 new String:copybuffer[2048];
377 if (!fFile)
378 {
379 return 12;
380 }
381 while (!File.EndOfFile(fFile) && File.ReadLine(fFile, readbuffer, 2048))
382 {
383 new var3;
384 if (!(IsCharSpace(readbuffer[0]) || readbuffer[0] == '/' || !IsCharAlpha(readbuffer[0])))
385 {
386 if (!(GetCharCountInStr(32, readbuffer) < 1))
387 {
388 if (!(GetCharCountInStr(34, readbuffer) != 2))
389 {
390 if (!((valuestart = StrContains(readbuffer, "\"", true)) == -1))
391 {
392 if (!((valueend = StrContains(readbuffer[valuestart + 1], "\"", true)) == -1))
393 {
394 new var4;
395 if (!((cvarend = StrContains(readbuffer, " ", true)) == -1 || cvarend >= valuestart))
396 {
397 if (!(cvarend >= valuestart))
398 {
399 strcopy(copybuffer, 2048, readbuffer);
400 copybuffer[cvarend] = MissingTAG:0;
401 strcopy(sConvar, 64, copybuffer);
402 strcopy(copybuffer, 2048, readbuffer[valuestart + 1]);
403 copybuffer[valueend] = MissingTAG:0;
404 strcopy(sValue, 64, copybuffer);
405 if (StrEqual(sConvar, cvar, caseSensitive))
406 {
407 Format(value, size, "%s", sConvar);
408 File.Close(fFile);
409 return 14;
410 }
411 }
412 }
413 }
414 }
415 }
416 }
417 }
418 }
419 File.Close(fFile);
420 return 13;
421 }
422 return 11;
423}
424
425AutoExecConfig_CleanFile()
426{
427 if (strlen(g_sConfigFile) < 1)
428 {
429 return 30;
430 }
431 new String:sfile[256];
432 strcopy(sfile, 256, g_sConfigFile);
433 if (!FileExists(sfile, false, "GAME"))
434 {
435 return 20;
436 }
437 new String:sfile2[256];
438 Format(sfile2, 256, "%s_tempcopy", sfile);
439 new String:readbuffer[2048];
440 new count;
441 new bool:firstreached;
442 new File:fFile1 = OpenFile(sfile, "r", false, "GAME");
443 new File:fFile2 = OpenFile(sfile2, "w", false, "GAME");
444 new var1;
445 if (fFile1 && fFile2)
446 {
447 if (fFile1)
448 {
449 File.Close(fFile1);
450 }
451 if (fFile2)
452 {
453 File.Close(fFile2);
454 }
455 return 21;
456 }
457 while (!File.EndOfFile(fFile1) && File.ReadLine(fFile1, readbuffer, 2048))
458 {
459 if (IsCharSpace(readbuffer[0]))
460 {
461 count++;
462 }
463 else
464 {
465 count = 0;
466 }
467 new var3;
468 if (count < 2 || !firstreached)
469 {
470 ReplaceString(readbuffer, 2048, "\n", "", true);
471 File.WriteLine(fFile2, readbuffer);
472 }
473 if (count == 2)
474 {
475 firstreached = true;
476 }
477 }
478 File.Close(fFile1);
479 File.Close(fFile2);
480 DeleteFile(sfile, false, "DEFAULT_WRITE_PATH");
481 RenameFile(sfile, sfile2, false, "DEFAULT_WRITE_PATH");
482 return 22;
483}
484
485GetCharCountInStr(character, String:str[])
486{
487 new len = strlen(str);
488 new count;
489 new i;
490 while (i < len)
491 {
492 if (character == str[i])
493 {
494 count++;
495 }
496 i++;
497 }
498 return count;
499}
500
501public __pl_updater_SetNTVOptional()
502{
503 MarkNativeAsOptional("Updater_AddPlugin");
504 MarkNativeAsOptional("Updater_RemovePlugin");
505 MarkNativeAsOptional("Updater_ForceUpdate");
506 return 0;
507}
508
509public void:OnConfigsExecuted()
510{
511 if (!g_bDbInitTriggered)
512 {
513 ConVar.GetString(g_hTableName, g_sTableName, 32);
514 InitDB();
515 g_bDbInitTriggered = true;
516 }
517 return void:0;
518}
519
520public void:OnPluginStart()
521{
522 AutoExecConfig_SetFile("plugin.calladmin_mysql", "sourcemod");
523 g_hVersion = AutoExecConfig_CreateConVar("sm_calladmin_mysql_version", "0.1.5", "Plugin version", 131328, false, 0.0, false, 0.0);
524 g_hTableName = AutoExecConfig_CreateConVar("sm_calladmin_table_name", "zgloszenia", "Name of the CallAdmin table", 32, false, 0.0, false, 0.0);
525 g_hServerKey = AutoExecConfig_CreateConVar("sm_calladmin_server_key", "", "Server key to identify this server (Max. 64 allowed!)", 32, false, 0.0, false, 0.0);
526 g_hEntryPruning = AutoExecConfig_CreateConVar("sm_calladmin_entrypruning", "25", "Entries older than given minutes will be deleted, 0 deactivates the feature", 0, true, 0.0, false, 0.0);
527 g_hOhphanedEntryPruning = AutoExecConfig_CreateConVar("sm_calladmin_entrypruning_ohphaned", "4320", "Entries older than given minutes will be recognized as orphaned and will be deleted globally (serverIP and serverPort won't be checked)", 0, true, 0.0, false, 0.0);
528 AutoExecConfig(true, "plugin.calladmin_mysql", "sourcemod");
529 AutoExecConfig_CleanFile();
530 LoadTranslations("calladmin.phrases");
531 ConVar.SetString(g_hVersion, "0.1.5", false, false);
532 HookConVarChange(g_hVersion, OnCvarChanged);
533 g_iEntryPruning = ConVar.IntValue.get(g_hEntryPruning);
534 HookConVarChange(g_hEntryPruning, OnCvarChanged);
535 ConVar.GetString(g_hServerKey, g_sServerKey, 32);
536 HookConVarChange(g_hServerKey, OnCvarChanged);
537 g_iOhphanedEntryPruning = ConVar.IntValue.get(g_hOhphanedEntryPruning);
538 HookConVarChange(g_hOhphanedEntryPruning, OnCvarChanged);
539 CreateTimer(60.0, Timer_PruneEntries, any:0, 1);
540 CreateTimer(20.0, Timer_UpdateTrackersCount, any:0, 1);
541 return void:0;
542}
543
544void:InitDB()
545{
546 new var1;
547 if (!SQL_CheckConfig("CallAdmin") && !SQL_CheckConfig("default"))
548 {
549 CallAdmin_LogMessage("Couldn't find database config");
550 SetFailState("Couldn't find database config");
551 }
552 new var2;
553 if (SQL_CheckConfig("CallAdmin"))
554 {
555 var2[0] = 4512;
556 }
557 else
558 {
559 var2[0] = 4524;
560 }
561 Database.Connect(SQLConnectCallback:17, var2, any:0);
562 return void:0;
563}
564
565public void:OnAllPluginsLoaded()
566{
567 if (!LibraryExists("calladmin"))
568 {
569 SetFailState("CallAdmin not found");
570 }
571 if (LibraryExists("updater"))
572 {
573 Updater_AddPlugin("http://plugins.gugyclan.eu/calladmin/calladmin_mysql.txt");
574 }
575 g_iHostPort = CallAdmin_GetHostPort();
576 CallAdmin_GetHostIP(g_sHostIP, 16);
577 CallAdmin_GetHostName(g_sServerName, 64);
578 return void:0;
579}
580
581public void:OnLibraryAdded(String:name[])
582{
583 if (StrEqual(name, "updater", true))
584 {
585 Updater_AddPlugin("http://plugins.gugyclan.eu/calladmin/calladmin_mysql.txt");
586 }
587 return void:0;
588}
589
590public Action:Timer_PruneEntries(Handle:timer)
591{
592 if (String:0 < g_iEntryPruning)
593 {
594 return Action:0;
595 }
596 return Action:0;
597}
598
599public void:CallAdmin_OnRequestTrackersCountRefresh(&trackers)
600{
601 trackers = g_iCurrentTrackers;
602 return void:0;
603}
604
605public void:CallAdmin_OnServerDataChanged(ConVar:convar, ServerData:type, String:oldVal[], String:newVal[])
606{
607 if (type == ServerData:1)
608 {
609 CallAdmin_GetHostIP(g_sHostIP, 16);
610 }
611 else
612 {
613 if (type)
614 {
615 if (type == ServerData:2)
616 {
617 g_iHostPort = CallAdmin_GetHostPort();
618 }
619 }
620 CallAdmin_GetHostName(g_sServerName, 64);
621 }
622 return void:0;
623}
624
625public void:OnCvarChanged(Handle:cvar, String:oldValue[], String:newValue[])
626{
627 if (g_hEntryPruning == cvar)
628 {
629 g_iEntryPruning = ConVar.IntValue.get(g_hEntryPruning);
630 }
631 else
632 {
633 if (g_hServerKey == cvar)
634 {
635 ConVar.GetString(g_hServerKey, g_sServerKey, 32);
636 }
637 if (g_hOhphanedEntryPruning == cvar)
638 {
639 g_iOhphanedEntryPruning = ConVar.IntValue.get(g_hOhphanedEntryPruning);
640 }
641 if (g_hVersion == cvar)
642 {
643 ConVar.SetString(g_hVersion, "0.1.5", false, false);
644 }
645 }
646 return void:0;
647}
648
649public void:CallAdmin_OnReportPost(client, target, String:reason[])
650{
651 new var1;
652 if (!g_bAllLoaded || g_hDbHandle)
653 {
654 return void:0;
655 }
656 new String:clientNameBuf[32];
657 new String:clientName[68];
658 new String:clientAuth[24];
659 new String:targetNameBuf[32];
660 new String:targetName[68];
661 new String:targetAuth[24];
662 new String:sKey[68];
663 Database.Escape(g_hDbHandle, g_sServerKey, sKey, 66, 0);
664 new String:sReason[260];
665 Database.Escape(g_hDbHandle, reason, sReason, 258, 0);
666 if (client == 1679124)
667 {
668 strcopy(clientName, 66, "Server/Console");
669 strcopy(clientAuth, 21, "Server/Console");
670 }
671 else
672 {
673 GetClientName(client, clientNameBuf, 32);
674 Database.Escape(g_hDbHandle, clientNameBuf, clientName, 66, 0);
675 GetClientAuthId(client, AuthIdType:1, clientAuth, 21, true);
676 }
677 GetClientName(target, targetNameBuf, 32);
678 Database.Escape(g_hDbHandle, targetNameBuf, targetName, 66, 0);
679 GetClientAuthId(target, AuthIdType:1, targetAuth, 21, true);
680 new String:serverName[132];
681 Database.Escape(g_hDbHandle, g_sServerName, serverName, 130, 0);
682 new String:query[1024];
683 Format(query, 1024, "INSERT INTO zgloszenia(notification, time)VALUES('<b><font color=\"#c34343\">(DD2/Mirage)</font> <font color=\"white\">Gracz %s zglasza:</font> <font color=\"red\">%s %s</font></b>', UNIX_TIMESTAMP())", clientName, targetName, sReason);
684 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
685 return void:0;
686}
687
688public void:SQLT_ConnectCallback(Database:db, String:error[], any:data)
689{
690 if (db)
691 {
692 g_hDbHandle = db;
693 Database.Query(g_hDbHandle, SQLQueryCallback:23, "SET NAMES 'utf8'", any:0, DBPriority:1);
694 new String:query[1024];
695 Format(query, 1024, "CREATE TABLE IF NOT EXISTS zgloszenia (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`notification` VARCHAR(256) NOT NULL,`time` INT UNSIGNED NOT NULL,INDEX `time` (`time`),PRIMARY KEY (`callID`))COLLATE='utf8_unicode_ci'", g_sTableName, 128);
696 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
697 Format(query, 1024, "CREATE TABLE IF NOT EXISTS `%s_Trackers` (`trackerIP` VARCHAR(15) NOT NULL,`trackerID` VARCHAR(21) NOT NULL,`lastView` INT UNSIGNED NOT NULL,`accessID` BIGINT UNSIGNED NOT NULL,INDEX `lastView` (`lastView`),UNIQUE INDEX `trackerIP` (`trackerIP`))COLLATE='utf8_unicode_ci'", g_sTableName);
698 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
699 Format(query, 1024, "CREATE TABLE IF NOT EXISTS `%s_Access` (`serverKey` VARCHAR(32) NOT NULL,`accessBit` BIGINT UNSIGNED NOT NULL,UNIQUE INDEX `serverKey` (`serverKey`))COLLATE='utf8_unicode_ci'", g_sTableName);
700 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
701 Format(query, 1024, "CREATE TABLE IF NOT EXISTS `%s_Settings` (`version` VARCHAR(12) NOT NULL)COLLATE='utf8_unicode_ci'", g_sTableName);
702 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
703 Format(query, 1024, "SELECT `version` FROM `%s_Settings` LIMIT 1", g_sTableName);
704 Database.Query(g_hDbHandle, SQLQueryCallback:21, query, any:0, DBPriority:1);
705 }
706 else
707 {
708 CallAdmin_LogMessage("ConErr: %s", error);
709 SetFailState("ConErr: %s", error);
710 }
711 return void:0;
712}
713
714public void:SQLT_ErrorCheckCallback(Database:db, DBResultSet:result, String:error[], any:data)
715{
716 if (!result)
717 {
718 CallAdmin_LogMessage("QueryErr: %s", error);
719 SetFailState("QueryErr: %s", error);
720 }
721 return void:0;
722}
723
724public void:SQLT_CurrentVersion(Database:db, DBResultSet:result, String:error[], any:data)
725{
726 new String:version[12];
727 new String:query[512];
728 if (result)
729 {
730 if (DBResultSet.FetchRow(result))
731 {
732 DBResultSet.FetchString(result, 0, version, 12, 0);
733 ChangeDB(version);
734 }
735 Format(query, 512, "SELECT `serverKey` FROM `%s` LIMIT 1", g_sTableName);
736 Database.Query(g_hDbHandle, SQLQueryCallback:25, query, any:0, DBPriority:1);
737 Format(query, 512, "INSERT INTO `%s_Settings` (version) VALUES ('%s')", g_sTableName, "0.1.5");
738 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
739 return void:0;
740 }
741 else
742 {
743 CallAdmin_LogMessage("VersionErr: %s", error);
744 SetFailState("VersionErr: %s", error);
745 }
746 Format(query, 512, "UPDATE `%s_Settings` SET version = '%s'", g_sTableName, "0.1.5");
747 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
748 return void:0;
749}
750
751public void:SQLT_GetRealVersion(Database:db, DBResultSet:result, String:error[], any:data)
752{
753 if (result)
754 {
755 OnAllLoaded();
756 }
757 else
758 {
759 ChangeDB("0.1.2A");
760 }
761 return void:0;
762}
763
764void:ChangeDB(String:version[])
765{
766 new String:query[512];
767 if (!IsVersionNewerOrEqual(version, "0.1.3"))
768 {
769 Format(query, 512, "ALTER TABLE `%s` ADD COLUMN `serverKey` VARCHAR(32) NOT NULL AFTER `serverName`, CHANGE COLUMN `targetReason` `targetReason` VARCHAR(%d) NOT NULL AFTER `targetID`, ADD INDEX `serverKey` (`serverKey`) ", g_sTableName, 128);
770 Database.Query(g_hDbHandle, SQLQueryCallback:23, query, any:0, DBPriority:1);
771 }
772 OnAllLoaded();
773 return void:0;
774}
775
776bool:IsVersionNewerOrEqual(String:currentVersion[], String:versionCompare[])
777{
778 return strcmp(versionCompare, currentVersion, false) <= 0;
779}
780
781public Action:Timer_UpdateTrackersCount(Handle:timer)
782{
783 GetCurrentTrackers();
784 return Action:0;
785}
786
787GetCurrentTrackers()
788{
789 new var1;
790 if (g_hDbHandle && g_bAllLoaded)
791 {
792 new String:query[1024];
793 new String:sKey[68];
794 SQL_EscapeString(g_hDbHandle, g_sServerKey, sKey, 66, 0);
795 Format(query, 1024, "SELECT COUNT(`trackerID`) as currentTrackers FROM `%s_Trackers` WHERE TIMESTAMPDIFF(MINUTE, FROM_UNIXTIME(lastView), NOW()) < 2 AND `accessID` & (SELECT `accessBit` FROM `%s_Access` WHERE `serverKey`='%s')", g_sTableName, g_sTableName, sKey);
796 Database.Query(g_hDbHandle, SQLQueryCallback:19, query, any:0, DBPriority:1);
797 }
798 else
799 {
800 g_iCurrentTrackers = MissingTAG:0;
801 }
802 return 0;
803}
804
805public void:SQLT_CurrentTrackersCallback(Database:db, DBResultSet:result, String:error[], any:data)
806{
807 if (result)
808 {
809 if (DBResultSet.FetchRow(result))
810 {
811 g_iCurrentTrackers = DBResultSet.FetchInt(result, 0, 0);
812 }
813 }
814 else
815 {
816 CallAdmin_LogMessage("CurrentTrackersErr: %s", error);
817 SetFailState("CurrentTrackersErr: %s", error);
818 }
819 return void:0;
820}
821
822void:OnAllLoaded()
823{
824 g_bAllLoaded = true;
825 GetCurrentTrackers();
826 return void:0;
827}