Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 71.07 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <adminmenu>
  3. #include <dbi>
  4.  
  5. #undef REQUIRE_PLUGIN
  6. #include <updater>
  7.  
  8. #define RTF_ROOT "cfg/rtf_configs"
  9.  
  10. new const String:PLUGIN_VERSION[] = "1.1.7f";
  11. new const String:UPDATE_URL[] = "http://scripts.norcalbots.com/report-to-forums/raw/default/rtfupdate.txt";
  12. const MAX_CATEGORIES = 5;
  13.  
  14. enum SupportedForums
  15. {
  16. FORUM_UNSUPPORTED,
  17. FORUM_VB4,
  18. FORUM_MYBB,
  19. FORUM_SMF,
  20. FORUM_PHPBB,
  21. FORUM_WBBLITE,
  22. FORUM_AEF,
  23. FORUM_USEBB,
  24. FORUM_XMB,
  25. FORUM_IPBOARDS,
  26. FORUM_XENFORO
  27. }
  28.  
  29. /* File Paths */
  30. new String:g_szBlackListPath[PLATFORM_MAX_PATH];
  31. new String:g_szRulesPath[PLATFORM_MAX_PATH];
  32. new String:g_szConfigPath[PLATFORM_MAX_PATH];
  33.  
  34. /* Valve ConVars */
  35. new Handle:g_Cvar_HostName = INVALID_HANDLE;
  36. new Handle:g_Cvar_ServerPort = INVALID_HANDLE;
  37. new Handle:g_Cvar_ServerIP = INVALID_HANDLE;
  38.  
  39. /* Menu ConVars */
  40. new Handle:g_Cvar_TargetMenuTitle = INVALID_HANDLE;
  41. new Handle:g_Cvar_MainMenuTitle = INVALID_HANDLE;
  42. new Handle:g_Cvar_SubMenuTitle = INVALID_HANDLE;
  43.  
  44. /* Settings ConVars */
  45. new Handle:g_Cvar_TitleMode = INVALID_HANDLE;
  46. new Handle:g_Cvar_TimeDifference = INVALID_HANDLE;
  47. new Handle:g_Cvar_AllowCustomReports = INVALID_HANDLE;
  48. new Handle:g_Cvar_ForumSoftwareID = INVALID_HANDLE;
  49. new Handle:g_Cvar_ReportCmdCoolDown = INVALID_HANDLE;
  50. new Handle:g_Cvar_AdvertInterval = INVALID_HANDLE;
  51. new Handle:g_Cvar_ChatPrefix = INVALID_HANDLE;
  52. new Handle:g_Cvar_AutoUpdate = INVALID_HANDLE;
  53. new Handle:g_Cvar_Development = INVALID_HANDLE;
  54. new Handle:g_Cvar_Debug = INVALID_HANDLE;
  55.  
  56. /* Post Headings ConVars */
  57. new Handle:g_Cvar_ReporterTitle = INVALID_HANDLE;
  58. new Handle:g_Cvar_ReportedTitle = INVALID_HANDLE;
  59. new Handle:g_Cvar_ServerInfoTitle = INVALID_HANDLE;
  60.  
  61. /* Post Body ConVars */
  62. new Handle:g_Cvar_ServerInfo_Name = INVALID_HANDLE;
  63. new Handle:g_Cvar_ServerInfo_IP = INVALID_HANDLE;
  64. new Handle:g_Cvar_ServerInfo_Map = INVALID_HANDLE;
  65.  
  66. new Handle:g_Cvar_OffPlayerName = INVALID_HANDLE;
  67. new Handle:g_Cvar_OffPlayerAuthId = INVALID_HANDLE;
  68. new Handle:g_Cvar_OffPlayerIP = INVALID_HANDLE;
  69. new Handle:g_Cvar_Category = INVALID_HANDLE;
  70. new Handle:g_Cvar_Reason = INVALID_HANDLE;
  71. new Handle:g_Cvar_Description = INVALID_HANDLE;
  72.  
  73. new Handle:g_Cvar_RepName = INVALID_HANDLE;
  74. new Handle:g_Cvar_RepSteamID = INVALID_HANDLE;
  75. new Handle:g_Cvar_RepIP = INVALID_HANDLE;
  76.  
  77. new Handle:g_Cvar_Branding = INVALID_HANDLE;
  78.  
  79. /* SQL ConVars */
  80. new Handle:g_Cvar_ReporterID = INVALID_HANDLE;
  81. new Handle:g_Cvar_ReporterUserName = INVALID_HANDLE;
  82. new Handle:g_Cvar_ReporterEmail = INVALID_HANDLE;
  83. new Handle:g_Cvar_ForumID = INVALID_HANDLE;
  84. new Handle:g_Cvar_TablePrefix = INVALID_HANDLE;
  85.  
  86. /* Admin ConVars */
  87. new Handle:g_Cvar_AdminAlert = INVALID_HANDLE;
  88. new Handle:g_Cvar_AlertAdminNoPost = INVALID_HANDLE;
  89.  
  90. /* Menu Settings */
  91. new g_iCategoryCount;
  92.  
  93. /* SQL Handle */
  94. new Handle:g_hSQLDatabase = INVALID_HANDLE;
  95.  
  96. /* Menu Handles */
  97. new Handle:g_hMainMenu = INVALID_HANDLE;
  98. new Handle:g_hSubMenu[MAX_CATEGORIES] = {INVALID_HANDLE, ...};
  99.  
  100. /* Menu Titles */
  101. new String:g_szMainMenuTitle[32];
  102. new String:g_szSubMenuTitle[32];
  103.  
  104. /* Misc Data Handles */
  105. new Handle:g_hDebugArray[MAXPLAYERS+1] = {INVALID_HANDLE, ...};
  106. new Handle:g_hAdvertisementTimer = INVALID_HANDLE;
  107.  
  108. /* Post Heading Titles */
  109. new String:g_szReporterTitle[64];
  110. new String:g_szReportedTitle[64];
  111. new String:g_szServerInfoTitle[64];
  112.  
  113. /* Post Body Titles */
  114. new String:g_szServerInfoName[64];
  115. new String:g_szServerInfoIP[64];
  116. new String:g_szServerInfoMap[64];
  117.  
  118. new String:g_szOffPlayerName[MAX_NAME_LENGTH*2+1];
  119. new String:g_szOffSteamID[32];
  120. new String:g_szOffIP[32];
  121. new String:g_szOffCat[32];
  122. new String:g_szOffReason[64];
  123. new String:g_szOffDesc[256];
  124.  
  125. new String:g_szRepName[MAX_NAME_LENGTH*2+1];
  126. new String:g_szRepSteamID[32];
  127. new String:g_szRepIP[32];
  128.  
  129. new String:g_szBranding[128];
  130.  
  131. /* Target Variables */
  132. new g_iTargetClientIndex[MAXPLAYERS+1];
  133. new g_iTargetArrayIndex[MAXPLAYERS+1];
  134. new String:g_szTargetName[MAXPLAYERS+1][MAX_NAME_LENGTH * 2 + 1];
  135. new String:g_szSafeTargetName[MAXPLAYERS+1][MAX_NAME_LENGTH * 2 + 1];
  136. new String:g_szTargetAuthID[MAXPLAYERS+1][32];
  137. new String:g_szTargetIP[MAXPLAYERS+1][32];
  138. new g_iTimeStamp[MAXPLAYERS+1];
  139.  
  140. /* Target Handlers */
  141. new Handle:g_hTargetNames[MAXPLAYERS+1] = {INVALID_HANDLE, ...};
  142. new Handle:g_hSafeTargetNames[MAXPLAYERS+1] = {INVALID_HANDLE, ...};
  143. new Handle:g_hTargetIP[MAXPLAYERS+1] = {INVALID_HANDLE, ...};
  144. new Handle:g_hTargetAuthID[MAXPLAYERS+1] = {INVALID_HANDLE, ...};
  145.  
  146. /* Post Info */
  147. new String:g_szThreadTitle[MAXPLAYERS+1][256];
  148. new String:g_szReason[MAXPLAYERS+1][32];
  149. new String:g_szCategory[MAXPLAYERS+1][256];
  150. new String:g_szSafeDescription[MAXPLAYERS+1][1024];
  151.  
  152. /* Server Info Variables */
  153. new String:g_szMapName[32];
  154. new String:g_szHostName[200];
  155. new String:g_szServerPort[10];
  156. new String:g_szServerIP[32];
  157.  
  158. /* Forum Info */
  159. new SupportedForums:g_iForumSoftwareID;
  160. new g_iForumID, g_iUserID;
  161. new g_iThreadID[MAXPLAYERS+1];
  162. new g_iPostID[MAXPLAYERS+1];
  163. new String:g_szTablePrefix[32];
  164. new String:g_szUserName[32];
  165. new String:g_szEmailAddress[64];
  166.  
  167. /* Misc Variables */
  168. new g_iTimeDifference;
  169. new String:g_szPrefix[32];
  170. new bool:g_bIsUserAdmin[MAXPLAYERS+1];
  171. new g_iAdminCount;
  172.  
  173. public Plugin:myinfo =
  174. {
  175. name = "Report To Forums Beta",
  176. author = "SavSin",
  177. description = "Report players to your forums from your game server.",
  178. version = PLUGIN_VERSION,
  179. url = "http://www.norcalbots.com/"
  180. };
  181.  
  182. public OnPluginStart()
  183. {
  184. /* Public Version Convar */
  185. CreateConVar("rtf_version", PLUGIN_VERSION, "Version of Report to Forums", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
  186.  
  187. /* Register Console Command */
  188. RegConsoleCmd("sm_report", Command_SMReport, "Report a player to the forums.");
  189.  
  190. /* Register Admin Commands */
  191. RegAdminCmd("rtf_blacklist", Command_Blacklist, ADMFLAG_BAN, "Blacklist a player using the sm_report command.");
  192. RegAdminCmd("rtf_unblacklist", Command_UnBlacklist, ADMFLAG_UNBAN, "unblacklist a player.");
  193. RegAdminCmd("rtf_send_report", Command_SendReport, ADMFLAG_BAN, "Sends the report menu to a player.");
  194.  
  195. /* Board Settings */
  196. g_Cvar_ForumSoftwareID = CreateConVar("rtf_forum_software_id", "", "Which board you use? Visit https://bitbucket.org/norcalbots/report-to-forums/wiki/Supported%20Forums", _, true, 1.0, true, 10.0);
  197.  
  198. /* Forum Info */
  199. g_Cvar_TablePrefix = CreateConVar("rtf_table_prefix", "", "Table prefix.");
  200. g_Cvar_ForumID = CreateConVar("rtf_forum_id", "", "Forum ID to the specific forum you want the reports sent to.");
  201. g_Cvar_ReporterID = CreateConVar("rtf_reporter_id", "", "Userid for the Reporter User.");
  202. g_Cvar_ReporterUserName = CreateConVar("rtf_reporter_username", "", "Username for the reporter.");
  203. g_Cvar_ReporterEmail = CreateConVar("rtf_reporter_email", "", "E-Mail address for the reporter.");
  204.  
  205. /* Menu Titles */
  206. g_Cvar_TargetMenuTitle = CreateConVar("rtf_targetmenu_title", "", "Title to the target menu.");
  207. g_Cvar_MainMenuTitle = CreateConVar("rtf_mainmenu_title", "", "Title to the main category menu.");
  208. g_Cvar_SubMenuTitle = CreateConVar("rtf_submenu_title", "", "Title to the reason selection menu.");
  209.  
  210. /* Settings */
  211. g_Cvar_TitleMode = CreateConVar("rtf_title_mode", "", "1 = Name - Reason .. 2 = SteamID - Reason .. 3 = IP - Reason", _, true, 1.0, true, 3.0);
  212. g_Cvar_TimeDifference = CreateConVar("rtf_vps_timediff", "", "Time difference in seconds. Set to 0 if none. (Used for Virtual Private Servers)");
  213. g_Cvar_AllowCustomReports = CreateConVar("rtf_allow_custom_reports", "", "Allow users to create custom reports using sm_report <name|steamid|ip> <reason>.", _, true, 0.0, true, 1.0);
  214. g_Cvar_ChatPrefix = CreateConVar("rtf_prefix", "", "Prefix added to the beging of the plugin generated say messages.");
  215. g_Cvar_ReportCmdCoolDown = CreateConVar("rtf_cmd_cooldown", "", "Time in seconds between reports (per user).");
  216. g_Cvar_AdvertInterval = CreateConVar("rtf_advertisement_frequency", "", "Time in seconds to display the advertisement. 0 turns off the advertisement.");
  217. g_Cvar_AutoUpdate = CreateConVar("rtf_auto_update", "", "Use updater to keep the plugin uptodate.", _, true, 0.0, true, 1.0);
  218. g_Cvar_Development = CreateConVar("rtf_dev_toggle", "", "Allow Self Reports for Development and testing", _, true, 0.0, true, 1.0);
  219. g_Cvar_Debug = CreateConVar("rtf_debug", "", "Enables this if you are having trouble.", _, true, 0.0, true, 1.0);
  220.  
  221. /* Post Headings */
  222. g_Cvar_ReporterTitle = CreateConVar("rtf_reporter_title", "", "Reporter Heading");
  223. g_Cvar_ReportedTitle = CreateConVar("rtf_reported_title", "", "Reported Heading");
  224. g_Cvar_ServerInfoTitle = CreateConVar("rtf_serverinfo_title", "", "Server Info Heading");
  225.  
  226. /* Post Body */
  227. g_Cvar_ServerInfo_Name = CreateConVar("rtf_serverinfo_name", "", "'Name' under 'Server Info'");
  228. g_Cvar_ServerInfo_IP = CreateConVar("rtf_serverinfo_ip", "", "'IP' under 'Server Info'");
  229. g_Cvar_ServerInfo_Map = CreateConVar("rtf_serverinfo_map", "", "'Map' under 'Server Info'");
  230.  
  231. g_Cvar_OffPlayerName = CreateConVar("rtf_offending_name", "", "'Name' under 'Offending Party'");
  232. g_Cvar_OffPlayerAuthId = CreateConVar("rtf_offending_authid", "", "'AuthID' under 'Offending Party'");
  233. g_Cvar_OffPlayerIP = CreateConVar("rtf_offending_ip", "", "'IP' under 'Offending Party'");
  234. g_Cvar_Category = CreateConVar("rtf_offending_cat", "", "'Category' under 'Offending Party'");
  235. g_Cvar_Reason = CreateConVar("rtf_offending_reason", "", "'Reason' under 'Offending Party'");
  236. g_Cvar_Description = CreateConVar("rtf_offending_desc", "", "'Description' under 'Offending Party'");
  237.  
  238. g_Cvar_RepName = CreateConVar("rtf_reporting_name", "", "'Name' under 'Reporting Party'");
  239. g_Cvar_RepSteamID = CreateConVar("rtf_reporting_authid", "", "'AuthID' under 'Reporting Party'");
  240. g_Cvar_RepIP = CreateConVar("rtf_reporting_ip", "", "'IP' under 'Reporting Party'");
  241.  
  242. g_Cvar_Branding = CreateConVar("rtf_branding", "", "Branding at the bottom of the page. (Blank to remove it)");
  243.  
  244. /* Admin Settings */
  245. g_Cvar_AdminAlert = CreateConVar("rtf_admin_alert", "", "Alert in game of the player that was reported and the reason", _, true, 0.0, true, 1.0);
  246. g_Cvar_AlertAdminNoPost = CreateConVar("rtf_admin_nopost", "", "Block posts to the forum if there is an admin in game.", _, true, 0.0, true, 1.0);
  247.  
  248. /* Valve ConVars */
  249. g_Cvar_HostName = FindConVar("hostname");
  250. g_Cvar_ServerPort = FindConVar("hostport");
  251. g_Cvar_ServerIP = FindConVar("ip");
  252.  
  253. /* Format File Paths */
  254. Format(g_szBlackListPath, sizeof(g_szBlackListPath), "%s/rtf-blacklist.txt", RTF_ROOT);
  255. Format(g_szRulesPath, sizeof(g_szRulesPath), "%s/rtf-rules.txt", RTF_ROOT);
  256. Format(g_szConfigPath, sizeof(g_szConfigPath), "%s/rtfsettings.cfg", RTF_ROOT);
  257.  
  258. /* Hook Advertisement ConVar */
  259. HookConVarChange(g_Cvar_AdvertInterval, OnAdvertisementChange);
  260.  
  261. /* Hook Autoupdater ConVar */
  262. //HookConVarChange(g_Cvar_AutoUpdate, OnAutoUpdateChange);
  263.  
  264. /* Create Menu Handles */
  265. g_hMainMenu = CreateMenu(MainMenuHandler);
  266.  
  267. for(new i=0; i < MAX_CATEGORIES; i++)
  268. {
  269. g_hSubMenu[i] = CreateMenu(SubMenuHandler);
  270. }
  271.  
  272. if(FileExists(g_szConfigPath))
  273. ServerCommand("exec rtf_configs/rtfsettings.cfg");
  274. else
  275. LogError("Settings Config is Missing.");
  276.  
  277. /* Connect to the Database */
  278. if(!SQL_CheckConfig("rtfsettings"))
  279. LogError("SQL Config not found. Check your databses.cfg");
  280. else
  281. SQL_TConnect(MySQL_ConnectionCallback, "rtfsettings");
  282.  
  283. /* Read The Rules File and Genearte the menus */
  284. if(FileExists(g_szRulesPath))
  285. {
  286. new Handle:smc = SMC_CreateParser();
  287. SMC_SetReaders(smc, NewSection, KeyValue, EndSection);
  288. new SMCError:error = SMC_ParseFile(smc, g_szRulesPath);
  289.  
  290. g_iCategoryCount = 0;
  291.  
  292. if(error != SMCError_Okay)
  293. {
  294. new String:szBuffer[255];
  295. if(SMC_GetErrorString(error, szBuffer, sizeof(szBuffer)))
  296. {
  297. LogError("%s", szBuffer);
  298. }
  299. }
  300.  
  301. CloseHandle(smc);
  302. }
  303. else
  304. {
  305. LogError("Missing rtf-rules.txt. Check Dir: %s", RTF_ROOT);
  306. }
  307. }
  308.  
  309. /* Updater Settings On Late Load */
  310. public OnLibraryAdded(const String:szName[])
  311. {
  312. if(StrEqual(szName, "updater") && GetConVarBool(g_Cvar_AutoUpdate))
  313. {
  314. Updater_AddPlugin(UPDATE_URL);
  315. }
  316. }
  317.  
  318. public OnConfigsExecuted()
  319. {
  320. /* Add Auto Updater URL */
  321. if(LibraryExists("updater") && GetConVarBool(g_Cvar_AutoUpdate))
  322. {
  323. Updater_AddPlugin(UPDATE_URL);
  324. }
  325.  
  326. /* Cache Time Difference */
  327. g_iTimeDifference = GetConVarInt(g_Cvar_TimeDifference);
  328.  
  329. /* Set the Forum Software ID */
  330. g_iForumSoftwareID = SupportedForums:GetConVarInt(g_Cvar_ForumSoftwareID);
  331. LogMessage("Forum Software ID: %d", g_iForumSoftwareID);
  332.  
  333. /* Get Prefix Name */
  334. GetConVarString(g_Cvar_ChatPrefix, g_szPrefix, sizeof(g_szPrefix));
  335.  
  336. /* Get Table Prefix */
  337. GetConVarString(g_Cvar_TablePrefix, g_szTablePrefix, sizeof(g_szTablePrefix));
  338.  
  339. /* Get Reporter UserName */
  340. GetConVarString(g_Cvar_ReporterUserName, g_szUserName, sizeof(g_szUserName));
  341.  
  342. /* Get Reporter Email Address */
  343. GetConVarString(g_Cvar_ReporterEmail, g_szEmailAddress, sizeof(g_szEmailAddress));
  344.  
  345. /* Get Heading Names */
  346. GetConVarString(g_Cvar_ReporterTitle, g_szReporterTitle, sizeof(g_szReporterTitle));
  347. GetConVarString(g_Cvar_ReportedTitle, g_szReportedTitle, sizeof(g_szReportedTitle));
  348. GetConVarString(g_Cvar_ServerInfoTitle, g_szServerInfoTitle, sizeof(g_szServerInfoTitle));
  349.  
  350. /* Post Body Headings */
  351. GetConVarString(g_Cvar_ServerInfo_Name, g_szServerInfoName, sizeof(g_szServerInfoName));
  352. GetConVarString(g_Cvar_ServerInfo_IP, g_szServerInfoIP, sizeof(g_szServerInfoIP));
  353. GetConVarString(g_Cvar_ServerInfo_Map, g_szServerInfoMap, sizeof(g_szServerInfoMap));
  354.  
  355. GetConVarString(g_Cvar_OffPlayerName, g_szOffPlayerName, sizeof(g_szOffPlayerName));
  356. GetConVarString(g_Cvar_OffPlayerAuthId, g_szOffSteamID, sizeof(g_szOffSteamID));
  357. GetConVarString(g_Cvar_OffPlayerIP, g_szOffIP, sizeof(g_szOffIP));
  358. GetConVarString(g_Cvar_Category, g_szOffCat, sizeof(g_szOffCat));
  359. GetConVarString(g_Cvar_Reason, g_szOffReason, sizeof(g_szOffReason));
  360. GetConVarString(g_Cvar_Description, g_szOffDesc, sizeof(g_szOffDesc));
  361.  
  362. GetConVarString(g_Cvar_RepName, g_szRepName, sizeof(g_szRepName));
  363. GetConVarString(g_Cvar_RepSteamID, g_szRepSteamID, sizeof(g_szRepSteamID));
  364. GetConVarString(g_Cvar_RepIP, g_szRepIP, sizeof(g_szRepIP));
  365.  
  366. GetConVarString(g_Cvar_Branding, g_szBranding, sizeof(g_szBranding));
  367.  
  368. /* Cache Reporter Id */
  369. g_iUserID = GetConVarInt(g_Cvar_ReporterID);
  370.  
  371. /* Cache ForumID */
  372. g_iForumID = GetConVarInt(g_Cvar_ForumID);
  373.  
  374. /* Cache Hostname */
  375. GetConVarString(g_Cvar_HostName, g_szHostName, sizeof(g_szHostName));
  376.  
  377. /* Cache Map Name */
  378. GetCurrentMap(g_szMapName, sizeof(g_szMapName));
  379.  
  380. /* Cache Server IP */
  381. GetConVarString(g_Cvar_ServerIP, g_szServerIP, sizeof(g_szServerIP));
  382.  
  383. /* Cache Server Port */
  384. GetConVarString(g_Cvar_ServerPort, g_szServerPort, sizeof(g_szServerPort));
  385.  
  386. /* Format Menu Titles */
  387. GetConVarString(g_Cvar_MainMenuTitle, g_szMainMenuTitle, sizeof(g_szMainMenuTitle));
  388. GetConVarString(g_Cvar_SubMenuTitle, g_szSubMenuTitle, sizeof(g_szSubMenuTitle));
  389.  
  390. /* Set Menu Titles */
  391. SetMenuTitle(g_hMainMenu, g_szMainMenuTitle);
  392.  
  393. for(new i=0; i < MAX_CATEGORIES; i++)
  394. {
  395. SetMenuTitle(g_hSubMenu[i], g_szSubMenuTitle);
  396. }
  397.  
  398. if(StrContains(g_szMapName, "workshop", false) != -1)
  399. {
  400. decl String:szWorkShopID[32];
  401. GetCurrentWorkshopMap(g_szMapName, sizeof(g_szMapName), szWorkShopID, sizeof(szWorkShopID));
  402. }
  403.  
  404. /* Start Advertisement Timer */
  405. if(GetConVarBool(g_Cvar_AdvertInterval) && g_hAdvertisementTimer == INVALID_HANDLE)
  406. {
  407. g_hAdvertisementTimer = CreateTimer(GetConVarFloat(g_Cvar_AdvertInterval), Timer_ShowAdvertisement, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
  408. }
  409. }
  410.  
  411. public OnAdvertisementChange(Handle:hConVar, const String:szOldValue[], const String:szNewValue[])
  412. {
  413. new Float:flAdvertInterval = StringToFloat(szNewValue);
  414.  
  415. if(flAdvertInterval > 0)
  416. {
  417. g_hAdvertisementTimer = CreateTimer(flAdvertInterval, Timer_ShowAdvertisement, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
  418. }
  419. else
  420. {
  421. if(g_hAdvertisementTimer != INVALID_HANDLE)
  422. {
  423. KillTimer(g_hAdvertisementTimer);
  424. g_hAdvertisementTimer = INVALID_HANDLE;
  425. }
  426. }
  427. }
  428.  
  429. public OnAutoUpdateChange(Handle:hConVar, const String:szOldValue[], const String:szNewValue[])
  430. {
  431. new iNewValue = StringToInt(szNewValue);
  432.  
  433. if(iNewValue)
  434. {
  435. Updater_AddPlugin(UPDATE_URL);
  436. }
  437. else
  438. {
  439. Updater_RemovePlugin();
  440. }
  441. }
  442.  
  443. public OnMapEnd()
  444. {
  445. g_hAdvertisementTimer = INVALID_HANDLE;
  446. }
  447.  
  448. public Action:Timer_ShowAdvertisement(Handle:hTimer, any:data)
  449. {
  450. /* Advertisement Text */
  451. PrintToChatAll("[%s] Type !report in chat or sm_report in console to report a player for breaking the rules.", g_szPrefix);
  452. }
  453.  
  454. public OnClientPostAdminCheck(iClient)
  455. {
  456. if(CheckCommandAccess(iClient, "sm_report", ADMFLAG_KICK, true))
  457. {
  458. ++g_iAdminCount;
  459. g_bIsUserAdmin[iClient] = true;
  460. }
  461. }
  462.  
  463. public OnClientDisconnect(iClient)
  464. {
  465. if(g_bIsUserAdmin[iClient])
  466. {
  467. --g_iAdminCount;
  468. g_bIsUserAdmin[iClient] = false;
  469. }
  470. }
  471.  
  472. public Action:Command_SendReport(iClient, iArgs)
  473. {
  474. decl String:szTargetName[MAX_NAME_LENGTH], String:szArgTarget[MAX_NAME_LENGTH];
  475. new iTargetCount, iTargetList[MAXPLAYERS], bool:tn_is_ml;
  476.  
  477. if(iArgs < 1)
  478. {
  479. ReplyToCommand(iClient, "[%s] ERROR Usage: rtf_send_report <name>", g_szPrefix);
  480. return Plugin_Handled;
  481. }
  482. else
  483. {
  484. GetCmdArg(1, szArgTarget, sizeof(szArgTarget));
  485. iTargetCount = ProcessTargetString(szArgTarget, iClient, iTargetList, MAXPLAYERS, COMMAND_FILTER_NO_IMMUNITY|COMMAND_FILTER_NO_BOTS, szTargetName, sizeof(szTargetName), tn_is_ml);
  486.  
  487. if(iTargetCount <= 0)
  488. {
  489. ReplyToCommand(iClient, "[%s] No target matching %s", g_szPrefix, szArgTarget);
  490. return Plugin_Handled;
  491. }
  492. else if(iTargetCount > 1)
  493. {
  494. ReplyToCommand(iClient, "[%s] More than 1 targets matching %s", g_szPrefix, szArgTarget);
  495. return Plugin_Handled;
  496. }
  497. }
  498.  
  499. if(!CanUserTarget(iClient, iTargetList[0]))
  500. {
  501. ReplyToCommand(iClient, "[%s] You cannot target this client.", g_szPrefix);
  502. return Plugin_Handled;
  503. }
  504.  
  505. DisplayTargetSelectionMenu(iTargetList[0]);
  506. ReplyToCommand(iClient, "[%s] Sucessfully sent the menu to %s.", szTargetName);
  507. return Plugin_Handled;
  508. }
  509.  
  510.  
  511. public Action:Command_ReloadRules(iClient, iArgs)
  512. {
  513. /* Clear All Menu Items */
  514. RemoveAllMenuItems(g_hMainMenu);
  515.  
  516. for(new i=0; i < MAX_CATEGORIES; i++)
  517. {
  518. RemoveAllMenuItems(g_hSubMenu[i]);
  519. }
  520.  
  521. /* Read The Rules File and regenearte the menus */
  522. if(FileExists(g_szRulesPath))
  523. {
  524. new Handle:smc = SMC_CreateParser();
  525. SMC_SetReaders(smc, NewSection, KeyValue, EndSection);
  526. new SMCError:error = SMC_ParseFile(smc, g_szRulesPath);
  527.  
  528. g_iCategoryCount = 0;
  529.  
  530. if(error != SMCError_Okay)
  531. {
  532. new String:szBuffer[255];
  533. if(SMC_GetErrorString(error, szBuffer, sizeof(szBuffer)))
  534. {
  535. LogError("%s", szBuffer);
  536. }
  537. }
  538.  
  539. CloseHandle(smc);
  540. }
  541. else
  542. {
  543. LogError("Missing rtf-rules.txt. Check Dir: %s", RTF_ROOT);
  544. }
  545.  
  546. ReplyToCommand(iClient, "[%s] Menu's Have been reloaded", g_szPrefix);
  547. }
  548.  
  549. public Action:Command_Blacklist(iClient, iArgs)
  550. {
  551. decl String:szTargetName[MAX_NAME_LENGTH], String:szArgTarget[MAX_NAME_LENGTH], String:szArgReason[256];
  552. new iTargetCount, iTargetList[MAXPLAYERS], bool:tn_is_ml;
  553.  
  554. if(iArgs >= 2)
  555. {
  556. GetCmdArg(1, szArgTarget, sizeof(szArgTarget));
  557. GetCmdArg(2, szArgReason, sizeof(szArgReason));
  558. iTargetCount = ProcessTargetString(szArgTarget, iClient, iTargetList, MAXPLAYERS, COMMAND_FILTER_NO_IMMUNITY|COMMAND_FILTER_NO_BOTS, szTargetName, sizeof(szTargetName), tn_is_ml);
  559.  
  560. if(iTargetCount <= 0)
  561. {
  562. if(StrContains(szArgTarget, "STEAM_", false))
  563. {
  564. AddPlayerToBlackList(szArgTarget, "", szArgReason);
  565. ReplyToCommand(iClient, "[%s] Added STEAM_ID %s to the black list.", g_szPrefix, szArgTarget);
  566. return Plugin_Handled;
  567. }
  568. else
  569. {
  570. ReplyToCommand(iClient, "[%s] No target matching %s", g_szPrefix, szArgTarget);
  571. return Plugin_Handled;
  572. }
  573. }
  574. else if(iTargetCount > 1)
  575. {
  576. ReplyToCommand(iClient, "[%s] More than 1 targets matching %s", g_szPrefix, szArgTarget);
  577. return Plugin_Handled;
  578. }
  579. }
  580. else
  581. {
  582. ReplyToCommand(iClient, "[%s] ERROR Usage: rtf_blacklist <name|steamid|ip> <reason>", g_szPrefix);
  583. return Plugin_Handled;
  584. }
  585.  
  586. if(!CanUserTarget(iClient, iTargetList[0]))
  587. {
  588. ReplyToCommand(iClient, "[%s] You cannot target this client.", g_szPrefix);
  589. return Plugin_Handled;
  590. }
  591.  
  592. decl String:szAuthID[32];
  593. GetClientAuthString(iTargetList[0], szAuthID, sizeof(szAuthID));
  594. AddPlayerToBlackList(szAuthID, szTargetName, szArgReason);
  595.  
  596. ShowActivity2(iClient, "[SM] ", "%N Added %s to the blacklist", iClient, szTargetName);
  597. return Plugin_Handled;
  598. }
  599.  
  600. public Action:Command_UnBlacklist(iClient, iArgs)
  601. {
  602. decl String:szTargetName[MAX_NAME_LENGTH], String:szArgTarget[MAX_NAME_LENGTH];
  603. new iTargetCount, iTargetList[MAXPLAYERS], bool:tn_is_ml;
  604.  
  605. if(iArgs >= 1)
  606. {
  607. GetCmdArg(1, szArgTarget, sizeof(szArgTarget));
  608. iTargetCount = ProcessTargetString(szArgTarget, iClient, iTargetList, MAXPLAYERS, COMMAND_FILTER_NO_IMMUNITY|COMMAND_FILTER_NO_BOTS, szTargetName, sizeof(szTargetName), tn_is_ml);
  609.  
  610. if(iTargetCount <= 0)
  611. {
  612. if(StrContains(szArgTarget, "STEAM_", false))
  613. {
  614. RemPlayerToBlackList(szArgTarget);
  615. ReplyToCommand(iClient, "[%s] Removed STEAM_ID %s from the black list.", g_szPrefix, szArgTarget);
  616. return Plugin_Handled;
  617. }
  618. else
  619. {
  620. ReplyToCommand(iClient, "[%s] No target matching %s", g_szPrefix, szArgTarget);
  621. return Plugin_Handled;
  622. }
  623. }
  624. else if(iTargetCount > 1)
  625. {
  626. ReplyToCommand(iClient, "[%s] More than 1 targets matching %s", g_szPrefix, szArgTarget);
  627. return Plugin_Handled;
  628. }
  629. }
  630. else
  631. {
  632. ReplyToCommand(iClient, "[%s] ERROR Usage: rtf_unblacklist <name|steamid|ip>", g_szPrefix);
  633. return Plugin_Handled;
  634. }
  635.  
  636. decl String:szAuthID[32];
  637. GetClientAuthString(iTargetList[0], szAuthID, sizeof(szAuthID));
  638.  
  639. if(RemPlayerToBlackList(szAuthID))
  640. {
  641. ShowActivity2(iClient, "[SM] ", "%N Removed %s to the blacklist", iClient, szTargetName);
  642. }
  643. else
  644. {
  645. ReplyToCommand(iClient, "[%s] Error removing client from the blacklist", g_szPrefix);
  646. }
  647.  
  648. return Plugin_Handled;
  649. }
  650.  
  651. public Action:Command_SMReport(iClient, iArgs)
  652. {
  653. decl String:szAuthID[32];
  654. GetClientAuthString(iClient, szAuthID, sizeof(szAuthID));
  655.  
  656. if(IsUserBlacklisted(szAuthID))
  657. {
  658. ReplyToCommand(iClient, "[%s] You have been banned from using this command.", g_szPrefix);
  659. return Plugin_Handled;
  660. }
  661.  
  662. new iCurTime = (GetTime() - g_iTimeDifference);
  663. if((iCurTime - g_iTimeStamp[iClient]) < GetConVarInt(g_Cvar_ReportCmdCoolDown))
  664. {
  665. new iTimeLeft = (GetConVarInt(g_Cvar_ReportCmdCoolDown) - (iCurTime - g_iTimeStamp[iClient]));
  666. PrintToChat(iClient, "[%s] You must wait %d more seconds to use this command again.", g_szPrefix, iTimeLeft);
  667. }
  668. else
  669. {
  670. /* Check Debug Settings */
  671. if(GetConVarBool(g_Cvar_Debug) && g_hDebugArray[iClient] == INVALID_HANDLE)
  672. g_hDebugArray[iClient] = CreateArray(1024);
  673.  
  674. if(iArgs >= 1)
  675. {
  676. decl String:szTargetName[MAX_NAME_LENGTH], String:szArgTarget[MAX_NAME_LENGTH];
  677. new iTargetCount, iTargetList[MAXPLAYERS], bool:tn_is_ml;
  678.  
  679. GetCmdArg(1, szArgTarget, sizeof(szArgTarget));
  680.  
  681. /* Process the Target */
  682. iTargetCount = ProcessTargetString(szArgTarget, iClient, iTargetList, MAXPLAYERS, COMMAND_FILTER_NO_IMMUNITY|COMMAND_FILTER_NO_BOTS, szTargetName, sizeof(szTargetName), tn_is_ml);
  683.  
  684. if(iTargetCount <= 0)
  685. {
  686. ReplyToCommand(iClient, "[%s] No target matching %s", g_szPrefix, szArgTarget);
  687. return Plugin_Handled;
  688. }
  689. else if(iTargetCount > 1)
  690. {
  691. ReplyToCommand(iClient, "[%s] More than 1 targets matching %s", g_szPrefix, szArgTarget);
  692. return Plugin_Handled;
  693. }
  694. else if(iTargetList[0] == iClient && !GetConVarBool(g_Cvar_Development))
  695. {
  696. ReplyToCommand(iClient, "[%s] You may not report your self", g_szPrefix);
  697. return Plugin_Handled;
  698. }
  699.  
  700. /* Get Target Info */
  701. g_iTimeStamp[iClient] = (GetTime() - g_iTimeDifference);
  702. g_iTargetClientIndex[iClient] = iTargetList[0];
  703. ParsePlayerName(szTargetName, g_szSafeTargetName[iClient], sizeof(g_szSafeTargetName[]));
  704. GetClientAuthString(g_iTargetClientIndex[iClient], g_szTargetAuthID[iClient], sizeof(g_szTargetAuthID[]));
  705. GetClientIP(g_iTargetClientIndex[iClient], g_szTargetIP[iClient], sizeof(g_szTargetIP[]));
  706.  
  707. if(iArgs >= 2 && GetConVarBool(g_Cvar_AllowCustomReports))
  708. {
  709. decl String:szReason[256];
  710. GetCmdArg(2, szReason, sizeof(szReason));
  711. SQL_EscapeString(g_hSQLDatabase, szReason, g_szSafeDescription[iClient], sizeof(g_szSafeDescription[]));
  712. strcopy(g_szReason[iClient], sizeof(g_szReason[]), "Custom Report");
  713.  
  714. if(GetConVarBool(g_Cvar_AdminAlert))
  715. {
  716. AlertAdmins(iClient);
  717. }
  718.  
  719. if((!GetConVarBool(g_Cvar_AlertAdminNoPost) && GetConVarBool(g_Cvar_AdminAlert)) || !GetConVarBool(g_Cvar_AdminAlert))
  720. CreateReportThread(iClient);
  721.  
  722. return Plugin_Handled;
  723. }
  724.  
  725. DisplayMenu(g_hMainMenu, iClient, MENU_TIME_FOREVER);
  726. }
  727. else
  728. {
  729. /* Set up and Display the Target Menu */
  730. decl String:szMenuTitle[32];
  731. GetConVarString(g_Cvar_TargetMenuTitle, szMenuTitle, sizeof(szMenuTitle));
  732. new Handle:hMenu = CreateMenu(TargetMenuHandler);
  733. SetMenuTitle(hMenu, szMenuTitle);
  734. SetMenuExitButton(hMenu, true);
  735.  
  736. if(AddPlayersToMenu(hMenu, iClient))
  737. {
  738. DisplayMenu(hMenu, iClient, MENU_TIME_FOREVER);
  739. }
  740. else
  741. {
  742. ReplyToCommand(iClient, "[%s] There are no players to report.", g_szPrefix);
  743. CloseHandle(hMenu);
  744. return Plugin_Handled;
  745. }
  746. }
  747. }
  748. return Plugin_Handled;
  749. }
  750.  
  751. public DisplayTargetSelectionMenu(iClient)
  752. {
  753.  
  754. }
  755.  
  756. public MySQL_ConnectionCallback(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  757. {
  758. if(hDatabase != INVALID_HANDLE)
  759. g_hSQLDatabase = hDatabase;
  760. else
  761. LogError("Failed To Connect: %s", szError);
  762. }
  763.  
  764. public SMC_ParseStart(Handle:smc)
  765. {
  766. }
  767.  
  768. public SMCResult:NewSection(Handle:smc, const String:szSection[], bool:opt_quotes)
  769. {
  770. /* Get the Section names of each SubSection*/
  771. if(!StrEqual("Report To Forums", szSection, false))
  772. {
  773. decl String:szTempString[1024];
  774. Format(szTempString, sizeof(szTempString), "%d|%s", g_iCategoryCount, szSection);
  775. AddMenuItem(g_hMainMenu, szTempString, szSection);
  776. }
  777. }
  778.  
  779. public SMCResult:KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
  780. {
  781. decl String:szTempString[1024];
  782. Format(szTempString, sizeof(szTempString), "%s|%s", key, value);
  783. AddMenuItem(g_hSubMenu[g_iCategoryCount], szTempString, key);
  784. }
  785.  
  786. /* Increase the Category ID when before going to the next category. */
  787. public SMCResult:EndSection(Handle:smc)
  788. {
  789. ++g_iCategoryCount;
  790. }
  791.  
  792. public TargetMenuHandler(Handle:hMenu, MenuAction:iAction, iClient, iItem)
  793. {
  794. if(iAction == MenuAction_Select)
  795. {
  796. decl String:szMenuItem[10], String:szMenuItemsSplit[2][10];
  797. GetMenuItem(hMenu, iItem, szMenuItem, sizeof(szMenuItem));
  798. ExplodeString(szMenuItem, "|", szMenuItemsSplit, 2, sizeof(szMenuItemsSplit[]));
  799.  
  800. g_iTargetArrayIndex[iClient] = StringToInt(szMenuItemsSplit[0]);
  801. g_iTargetClientIndex[iClient] = StringToInt(szMenuItemsSplit[1]);
  802.  
  803. /* Get Target Info */
  804. g_iTimeStamp[iClient] = (GetTime() -g_iTimeDifference);
  805.  
  806. GetArrayString(g_hTargetNames[iClient], g_iTargetArrayIndex[iClient], g_szTargetName[iClient], sizeof(g_szTargetName[]));
  807. GetArrayString(g_hSafeTargetNames[iClient], g_iTargetArrayIndex[iClient], g_szSafeTargetName[iClient], sizeof(g_szSafeTargetName[]));
  808. GetArrayString(g_hTargetIP[iClient], g_iTargetArrayIndex[iClient], g_szTargetIP[iClient], sizeof(g_szTargetIP[]));
  809. GetArrayString(g_hTargetAuthID[iClient], g_iTargetArrayIndex[iClient], g_szTargetAuthID[iClient], sizeof(g_szTargetAuthID[]));
  810.  
  811. /* Display Main Menu */
  812. DisplayMenu(g_hMainMenu, iClient, MENU_TIME_FOREVER);
  813. }
  814. }
  815.  
  816. public MainMenuHandler(Handle:hMenu, MenuAction:iAction, iClient, iItem)
  817. {
  818. if(iAction == MenuAction_Select)
  819. {
  820. decl String:szMenuItem[1024], String:szMenuItemsSplit[2][1024];
  821. GetMenuItem(hMenu, iItem, szMenuItem, sizeof(szMenuItem));
  822. ExplodeString(szMenuItem, "|", szMenuItemsSplit, 2, sizeof(szMenuItemsSplit[]));
  823.  
  824. if(StrContains(szMenuItemsSplit[1], "admin", false) != -1 && !g_bIsUserAdmin[g_iTargetClientIndex[iClient]])
  825. {
  826. PrintToChat(iClient, "[%s] The target you selected is not an admin.", g_szPrefix);
  827. DisplayMenu(g_hMainMenu, iClient, MENU_TIME_FOREVER);
  828. }
  829. else
  830. {
  831. strcopy(g_szCategory[iClient], sizeof(g_szCategory[]), szMenuItemsSplit[1]);
  832. DisplayMenu(g_hSubMenu[StringToInt(szMenuItemsSplit[0])], iClient, MENU_TIME_FOREVER);
  833. }
  834. }
  835. }
  836.  
  837. public SubMenuHandler(Handle:hMenu, MenuAction:iAction, iClient, iItem)
  838. {
  839. if(iAction == MenuAction_Select)
  840. {
  841. decl String:szMenuItem[1024], String:szMenuItemsSplit[2][1024];
  842. GetMenuItem(hMenu, iItem, szMenuItem, sizeof(szMenuItem));
  843. ExplodeString(szMenuItem, "|", szMenuItemsSplit, 2, sizeof(szMenuItemsSplit[]));
  844.  
  845. strcopy(g_szReason[iClient], sizeof(g_szReason[]), szMenuItemsSplit[0]);
  846. strcopy(g_szSafeDescription[iClient], sizeof(g_szSafeDescription[]), szMenuItemsSplit[1]);
  847.  
  848. if(!GetConVarBool(g_Cvar_AlertAdminNoPost) && GetConVarBool(g_Cvar_AdminAlert))
  849. CreateReportThread(iClient);
  850. else
  851. AlertAdmins(iClient);
  852. }
  853. }
  854.  
  855. /* SQL Stuff */
  856. public CreateReportThread(iClient)
  857. {
  858. switch(GetConVarInt(g_Cvar_TitleMode))
  859. {
  860. case 1: Format(g_szThreadTitle[iClient], sizeof(g_szThreadTitle[]), "%s - %s", g_szSafeTargetName[iClient], g_szReason[iClient]);
  861. case 2: Format(g_szThreadTitle[iClient], sizeof(g_szThreadTitle[]), "%s - %s", g_szTargetAuthID[iClient], g_szReason[iClient]);
  862. case 3: Format(g_szThreadTitle[iClient], sizeof(g_szThreadTitle[]), "%s - %s", g_szTargetIP[iClient], g_szReason[iClient]);
  863. }
  864.  
  865. decl String:szSQLQuery[1024], String:szSafeTitle[1024], String:szSafePosterName[2 * MAX_NAME_LENGTH + 1];
  866.  
  867. SQL_TQuery(g_hSQLDatabase, MySQL_SetCharSet, "SET NAMES 'utf8'");
  868.  
  869. switch(g_iForumSoftwareID)
  870. {
  871. case FORUM_VB4:
  872. {
  873. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  874.  
  875. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sthread (title, lastpost, forumid, open, postusername, postuserid, lastposter, lastposterid, dateline, visible) VALUES ('%s', '%d', '%d', '1', '%s', '%d', '%s', '%d', '%d', '1');", g_szTablePrefix, szSafeTitle, g_iTimeStamp[iClient], g_iForumID, g_szUserName, g_iUserID, g_szUserName, g_iUserID, g_iTimeStamp[iClient]);
  876. }
  877. case FORUM_MYBB:
  878. {
  879. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  880.  
  881. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sthreads (fid, subject, uid, username, dateline, firstpost, lastpost, visible) VALUES ('%d', '%s', '%d', '%s', '%d', '1', '%d', '1');", g_szTablePrefix, g_iForumID, szSafeTitle, g_iUserID, g_szUserName, g_iTimeStamp[iClient], g_iTimeStamp[iClient]);
  882. }
  883. case FORUM_SMF:
  884. {
  885. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %stopics (id_board, approved) VALUES ('%d', '1');", g_szTablePrefix, g_iForumID);
  886. }
  887. case FORUM_PHPBB:
  888. {
  889. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  890.  
  891. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %stopics (forum_id, topic_approved, topic_title, topic_poster, topic_time, topic_views, topic_first_poster_name, topic_first_poster_colour, topic_last_poster_id, topic_last_poster_name, topic_last_post_subject, topic_last_post_time, topic_last_view_time) VALUES ('%d', '1', '%s', '%d', '%d', '1', '%s', 'AA0000', '%d', '%s', '%s', '%d', '%d');", g_szTablePrefix, g_iForumID, szSafeTitle, g_iUserID, g_iTimeStamp[iClient], g_szUserName, g_iUserID, g_szUserName, szSafeTitle, g_iTimeStamp[iClient], g_iTimeStamp[iClient]);
  892. }
  893. case FORUM_WBBLITE:
  894. {
  895. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  896.  
  897. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sthread (boardID, topic, time, userID, username, lastPostTime, lastPosterID, lastPoster) VALUES ('%d', '%s', '%d', '%d', '%s', '%d', '%d', '%s');", g_szTablePrefix, g_iForumID, szSafeTitle, g_iTimeStamp[iClient], g_iUserID, g_szUserName, g_iTimeStamp[iClient], g_iUserID, g_szUserName);
  898. }
  899. case FORUM_AEF:
  900. {
  901. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  902.  
  903. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %stopics (topic, t_bid, t_status, t_mem_id, t_approved) VALUES ('%s', '%d', '1', '%d', '1');", g_szTablePrefix, szSafeTitle, g_iForumID, g_iUserID);
  904. }
  905. case FORUM_USEBB:
  906. {
  907. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  908.  
  909. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %stopics (forum_id, topic_title) VALUES ('%d', '%s');", g_szTablePrefix, g_iForumID, szSafeTitle);
  910. }
  911. case FORUM_XMB:
  912. {
  913. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  914.  
  915. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sthreads (fid, subject, author) VALUES ('%d', '%s', '%s');", g_szTablePrefix, g_iForumID, szSafeTitle, g_szUserName);
  916. }
  917. case FORUM_IPBOARDS:
  918. {
  919. decl String:szSafeTitleSpace[1024];
  920. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitleSpace, sizeof(szSafeTitleSpace), false);
  921. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), true);
  922. GetWebSafeString(g_szUserName, szSafePosterName, sizeof(szSafePosterName), true);
  923.  
  924. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %stopics (title, state, posts, starter_id, start_date, last_poster_id, last_post, starter_name, last_poster_name, poll_state, last_vote, views, forum_id, approved, author_mode, pinned, title_seo, seo_first_name, seo_last_name, last_real_post) VALUES ('%s', 'open', '1', '%d', '%d', '%d', '%d', '%s', '%s', '0', '0', '1', '%d', '1', '1', '0', '%s', '%s', '%s', '%d');", g_szTablePrefix, szSafeTitleSpace, g_iUserID, g_iTimeStamp[iClient], g_iUserID, g_iTimeStamp[iClient], g_szUserName, g_szUserName, g_iForumID, szSafeTitle, szSafePosterName, szSafePosterName, g_iTimeStamp[iClient]);
  925. }
  926. case FORUM_XENFORO:
  927. {
  928. GetWebSafeString(g_szThreadTitle[iClient], szSafeTitle, sizeof(szSafeTitle), false);
  929. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sthread (node_id, title, reply_count, view_count, user_id, username, post_date, discussion_state, discussion_open) VALUES ('%d', '%s', '0', '1', '%d', '%s', '%d', 'visible', '1');", g_szTablePrefix, g_iForumID, szSafeTitle, g_iUserID, g_szUserName, g_iTimeStamp[iClient]);
  930. }
  931. }
  932.  
  933. if(GetConVarInt(g_Cvar_Debug))
  934. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  935.  
  936. LogMessage("Create Thread: %s", szSQLQuery);
  937. SQL_TQuery(g_hSQLDatabase, MySQL_InsertReport, szSQLQuery, iClient);
  938. }
  939.  
  940. public MySQL_InsertReport(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  941. {
  942. if(hDatabase == INVALID_HANDLE)
  943. LogError("Failed To Create Thread: %s", szError);
  944. else
  945. FindCorrectThread(data);
  946. }
  947.  
  948. /* Finds the Thread ID for the thread we just created */
  949. public FindCorrectThread(iClient)
  950. {
  951. /* Search mybb_threads for the most recent Thread to get the ID */
  952. decl String:szSQLQuery[512];
  953.  
  954. switch(g_iForumSoftwareID)
  955. {
  956. case FORUM_VB4:
  957. {
  958. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT threadid FROM %sthread WHERE dateline='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  959. }
  960. case FORUM_MYBB:
  961. {
  962. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT tid FROM %sthreads WHERE dateline='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  963. }
  964. case FORUM_SMF:
  965. {
  966. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT MAX(id_topic) FROM %stopics;", g_szTablePrefix);
  967. }
  968. case FORUM_PHPBB:
  969. {
  970. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT topic_id FROM %stopics WHERE topic_time='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  971. }
  972. case FORUM_WBBLITE:
  973. {
  974. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT threadID FROM %sthread WHERE time='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  975. }
  976. case FORUM_AEF:
  977. {
  978. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT MAX(tid) FROM %stopics;", g_szTablePrefix);
  979. }
  980. case FORUM_USEBB:
  981. {
  982. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT MAX(id) FROM %stopics;", g_szTablePrefix);
  983. }
  984. case FORUM_XMB:
  985. {
  986. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT tid FROM %stopics WHERE lastpost='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  987. }
  988. case FORUM_IPBOARDS:
  989. {
  990. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT tid FROM %stopics WHERE last_post='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  991. }
  992. case FORUM_XENFORO:
  993. {
  994. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT thread_id FROM %sthread WHERE post_date='%d'", g_szTablePrefix, g_iTimeStamp[iClient]);
  995. }
  996. }
  997.  
  998. if(GetConVarInt(g_Cvar_Debug))
  999. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1000.  
  1001. SQL_TQuery(g_hSQLDatabase, MySQL_SelectTid, szSQLQuery, iClient);
  1002. }
  1003.  
  1004. public MySQL_SelectTid(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1005. {
  1006. if(hDatabase == INVALID_HANDLE)
  1007. LogError("Failed To Select tid: %s", szError);
  1008. else
  1009. {
  1010. if(SQL_GetRowCount(hDatabase))
  1011. {
  1012. SQL_FetchRow(hDatabase);
  1013. g_iThreadID[data] = SQL_FetchInt(hDatabase, 0);
  1014. CreateThreadPost(data);
  1015. }
  1016. }
  1017. }
  1018.  
  1019. /* Creates the Post (message) for the thread we created */
  1020. public CreateThreadPost(iClient)
  1021. {
  1022. decl String:szContent[1024];
  1023. decl String:szReporterName[MAX_NAME_LENGTH], String:szSafeReporterName[MAX_NAME_LENGTH * 2 + 1], String:szReporterAuthID[32], String:szReporterIP[32];
  1024.  
  1025. GetClientName(iClient, szReporterName, sizeof(szReporterName));
  1026. ParsePlayerName(szReporterName, szSafeReporterName, sizeof(szSafeReporterName));
  1027. GetClientAuthString(iClient, szReporterAuthID, sizeof(szReporterAuthID));
  1028. GetClientIP(iClient, szReporterIP, sizeof(szReporterIP));
  1029.  
  1030. SQL_TQuery(g_hSQLDatabase, MySQL_SetCharSet, "SET NAMES 'utf8'");
  1031.  
  1032. decl String:szSQLQuery[1024];
  1033. switch(g_iForumSoftwareID)
  1034. {
  1035. case FORUM_VB4:
  1036. {
  1037. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1038.  
  1039. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %spost (threadid, username, userid, title, dateline, pagetext, allowsmilie, visible, htmlstate) VALUES ('%d', '%s', '%d', '%s', '%d', '%s', '1', '1', 'on_nl2br');", g_szTablePrefix, g_iThreadID[iClient], g_szUserName, g_iUserID, g_szThreadTitle[iClient], g_iTimeStamp[iClient], szContent);
  1040. }
  1041. case FORUM_MYBB:
  1042. {
  1043. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1044.  
  1045. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sposts (tid, fid, subject, uid, username, dateline, message, ipaddress, visible) VALUES ('%d', '%d', '%s', '%d', '%s', '%d', '%s', '%s', '1');", g_szTablePrefix, g_iThreadID[iClient], g_iForumID, g_szThreadTitle[iClient], g_iUserID, g_szUserName, g_iTimeStamp[iClient], szContent, szReporterIP);
  1046. }
  1047. case FORUM_SMF:
  1048. {
  1049. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1050.  
  1051. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %smessages (id_topic, id_board, poster_time, id_member, subject, poster_name, poster_email, poster_ip, body, approved) VALUES ('%d', '%d', '%d', '%d', '%s', '%s', '%s', '%s', '%s', '1');", g_szTablePrefix, g_iThreadID[iClient], g_iForumID, g_iTimeStamp[iClient], g_iUserID, g_szThreadTitle[iClient], g_szUserName, g_szEmailAddress, szReporterIP, szContent);
  1052. }
  1053. case FORUM_PHPBB:
  1054. {
  1055. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1056.  
  1057. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sposts (topic_id, forum_id, poster_id, poster_ip, post_time, post_approved, enable_bbcode, post_subject, post_text, post_postcount) VALUES ('%d', '%d', '%d', '%s', '%d', '1', '1', '%s', '%s', '1');", g_szTablePrefix, g_iThreadID[iClient], g_iForumID, g_iUserID, g_szTargetIP[iClient], g_iTimeStamp[iClient], g_szThreadTitle[iClient], szContent);
  1058. }
  1059. case FORUM_WBBLITE:
  1060. {
  1061. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1062.  
  1063. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %spost (threadID, userID, username, message, time, enableSmilies, enableBBCodes, ipAddress) VALUES ('%d', '%d', '%s', '%s', '%d', '0', '1', '%s');", g_szTablePrefix, g_iThreadID[iClient], g_iUserID, g_szUserName, szContent, g_iTimeStamp[iClient], szReporterIP);
  1064. }
  1065. case FORUM_AEF:
  1066. {
  1067. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1068.  
  1069. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sposts (post_tid, post_fid, ptime, poster_id, poster_ip, post, use_smileys, p_approved) VALUES ('%d', '%d', '%d', '%d', '%s', '%s', '0', '1');", g_szTablePrefix, g_iThreadID[iClient], g_iForumID, g_iTimeStamp[iClient], g_iUserID, szReporterIP, szContent);
  1070. }
  1071. case FORUM_USEBB:
  1072. {
  1073. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1074.  
  1075. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sposts (topic_id, poster_id, poster_ip_addr, content, post_time, enable_smilies) VALUES ('%d', '%d', '%s', '%s', '%d', '0');", g_szTablePrefix, g_iThreadID[iClient], g_iUserID, szReporterIP, szContent, g_iTimeStamp[iClient]);
  1076. }
  1077. case FORUM_XMB:
  1078. {
  1079. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1080.  
  1081. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sposts (fid, tid, author, message, subject, dateline, useip, bbcodeoff, smileyoff) VALUES ('%d', '%d', '%s', '%s', '%s', '%d', '%s', 'no', 'yes');", g_szTablePrefix, g_iForumID, g_iThreadID[iClient], g_szUserName, szContent, g_szThreadTitle[iClient], g_iTimeStamp[iClient]);
  1082. }
  1083. case FORUM_IPBOARDS:
  1084. {
  1085. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: [url=steam://connect/%s:%s]%s:%s[/url] \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1086.  
  1087. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %sposts (author_id, author_name, ip_address, post_date, post, topic_id, new_topic) VALUES ('%d', '%s', '%s', '%d', '%s', '%d', '1');", g_szTablePrefix, g_iUserID, g_szUserName, szReporterIP, g_iTimeStamp[iClient], szContent, g_iThreadID[iClient]);
  1088. }
  1089. case FORUM_XENFORO:
  1090. {
  1091. Format(szContent, sizeof(szContent), "%s - \n%s: %s \n%s: %s:%s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n%s: %s \n\n%s - \n%s: %s \n%s: %s \n%s: %s \n\n %s", g_szServerInfoTitle, g_szServerInfoName, g_szHostName, g_szServerInfoIP, g_szServerIP, g_szServerPort, g_szServerInfoMap, g_szMapName, g_szReportedTitle, g_szOffPlayerName, g_szSafeTargetName[iClient], g_szOffSteamID, g_szTargetAuthID[iClient], g_szOffIP, g_szTargetIP[iClient], g_szOffCat, g_szCategory[iClient], g_szOffReason, g_szReason[iClient], g_szOffDesc, g_szSafeDescription[iClient], g_szReporterTitle, g_szRepName, szSafeReporterName, g_szRepSteamID, szReporterAuthID, g_szRepIP, szReporterIP, g_szBranding);
  1092.  
  1093. Format(szSQLQuery, sizeof(szSQLQuery), "INSERT INTO %spost (thread_id, user_id, username, post_date, message, message_state) VALUES ('%d', '%d', '%s', '%d', '%s', 'visible');", g_szTablePrefix, g_iThreadID[iClient], g_iUserID, g_szUserName, g_iTimeStamp[iClient], szContent);
  1094. }
  1095. }
  1096.  
  1097. if(GetConVarInt(g_Cvar_Debug))
  1098. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1099.  
  1100. SQL_TQuery(g_hSQLDatabase, MySQL_InsertPostContent, szSQLQuery, iClient);
  1101. }
  1102.  
  1103. public MySQL_InsertPostContent(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1104. {
  1105. if(hDatabase == INVALID_HANDLE)
  1106. LogError("Failed insert post message: %s", szError);
  1107. else
  1108. {
  1109. if(g_iForumSoftwareID != FORUM_MYBB)
  1110. GetPostId(data);
  1111. else
  1112. GetCurrentForumPostData(data);
  1113. }
  1114. }
  1115.  
  1116. /* Finds the Post ID for the thread we just created */
  1117. public GetPostId(iClient)
  1118. {
  1119. /* Search posts table for the most recent post to get the ID */
  1120. decl String:szSQLQuery[512];
  1121.  
  1122. switch(g_iForumSoftwareID)
  1123. {
  1124. case FORUM_VB4:
  1125. {
  1126. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT postid FROM %spost WHERE dateline='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1127. }
  1128. case FORUM_SMF:
  1129. {
  1130. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT id_msg FROM %smessages WHERE poster_time='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1131. }
  1132. case FORUM_PHPBB:
  1133. {
  1134. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT post_id FROM %sposts WHERE post_time='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1135. }
  1136. case FORUM_WBBLITE:
  1137. {
  1138. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT postID FROM %spost WHERE time='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1139. }
  1140. case FORUM_AEF:
  1141. {
  1142. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT pid FROM %sposts WHERE ptime='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1143. }
  1144. case FORUM_USEBB:
  1145. {
  1146. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT id FROM %sposts WHERE post_time='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1147. }
  1148. case FORUM_XMB:
  1149. {
  1150. Format(szSQLQuery, sizeof(szSQLQuery), "SLECT pid FROM %sposts WHERE dateline='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1151. }
  1152. case FORUM_IPBOARDS:
  1153. {
  1154. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT pid FROM %sposts WHERE post_date='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1155. }
  1156. case FORUM_XENFORO:
  1157. {
  1158. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT post_id FROM %spost WHERE post_date='%d';", g_szTablePrefix, g_iTimeStamp[iClient]);
  1159. }
  1160. }
  1161.  
  1162. if(GetConVarInt(g_Cvar_Debug))
  1163. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1164.  
  1165. SQL_TQuery(g_hSQLDatabase, MySQL_SelectPid, szSQLQuery, iClient);
  1166. }
  1167.  
  1168. public MySQL_SelectPid(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1169. {
  1170. if(hDatabase == INVALID_HANDLE)
  1171. LogError("Failed To Select post id: %s", szError);
  1172. else
  1173. {
  1174. if(SQL_GetRowCount(hDatabase))
  1175. {
  1176. SQL_FetchRow(hDatabase);
  1177. g_iPostID[data] = SQL_FetchInt(hDatabase, 0);
  1178. SetPostId(data);
  1179. }
  1180. }
  1181. }
  1182.  
  1183. /* Sets the Post ID for the thread we just created */
  1184. public SetPostId(iClient)
  1185. {
  1186. /* Update The thread with the correct post data */
  1187. decl String:szSQLQuery[512];
  1188.  
  1189. switch(g_iForumSoftwareID)
  1190. {
  1191. case FORUM_VB4:
  1192. {
  1193. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sthread SET firstpostid=%d, lastpostid=%d WHERE threadid=%d;", g_szTablePrefix, g_iPostID[iClient], g_iPostID[iClient], g_iThreadID[iClient]);
  1194. }
  1195. case FORUM_SMF:
  1196. {
  1197. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %stopics SET id_first_msg=%d, id_last_msg=%d WHERE id_topic=%d;", g_szTablePrefix, g_iPostID[iClient], g_iPostID[iClient], g_iThreadID[iClient]);
  1198. }
  1199. case FORUM_PHPBB:
  1200. {
  1201. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %stopics SET topic_first_post_id=%d, topic_last_post_id=%d WHERE topic_id=%d;", g_szTablePrefix, g_iPostID[iClient], g_iPostID[iClient], g_iThreadID[iClient]);
  1202. }
  1203. case FORUM_WBBLITE:
  1204. {
  1205. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sthread SET firstPostID=%d WHERE threadID=%d;", g_szTablePrefix, g_iPostID[iClient], g_iThreadID[iClient]);
  1206. }
  1207. case FORUM_AEF:
  1208. {
  1209. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %stopics SET first_post_id=%d, last_post_id=%d, mem_id_last_post=%d WHERE tid=%d;", g_szTablePrefix, g_iPostID[iClient], g_iPostID[iClient], g_iUserID, g_iThreadID[iClient]);
  1210. }
  1211. case FORUM_USEBB:
  1212. {
  1213. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %stopics SET first_post_id=%d, last_post_id=%d WHERE id=%d;", g_szTablePrefix, g_iPostID[iClient], g_iPostID[iClient], g_iThreadID[iClient]);
  1214. }
  1215. case FORUM_XMB:
  1216. {
  1217. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sthreads SET lastpost='%d|%s|%d' WHERE tid=%d;", g_szTablePrefix, g_iTimeStamp[iClient], g_szUserName, g_iPostID[iClient], g_iThreadID[iClient]);
  1218. }
  1219. case FORUM_IPBOARDS:
  1220. {
  1221. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %stopics SET topic_firstpost='%d' WHERE last_post='%d';", g_szTablePrefix, g_iPostID[iClient], g_iTimeStamp[iClient]);
  1222. }
  1223. case FORUM_XENFORO:
  1224. {
  1225. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sthread SET first_post_id='%d', last_post_date='%d', last_post_id='%s', last_post_user_id='%d', last_post_username='%s' WHERE thread_id='%d';", g_szTablePrefix, g_iPostID[iClient], g_iTimeStamp[iClient], g_iPostID[iClient], g_iUserID, g_szUserName, g_iThreadID[iClient]);
  1226. }
  1227. }
  1228.  
  1229. if(GetConVarInt(g_Cvar_Debug))
  1230. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1231.  
  1232. SQL_TQuery(g_hSQLDatabase, MySQL_UpdatetPid, szSQLQuery, iClient);
  1233. }
  1234.  
  1235. public MySQL_UpdatetPid(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1236. {
  1237. if(hDatabase == INVALID_HANDLE)
  1238. LogError("Failed To update thread with post id: %s", szError);
  1239. else
  1240. {
  1241. GetCurrentForumPostData(data);
  1242. }
  1243. }
  1244.  
  1245. /* Gets the Current Post and Thread count for the specified thread */
  1246. public GetCurrentForumPostData(iClient)
  1247. {
  1248. /* Search mybb_forums to retrieve the post count */
  1249. decl String:szSQLQuery[512];
  1250.  
  1251. switch(g_iForumSoftwareID)
  1252. {
  1253. case FORUM_VB4:
  1254. {
  1255. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT replycount, threadcount FROM %sforum WHERE forumid='%d';", g_szTablePrefix, g_iForumID);
  1256. }
  1257. case FORUM_MYBB:
  1258. {
  1259. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts, threads FROM %sforums WHERE fid='%d';", g_szTablePrefix, g_iForumID);
  1260. }
  1261. case FORUM_SMF:
  1262. {
  1263. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT num_posts, num_topics FROM %sboards WHERE id_board='%d';", g_szTablePrefix, g_iForumID);
  1264. }
  1265. case FORUM_PHPBB:
  1266. {
  1267. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT forum_posts, forum_topics FROM %sforums WHERE forum_id='%d';", g_szTablePrefix, g_iForumID);
  1268. }
  1269. case FORUM_WBBLITE:
  1270. {
  1271. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts, threads FROM %sboard WHERE boardID='%d';", g_szTablePrefix, g_iForumID);
  1272. }
  1273. case FORUM_AEF:
  1274. {
  1275. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT nposts, ntopic FROM %sforums WHERE fid='%d';", g_szTablePrefix, g_iForumID);
  1276. }
  1277. case FORUM_USEBB:
  1278. {
  1279. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts, topics FROM %sforums WHERE id='%d';", g_szTablePrefix, g_iForumID);
  1280. }
  1281. case FORUM_XMB:
  1282. {
  1283. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts, threads FROM %sforums WHERE fid='%d';", g_szTablePrefix, g_iForumID);
  1284. }
  1285. case FORUM_IPBOARDS:
  1286. {
  1287. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts, topics FROM %sforums WHERE id='%d';", g_szTablePrefix, g_iForumID);
  1288. }
  1289. case FORUM_XENFORO:
  1290. {
  1291. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT message_count, discussion_count FROM %sforum WHERE node_id='%d';", g_szTablePrefix, g_iForumID);
  1292. }
  1293. }
  1294.  
  1295. if(GetConVarInt(g_Cvar_Debug))
  1296. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1297.  
  1298. SQL_TQuery(g_hSQLDatabase, MySQL_SelectForumThreadInfo, szSQLQuery, iClient);
  1299. }
  1300.  
  1301. public MySQL_SelectForumThreadInfo(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1302. {
  1303. if(hDatabase == INVALID_HANDLE)
  1304. LogError("Failed To Select post and thread count: %s", szError);
  1305. else
  1306. {
  1307. if(SQL_GetRowCount(hDatabase))
  1308. {
  1309. SQL_FetchRow(hDatabase);
  1310. new iForumPostCount = (SQL_FetchInt(hDatabase, 0) + 1);
  1311. new iForumThreadCount = (SQL_FetchInt(hDatabase, 1) + 1);
  1312. UpdateForumPostCount(data, iForumPostCount, iForumThreadCount);
  1313. }
  1314. }
  1315. }
  1316.  
  1317. /* Increase the Thread and Post count accordingly */
  1318. public UpdateForumPostCount(iClient, iPostCount, iThreadCount)
  1319. {
  1320. decl String:szSQLQuery[1024];
  1321.  
  1322. switch(g_iForumSoftwareID)
  1323. {
  1324. case FORUM_VB4:
  1325. {
  1326. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforum SET threadcount='%d', replycount='%d', lastpost='%d', lastposter='%s', lastposterid='%d', lastpostid='%d', lastthread='%s', lastthreadid='%d' WHERE forumid='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iTimeStamp[iClient], g_szUserName, g_iUserID, g_iPostID[iClient], g_szThreadTitle[iClient], g_iThreadID[iClient], g_iForumID);
  1327. }
  1328. case FORUM_MYBB:
  1329. {
  1330. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforums SET threads='%d', posts='%d', lastpost='%d', lastposter='%s', lastposteruid='%d', lastposttid='%d', lastpostsubject='%s' WHERE fid='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iTimeStamp[iClient], g_szUserName, g_iUserID, g_iThreadID[iClient], g_szThreadTitle[iClient], g_iForumID);
  1331. }
  1332. case FORUM_SMF:
  1333. {
  1334. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sboards SET num_topics='%d', num_posts='%d', id_last_msg='%d', id_msg_updated='%d' WHERE id_board='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iPostID[iClient], g_iPostID[iClient], g_iForumID);
  1335. }
  1336. case FORUM_PHPBB:
  1337. {
  1338. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforums SET forum_topics='%d', forum_topics_real='%d', forum_posts='%d', forum_last_post_id='%d', forum_last_post_subject='%s', forum_last_post_time='%d', forum_last_poster_name='%s' WHERE forum_id='%d';", g_szTablePrefix, iThreadCount, iThreadCount, iPostCount, g_iPostID[iClient], g_szThreadTitle[iClient], g_iTimeStamp[iClient], g_szUserName, g_iForumID);
  1339. }
  1340. case FORUM_WBBLITE:
  1341. {
  1342. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sboard SET threads='%d', posts='%d' WHERE boardID='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iForumID);
  1343. }
  1344. case FORUM_AEF:
  1345. {
  1346. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforums SET ntopic='%d', nposts='%d', f_last_pid='%d' WHERE fid ='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iPostID[iClient], g_iForumID);
  1347. }
  1348. case FORUM_USEBB:
  1349. {
  1350. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforums SET topics='%d', posts='%d', last_topic_id='%d' WHERE id='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iThreadID[iClient], g_iForumID);
  1351. }
  1352. case FORUM_XMB:
  1353. {
  1354. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforums SET lastpost='%d', posts='%d', threads='%d' WHERE fid='%d';", g_szTablePrefix, g_iTimeStamp[iClient], iPostCount, iThreadCount, g_iForumID);
  1355. }
  1356. case FORUM_IPBOARDS:
  1357. {
  1358. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforums SET topics='%d', posts='%d', last_post='%d', last_poster_id='%d', last_poster_name='%s', last_title='%s', last_id='%d', newest_title='%s', newest_id='%d' WHERE id='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iTimeStamp[iClient], g_iUserID, g_szUserName, g_szThreadTitle[iClient], g_iPostID, g_szThreadTitle[iClient], g_iPostID, g_iForumID);
  1359. }
  1360. case FORUM_XENFORO:
  1361. {
  1362. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %sforum SET discussion_count='%d', message_count='%d', last_post_id='%d', last_post_date='%d', last_post_user_id='%d', last_post_username='%s', last_thread_title='%s' WHERE node_id='%d';", g_szTablePrefix, iThreadCount, iPostCount, g_iPostID[iClient], g_iTimeStamp[iClient], g_iUserID, g_szUserName, g_szThreadTitle[iClient], g_iForumID);
  1363. }
  1364. }
  1365.  
  1366. if(GetConVarInt(g_Cvar_Debug))
  1367. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1368.  
  1369. SQL_TQuery(g_hSQLDatabase, MySQL_UpdateForumPostCount, szSQLQuery, iClient);
  1370. }
  1371.  
  1372. public MySQL_UpdateForumPostCount(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1373. {
  1374. if(hDatabase == INVALID_HANDLE)
  1375. LogError("Failed To Update Thread and Post Count: %s", szError);
  1376. else
  1377. {
  1378. GetUserPostInfo(data);
  1379. }
  1380. }
  1381.  
  1382. /* Get the Users post count */
  1383. public GetUserPostInfo(iClient)
  1384. {
  1385. decl String:szSQLQuery[512];
  1386.  
  1387. switch(g_iForumSoftwareID)
  1388. {
  1389. case FORUM_VB4:
  1390. {
  1391. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts FROM %suser WHERE userid='%d';", g_szTablePrefix, g_iUserID);
  1392. }
  1393. case FORUM_MYBB:
  1394. {
  1395. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT postnum FROM %susers WHERE uid='%d';", g_szTablePrefix, g_iUserID);
  1396. }
  1397. case FORUM_SMF:
  1398. {
  1399. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts FROM %smembers WHERE id_member='%d';", g_szTablePrefix, g_iUserID);
  1400. }
  1401. case FORUM_PHPBB:
  1402. {
  1403. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT user_posts FROM %susers WHERE user_id='%d';", g_szTablePrefix, g_iUserID);
  1404. }
  1405. case FORUM_WBBLITE:
  1406. {
  1407. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts FROM %suser WHERE userID='%d';", g_szTablePrefix, g_iUserID);
  1408. }
  1409. case FORUM_AEF:
  1410. {
  1411. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts FROM %susers WHERE id='%d';", g_szTablePrefix, g_iUserID);
  1412. }
  1413. case FORUM_USEBB:
  1414. {
  1415. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts FROM %smembers WHERE id='%d';", g_szTablePrefix, g_iUserID);
  1416. }
  1417. case FORUM_XMB:
  1418. {
  1419. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT postnum FROM %smembers WHERE uid='%d';", g_szTablePrefix, g_iUserID);
  1420. }
  1421. case FORUM_IPBOARDS:
  1422. {
  1423. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT posts FROM %smembers WHERE member_id='%d';", g_szTablePrefix, g_iUserID);
  1424. }
  1425. case FORUM_XENFORO:
  1426. {
  1427. Format(szSQLQuery, sizeof(szSQLQuery), "SELECT message_count FROM %suser WHERE user_id='%d';", g_szTablePrefix, g_iUserID);
  1428. }
  1429. }
  1430.  
  1431. if(GetConVarInt(g_Cvar_Debug))
  1432. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1433.  
  1434. SQL_TQuery(g_hSQLDatabase, MySQL_GetUserPostCount, szSQLQuery, iClient);
  1435. }
  1436.  
  1437. public MySQL_GetUserPostCount(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1438. {
  1439. if(hDatabase == INVALID_HANDLE)
  1440. LogError("Failed To Select User Post Data: %s", szError);
  1441. else
  1442. {
  1443. if(SQL_GetRowCount(hDatabase))
  1444. {
  1445. SQL_FetchRow(hDatabase);
  1446. new iUserPostCount = (SQL_FetchInt(hDatabase, 0) + 1);
  1447. UpdateUserPostCount(data, iUserPostCount);
  1448. }
  1449. }
  1450. }
  1451.  
  1452. /* Increase the users post count accordingly */
  1453. public UpdateUserPostCount(iClient, iPostCount)
  1454. {
  1455. decl String:szSQLQuery[512];
  1456.  
  1457. switch(g_iForumSoftwareID)
  1458. {
  1459. case FORUM_VB4:
  1460. {
  1461. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %suser SET posts='%d', lastvisit='%d', lastactivity='%d', lastpost='%d', lastpostid='%d' WHERE userid=%d;", g_szTablePrefix, iPostCount, g_iTimeStamp[iClient], g_iTimeStamp[iClient], g_iTimeStamp[iClient], g_iPostID[iClient], g_iUserID);
  1462. }
  1463. case FORUM_MYBB:
  1464. {
  1465. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %susers SET postnum='%d' WHERE uid='%d';", g_szTablePrefix, iPostCount, g_iUserID);
  1466. }
  1467. case FORUM_SMF:
  1468. {
  1469. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %smembers SET posts='%d', last_login='%d' WHERE id_member=%d;", g_szTablePrefix, iPostCount, g_iTimeStamp[iClient], g_iUserID);
  1470. }
  1471. case FORUM_PHPBB:
  1472. {
  1473. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %susers SET user_posts='%d', user_lastpost_time='%d' WHERE user_id=%d;", g_szTablePrefix, iPostCount, g_iTimeStamp[iClient], g_iUserID);
  1474. }
  1475. case FORUM_WBBLITE:
  1476. {
  1477. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %suser SET posts='%d', boardLastVisitTime='%d', boardLastActivityTime='%d' WHERE userID=%d;", g_szTablePrefix, iPostCount, g_iTimeStamp[iClient], g_iTimeStamp[iClient], g_iUserID);
  1478. }
  1479. case FORUM_AEF:
  1480. {
  1481. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %susers SET lastlogin='%d', lastlogin_1='%d', posts='%d' WHERE id=%d;", g_szTablePrefix, g_iTimeStamp[iClient], g_iTimeStamp[iClient], iPostCount, g_iUserID);
  1482. }
  1483. case FORUM_USEBB:
  1484. {
  1485. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %smembers SET last_login='%d', last_pageview='%d', posts='%d' WHERE id=%d;", g_szTablePrefix, g_iTimeStamp[iClient], g_iTimeStamp[iClient], iPostCount, g_iUserID);
  1486. }
  1487. case FORUM_XMB:
  1488. {
  1489. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %smembers SET postnum='%d', lastvisit='%d';", g_szTablePrefix, iPostCount, g_iTimeStamp[iClient]);
  1490. }
  1491. case FORUM_IPBOARDS:
  1492. {
  1493. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %smembers SET posts='%d', last_post='%d', last_visit='%d', last_activity='%d' WHERE member_id=%d;", g_szTablePrefix, iPostCount, g_iTimeStamp[iClient], g_iTimeStamp[iClient], g_iTimeStamp[iClient], g_iUserID);
  1494. }
  1495. case FORUM_XENFORO:
  1496. {
  1497. Format(szSQLQuery, sizeof(szSQLQuery), "UPDATE %suser SET message_count='%d', last_activity='%d' WHERE user_id='%d';", g_szTablePrefix, iPostCount, g_iTimeStamp[iClient], g_iUserID);
  1498. }
  1499. }
  1500.  
  1501. if(GetConVarInt(g_Cvar_Debug))
  1502. PushArrayString(g_hDebugArray[iClient], szSQLQuery);
  1503.  
  1504. SQL_TQuery(g_hSQLDatabase, MySQL_UpdateUserPostCount, szSQLQuery, iClient);
  1505. }
  1506.  
  1507. public MySQL_UpdateUserPostCount(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1508. {
  1509. if(hDatabase == INVALID_HANDLE)
  1510. LogError("Failed To Update User Post Data: %s", szError);
  1511. else
  1512. {
  1513. /* Display Message to player saying player was reported. */
  1514. PrintToChat(data, "[%s] %s has been reported: %s", g_szPrefix, g_szTargetName[data], g_szReason[data]);
  1515.  
  1516. if(GetConVarInt(g_Cvar_Debug))
  1517. {
  1518. CreateDebugFile(data);
  1519. ClearArray(g_hDebugArray[data]);
  1520. }
  1521.  
  1522. if(GetConVarInt(g_Cvar_AdminAlert))
  1523. AlertAdmins(data);
  1524. }
  1525. }
  1526.  
  1527. public MySQL_SetCharSet(Handle:hOwner, Handle:hDatabase, const String:szError[], any:data)
  1528. {
  1529. if(hDatabase == INVALID_HANDLE)
  1530. LogError("Failed to SetCharSet: %s", szError);
  1531. }
  1532.  
  1533. stock bool:AddPlayerToBlackList(const String:szAuthID[], const String:szTargetName[], const String:szArgReason[])
  1534. {
  1535. new Handle:kv = CreateKeyValues("Blacklist");
  1536. FileToKeyValues(kv, g_szBlackListPath);
  1537. if(KvJumpToKey(kv, szAuthID, true))
  1538. {
  1539. KvSetString(kv, "name", szTargetName);
  1540. KvSetString(kv, "reason", szArgReason);
  1541. KvRewind(kv);
  1542. KeyValuesToFile(kv, g_szBlackListPath);
  1543. CloseHandle(kv);
  1544. return true;
  1545. }
  1546.  
  1547. CloseHandle(kv);
  1548. return false;
  1549. }
  1550.  
  1551. stock bool:RemPlayerToBlackList(const String:szAuthID[])
  1552. {
  1553. new Handle:kv = CreateKeyValues("Blacklist");
  1554. FileToKeyValues(kv, g_szBlackListPath);
  1555.  
  1556. if(KvJumpToKey(kv, szAuthID))
  1557. {
  1558. if(KvDeleteThis(kv))
  1559. {
  1560. KvRewind(kv);
  1561. KeyValuesToFile(kv, g_szBlackListPath);
  1562. CloseHandle(kv);
  1563. return true;
  1564. }
  1565. }
  1566.  
  1567. CloseHandle(kv);
  1568. return false;
  1569. }
  1570.  
  1571. stock bool:IsUserBlacklisted(const String:szAuthID[])
  1572. {
  1573. new Handle:kv = CreateKeyValues("Blacklist");
  1574. FileToKeyValues(kv, g_szBlackListPath);
  1575.  
  1576. if(KvJumpToKey(kv, szAuthID))
  1577. {
  1578. CloseHandle(kv);
  1579. return true;
  1580. }
  1581.  
  1582. CloseHandle(kv);
  1583.  
  1584. return false;
  1585. }
  1586.  
  1587. //Returns the correct map for CSGO
  1588. stock GetCurrentWorkshopMap(String:szMap[], iMapBuf, String:szWorkShopID[], iWorkShopBuf)
  1589. {
  1590. decl String:szCurMapSplit[2][64];
  1591.  
  1592. ReplaceString(szMap, iMapBuf, "workshop/", "", false);
  1593. ExplodeString(szMap, "/", szCurMapSplit, 2, sizeof(szCurMapSplit[]));
  1594.  
  1595. strcopy(szMap, iMapBuf, szCurMapSplit[1]);
  1596. strcopy(szWorkShopID, iWorkShopBuf, szCurMapSplit[0]);
  1597. }
  1598.  
  1599. stock GetWebSafeString(const String:szString[], String:szBuffer[], len, bool:bRemoveSpaces)
  1600. {
  1601. strcopy(szBuffer, len, szString);
  1602.  
  1603. if(bRemoveSpaces)
  1604. ReplaceString(szBuffer, len, " ", "");
  1605.  
  1606. ReplaceString(szBuffer, len, "/", "");
  1607. ReplaceString(szBuffer, len, "\\", "");
  1608. ReplaceString(szBuffer, len, "[", "");
  1609. ReplaceString(szBuffer, len, "]", "");
  1610. ReplaceString(szBuffer, len, "}", "");
  1611. ReplaceString(szBuffer, len, "{", "");
  1612. ReplaceString(szBuffer, len, "|", "");
  1613. ReplaceString(szBuffer, len, "?", "");
  1614. ReplaceString(szBuffer, len, "=", "");
  1615. ReplaceString(szBuffer, len, "+", "");
  1616. ReplaceString(szBuffer, len, ">", "");
  1617. ReplaceString(szBuffer, len, "<", "");
  1618. ReplaceString(szBuffer, len, "*", "");
  1619. ReplaceString(szBuffer, len, "\"", "");
  1620. ReplaceString(szBuffer, len, "'", "");
  1621. ReplaceString(szBuffer, len, "`", "");
  1622. ReplaceString(szBuffer, len, "!", "");
  1623. ReplaceString(szBuffer, len, "@", "");
  1624. ReplaceString(szBuffer, len, "#", "");
  1625. ReplaceString(szBuffer, len, "$", "");
  1626. ReplaceString(szBuffer, len, "%", "");
  1627. ReplaceString(szBuffer, len, "^", "");
  1628. ReplaceString(szBuffer, len, "&", "");
  1629. }
  1630.  
  1631. stock ParsePlayerName(const String:szString[], String:szBuffer[], len)
  1632. {
  1633. SQL_EscapeString(g_hSQLDatabase, szString, szBuffer, len);
  1634. ReplaceString(szBuffer, len, "}", "");
  1635. ReplaceString(szBuffer, len, "{", "");
  1636. ReplaceString(szBuffer, len, "|", "");
  1637. }
  1638.  
  1639. /* Alert Admins if any of reported player */
  1640. stock AlertAdmins(iClient)
  1641. {
  1642. for(new i=1; i<MaxClients;i++)
  1643. {
  1644. if(g_bIsUserAdmin[i] && iClient != i)
  1645. {
  1646. /* Display Message to admin saying player was reported. */
  1647. PrintToChat(i, "[%s] %s has been reported: %s by %N", g_szPrefix, g_szSafeTargetName[iClient], g_szReason[iClient], iClient);
  1648. }
  1649. }
  1650. }
  1651.  
  1652. public CreateDebugFile(iClient)
  1653. {
  1654. decl String:szBuffer[1024], String:szDebugFile[PLATFORM_MAX_PATH], String:szTime[10];
  1655. new iArraySize = GetArraySize(g_hDebugArray[iClient]);
  1656. FormatTime(szTime, sizeof(szTime), "%j-%H%M", GetTime());
  1657. Format(szDebugFile, sizeof(szDebugFile), "addons/sourcemod/logs/rtf-%s.log", szTime);
  1658. new Handle:hFile = OpenFile(szDebugFile, "w");
  1659. for(new i=0; i < iArraySize; i++)
  1660. {
  1661. GetArrayString(g_hDebugArray[iClient], i, szBuffer, sizeof(szBuffer));
  1662. WriteFileLine(hFile, szBuffer);
  1663. WriteFileLine(hFile, "");
  1664. }
  1665. CloseHandle(hFile);
  1666. }
  1667.  
  1668. stock bool:AddPlayersToMenu(Handle:hMenu, iClient)
  1669. {
  1670. decl String:szName[MAX_NAME_LENGTH], String:szSafeName[2 * MAX_NAME_LENGTH + 1], String:szIP[32], String:szAuthID[32], String:szMenuItem[10];
  1671. new iMenuIndex;
  1672.  
  1673. if(g_hTargetNames[iClient] == INVALID_HANDLE)
  1674. g_hTargetNames[iClient] = CreateArray(32);
  1675. else
  1676. ClearArray(g_hTargetNames[iClient]);
  1677.  
  1678. if(g_hSafeTargetNames[iClient] == INVALID_HANDLE)
  1679. g_hSafeTargetNames[iClient] = CreateArray(32);
  1680. else
  1681. ClearArray(g_hSafeTargetNames[iClient]);
  1682.  
  1683. if(g_hTargetIP[iClient] == INVALID_HANDLE)
  1684. g_hTargetIP[iClient] = CreateArray(32);
  1685. else
  1686. ClearArray(g_hTargetAuthID[iClient]);
  1687.  
  1688. if(g_hTargetAuthID[iClient] == INVALID_HANDLE)
  1689. g_hTargetAuthID[iClient] = CreateArray(32);
  1690. else
  1691. ClearArray(g_hTargetIP[iClient]);
  1692.  
  1693. new iPlayerCount;
  1694. for(new i=1; i<=MaxClients; i++)
  1695. {
  1696. if(IsClientInGame(i) && !IsFakeClient(i))
  1697. {
  1698. if(i == iClient && !GetConVarBool(g_Cvar_Development))
  1699. continue;
  1700.  
  1701. GetClientName(i, szName, sizeof(szName));
  1702. ParsePlayerName(szName, szSafeName, sizeof(szSafeName));
  1703. GetClientIP(i, szIP, sizeof(szIP));
  1704. GetClientAuthString(i, szAuthID, sizeof(szAuthID));
  1705.  
  1706. iMenuIndex = PushArrayString(g_hTargetNames[iClient], szName);
  1707. PushArrayString(g_hSafeTargetNames[iClient], szSafeName);
  1708. PushArrayString(g_hTargetIP[iClient], szIP);
  1709. PushArrayString(g_hTargetAuthID[iClient], szAuthID);
  1710.  
  1711. Format(szMenuItem, sizeof(szMenuItem), "%d|%d", iMenuIndex, i);
  1712. AddMenuItem(hMenu, szMenuItem, szName);
  1713. ++iPlayerCount;
  1714. }
  1715. }
  1716.  
  1717. if(iPlayerCount <= 0)
  1718. return false;
  1719.  
  1720. return true;
  1721. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement