PageRenderTime 53ms CodeModel.GetById 9ms RepoModel.GetById 1ms app.codeStats 0ms

/mani_admin_plugin/mani_autokickban.cpp

http://maniadminplugin.googlecode.com/
C++ | 1892 lines | 1319 code | 316 blank | 257 comment | 285 complexity | d7745c3a4ef519f5c15e5112351238f6 MD5 | raw file
Possible License(s): GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. //
  2. // Mani Admin Plugin
  3. //
  4. // Copyright Š 2009-2014 Giles Millward (Mani). All rights reserved.
  5. //
  6. // This file is part of ManiAdminPlugin.
  7. //
  8. // Mani Admin Plugin is free software: you can redistribute it and/or modify
  9. // it under the terms of the GNU General Public License as published by
  10. // the Free Software Foundation, either version 3 of the License, or
  11. // (at your option) any later version.
  12. //
  13. // Mani Admin Plugin is distributed in the hope that it will be useful,
  14. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. // GNU General Public License for more details.
  17. //
  18. // You should have received a copy of the GNU General Public License
  19. // along with Mani Admin Plugin. If not, see <http://www.gnu.org/licenses/>.
  20. //
  21. //
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <math.h>
  26. #include <time.h>
  27. #include "interface.h"
  28. #include "filesystem.h"
  29. #include "engine/iserverplugin.h"
  30. #include "iplayerinfo.h"
  31. #include "eiface.h"
  32. #include "igameevents.h"
  33. #include "mrecipientfilter.h"
  34. #include "bitbuf.h"
  35. #include "engine/IEngineSound.h"
  36. #include "inetchannelinfo.h"
  37. #include "ivoiceserver.h"
  38. #include "networkstringtabledefs.h"
  39. #include "mani_main.h"
  40. #include "mani_mainclass.h"
  41. #include "mani_convar.h"
  42. #include "mani_parser.h"
  43. #include "mani_player.h"
  44. #include "mani_language.h"
  45. #include "mani_menu.h"
  46. #include "mani_memory.h"
  47. #include "mani_output.h"
  48. #include "mani_client_flags.h"
  49. #include "mani_client.h"
  50. #include "mani_gametype.h"
  51. #include "mani_util.h"
  52. #include "mani_commands.h"
  53. #include "mani_help.h"
  54. #include "mani_autokickban.h"
  55. #include "shareddefs.h"
  56. #include "mani_playerkick.h"
  57. #include "mani_handlebans.h"
  58. extern IVEngineServer *engine;
  59. extern IVoiceServer *voiceserver;
  60. extern IFileSystem *filesystem;
  61. extern IPlayerInfoManager *playerinfomanager;
  62. extern int max_players;
  63. extern CGlobalVars *gpGlobals;
  64. extern bool war_mode;
  65. static int sort_autokick_steam ( const void *m1, const void *m2);
  66. static int sort_autokick_ip ( const void *m1, const void *m2);
  67. inline bool FStruEq(const char *sz1, const char *sz2)
  68. {
  69. return(Q_strcmp(sz1, sz2) == 0);
  70. }
  71. inline bool FStrEq(const char *sz1, const char *sz2)
  72. {
  73. return(Q_stricmp(sz1, sz2) == 0);
  74. }
  75. ManiAutoKickBan g_ManiAutoKickBan;
  76. ManiAutoKickBan *gpManiAutoKickBan;
  77. ManiAutoKickBan::ManiAutoKickBan()
  78. {
  79. // Init
  80. autokick_ip_list = NULL;
  81. autokick_steam_list = NULL;
  82. autokick_name_list = NULL;
  83. autokick_pname_list = NULL;
  84. autokick_ip_list_size = 0;
  85. autokick_steam_list_size = 0;
  86. autokick_name_list_size = 0;
  87. autokick_pname_list_size = 0;
  88. gpManiAutoKickBan = this;
  89. }
  90. ManiAutoKickBan::~ManiAutoKickBan()
  91. {
  92. // Cleanup
  93. this->CleanUp();
  94. }
  95. //---------------------------------------------------------------------------------
  96. // Purpose: Init stuff for plugin load
  97. //---------------------------------------------------------------------------------
  98. void ManiAutoKickBan::CleanUp(void)
  99. {
  100. FreeList ((void **) &autokick_ip_list, &autokick_ip_list_size);
  101. FreeList ((void **) &autokick_steam_list, &autokick_steam_list_size);
  102. FreeList ((void **) &autokick_name_list, &autokick_name_list_size);
  103. FreeList ((void **) &autokick_pname_list, &autokick_pname_list_size);
  104. }
  105. //---------------------------------------------------------------------------------
  106. // Purpose: Init stuff for plugin load
  107. //---------------------------------------------------------------------------------
  108. void ManiAutoKickBan::Load(void)
  109. {
  110. }
  111. //---------------------------------------------------------------------------------
  112. // Purpose: Level load
  113. //---------------------------------------------------------------------------------
  114. void ManiAutoKickBan::LevelInit(void)
  115. {
  116. FileHandle_t file_handle;
  117. char autokickban_id[512];
  118. char base_filename[256];
  119. this->CleanUp();
  120. //Get autokickban IP list
  121. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/autokick_ip.txt", mani_path.GetString());
  122. file_handle = filesystem->Open (base_filename,"rt",NULL);
  123. if (file_handle == NULL)
  124. {
  125. // MMsg("Did not load autokick_ip.txt\n");
  126. }
  127. else
  128. {
  129. // MMsg("autokickban IP list\n");
  130. while (filesystem->ReadLine (autokickban_id, sizeof(autokickban_id), file_handle) != NULL)
  131. {
  132. if (!ParseLine(autokickban_id, true, true)) continue;
  133. AddAutoKickIP(autokickban_id);
  134. }
  135. filesystem->Close(file_handle);
  136. qsort(autokick_ip_list, autokick_ip_list_size, sizeof(autokick_ip_t), sort_autokick_ip);
  137. }
  138. //Get autokickban Steam list
  139. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/autokick_steam.txt", mani_path.GetString());
  140. file_handle = filesystem->Open (base_filename,"rt",NULL);
  141. if (file_handle == NULL)
  142. {
  143. // MMsg("Did not load autokick_steam.txt\n");
  144. }
  145. else
  146. {
  147. // MMsg("autokickban Steam list\n");
  148. while (filesystem->ReadLine (autokickban_id, sizeof(autokickban_id), file_handle) != NULL)
  149. {
  150. if (!ParseLine(autokickban_id, true, true)) continue;
  151. AddAutoKickSteamID(autokickban_id);
  152. }
  153. filesystem->Close(file_handle);
  154. qsort(autokick_steam_list, autokick_steam_list_size, sizeof(autokick_steam_t), sort_autokick_steam);
  155. }
  156. //Get autokickban Name list
  157. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/autokick_name.txt", mani_path.GetString());
  158. file_handle = filesystem->Open (base_filename,"rt",NULL);
  159. if (file_handle == NULL)
  160. {
  161. // MMsg("Did not load autokick_name.txt\n");
  162. }
  163. else
  164. {
  165. // MMsg("autokickban Name list\n");
  166. while (filesystem->ReadLine (autokickban_id, sizeof(autokickban_id), file_handle) != NULL)
  167. {
  168. if (!ParseLine(autokickban_id, true, false)) continue;
  169. AddAutoKickName(autokickban_id);
  170. }
  171. filesystem->Close(file_handle);
  172. }
  173. //Get autokickban PName list
  174. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/autokick_pname.txt", mani_path.GetString());
  175. file_handle = filesystem->Open (base_filename,"rt",NULL);
  176. if (file_handle == NULL)
  177. {
  178. // MMsg("Did not load autokick_pname.txt\n");
  179. }
  180. else
  181. {
  182. // MMsg("autokickban PName list\n");
  183. while (filesystem->ReadLine (autokickban_id, sizeof(autokickban_id), file_handle) != NULL)
  184. {
  185. if (!ParseLine(autokickban_id, true, false)) continue;
  186. AddAutoKickPName(autokickban_id);
  187. }
  188. filesystem->Close(file_handle);
  189. }
  190. }
  191. //---------------------------------------------------------------------------------
  192. // Purpose: Client Disconnected
  193. //---------------------------------------------------------------------------------
  194. void ManiAutoKickBan::ClientDisconnect(player_t *player_ptr)
  195. {
  196. return;
  197. }
  198. //---------------------------------------------------------------------------------
  199. // Purpose: Check Player on connect
  200. //---------------------------------------------------------------------------------
  201. bool ManiAutoKickBan::NetworkIDValidated(player_t *player_ptr)
  202. {
  203. autokick_steam_t autokick_steam_key;
  204. autokick_steam_t *found_steam = NULL;
  205. autokick_ip_t autokick_ip_key;
  206. autokick_ip_t *found_ip = NULL;
  207. char kick_cmd[512];
  208. if (war_mode)
  209. {
  210. return true;
  211. }
  212. if (FStrEq(player_ptr->steam_id, "BOT"))
  213. {
  214. // Is Bot
  215. return true;
  216. }
  217. if (gpManiClient->HasAccess(player_ptr->index, IMMUNITY, IMMUNITY_TAG, false, true))
  218. {
  219. return true;
  220. }
  221. Q_strcpy (autokick_steam_key.steam_id, player_ptr->steam_id);
  222. /* Check steam ID's first */
  223. if (autokick_steam_list_size != 0)
  224. {
  225. found_steam = (autokick_steam_t *) bsearch
  226. (
  227. &autokick_steam_key,
  228. autokick_steam_list,
  229. autokick_steam_list_size,
  230. sizeof(autokick_steam_t),
  231. sort_autokick_steam
  232. );
  233. if (found_steam != NULL)
  234. {
  235. // Matched steam id
  236. if (found_steam->kick)
  237. {
  238. player_ptr->user_id = engine->GetPlayerUserId(player_ptr->entity);
  239. PrintToClientConsole(player_ptr->entity, "You have been autokicked\n");
  240. gpManiPlayerKick->AddPlayer( player_ptr->index, 0.5f, "You were autokicked" );
  241. snprintf( kick_cmd, sizeof(kick_cmd), "kickid %i You were autokicked\n", player_ptr->user_id);
  242. LogCommand (NULL, "Kick (Bad Steam ID) [%s] [%s] %s\n", player_ptr->name, player_ptr->steam_id, kick_cmd);
  243. return false;
  244. }
  245. }
  246. }
  247. if (autokick_ip_list_size != 0)
  248. {
  249. Q_strcpy(autokick_ip_key.ip_address, player_ptr->ip_address);
  250. found_ip = (autokick_ip_t *) bsearch
  251. (
  252. &autokick_ip_key,
  253. autokick_ip_list,
  254. autokick_ip_list_size,
  255. sizeof(autokick_ip_t),
  256. sort_autokick_ip
  257. );
  258. if (found_ip != NULL)
  259. {
  260. // Matched ip address
  261. if (found_ip->kick)
  262. {
  263. player_ptr->user_id = engine->GetPlayerUserId(player_ptr->entity);
  264. PrintToClientConsole(player_ptr->entity, "You have been autokicked\n");
  265. gpManiPlayerKick->AddPlayer( player_ptr->index, 0.5f, "You were autokicked" );
  266. snprintf( kick_cmd, sizeof(kick_cmd), "kickid %i You were autokicked\n", player_ptr->user_id);
  267. LogCommand (NULL, "Kick (Bad IP Address) [%s] [%s] %s\n", player_ptr->name, player_ptr->steam_id, kick_cmd);
  268. return false;
  269. }
  270. }
  271. }
  272. if (player_ptr->player_info)
  273. {
  274. for (int i = 0; i < autokick_name_list_size; i++)
  275. {
  276. if (FStrEq(autokick_name_list[i].name, player_ptr->name))
  277. {
  278. // Matched name of player
  279. if (autokick_name_list[i].kick)
  280. {
  281. PrintToClientConsole(player_ptr->entity, "You have been autokicked\n");
  282. gpManiPlayerKick->AddPlayer( player_ptr->index, 0.5f, "You were autokicked" );
  283. snprintf( kick_cmd, sizeof(kick_cmd), "kickid %i You were autokicked\n", player_ptr->user_id);
  284. LogCommand (NULL, "Kick (Bad Name) [%s] [%s] %s\n", player_ptr->name, player_ptr->steam_id, kick_cmd);
  285. return false;
  286. }
  287. else if (autokick_name_list[i].ban && !IsLAN())
  288. {
  289. // Ban by user id
  290. PrintToClientConsole(player_ptr->entity, "You have been auto banned\n");
  291. LogCommand (NULL,"Ban (Bad Name) [%s] [%s]\n", player_ptr->name, player_ptr->steam_id);
  292. gpManiHandleBans->AddBan ( player_ptr, player_ptr->steam_id, "MAP", autokick_name_list[i].ban_time, "Banned (Bad Name)", "Bad Name" );
  293. gpManiHandleBans->WriteBans();
  294. return false;
  295. }
  296. }
  297. }
  298. for (int i = 0; i < autokick_pname_list_size; i++)
  299. {
  300. if (NULL != Q_stristr(player_ptr->name, autokick_pname_list[i].pname))
  301. {
  302. // Matched name of player
  303. if (autokick_pname_list[i].kick)
  304. {
  305. PrintToClientConsole(player_ptr->entity, "You have been autokicked\n");
  306. gpManiPlayerKick->AddPlayer( player_ptr->index, 0.5f, "You were autokicked" );
  307. snprintf( kick_cmd, sizeof(kick_cmd), "kickid %i You were autokicked\n", player_ptr->user_id);
  308. LogCommand (NULL, "Kick (Bad Name) [%s] [%s] %s\n", player_ptr->name, player_ptr->steam_id, kick_cmd);
  309. return false;
  310. }
  311. else if (autokick_pname_list[i].ban && !IsLAN())
  312. {
  313. // Ban by user id
  314. PrintToClientConsole(player_ptr->entity, "You have been auto banned\n");
  315. LogCommand (NULL,"Ban (Bad Name - partial) [%s] [%s]\n", player_ptr->name, player_ptr->steam_id);
  316. gpManiHandleBans->AddBan ( player_ptr, player_ptr->steam_id, "MAP", autokick_pname_list[i].ban_time, "Banned (Bad Name)", "Bad Name" );
  317. gpManiHandleBans->WriteBans();
  318. return false;
  319. }
  320. }
  321. }
  322. }
  323. return true;
  324. }
  325. //---------------------------------------------------------------------------------
  326. // Purpose: Process the ma_autoban_name command
  327. //---------------------------------------------------------------------------------
  328. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoBanName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  329. {
  330. autokick_name_t autokick_name;
  331. bool perm_ban = true;
  332. bool temp_ban = true;
  333. if (player_ptr)
  334. {
  335. // Check if player is admin
  336. perm_ban = gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode);
  337. temp_ban = gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_BAN, war_mode);
  338. if (!(temp_ban || perm_ban)) return PLUGIN_BAD_ADMIN;
  339. }
  340. int argc = gpCmd->Cmd_Argc();
  341. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  342. int ban_time = 0;
  343. if (argc == 3)
  344. {
  345. ban_time = atoi(gpCmd->Cmd_Argv(2));
  346. if (ban_time < 0)
  347. {
  348. ban_time = 0;
  349. }
  350. }
  351. // If if only temp ban if it's within limits
  352. if (!perm_ban)
  353. {
  354. if (ban_time == 0 || ban_time > mani_admin_temp_ban_time_limit.GetInt())
  355. {
  356. OutputHelpText(ORANGE_CHAT, player_ptr, "%s", Translate(player_ptr, 2581, "%i", mani_admin_temp_ban_time_limit.GetInt()));
  357. return PLUGIN_STOP;
  358. }
  359. }
  360. // Check if name is already in list
  361. for (int i = 0; i < autokick_name_list_size; i++)
  362. {
  363. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_name_list[i].name))
  364. {
  365. autokick_name_list[i].ban = true;
  366. autokick_name_list[i].ban_time = ban_time;
  367. autokick_name_list[i].kick = false;
  368. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Player [%s] updated", gpCmd->Cmd_Argv(1));
  369. LogCommand (player_ptr, "Updated player [%s] to autokick_name.txt\n", gpCmd->Cmd_Argv(1));
  370. WriteNameList("autokick_name.txt");
  371. return PLUGIN_STOP;
  372. }
  373. }
  374. Q_strcpy(autokick_name.name, gpCmd->Cmd_Argv(1));
  375. autokick_name.ban = true;
  376. autokick_name.ban_time = ban_time;
  377. autokick_name.kick = false;
  378. AddToList((void **) &autokick_name_list, sizeof(autokick_name_t), &autokick_name_list_size);
  379. autokick_name_list[autokick_name_list_size - 1] = autokick_name;
  380. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Player [%s] added", gpCmd->Cmd_Argv(1));
  381. LogCommand (player_ptr, "Added player [%s] to autokick_name.txt\n", gpCmd->Cmd_Argv(1));
  382. WriteNameList("autokick_name.txt");
  383. return PLUGIN_STOP;
  384. }
  385. //---------------------------------------------------------------------------------
  386. // Purpose: Process the ma_autokick_name command
  387. //---------------------------------------------------------------------------------
  388. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoKickName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  389. {
  390. autokick_name_t autokick_name;
  391. if (player_ptr)
  392. {
  393. // Check if player is admin
  394. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  395. }
  396. int argc = gpCmd->Cmd_Argc();
  397. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  398. // Check if name is already in list
  399. for (int i = 0; i < autokick_name_list_size; i++)
  400. {
  401. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_name_list[i].name))
  402. {
  403. autokick_name_list[i].ban = false;
  404. autokick_name_list[i].ban_time = 0;
  405. autokick_name_list[i].kick = true;
  406. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Player [%s] updated", gpCmd->Cmd_Argv(1));
  407. LogCommand (player_ptr, "Updated player [%s] to autokick_name.txt\n", gpCmd->Cmd_Argv(1));
  408. WriteNameList("autokick_name.txt");
  409. return PLUGIN_STOP;
  410. }
  411. }
  412. Q_strcpy(autokick_name.name, gpCmd->Cmd_Argv(1));
  413. autokick_name.ban = false;
  414. autokick_name.ban_time = 0;
  415. autokick_name.kick = true;
  416. AddToList((void **) &autokick_name_list, sizeof(autokick_name_t), &autokick_name_list_size);
  417. autokick_name_list[autokick_name_list_size - 1] = autokick_name;
  418. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Player [%s] added", gpCmd->Cmd_Argv(1));
  419. LogCommand (player_ptr, "Added player [%s] to autokick_name.txt\n", gpCmd->Cmd_Argv(1));
  420. WriteNameList("autokick_name.txt");
  421. return PLUGIN_STOP;
  422. }
  423. //---------------------------------------------------------------------------------
  424. // Purpose: Process the ma_autoban_pname command
  425. //---------------------------------------------------------------------------------
  426. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoBanPName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  427. {
  428. autokick_pname_t autokick_pname;
  429. bool perm_ban = true;
  430. bool temp_ban = true;
  431. if (player_ptr)
  432. {
  433. // Check if player is admin
  434. perm_ban = gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode);
  435. temp_ban = gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_BAN, war_mode);
  436. if (!(temp_ban || perm_ban)) return PLUGIN_BAD_ADMIN;
  437. }
  438. int argc = gpCmd->Cmd_Argc();
  439. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  440. int ban_time = 0;
  441. if (argc == 3)
  442. {
  443. ban_time = atoi(gpCmd->Cmd_Argv(2));
  444. if (ban_time < 0)
  445. {
  446. ban_time = 0;
  447. }
  448. }
  449. // If if only temp ban if it's within limits
  450. if (!perm_ban)
  451. {
  452. if (ban_time == 0 || ban_time > mani_admin_temp_ban_time_limit.GetInt())
  453. {
  454. OutputHelpText(ORANGE_CHAT, player_ptr, "%s", Translate(player_ptr, 2581, "%i", mani_admin_temp_ban_time_limit.GetInt()));
  455. return PLUGIN_STOP;
  456. }
  457. }
  458. // Check if name is already in list
  459. for (int i = 0; i < autokick_pname_list_size; i++)
  460. {
  461. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_pname_list[i].pname))
  462. {
  463. autokick_pname_list[i].ban = true;
  464. autokick_pname_list[i].ban_time = ban_time;
  465. autokick_pname_list[i].kick = false;
  466. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Partial name [%s] updated", gpCmd->Cmd_Argv(1));
  467. LogCommand (player_ptr, "Updated player [%s] to autokick_pname.txt\n", gpCmd->Cmd_Argv(1));
  468. WritePNameList("autokick_pname.txt");
  469. return PLUGIN_STOP;
  470. }
  471. }
  472. Q_strcpy(autokick_pname.pname, gpCmd->Cmd_Argv(1));
  473. autokick_pname.ban = true;
  474. autokick_pname.ban_time = ban_time;
  475. autokick_pname.kick = false;
  476. AddToList((void **) &autokick_pname_list, sizeof(autokick_pname_t), &autokick_pname_list_size);
  477. autokick_pname_list[autokick_pname_list_size - 1] = autokick_pname;
  478. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Partial name [%s] added", gpCmd->Cmd_Argv(1));
  479. LogCommand (player_ptr, "Added player [%s] to autokick_pname.txt\n", gpCmd->Cmd_Argv(1));
  480. WritePNameList("autokick_pname.txt");
  481. return PLUGIN_STOP;
  482. }
  483. //---------------------------------------------------------------------------------
  484. // Purpose: Process the ma_autokick_pname command
  485. //---------------------------------------------------------------------------------
  486. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoKickPName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  487. {
  488. autokick_pname_t autokick_pname;
  489. if (player_ptr)
  490. {
  491. // Check if player is admin
  492. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  493. }
  494. int argc = gpCmd->Cmd_Argc();
  495. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  496. // Check if name is already in list
  497. for (int i = 0; i < autokick_pname_list_size; i++)
  498. {
  499. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_pname_list[i].pname))
  500. {
  501. autokick_pname_list[i].ban = false;
  502. autokick_pname_list[i].ban_time = 0;
  503. autokick_pname_list[i].kick = true;
  504. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Partial name [%s] updated", gpCmd->Cmd_Argv(1));
  505. LogCommand (player_ptr, "Updated player [%s] to autokick_pname.txt\n", gpCmd->Cmd_Argv(1));
  506. WritePNameList("autokick_pname.txt");
  507. return PLUGIN_STOP;
  508. }
  509. }
  510. Q_strcpy(autokick_pname.pname, gpCmd->Cmd_Argv(1));
  511. autokick_pname.ban = false;
  512. autokick_pname.ban_time = 0;
  513. autokick_pname.kick = true;
  514. AddToList((void **) &autokick_pname_list, sizeof(autokick_pname_t), &autokick_pname_list_size);
  515. autokick_pname_list[autokick_pname_list_size - 1] = autokick_pname;
  516. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Partial name [%s] added", gpCmd->Cmd_Argv(1));
  517. LogCommand (player_ptr, "Added player [%s] to autokick_pname.txt\n", gpCmd->Cmd_Argv(1));
  518. WritePNameList("autokick_pname.txt");
  519. return PLUGIN_STOP;
  520. }
  521. //---------------------------------------------------------------------------------
  522. // Purpose: Process the ma_autokick_steam command
  523. //---------------------------------------------------------------------------------
  524. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoKickSteam(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  525. {
  526. autokick_steam_t autokick_steam;
  527. if (player_ptr)
  528. {
  529. // Check if player is admin
  530. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  531. }
  532. int argc = gpCmd->Cmd_Argc();
  533. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  534. // Check if steam id is already in list
  535. for (int i = 0; i < autokick_steam_list_size; i++)
  536. {
  537. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_steam_list[i].steam_id))
  538. {
  539. autokick_steam_list[i].kick = true;
  540. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Steam ID [%s] updated", gpCmd->Cmd_Argv(1));
  541. LogCommand (player_ptr, "Updated steam [%s] to autokick_steam.txt\n", gpCmd->Cmd_Argv(1));
  542. WriteSteamList("autokick_steam.txt");
  543. return PLUGIN_STOP;
  544. }
  545. }
  546. Q_strcpy(autokick_steam.steam_id, gpCmd->Cmd_Argv(1));
  547. autokick_steam.kick = true;
  548. AddToList((void **) &autokick_steam_list, sizeof(autokick_steam_t), &autokick_steam_list_size);
  549. autokick_steam_list[autokick_steam_list_size - 1] = autokick_steam;
  550. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Steam ID [%s] added", gpCmd->Cmd_Argv(1));
  551. LogCommand (player_ptr, "Added steam id [%s] to autokick_steam.txt\n", gpCmd->Cmd_Argv(1));
  552. qsort(autokick_steam_list, autokick_steam_list_size, sizeof(autokick_steam_t), sort_autokick_steam);
  553. WriteSteamList("autokick_steam.txt");
  554. return PLUGIN_STOP;
  555. }
  556. //---------------------------------------------------------------------------------
  557. // Purpose: Process the ma_autokick_ip command
  558. //---------------------------------------------------------------------------------
  559. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoKickIP(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  560. {
  561. autokick_ip_t autokick_ip;
  562. if (player_ptr)
  563. {
  564. // Check if player is admin
  565. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  566. }
  567. int argc = gpCmd->Cmd_Argc();
  568. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  569. // Check if ip is already in list
  570. for (int i = 0; i < autokick_ip_list_size; i++)
  571. {
  572. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_ip_list[i].ip_address))
  573. {
  574. autokick_ip_list[i].kick = true;
  575. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: IP address [%s] updated", gpCmd->Cmd_Argv(1));
  576. LogCommand (player_ptr, "Updated ip address [%s] to autokick_ip.txt\n", gpCmd->Cmd_Argv(1));
  577. WriteIPList("autokick_ip.txt");
  578. return PLUGIN_STOP;
  579. }
  580. }
  581. Q_strcpy(autokick_ip.ip_address, gpCmd->Cmd_Argv(1));
  582. autokick_ip.kick = true;
  583. AddToList((void **) &autokick_ip_list, sizeof(autokick_ip_t), &autokick_ip_list_size);
  584. autokick_ip_list[autokick_ip_list_size - 1] = autokick_ip;
  585. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: IP address [%s] added", gpCmd->Cmd_Argv(1));
  586. LogCommand (player_ptr, "Added ip address [%s] to autokick_ip.txt\n", gpCmd->Cmd_Argv(1));
  587. qsort(autokick_ip_list, autokick_ip_list_size, sizeof(autokick_ip_t), sort_autokick_ip);
  588. WriteIPList("autokick_ip.txt");
  589. return PLUGIN_STOP;
  590. }
  591. //---------------------------------------------------------------------------------
  592. // Purpose: Process the ma_unauto_name command
  593. //---------------------------------------------------------------------------------
  594. PLUGIN_RESULT ManiAutoKickBan::ProcessMaUnAutoName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  595. {
  596. if (player_ptr)
  597. {
  598. // Check if player is admin
  599. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  600. }
  601. int argc = gpCmd->Cmd_Argc();
  602. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  603. // Check if name is already in list
  604. for (int i = 0; i < autokick_name_list_size; i++)
  605. {
  606. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_name_list[i].name))
  607. {
  608. autokick_name_list[i].ban = false;
  609. autokick_name_list[i].ban_time = 0;
  610. autokick_name_list[i].kick = false;
  611. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Player [%s] updated", gpCmd->Cmd_Argv(1));
  612. LogCommand (player_ptr, "Updated player [%s] to autokick_name.txt\n", gpCmd->Cmd_Argv(1));
  613. WriteNameList("autokick_name.txt");
  614. return PLUGIN_STOP;
  615. }
  616. }
  617. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Player [%s] not found", gpCmd->Cmd_Argv(1));
  618. LogCommand (player_ptr, "Player [%s] not found\n", gpCmd->Cmd_Argv(1));
  619. return PLUGIN_STOP;
  620. }
  621. //---------------------------------------------------------------------------------
  622. // Purpose: Process the ma_unauto_pname command
  623. //---------------------------------------------------------------------------------
  624. PLUGIN_RESULT ManiAutoKickBan::ProcessMaUnAutoPName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  625. {
  626. if (player_ptr)
  627. {
  628. // Check if player is admin
  629. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  630. }
  631. int argc = gpCmd->Cmd_Argc();
  632. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  633. // Check if name is already in list
  634. for (int i = 0; i < autokick_pname_list_size; i++)
  635. {
  636. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_pname_list[i].pname))
  637. {
  638. autokick_pname_list[i].ban = false;
  639. autokick_pname_list[i].ban_time = 0;
  640. autokick_pname_list[i].kick = false;
  641. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Partial name [%s] updated", gpCmd->Cmd_Argv(1));
  642. LogCommand (player_ptr, "Updated partial name [%s] to autokick_name.txt\n", gpCmd->Cmd_Argv(1));
  643. WritePNameList("autokick_pname.txt");
  644. return PLUGIN_STOP;
  645. }
  646. }
  647. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Partial name [%s] not found", gpCmd->Cmd_Argv(1));
  648. LogCommand (player_ptr, "Partial name [%s] not found\n", gpCmd->Cmd_Argv(1));
  649. return PLUGIN_STOP;
  650. }
  651. //---------------------------------------------------------------------------------
  652. // Purpose: Process the ma_unauto_steam command
  653. //---------------------------------------------------------------------------------
  654. PLUGIN_RESULT ManiAutoKickBan::ProcessMaUnAutoSteam(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  655. {
  656. if (player_ptr)
  657. {
  658. // Check if player is admin
  659. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  660. }
  661. int argc = gpCmd->Cmd_Argc();
  662. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  663. // Check if steam id is already in list
  664. for (int i = 0; i < autokick_steam_list_size; i++)
  665. {
  666. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_steam_list[i].steam_id))
  667. {
  668. autokick_steam_list[i].kick = false;
  669. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Steam ID [%s] updated", gpCmd->Cmd_Argv(1));
  670. LogCommand (player_ptr, "Updated steam id [%s] to autokick_steam.txt\n", gpCmd->Cmd_Argv(1));
  671. WriteSteamList("autokick_steam.txt");
  672. return PLUGIN_STOP;
  673. }
  674. }
  675. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Steam ID [%s] not found", gpCmd->Cmd_Argv(1));
  676. LogCommand (player_ptr, "Steam ID [%s] not found\n", gpCmd->Cmd_Argv(1));
  677. return PLUGIN_STOP;
  678. }
  679. //---------------------------------------------------------------------------------
  680. // Purpose: Process the ma_unauto_ip command
  681. //---------------------------------------------------------------------------------
  682. PLUGIN_RESULT ManiAutoKickBan::ProcessMaUnAutoIP(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  683. {
  684. if (player_ptr)
  685. {
  686. // Check if player is admin
  687. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_PERM_BAN, war_mode)) return PLUGIN_BAD_ADMIN;
  688. }
  689. int argc = gpCmd->Cmd_Argc();
  690. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  691. // Check if ip is already in list
  692. for (int i = 0; i < autokick_ip_list_size; i++)
  693. {
  694. if (FStrEq(gpCmd->Cmd_Argv(1), autokick_ip_list[i].ip_address))
  695. {
  696. autokick_ip_list[i].kick = false;
  697. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: ip address [%s] updated", gpCmd->Cmd_Argv(1));
  698. LogCommand (player_ptr, "Updated ip address [%s] to autokick_ip.txt\n", gpCmd->Cmd_Argv(1));
  699. WriteIPList("autokick_ip.txt");
  700. return PLUGIN_STOP;
  701. }
  702. }
  703. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: IP address [%s] not found", gpCmd->Cmd_Argv(1));
  704. LogCommand (player_ptr, "IP address [%s] not found\n", gpCmd->Cmd_Argv(1));
  705. return PLUGIN_STOP;
  706. }
  707. //---------------------------------------------------------------------------------
  708. // Purpose: Write name list to file
  709. //---------------------------------------------------------------------------------
  710. void ManiAutoKickBan::WriteNameList(char *filename_string)
  711. {
  712. char base_filename[1024];
  713. FileHandle_t file_handle;
  714. // Check if file exists, create a new one if it doesn't
  715. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/%s", mani_path.GetString(), filename_string);
  716. //if (filesystem->FileExists( base_filename))
  717. //{
  718. // filesystem->RemoveFile(base_filename);
  719. // if (filesystem->FileExists( base_filename))
  720. // {
  721. // MMsg("Failed to delete %s\n", filename_string);
  722. // }
  723. //}
  724. file_handle = filesystem->Open(base_filename,"wt",NULL);
  725. if (file_handle == NULL)
  726. {
  727. MMsg("Failed to open %s for writing\n", filename_string);
  728. }
  729. else
  730. {
  731. gpManiAdminPlugin->PrintHeader ( file_handle, filename_string, "list of names that are to be kicked/banned" );
  732. filesystem->FPrintf ( file_handle, "//\n" );
  733. filesystem->FPrintf ( file_handle, "// Put the name you wish to kick/ban in quotes.\n" );
  734. filesystem->FPrintf ( file_handle, "// Then whether to kick (k) or ban (b)\n" );
  735. filesystem->FPrintf ( file_handle, "// Lastly put the amount of time to ban (optional)\n" );
  736. filesystem->FPrintf ( file_handle, "//\n" );
  737. filesystem->FPrintf ( file_handle, "// \"spek\" k\n" );
  738. filesystem->FPrintf ( file_handle, "// \"spek\" b 60\n" );
  739. filesystem->FPrintf ( file_handle, "//\n" );
  740. // Write file in human readable text format
  741. for (int i = 0; i < autokick_name_list_size; i ++)
  742. {
  743. char ban_string[128];
  744. if (!autokick_name_list[i].ban && !autokick_name_list[i].kick) continue;
  745. snprintf(ban_string , sizeof(ban_string), "b %i\n", autokick_name_list[i].ban_time);
  746. char temp_string[512];
  747. int temp_length = snprintf(temp_string, sizeof(temp_string), "\"%s\" %s", autokick_name_list[i].name, (autokick_name_list[i].kick)? "k\n":ban_string);
  748. if (filesystem->Write((void *) temp_string, temp_length, file_handle) == 0)
  749. {
  750. MMsg("Failed to write to %s!!\n", filename_string);
  751. filesystem->Close(file_handle);
  752. break;
  753. }
  754. }
  755. filesystem->Close(file_handle);
  756. }
  757. }
  758. //---------------------------------------------------------------------------------
  759. // Purpose: Write pname list to file
  760. //---------------------------------------------------------------------------------
  761. void ManiAutoKickBan::WritePNameList(char *filename_string)
  762. {
  763. char base_filename[1024];
  764. FileHandle_t file_handle;
  765. // Check if file exists, create a new one if it doesn't
  766. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/%s", mani_path.GetString(), filename_string);
  767. //if (filesystem->FileExists( base_filename))
  768. //{
  769. // filesystem->RemoveFile(base_filename);
  770. // if (filesystem->FileExists( base_filename))
  771. // {
  772. // MMsg("Failed to delete %s\n", filename_string);
  773. // }
  774. //}
  775. file_handle = filesystem->Open(base_filename,"wt",NULL);
  776. if (file_handle == NULL)
  777. {
  778. MMsg("Failed to open %s for writing\n", filename_string);
  779. }
  780. else
  781. {
  782. gpManiAdminPlugin->PrintHeader ( file_handle, filename_string, "list of name matches that are to be kicked/banned" );
  783. filesystem->FPrintf ( file_handle, "//\n" );
  784. filesystem->FPrintf ( file_handle, "// Put the partial name you wish to kick/ban in quotes.\n" );
  785. filesystem->FPrintf ( file_handle, "// Then whether to kick (k) or ban (b)\n" );
  786. filesystem->FPrintf ( file_handle, "// Lastly put the amount of time to ban (optional)\n" );
  787. filesystem->FPrintf ( file_handle, "//\n" );
  788. filesystem->FPrintf ( file_handle, "// \"spek\" k\n" );
  789. filesystem->FPrintf ( file_handle, "// \"spek\" b 60\n" );
  790. filesystem->FPrintf ( file_handle, "//\n" );
  791. // Write file in human readable text format
  792. for (int i = 0; i < autokick_pname_list_size; i ++)
  793. {
  794. char ban_string[128];
  795. if (!autokick_pname_list[i].ban && !autokick_pname_list[i].kick) continue;
  796. snprintf(ban_string , sizeof(ban_string), "b %i\n", autokick_pname_list[i].ban_time);
  797. char temp_string[512];
  798. int temp_length = snprintf(temp_string, sizeof(temp_string), "\"%s\" %s", autokick_pname_list[i].pname, (autokick_pname_list[i].kick)? "k\n": ban_string);
  799. if (filesystem->Write((void *) temp_string, temp_length, file_handle) == 0)
  800. {
  801. MMsg("Failed to write to %s!!\n", filename_string);
  802. filesystem->Close(file_handle);
  803. break;
  804. }
  805. }
  806. filesystem->Close(file_handle);
  807. }
  808. }
  809. //---------------------------------------------------------------------------------
  810. // Purpose: Write ip list to file
  811. //---------------------------------------------------------------------------------
  812. void ManiAutoKickBan::WriteIPList(char *filename_string)
  813. {
  814. char base_filename[1024];
  815. FileHandle_t file_handle;
  816. // Check if file exists, create a new one if it doesn't
  817. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/%s", mani_path.GetString(), filename_string);
  818. //if (filesystem->FileExists( base_filename))
  819. //{
  820. // filesystem->RemoveFile(base_filename);
  821. // if (filesystem->FileExists( base_filename))
  822. // {
  823. // MMsg("Failed to delete %s\n", filename_string);
  824. // }
  825. //}
  826. file_handle = filesystem->Open(base_filename,"wt",NULL);
  827. if (file_handle == NULL)
  828. {
  829. MMsg("Failed to open %s for writing\n", filename_string);
  830. }
  831. else
  832. {
  833. gpManiAdminPlugin->PrintHeader ( file_handle, filename_string, "list of IPs that are to be kicked/banned" );
  834. filesystem->FPrintf ( file_handle, "//\n" );
  835. filesystem->FPrintf ( file_handle, "// Put the IP you wish to kick/ban in quotes.\n" );
  836. filesystem->FPrintf ( file_handle, "// Then whether to kick (k) or ban (b)\n" );
  837. filesystem->FPrintf ( file_handle, "// Lastly put the amount of time to ban (optional)\n" );
  838. filesystem->FPrintf ( file_handle, "//\n" );
  839. filesystem->FPrintf ( file_handle, "// \"192.168.0.2\" k\n" );
  840. filesystem->FPrintf ( file_handle, "// \"192.168.0.2\" b 60\n" );
  841. filesystem->FPrintf ( file_handle, "//\n" );
  842. // Write file in human readable text format
  843. for (int i = 0; i < autokick_ip_list_size; i ++)
  844. {
  845. if (!autokick_ip_list[i].kick) continue;
  846. char temp_string[512];
  847. int temp_length = snprintf(temp_string, sizeof(temp_string), "%s k\n", autokick_ip_list[i].ip_address);
  848. if (filesystem->Write((void *) temp_string, temp_length, file_handle) == 0)
  849. {
  850. MMsg("Failed to write to %s!!\n", filename_string);
  851. filesystem->Close(file_handle);
  852. break;
  853. }
  854. }
  855. filesystem->Close(file_handle);
  856. }
  857. }
  858. //---------------------------------------------------------------------------------
  859. // Purpose: Write steam list to file
  860. //---------------------------------------------------------------------------------
  861. void ManiAutoKickBan::WriteSteamList(char *filename_string)
  862. {
  863. char base_filename[1024];
  864. FileHandle_t file_handle;
  865. // Check if file exists, create a new one if it doesn't
  866. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/%s", mani_path.GetString(), filename_string);
  867. //if (filesystem->FileExists( base_filename))
  868. //{
  869. // filesystem->RemoveFile(base_filename);
  870. // if (filesystem->FileExists( base_filename))
  871. // {
  872. // MMsg("Failed to delete %s\n", filename_string);
  873. // }
  874. //}
  875. file_handle = filesystem->Open(base_filename,"wt",NULL);
  876. if (file_handle == NULL)
  877. {
  878. MMsg("Failed to open %s for writing\n", filename_string);
  879. }
  880. else
  881. {
  882. gpManiAdminPlugin->PrintHeader ( file_handle, filename_string, "list of steam ids that are to be kicked/banned" );
  883. filesystem->FPrintf ( file_handle, "//\n" );
  884. filesystem->FPrintf ( file_handle, "// Put the steamid you wish to kick/ban in quotes.\n" );
  885. filesystem->FPrintf ( file_handle, "// Then whether to kick (k) or ban (b)\n" );
  886. filesystem->FPrintf ( file_handle, "// Lastly put the amount of time to ban (optional)\n" );
  887. filesystem->FPrintf ( file_handle, "//\n" );
  888. filesystem->FPrintf ( file_handle, "// \"STEAM_0:1:0000001\" k\n" );
  889. filesystem->FPrintf ( file_handle, "// \"STEAM_0:1:0000001\" b 60\n" );
  890. filesystem->FPrintf ( file_handle, "//\n" );
  891. // Write file in human readable text format
  892. for (int i = 0; i < autokick_steam_list_size; i ++)
  893. {
  894. if (!autokick_steam_list[i].kick) continue;
  895. char temp_string[512];
  896. int temp_length = snprintf(temp_string, sizeof(temp_string), "%s k\n", autokick_steam_list[i].steam_id);
  897. if (filesystem->Write((void *) temp_string, temp_length, file_handle) == 0)
  898. {
  899. MMsg("Failed to write to %s!!\n", filename_string);
  900. filesystem->Close(file_handle);
  901. break;
  902. }
  903. }
  904. filesystem->Close(file_handle);
  905. }
  906. }
  907. //---------------------------------------------------------------------------------
  908. // Purpose: Parses the Autokick IP string
  909. //---------------------------------------------------------------------------------
  910. void ManiAutoKickBan::AddAutoKickIP(char *details)
  911. {
  912. char ip_address[128];
  913. autokick_ip_t autokick_ip;
  914. if ( !details || (details[0]==0) )
  915. return;
  916. autokick_ip.kick = true; // they are in the list ... they are to be autokicked.
  917. Q_strcpy(autokick_ip.ip_address, "");
  918. Q_strcpy(ip_address, "");
  919. int i = 0;
  920. int j = 0;
  921. for (;;)
  922. {
  923. if (details[i] == '\0')
  924. {
  925. // No more data
  926. ip_address[j] = '\0';
  927. i--;
  928. break;
  929. }
  930. if ( details[i] == '\"' )
  931. i++;
  932. // If reached space or tab break out of loop
  933. if (details[i] == ' ' ||
  934. details[i] == '\t')
  935. {
  936. ip_address[j] = '\0';
  937. break;
  938. }
  939. ip_address[j] = details[i];
  940. i++;
  941. j++;
  942. }
  943. Q_strcpy(autokick_ip.ip_address, ip_address);
  944. //MMsg("%s ", ip_address);
  945. i++;
  946. //while (details[i] != '\0')
  947. //{
  948. // switch (details[i])
  949. // {
  950. // case ('k') : autokick_ip.kick = true; break;
  951. // default : break;
  952. // }
  953. // i++;
  954. // if (autokick_ip.kick)
  955. // {
  956. // break;
  957. // }
  958. //}
  959. if (!AddToList((void **) &autokick_ip_list, sizeof(autokick_ip_t), &autokick_ip_list_size))
  960. return;
  961. autokick_ip_list[autokick_ip_list_size - 1] = autokick_ip;
  962. }
  963. //---------------------------------------------------------------------------------
  964. // Purpose: Parses the Autokick Steam ID string
  965. //---------------------------------------------------------------------------------
  966. void ManiAutoKickBan::AddAutoKickSteamID(char *details)
  967. {
  968. char steam_id[MAX_NETWORKID_LENGTH];
  969. autokick_steam_t autokick_steam;
  970. if ( !details || (details[0]==0) )
  971. return;
  972. // default admin to have absolute power
  973. autokick_steam.kick = true; // they are in the list ... they are to be autokicked.
  974. Q_strcpy(autokick_steam.steam_id, "");
  975. Q_strcpy(steam_id, "");
  976. int i = 0;
  977. int j = 0;
  978. for (;;)
  979. {
  980. if (details[i] == '\0')
  981. {
  982. // No more data
  983. steam_id[j] = '\0';
  984. i--;
  985. break;
  986. }
  987. if ( details[i] == '\"' )
  988. i++;
  989. // If reached space or tab break out of loop
  990. if (details[i] == ' ' ||
  991. details[i] == '\t')
  992. {
  993. steam_id[j] = '\0';
  994. break;
  995. }
  996. steam_id[j] = details[i];
  997. i++;
  998. j++;
  999. }
  1000. Q_strcpy(autokick_steam.steam_id, steam_id);
  1001. //MMsg("%s ", steam_id);
  1002. //i++;
  1003. //while (details[i] != '\0')
  1004. //{
  1005. // switch (details[i])
  1006. // {
  1007. // case ('k') : autokick_steam.kick = true; break;
  1008. // default : break;
  1009. // }
  1010. // i++;
  1011. // if (autokick_steam.kick)
  1012. // {
  1013. // break;
  1014. // }
  1015. //}
  1016. if (!AddToList((void **) &autokick_steam_list, sizeof(autokick_steam_t), &autokick_steam_list_size))
  1017. return;
  1018. autokick_steam_list[autokick_steam_list_size - 1] = autokick_steam;
  1019. }
  1020. //---------------------------------------------------------------------------------
  1021. // Purpose: Parses the Autokick Name string
  1022. //---------------------------------------------------------------------------------
  1023. void ManiAutoKickBan::AddAutoKickName(char *details)
  1024. {
  1025. char name[MAX_PLAYER_NAME_LENGTH];
  1026. autokick_name_t autokick_name;
  1027. if ( !details || (details[0]==0) )
  1028. return;
  1029. // default admin to have absolute power
  1030. autokick_name.ban = false;
  1031. autokick_name.ban_time = 0;
  1032. autokick_name.kick = false;
  1033. Q_strcpy(autokick_name.name, "");
  1034. Q_strcpy(name, "");
  1035. int i = 0;
  1036. int j = 0;
  1037. // Filter
  1038. while (details[i] != '\"' && details[i] != '\0')
  1039. i++;
  1040. if (details[i] == '\0')
  1041. {
  1042. return;
  1043. }
  1044. i++;
  1045. for (;;)
  1046. {
  1047. if (details[i] == '\0')
  1048. {
  1049. // No more data
  1050. name[j] = '\0';
  1051. i--;
  1052. break;
  1053. }
  1054. // If reached space or tab break out of loop
  1055. if (details[i] == '\"')
  1056. {
  1057. name[j] = '\0';
  1058. break;
  1059. }
  1060. name[j] = details[i];
  1061. i++;
  1062. j++;
  1063. }
  1064. Q_strcpy(autokick_name.name, name);
  1065. //MMsg("%s ", name);
  1066. i++;
  1067. while (details[i] != '\0')
  1068. {
  1069. switch (details[i])
  1070. {
  1071. case ('k') : autokick_name.kick = true; break;
  1072. case ('b') : autokick_name.ban = true; break;
  1073. default : break;
  1074. }
  1075. i++;
  1076. if (autokick_name.ban)
  1077. {
  1078. // Need to get the time in minutes
  1079. j = 0;
  1080. char time_string[512];
  1081. while(details[i] != '\0')
  1082. {
  1083. if (details[i] == ' ' ||
  1084. details[i] == '\t')
  1085. {
  1086. i++;
  1087. continue;
  1088. }
  1089. time_string[j++] = details[i++];
  1090. if (j == sizeof(time_string))
  1091. {
  1092. j--;
  1093. break;
  1094. }
  1095. }
  1096. time_string[j] = '\0';
  1097. autokick_name.ban_time = atoi(time_string);
  1098. break;
  1099. }
  1100. }
  1101. if (!autokick_name.ban && !autokick_name.kick)
  1102. {
  1103. autokick_name.kick = true;
  1104. }
  1105. if (autokick_name.ban)
  1106. {
  1107. if (autokick_name.ban_time == 0)
  1108. {
  1109. //MMsg("Ban permanent");
  1110. }
  1111. else
  1112. {
  1113. //MMsg("Ban %i minutes", autokick_name.ban_time);
  1114. }
  1115. }
  1116. if (!AddToList((void **) &autokick_name_list, sizeof(autokick_name_t), &autokick_name_list_size))
  1117. return;
  1118. autokick_name_list[autokick_name_list_size - 1] = autokick_name;
  1119. }
  1120. //---------------------------------------------------------------------------------
  1121. // Purpose: Parses the Autokick Name string
  1122. //---------------------------------------------------------------------------------
  1123. void ManiAutoKickBan::AddAutoKickPName(char *details)
  1124. {
  1125. char name[MAX_PLAYER_NAME_LENGTH];
  1126. autokick_pname_t autokick_pname;
  1127. // default admin to have absolute power
  1128. autokick_pname.ban = false;
  1129. autokick_pname.ban_time = 0;
  1130. autokick_pname.kick = false;
  1131. Q_strcpy(autokick_pname.pname, "");
  1132. Q_strcpy(name, "");
  1133. int i = 0;
  1134. int j = 0;
  1135. // Filter
  1136. while (details[i] != '\"' && details[i] != '\0')
  1137. {
  1138. i++;
  1139. }
  1140. if (details[i] == '\0')
  1141. {
  1142. return;
  1143. }
  1144. i++;
  1145. for (;;)
  1146. {
  1147. if (details[i] == '\0')
  1148. {
  1149. // No more data
  1150. name[j] = '\0';
  1151. i--;
  1152. break;
  1153. }
  1154. // If reached space or tab break out of loop
  1155. if (details[i] == '\"')
  1156. {
  1157. name[j] = '\0';
  1158. break;
  1159. }
  1160. name[j] = details[i];
  1161. i++;
  1162. j++;
  1163. }
  1164. Q_strcpy(autokick_pname.pname, name);
  1165. //MMsg("%s ", name);
  1166. i++;
  1167. while (details[i] != '\0')
  1168. {
  1169. switch (details[i])
  1170. {
  1171. case ('k') : autokick_pname.kick = true; break;
  1172. case ('b') : autokick_pname.ban = true; break;
  1173. default : break;
  1174. }
  1175. i++;
  1176. if (autokick_pname.ban)
  1177. {
  1178. // Need to get the time in minutes
  1179. j = 0;
  1180. char time_string[512]="0"; // default to perma
  1181. while(details[i] != '\0')
  1182. {
  1183. if (details[i] == ' ' ||
  1184. details[i] == '\t')
  1185. {
  1186. i++;
  1187. continue;
  1188. }
  1189. time_string[j++] = details[i++];
  1190. if (j == sizeof(time_string))
  1191. {
  1192. j--;
  1193. break;
  1194. }
  1195. }
  1196. time_string[j] = '\0';
  1197. autokick_pname.ban_time = atoi(time_string);
  1198. break;
  1199. }
  1200. }
  1201. if (!autokick_pname.ban && !autokick_pname.kick)
  1202. {
  1203. autokick_pname.kick = true;
  1204. }
  1205. if (autokick_pname.ban)
  1206. {
  1207. if (autokick_pname.ban_time == 0)
  1208. {
  1209. //MMsg("Ban permanent");
  1210. }
  1211. else
  1212. {
  1213. //MMsg("Ban %i minutes", autokick_pname.ban_time);
  1214. }
  1215. }
  1216. else
  1217. {
  1218. //MMsg("Kick");
  1219. }
  1220. if (!AddToList((void **) &autokick_pname_list, sizeof(autokick_pname_t), &autokick_pname_list_size))
  1221. return;
  1222. autokick_pname_list[autokick_pname_list_size - 1] = autokick_pname;
  1223. }
  1224. //---------------------------------------------------------------------------------
  1225. // Purpose: Process the ma_ashow_name command
  1226. //---------------------------------------------------------------------------------
  1227. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoShowName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  1228. {
  1229. if (player_ptr)
  1230. {
  1231. // Check if player is admin
  1232. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_BASIC_ADMIN, war_mode)) return PLUGIN_BAD_ADMIN;
  1233. }
  1234. OutputToConsole(player_ptr, "Current Names on the autokick/ban list\n\n");
  1235. OutputToConsole(player_ptr, "Name Kick Ban Ban Time\n");
  1236. char name[512];
  1237. char ban_time[20];
  1238. for (int i = 0; i < autokick_name_list_size; i++)
  1239. {
  1240. if (!autokick_name_list[i].ban && !autokick_name_list[i].kick)
  1241. {
  1242. continue;
  1243. }
  1244. Q_strcpy(ban_time,"");
  1245. if (autokick_name_list[i].ban)
  1246. {
  1247. if (autokick_name_list[i].ban_time == 0)
  1248. {
  1249. Q_strcpy (ban_time, "Permanent");
  1250. }
  1251. else
  1252. {
  1253. snprintf(ban_time, sizeof(ban_time), "%i minute%s",
  1254. autokick_name_list[i].ban_time,
  1255. (autokick_name_list[i].ban_time == 1) ? "":"s");
  1256. }
  1257. }
  1258. snprintf(name, sizeof(name), "\"%s\"", autokick_name_list[i].name);
  1259. OutputToConsole(player_ptr, "%-30s %-6s %-6s %s\n",
  1260. name,
  1261. (autokick_name_list[i].kick) ? "YES":"NO",
  1262. (autokick_name_list[i].ban) ? "YES":"NO",
  1263. ban_time
  1264. );
  1265. }
  1266. return PLUGIN_STOP;
  1267. }
  1268. //---------------------------------------------------------------------------------
  1269. // Purpose: Process the ma_ashow_pname command
  1270. //---------------------------------------------------------------------------------
  1271. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoShowPName(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  1272. {
  1273. if (player_ptr)
  1274. {
  1275. // Check if player is admin
  1276. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_BASIC_ADMIN, war_mode)) return PLUGIN_BAD_ADMIN;
  1277. }
  1278. OutputToConsole(player_ptr, "Current partial names on the autokick/ban list\n\n");
  1279. OutputToConsole(player_ptr, "Partial Name Kick Ban Ban Time\n");
  1280. char name[512];
  1281. char ban_time[20];
  1282. for (int i = 0; i < autokick_pname_list_size; i++)
  1283. {
  1284. if (!autokick_pname_list[i].ban && !autokick_pname_list[i].kick)
  1285. {
  1286. continue;
  1287. }
  1288. Q_strcpy(ban_time,"");
  1289. if (autokick_pname_list[i].ban)
  1290. {
  1291. if (autokick_pname_list[i].ban_time == 0)
  1292. {
  1293. Q_strcpy (ban_time, "Permanent");
  1294. }
  1295. else
  1296. {
  1297. snprintf(ban_time, sizeof(ban_time), "%i minute%s",
  1298. autokick_pname_list[i].ban_time,
  1299. (autokick_pname_list[i].ban_time == 1) ? "":"s");
  1300. }
  1301. }
  1302. snprintf(name, sizeof(name), "\"%s\"", autokick_pname_list[i].pname);
  1303. OutputToConsole(player_ptr, "%-30s %-6s %-6s %s\n",
  1304. name,
  1305. (autokick_pname_list[i].kick) ? "YES":"NO",
  1306. (autokick_pname_list[i].ban) ? "YES":"NO",
  1307. ban_time
  1308. );
  1309. }
  1310. return PLUGIN_STOP;
  1311. }
  1312. //---------------------------------------------------------------------------------
  1313. // Purpose: Process the ma_ashow_steam command
  1314. //---------------------------------------------------------------------------------
  1315. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoShowSteam(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  1316. {
  1317. if (player_ptr)
  1318. {
  1319. // Check if player is admin
  1320. if (!gpManiClient->HasAccess(player_ptr->index, ADMIN, ADMIN_BASIC_ADMIN, war_mode)) return PLUGIN_BAD_ADMIN;
  1321. }
  1322. OutputToConsole(player_ptr, "Current steam ids on the autokick/ban list\n\n");
  1323. OutputToConsole(player_ptr, "Steam ID\n");
  1324. for (int i = 0; i < autokick_steam_list_size; i++)
  1325. {
  1326. if (!autokick_steam_list[i].kick)
  1327. {
  1328. continue;
  1329. }
  1330. OutputToConsole(player_ptr, "%s\n", autokick_steam_list[i].steam_id);
  1331. }
  1332. return PLUGIN_STOP;
  1333. }
  1334. //---------------------------------------------------------------------------------
  1335. // Purpose: Process the ma_ashow_ip command
  1336. //---------------------------------------------------------------------------------
  1337. PLUGIN_RESULT ManiAutoKickBan::ProcessMaAutoShowIP(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  1338. {
  1339. if (player_ptr)
  1340. {
  1341. // Check if player is admin
  1342. if (!gpManiClient->HasAccess(player_ptr-

Large files files are truncated, but you can click here to view the full file