PageRenderTime 98ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/mani_admin_plugin/mani_client.cpp

http://maniadminplugin.googlecode.com/
C++ | 8173 lines | 8079 code | 51 blank | 43 comment | 63 complexity | d5fca107aa2295d573d9572edff9b86f MD5 | raw file
Possible License(s): GPL-3.0
  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 "inetchannelinfo.h"
  33. #include "mani_client_flags.h"
  34. #include "mani_memory.h"
  35. #include "mani_convar.h"
  36. #include "mani_player.h"
  37. #include "mani_output.h"
  38. #include "mani_parser.h"
  39. #include "mani_main.h"
  40. #include "mani_mysql.h"
  41. #include "mani_database.h"
  42. #include "mani_language.h"
  43. #include "mani_keyvalues.h"
  44. #include "mani_commands.h"
  45. #include "mani_util.h"
  46. #include "mani_help.h"
  47. #include "mani_client_util.h"
  48. #include "mani_client.h"
  49. #include "mani_client_sql.h"
  50. #include "mani_reservedslot.h"
  51. #include <map>
  52. #ifdef SOURCEMM
  53. #include "mani_client_interface.h"
  54. #endif
  55. extern IFileSystem *filesystem;
  56. extern IVEngineServer *engine; // helper functions (messaging clients, loading content, making entities, running commands, etc)
  57. extern IPlayerInfoManager *playerinfomanager;
  58. extern int con_command_index;
  59. extern bool war_mode;
  60. extern int max_players;
  61. #ifdef SOURCEMM
  62. extern unsigned int g_CallBackCount;
  63. extern SourceHook::CVector<AdminInterfaceListnerStruct *>g_CallBackList;
  64. #endif
  65. ConVar mani_disable_old_clients("mani_disable_old_clients","1",0, "Disallows the engine to read the old client files (adminlist.txt, admingroups.txt, immunitylist.txt)");
  66. static int sort_mask_list ( const void *m1, const void *m2);
  67. static int sort_mask_list ( const void *m1, const void *m2)
  68. {
  69. struct mask_level_t *mi1 = (struct mask_level_t *) m1;
  70. struct mask_level_t *mi2 = (struct mask_level_t *) m2;
  71. int result = strcmp(mi1->class_type, mi2->class_type);
  72. if (result != 0) return result;
  73. return mi1->level_id - mi2->level_id;
  74. }
  75. inline bool FStruEq(const char *sz1, const char *sz2)
  76. {
  77. return(Q_strcmp(sz1, sz2) == 0);
  78. }
  79. inline bool FStrEq(const char *sz1, const char *sz2)
  80. {
  81. return(Q_stricmp(sz1, sz2) == 0);
  82. }
  83. ManiClient::ManiClient()
  84. {
  85. // Init
  86. for (int i = 0; i < MANI_MAX_PLAYERS; i++)
  87. {
  88. active_client_list[i] = NULL;
  89. }
  90. this->InitAdminFlags();
  91. this->InitImmunityFlags();
  92. gpManiClient = this;
  93. }
  94. ManiClient::~ManiClient()
  95. {
  96. // Cleanup
  97. FreeClients();
  98. }
  99. //---------------------------------------------------------------------------------
  100. // Purpose: Player active on server
  101. //---------------------------------------------------------------------------------
  102. void ManiClient::NetworkIDValidated(player_t *player_ptr)
  103. {
  104. int index;
  105. index = this->FindClientIndex(player_ptr);
  106. if (index == -1)
  107. {
  108. active_client_list[player_ptr->index - 1] = NULL;
  109. }
  110. else
  111. {
  112. active_client_list[player_ptr->index - 1] = c_list[index];
  113. // Check levels to see if masking needs to be applied to other players
  114. if (!c_list[index]->level_list.IsEmpty())
  115. {
  116. this->SetupMasked();
  117. }
  118. #ifdef SOURCEMM
  119. for(unsigned int i=0;i<g_CallBackCount;i++)
  120. {
  121. AdminInterfaceListner *ptr = (AdminInterfaceListner *)g_CallBackList[i]->ptr;
  122. if(!ptr)
  123. continue;
  124. ptr->Client_Authorized(player_ptr->index);
  125. }
  126. #endif
  127. }
  128. return;
  129. }
  130. //---------------------------------------------------------------------------------
  131. // Purpose: Check if client is officially labelled as admin
  132. //---------------------------------------------------------------------------------
  133. void ManiClient::ClientDisconnect(player_t *player_ptr)
  134. {
  135. if (active_client_list[player_ptr->index - 1] != NULL)
  136. {
  137. // Check if they had any level ids
  138. if (!active_client_list[player_ptr->index - 1]->level_list.IsEmpty())
  139. {
  140. // Reset pointer then call SetupMasks to reset other
  141. // active player masks
  142. active_client_list[player_ptr->index - 1] = NULL;
  143. this->SetupMasked();
  144. }
  145. else
  146. {
  147. active_client_list[player_ptr->index - 1] = NULL;
  148. }
  149. }
  150. UpdatePlayer( player_ptr );
  151. return;
  152. }
  153. void ManiClient::LevelShutdown() {
  154. WriteIPList();
  155. }
  156. //---------------------------------------------------------------------------------
  157. // Purpose: Parses the Admin config line setting flags
  158. //---------------------------------------------------------------------------------
  159. bool ManiClient::OldAddClient
  160. (
  161. char *file_details,
  162. old_style_client_t *client_ptr,
  163. bool is_admin
  164. )
  165. {
  166. char steam_id[MAX_NETWORKID_LENGTH]="";
  167. char ip_address[128]="";
  168. char name[MAX_PLAYER_NAME_LENGTH]="";
  169. char password[128]="";
  170. int i,j;
  171. Q_memset(client_ptr, 0, sizeof(old_style_client_t));
  172. // Setup flags for individual access
  173. if (is_admin)
  174. {
  175. for (int i = 0; i < MAX_ADMIN_FLAGS; i ++)
  176. {
  177. Q_strcpy(client_ptr->flags[i].flag_name, admin_flag_list[i].flag);
  178. if (mani_reverse_admin_flags.GetInt() == 1)
  179. {
  180. client_ptr->flags[i].enabled = false;
  181. }
  182. else
  183. {
  184. client_ptr->flags[i].enabled = true;
  185. }
  186. }
  187. client_ptr->flags[ALLOW_CLIENT_ADMIN].enabled = true;
  188. }
  189. else
  190. {
  191. for (int i = 0; i < MAX_IMMUNITY_FLAGS; i ++)
  192. {
  193. Q_strcpy(client_ptr->flags[i].flag_name, immunity_flag_list[i].flag);
  194. if (mani_reverse_immunity_flags.GetInt() == 1)
  195. {
  196. client_ptr->flags[i].enabled = true;
  197. }
  198. else
  199. {
  200. client_ptr->flags[i].enabled = false;
  201. }
  202. }
  203. client_ptr->flags[IMMUNITY_ALLOW_BASIC_IMMUNITY].enabled = true;
  204. }
  205. i = 0;
  206. if (file_details[i] != ';')
  207. {
  208. j = 0;
  209. for (;;)
  210. {
  211. if (file_details[i] == '\0')
  212. {
  213. // No more data
  214. steam_id[j] = '\0';
  215. Q_strcpy(client_ptr->steam_id, steam_id);
  216. return true;
  217. }
  218. // If reached space or tab break out of loop
  219. if (file_details[i] == ' ' ||
  220. file_details[i] == '\t' ||
  221. file_details[i] == ';')
  222. {
  223. steam_id[j] = '\0';
  224. break;
  225. }
  226. steam_id[j] = file_details[i];
  227. i++;
  228. j++;
  229. }
  230. Q_strcpy(client_ptr->steam_id, steam_id);
  231. }
  232. MMsg("%s ", steam_id);
  233. if (file_details[i] == ';')
  234. {
  235. i++;
  236. j = 0;
  237. for (;;)
  238. {
  239. if (file_details[i] == '\0')
  240. {
  241. // No more data
  242. ip_address[j] = '\0';
  243. Q_strcpy(client_ptr->ip_address, ip_address);
  244. return true;
  245. }
  246. // If reached space or tab break out of loop
  247. if (file_details[i] == ' ' ||
  248. file_details[i] == ';' ||
  249. file_details[i] == '\t')
  250. {
  251. ip_address[j] = '\0';
  252. break;
  253. }
  254. ip_address[j] = file_details[i];
  255. i++;
  256. j++;
  257. }
  258. Q_strcpy(client_ptr->ip_address, ip_address);
  259. }
  260. MMsg("%s ", ip_address);
  261. if (file_details[i] == ';' && file_details[i + 1] == '\"')
  262. {
  263. i += 2;
  264. j = 0;
  265. for (;;)
  266. {
  267. if (file_details[i] == '\0')
  268. {
  269. // No more data
  270. name[j] = '\0';
  271. Q_strcpy(client_ptr->name, name);
  272. return true;
  273. }
  274. // If reached space or tab break out of loop
  275. if (file_details[i] == '"')
  276. {
  277. i++;
  278. name[j] = '\0';
  279. break;
  280. }
  281. name[j] = file_details[i];
  282. i++;
  283. j++;
  284. }
  285. Q_strcpy(client_ptr->name, name);
  286. }
  287. MMsg("%s ", name);
  288. if (file_details[i] == ';')
  289. {
  290. i++;
  291. j = 0;
  292. for (;;)
  293. {
  294. if (file_details[i] == '\0')
  295. {
  296. // No more data
  297. password[j] = '\0';
  298. if (!client_ptr->steam_id && !client_ptr->ip_address && !client_ptr->name)
  299. {
  300. return false;
  301. }
  302. Q_strcpy(client_ptr->password, password);
  303. return true;
  304. }
  305. // If reached space or tab break out of loop
  306. if (file_details[i] == ' ' ||
  307. file_details[i] == '\t')
  308. {
  309. password[j] = '\0';
  310. break;
  311. }
  312. password[j] = file_details[i];
  313. i++;
  314. j++;
  315. }
  316. if (!client_ptr->steam_id && !client_ptr->ip_address && !client_ptr->name)
  317. {
  318. return false;
  319. }
  320. Q_strcpy(client_ptr->password, password);
  321. }
  322. MMsg("%s ", password);
  323. i++;
  324. while (file_details[i] == ' ' || file_details[i] == '\t')
  325. {
  326. i++;
  327. }
  328. const char *flags_string = &(file_details[i]);
  329. if (is_admin)
  330. {
  331. if (group_list.Find(ADMIN, flags_string))
  332. {
  333. strcpy(client_ptr->group_id, flags_string);
  334. for (int k = 0; k < MAX_ADMIN_FLAGS; k ++)
  335. {
  336. client_ptr->flags[k].enabled = false;
  337. }
  338. return true;
  339. }
  340. }
  341. else
  342. {
  343. if (group_list.Find(IMMUNITY, flags_string))
  344. {
  345. strcpy(client_ptr->group_id, flags_string);
  346. for (int k = 0; k < MAX_IMMUNITY_FLAGS; k ++)
  347. {
  348. client_ptr->flags[k].enabled = false;
  349. }
  350. return true;
  351. }
  352. }
  353. while (file_details[i] != '\0')
  354. {
  355. if (is_admin)
  356. {
  357. for (int k = 0; k < MAX_ADMIN_FLAGS; k ++)
  358. {
  359. if (file_details[i] == admin_flag_list[k].flag[0])
  360. {
  361. if (mani_reverse_admin_flags.GetInt() == 1)
  362. {
  363. client_ptr->flags[k].enabled = true;
  364. }
  365. else
  366. {
  367. client_ptr->flags[k].enabled = false;
  368. }
  369. break;
  370. }
  371. }
  372. }
  373. else
  374. {
  375. for (int k = 0; k < MAX_IMMUNITY_FLAGS; k ++)
  376. {
  377. if (file_details[i] == immunity_flag_list[k].flag[0])
  378. {
  379. if (mani_reverse_immunity_flags.GetInt() == 1)
  380. {
  381. client_ptr->flags[k].enabled = false;
  382. }
  383. else
  384. {
  385. client_ptr->flags[k].enabled = true;
  386. }
  387. break;
  388. }
  389. }
  390. }
  391. i++;
  392. }
  393. MMsg("\n");
  394. return true;
  395. }
  396. //---------------------------------------------------------------------------------
  397. // Purpose: Parses the Admin Group config line setting flags
  398. //---------------------------------------------------------------------------------
  399. void ManiClient::OldAddGroup(char *file_details, char *class_type)
  400. {
  401. char group_id[128]="";
  402. int i,j;
  403. bool reverse_flags = mani_reverse_admin_flags.GetBool();
  404. if (file_details[0] != '\"') return;
  405. i = 1;
  406. j = 0;
  407. for (;;)
  408. {
  409. if (file_details[i] == '\0')
  410. {
  411. // No more data
  412. group_id[j] = '\0';
  413. if (reverse_flags)
  414. {
  415. // No point adding group
  416. return;
  417. }
  418. GlobalGroupFlag *g_flag = group_list.AddGroup(class_type, group_id);
  419. const DualStrKey *key_value = NULL;
  420. for (const char *desc = flag_desc_list.FindFirst(class_type, &key_value); desc != NULL; desc = flag_desc_list.FindNext(class_type, &key_value))
  421. {
  422. g_flag->SetFlag(key_value->key2, true);
  423. }
  424. return;
  425. }
  426. // If reached end quote
  427. if (file_details[i] == '\"')
  428. {
  429. group_id[j] = '\0';
  430. break;
  431. }
  432. group_id[j] = file_details[i];
  433. i++;
  434. j++;
  435. }
  436. // Populate all the flags if needed
  437. if (!reverse_flags)
  438. {
  439. group_list.AddGroup(class_type, group_id);
  440. GlobalGroupFlag *g_flag = group_list.AddGroup(class_type, group_id);
  441. const DualStrKey *key_value = NULL;
  442. for (const char *desc = flag_desc_list.FindFirst(class_type, &key_value); desc != NULL; desc = flag_desc_list.FindNext(class_type, &key_value))
  443. {
  444. g_flag->SetFlag(key_value->key2, true);
  445. }
  446. }
  447. i++;
  448. while (file_details[i] != '\0')
  449. {
  450. char temp_string[8];
  451. snprintf(temp_string, sizeof(temp_string), "%c", file_details[i]);
  452. if (flag_desc_list.IsValidFlag(class_type, temp_string))
  453. {
  454. if (!reverse_flags)
  455. {
  456. GlobalGroupFlag *g_flag = group_list.AddGroup(class_type, group_id);
  457. if (g_flag)
  458. {
  459. g_flag->SetFlag(temp_string, false);
  460. }
  461. }
  462. else
  463. {
  464. GlobalGroupFlag *g_flag = group_list.AddGroup(class_type, group_id);
  465. if (g_flag)
  466. {
  467. g_flag->SetFlag(temp_string, true);
  468. }
  469. }
  470. }
  471. i++;
  472. }
  473. }
  474. //---------------------------------------------------------------------------------
  475. // Purpose: Parses the Admin Group config line setting flags
  476. //---------------------------------------------------------------------------------
  477. bool ManiClient::Init(void)
  478. {
  479. // Setup the flags
  480. flag_desc_list.LoadFlags();
  481. this->AddBuiltInFlags();
  482. FreeClients();
  483. if (!mani_disable_old_clients.GetBool() && LoadOldStyle())
  484. {
  485. // Loaded from old style adminlist.txt etc so write in new file format
  486. WriteClients();
  487. if (gpManiDatabase->GetDBEnabled())
  488. {
  489. if (this->CreateDBTables(NULL))
  490. {
  491. if (this->CreateDBFlags(NULL))
  492. {
  493. this->ExportDataToDB(NULL);
  494. }
  495. }
  496. }
  497. }
  498. FreeClients();
  499. if (gpManiDatabase->GetDBEnabled())
  500. {
  501. if (!this->GetClientsFromDatabase(NULL))
  502. {
  503. FreeClients();
  504. LoadClients();
  505. }
  506. else
  507. {
  508. WriteClients();
  509. this->SetupUnMasked();
  510. this->SetupMasked();
  511. }
  512. }
  513. else
  514. {
  515. // Load up new style clients
  516. LoadClients();
  517. }
  518. flag_desc_list.WriteFlags();
  519. this->SetupPlayersOnServer();
  520. LoadIPList();
  521. return true;
  522. }
  523. //---------------------------------------------------------------------------------
  524. // Purpose: Finds any players on the server and creates a link ptr to the client class
  525. //---------------------------------------------------------------------------------
  526. void ManiClient::SetupPlayersOnServer(void)
  527. {
  528. for (int i = 1; i <= max_players; i++)
  529. {
  530. active_client_list[i - 1] = NULL;
  531. player_t player;
  532. player.index = i;
  533. if (!FindPlayerByIndex(&player)) continue;
  534. if (player.is_bot) continue;
  535. if (strcmp(player.steam_id, "STEAM_ID_PENDING") == 0) continue;
  536. this->NetworkIDValidated(&player);
  537. }
  538. }
  539. //---------------------------------------------------------------------------------
  540. // Purpose: Loads into memory the old style admin flags
  541. //---------------------------------------------------------------------------------
  542. bool ManiClient::LoadOldStyle(void)
  543. {
  544. FileHandle_t file_handle;
  545. char base_filename[512];
  546. char old_base_filename[512];
  547. char data_in[2048];
  548. bool loaded_old_style = false;
  549. //check to see if clients.txt exists first - if so, DO NOT RUN THIS
  550. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/clients.txt", mani_path.GetString());
  551. file_handle = filesystem->Open (base_filename,"rt",NULL);
  552. if ( file_handle != NULL )
  553. {
  554. filesystem->Close(file_handle);
  555. return false;
  556. }
  557. //Get admin groups list
  558. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/admingroups.txt", mani_path.GetString());
  559. file_handle = filesystem->Open (base_filename,"rt",NULL);
  560. if (file_handle == NULL)
  561. {
  562. // MMsg("Old style admingroups.txt file does not exist, using V1.2+ style\n");
  563. }
  564. else
  565. {
  566. MMsg("Admin Group list\n");
  567. while (filesystem->ReadLine (data_in, sizeof(data_in), file_handle) != NULL)
  568. {
  569. if (!ParseLine(data_in, true, false))
  570. {
  571. // String is empty after parsing
  572. continue;
  573. }
  574. OldAddGroup(data_in, ADMIN);
  575. }
  576. filesystem->Close(file_handle);
  577. snprintf(old_base_filename, sizeof(old_base_filename), "%s.old", base_filename);
  578. filesystem->RenameFile(base_filename, old_base_filename);
  579. loaded_old_style = true;
  580. }
  581. //Get immunity groups list
  582. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/immunitygroups.txt", mani_path.GetString());
  583. file_handle = filesystem->Open (base_filename,"rt",NULL);
  584. if (file_handle == NULL)
  585. {
  586. // MMsg("Old style immunitygroups.txt file does not exist, using V1.2+ style\n");
  587. }
  588. else
  589. {
  590. MMsg("Immunity Group list\n");
  591. while (filesystem->ReadLine (data_in, sizeof(data_in), file_handle) != NULL)
  592. {
  593. if (!ParseLine(data_in, true, false))
  594. {
  595. // String is empty after parsing
  596. continue;
  597. }
  598. OldAddGroup(data_in, IMMUNITY);
  599. }
  600. filesystem->Close(file_handle);
  601. snprintf(old_base_filename, sizeof(old_base_filename), "%s.old", base_filename);
  602. filesystem->RenameFile(base_filename, old_base_filename);
  603. loaded_old_style = true;
  604. }
  605. //Get admin list
  606. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/adminlist.txt", mani_path.GetString());
  607. file_handle = filesystem->Open (base_filename,"rt",NULL);
  608. if (file_handle == NULL)
  609. {
  610. // MMsg("Old style adminlist.txt file does not exist, using V1.2+ style\n");
  611. }
  612. else
  613. {
  614. MMsg("Admin steam id list\n");
  615. while (filesystem->ReadLine (data_in, sizeof(data_in), file_handle) != NULL)
  616. {
  617. if (!ParseLine(data_in, true, false))
  618. {
  619. // String is empty after parsing
  620. continue;
  621. }
  622. old_style_client_t temp_client;
  623. if (!OldAddClient(data_in, &temp_client, true)) continue;
  624. // Client data is okay, add it to client list
  625. ConvertOldClientToNewClient(&temp_client, true);
  626. }
  627. filesystem->Close(file_handle);
  628. snprintf(old_base_filename, sizeof(old_base_filename), "%s.old", base_filename);
  629. filesystem->RenameFile(base_filename, old_base_filename);
  630. loaded_old_style = true;
  631. }
  632. //Get immunity list
  633. snprintf(base_filename, sizeof (base_filename), "./cfg/%s/immunitylist.txt", mani_path.GetString());
  634. file_handle = filesystem->Open (base_filename,"rt",NULL);
  635. if (file_handle == NULL)
  636. {
  637. // MMsg("Old style immunitylist.txt file does not exist, using V1.2+ style\n");
  638. }
  639. else
  640. {
  641. MMsg("Immunity list\n");
  642. while (filesystem->ReadLine (data_in, sizeof(data_in), file_handle) != NULL)
  643. {
  644. if (!ParseLine(data_in, true, false))
  645. {
  646. // String is empty after parsing
  647. continue;
  648. }
  649. old_style_client_t temp_client;
  650. if (!OldAddClient(data_in, &temp_client, false)) continue;
  651. // Client data is okay, add it to client list
  652. ConvertOldClientToNewClient(&temp_client, false);
  653. }
  654. filesystem->Close(file_handle);
  655. snprintf(old_base_filename, sizeof(old_base_filename), "%s.old", base_filename);
  656. filesystem->RenameFile(base_filename, old_base_filename);
  657. loaded_old_style = true;
  658. }
  659. // We have to botch in player names here that need to be unqiue
  660. for (int i = 0; i != (int) c_list.size(); i++)
  661. {
  662. // No name set up
  663. if (gpManiDatabase->GetDBEnabled())
  664. {
  665. /* Need unique name !! */
  666. char new_name[128];
  667. snprintf(new_name, sizeof(new_name), "Client_%i_%s", i+1,
  668. gpManiDatabase->GetServerGroupID());
  669. c_list[i]->SetName(new_name);
  670. }
  671. else
  672. {
  673. char new_name[128];
  674. snprintf(new_name, sizeof(new_name), "Client_%i", i+1);
  675. c_list[i]->SetName(new_name);
  676. }
  677. }
  678. this->SetupUnMasked();
  679. this->SetupMasked();
  680. return (loaded_old_style);
  681. }
  682. //---------------------------------------------------------------------------------
  683. // Purpose: Add the client to an already existing entry or create a new one
  684. //---------------------------------------------------------------------------------
  685. void ManiClient::ConvertOldClientToNewClient
  686. (
  687. old_style_client_t *old_client_ptr,
  688. bool is_admin
  689. )
  690. {
  691. ClientPlayer *client_ptr;
  692. int client_index = -1;
  693. bool by_steam = false;
  694. bool by_ip = false;
  695. bool by_name = false;
  696. // Find existing client record
  697. client_index = FindClientIndex(old_client_ptr->steam_id);
  698. if (client_index == -1)
  699. {
  700. client_index = FindClientIndex(old_client_ptr->ip_address);
  701. if (client_index == -1)
  702. {
  703. client_index = FindClientIndex(old_client_ptr->name);
  704. if (client_index != -1)
  705. {
  706. by_name = true;
  707. }
  708. }
  709. else
  710. {
  711. by_ip = true;
  712. }
  713. }
  714. else
  715. {
  716. by_steam = true;
  717. }
  718. if (client_index == -1)
  719. {
  720. // Create new client record as we didn't find one
  721. MMsg("Adding client *********\n");
  722. client_ptr = new ClientPlayer;
  723. c_list.push_back(client_ptr);
  724. }
  725. else
  726. {
  727. // We found a client so point there
  728. client_ptr = c_list[client_index];
  729. MMsg("Found client *********\n");
  730. }
  731. // Copy core information about player
  732. if (old_client_ptr->steam_id && !FStrEq(old_client_ptr->steam_id,""))
  733. {
  734. if (!by_steam)
  735. {
  736. client_ptr->steam_list.Add(old_client_ptr->steam_id);
  737. }
  738. }
  739. if (old_client_ptr->ip_address && !FStrEq(old_client_ptr->ip_address,""))
  740. {
  741. if (!by_ip)
  742. {
  743. client_ptr->ip_address_list.Add(old_client_ptr->ip_address);
  744. }
  745. }
  746. if (old_client_ptr->name && !FStrEq(old_client_ptr->name,""))
  747. {
  748. if (!by_name)
  749. {
  750. client_ptr->nick_list.Add(old_client_ptr->name);
  751. }
  752. }
  753. if (old_client_ptr->password && !FStrEq(old_client_ptr->password,""))
  754. {
  755. client_ptr->SetPassword(old_client_ptr->password);
  756. }
  757. if (old_client_ptr->group_id && !FStrEq(old_client_ptr->group_id, ""))
  758. {
  759. if (is_admin)
  760. {
  761. client_ptr->group_list.Add(ADMIN, old_client_ptr->group_id);
  762. }
  763. else
  764. {
  765. client_ptr->group_list.Add(IMMUNITY, old_client_ptr->group_id);
  766. }
  767. }
  768. // Handle flags for client
  769. if (is_admin)
  770. {
  771. for (int i = 0; i < MAX_ADMIN_FLAGS; i++)
  772. {
  773. if (old_client_ptr->flags[i].enabled)
  774. {
  775. client_ptr->personal_flag_list.SetFlag(ADMIN, old_client_ptr->flags[i].flag_name, true);
  776. }
  777. }
  778. }
  779. else
  780. {
  781. for (int i = 0; i < MAX_IMMUNITY_FLAGS; i++)
  782. {
  783. if (old_client_ptr->flags[i].enabled)
  784. {
  785. client_ptr->personal_flag_list.SetFlag(IMMUNITY, old_client_ptr->flags[i].flag_name, true);
  786. }
  787. }
  788. }
  789. }
  790. //---------------------------------------------------------------------------------
  791. // Purpose: Free's up admin list memory
  792. //---------------------------------------------------------------------------------
  793. void ManiClient::FreeClients(void)
  794. {
  795. // New free clients section
  796. for (int i = 0; i != (int) c_list.size(); i++)
  797. {
  798. delete c_list[i];
  799. }
  800. c_list.clear();
  801. group_list.Kill();
  802. level_list.Kill();
  803. for (int i = 0; i < MANI_MAX_PLAYERS; i++)
  804. {
  805. active_client_list[i] = NULL;
  806. }
  807. }
  808. //---------------------------------------------------------------------------------
  809. // Purpose: Sets up admin flags, if you add a new flag it needs to be initialised
  810. // here !!
  811. //---------------------------------------------------------------------------------
  812. bool IsCommandIssuedByServerAdmin( void )
  813. {
  814. if ( engine->IsDedicatedServer() && con_command_index > -1 )
  815. return false;
  816. if ( !engine->IsDedicatedServer() && con_command_index > 0 )
  817. return false;
  818. return true;
  819. }
  820. //---------------------------------------------------------------------------------
  821. // Purpose: Creates database tables
  822. //---------------------------------------------------------------------------------
  823. bool ManiClient::CreateDBTables(player_t *player_ptr)
  824. {
  825. ManiMySQL *mani_mysql = new ManiMySQL();
  826. OutputHelpText(GREEN_CHAT, player_ptr, "Creating DB tables if not existing....");
  827. if (!mani_mysql->Init(player_ptr))
  828. {
  829. delete mani_mysql;
  830. return false;
  831. }
  832. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClient());
  833. if (!mani_mysql->ExecuteQuery(player_ptr,
  834. "CREATE TABLE IF NOT EXISTS %s%s ( "
  835. "user_id mediumint(8) NOT NULL auto_increment, "
  836. "name varchar(32) NOT NULL, "
  837. "password varchar(32) default '', "
  838. "email varchar(255) default '', "
  839. "notes varchar(255) default '', "
  840. "PRIMARY KEY (user_id), "
  841. "UNIQUE KEY (name) "
  842. ") ENGINE=MyISAM AUTO_INCREMENT=1",
  843. gpManiDatabase->GetDBTablePrefix(),
  844. gpManiDatabase->GetDBTBClient()))
  845. {
  846. delete mani_mysql;
  847. return false;
  848. }
  849. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBSteam());
  850. if (!mani_mysql->ExecuteQuery(player_ptr,
  851. "CREATE TABLE IF NOT EXISTS %s%s( "
  852. "user_id mediumint(8) NOT NULL default '0', "
  853. "steam_id varchar(32) NOT NULL default '', "
  854. "PRIMARY KEY (user_id, steam_id) "
  855. ") ENGINE=MyISAM"
  856. , gpManiDatabase->GetDBTablePrefix(),
  857. gpManiDatabase->GetDBTBSteam()))
  858. {
  859. delete mani_mysql;
  860. return false;
  861. }
  862. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBNick());
  863. if (!mani_mysql->ExecuteQuery(player_ptr,
  864. "CREATE TABLE IF NOT EXISTS %s%s ( "
  865. "user_id mediumint(8) NOT NULL default '0', "
  866. "nick varchar(32) NOT NULL default '', "
  867. "PRIMARY KEY (user_id, nick) "
  868. ") ENGINE=MyISAM"
  869. , gpManiDatabase->GetDBTablePrefix(),
  870. gpManiDatabase->GetDBTBNick()))
  871. {
  872. delete mani_mysql;
  873. return false;
  874. }
  875. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBIP());
  876. if (!mani_mysql->ExecuteQuery(player_ptr,
  877. "CREATE TABLE IF NOT EXISTS %s%s ( "
  878. "user_id mediumint(8) NOT NULL default '0', "
  879. "ip_address varchar(32) NOT NULL default '', "
  880. "PRIMARY KEY (user_id, ip_address) "
  881. ") ENGINE=MyISAM"
  882. , gpManiDatabase->GetDBTablePrefix(),
  883. gpManiDatabase->GetDBTBIP()))
  884. {
  885. delete mani_mysql;
  886. return false;
  887. }
  888. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBFlag());
  889. if (!mani_mysql->ExecuteQuery(player_ptr,
  890. "CREATE TABLE IF NOT EXISTS %s%s ( "
  891. "flag_id varchar(20) BINARY NOT NULL default '', "
  892. "type varchar(32) NOT NULL default '', "
  893. "description varchar(128) NOT NULL default '', "
  894. "PRIMARY KEY (flag_id, type) "
  895. ") ENGINE=MyISAM",
  896. gpManiDatabase->GetDBTablePrefix(),
  897. gpManiDatabase->GetDBTBFlag()))
  898. {
  899. delete mani_mysql;
  900. return false;
  901. }
  902. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer());
  903. if (!mani_mysql->ExecuteQuery(player_ptr,
  904. "CREATE TABLE IF NOT EXISTS %s%s ( "
  905. "server_id mediumint(8) NOT NULL default '0', "
  906. "name varchar(128) NOT NULL default '', "
  907. "ip_address varchar(32) NOT NULL default '', "
  908. "port mediumint(8) NOT NULL default '0', "
  909. "mod_name varchar(64) NOT NULL default '', "
  910. "rcon_password varchar(64) default '', "
  911. "server_group_id varchar(32) NOT NULL default '', "
  912. "PRIMARY KEY (server_id), "
  913. "UNIQUE KEY (name) "
  914. ") ENGINE=MyISAM"
  915. , gpManiDatabase->GetDBTablePrefix(),
  916. gpManiDatabase->GetDBTBServer()))
  917. {
  918. delete mani_mysql;
  919. return false;
  920. }
  921. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBGroup());
  922. if (!mani_mysql->ExecuteQuery(player_ptr,
  923. "CREATE TABLE IF NOT EXISTS %s%s ( "
  924. "group_id varchar(32) NOT NULL default '', "
  925. "flag_string text, "
  926. "type varchar(32) NOT NULL default '', "
  927. "server_group_id varchar(32) NOT NULL default '', "
  928. "PRIMARY KEY (group_id, type, server_group_id) "
  929. ") ENGINE=MyISAM"
  930. , gpManiDatabase->GetDBTablePrefix(),
  931. gpManiDatabase->GetDBTBGroup()))
  932. {
  933. delete mani_mysql;
  934. return false;
  935. }
  936. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientGroup());
  937. if (!mani_mysql->ExecuteQuery(player_ptr,
  938. "CREATE TABLE IF NOT EXISTS %s%s ( "
  939. "user_id mediumint(8) NOT NULL default '0', "
  940. "group_id varchar(32) NOT NULL default '', "
  941. "type varchar(32) NOT NULL default '', "
  942. "server_group_id varchar(32) NOT NULL default '', "
  943. "PRIMARY KEY (user_id, group_id, type, server_group_id) "
  944. ") ENGINE=MyISAM",
  945. gpManiDatabase->GetDBTablePrefix(),
  946. gpManiDatabase->GetDBTBClientGroup()))
  947. {
  948. delete mani_mysql;
  949. return false;
  950. }
  951. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientFlag());
  952. if (!mani_mysql->ExecuteQuery(player_ptr,
  953. "CREATE TABLE IF NOT EXISTS %s%s ( "
  954. "user_id mediumint(8) NOT NULL default '0', "
  955. "flag_string text, "
  956. "type varchar(32) NOT NULL default '', "
  957. "server_group_id varchar(32) NOT NULL default '', "
  958. "PRIMARY KEY (user_id, type, server_group_id) "
  959. ") ENGINE=MyISAM"
  960. , gpManiDatabase->GetDBTablePrefix(),
  961. gpManiDatabase->GetDBTBClientFlag()))
  962. {
  963. delete mani_mysql;
  964. return false;
  965. }
  966. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientLevel());
  967. if (!mani_mysql->ExecuteQuery(player_ptr,
  968. "CREATE TABLE IF NOT EXISTS %s%s( "
  969. "user_id mediumint(8) NOT NULL default '0', "
  970. "level_id mediumint(8) NOT NULL default '-1', "
  971. "type varchar(32) NOT NULL default '', "
  972. "server_group_id varchar(32) NOT NULL default '', "
  973. "PRIMARY KEY (user_id, level_id, type, server_group_id) "
  974. ") ENGINE=MyISAM"
  975. , gpManiDatabase->GetDBTablePrefix(),
  976. gpManiDatabase->GetDBTBClientLevel()))
  977. {
  978. delete mani_mysql;
  979. return false;
  980. }
  981. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBLevel());
  982. if (!mani_mysql->ExecuteQuery(player_ptr,
  983. "CREATE TABLE IF NOT EXISTS %s%s ( "
  984. "level_id mediumint(8) NOT NULL default '-1', "
  985. "type varchar(32) NOT NULL default '', "
  986. "flag_string text, "
  987. "server_group_id varchar(32) NOT NULL default '', "
  988. "PRIMARY KEY (level_id, type, server_group_id) "
  989. ") ENGINE=MyISAM"
  990. , gpManiDatabase->GetDBTablePrefix(),
  991. gpManiDatabase->GetDBTBLevel()))
  992. {
  993. delete mani_mysql;
  994. return false;
  995. }
  996. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientServer());
  997. if (!mani_mysql->ExecuteQuery(player_ptr,
  998. "CREATE TABLE IF NOT EXISTS %s%s ( "
  999. "user_id mediumint(8) NOT NULL default '0', "
  1000. "server_group_id varchar(32) NOT NULL default '0', "
  1001. "PRIMARY KEY (user_id, server_group_id) "
  1002. ") ENGINE=MyISAM"
  1003. , gpManiDatabase->GetDBTablePrefix(),
  1004. gpManiDatabase->GetDBTBClientServer()))
  1005. {
  1006. delete mani_mysql;
  1007. return false;
  1008. }
  1009. OutputHelpText(GREEN_CHAT, player_ptr, "Creating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBVersion());
  1010. if (!mani_mysql->ExecuteQuery(player_ptr,
  1011. "CREATE TABLE IF NOT EXISTS %s%s ( "
  1012. "version_id varchar(20) NOT NULL)",
  1013. gpManiDatabase->GetDBTablePrefix(),
  1014. gpManiDatabase->GetDBTBVersion()))
  1015. {
  1016. delete mani_mysql;
  1017. return false;
  1018. }
  1019. OutputHelpText(GREEN_CHAT, player_ptr, "Checking %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBVersion());
  1020. int row_count;
  1021. if (mani_mysql->ExecuteQuery(player_ptr, &row_count, "SELECT 1 FROM %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBVersion()))
  1022. {
  1023. if (row_count == 0)
  1024. {
  1025. OutputHelpText(GREEN_CHAT, player_ptr, "No rows found, inserting into %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBVersion());
  1026. // No rows so insert one
  1027. if (!mani_mysql->ExecuteQuery(player_ptr,
  1028. "INSERT INTO %s%s VALUES ('%s')",
  1029. gpManiDatabase->GetDBTablePrefix(),
  1030. gpManiDatabase->GetDBTBVersion(),
  1031. PLUGIN_VERSION_ID2))
  1032. {
  1033. delete mani_mysql;
  1034. return false;
  1035. }
  1036. }
  1037. else
  1038. {
  1039. OutputHelpText(GREEN_CHAT, player_ptr, "Row found, updating %s%s", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBVersion());
  1040. if (!mani_mysql->ExecuteQuery(player_ptr,
  1041. "UPDATE %s%s SET version_id = '%s'",
  1042. gpManiDatabase->GetDBTablePrefix(),
  1043. gpManiDatabase->GetDBTBVersion(),
  1044. PLUGIN_VERSION_ID2))
  1045. {
  1046. delete mani_mysql;
  1047. return false;
  1048. }
  1049. }
  1050. }
  1051. else
  1052. {
  1053. delete mani_mysql;
  1054. return false;
  1055. }
  1056. delete mani_mysql;
  1057. return true;
  1058. }
  1059. //---------------------------------------------------------------------------------
  1060. // Purpose: Creates flag information in tables
  1061. //---------------------------------------------------------------------------------
  1062. bool ManiClient::CreateDBFlags(player_t *player_ptr)
  1063. {
  1064. ManiMySQL *mani_mysql = new ManiMySQL();
  1065. if (!mani_mysql->Init(player_ptr))
  1066. {
  1067. delete mani_mysql;
  1068. return false;
  1069. }
  1070. OutputHelpText(GREEN_CHAT, player_ptr, "Generating DB access flags if not existing....");
  1071. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  1072. {
  1073. const DualStrKey *key_value = NULL;
  1074. for (const char *desc = flag_desc_list.FindFirst(c_type, &key_value); desc != NULL; desc = flag_desc_list.FindNext(c_type, &key_value))
  1075. {
  1076. OutputHelpText(ORANGE_CHAT, player_ptr, "Checking class [%s] flag_id [%s]", c_type, key_value->key2);
  1077. int row_count = 0;
  1078. if (!mani_mysql->ExecuteQuery(player_ptr, &row_count, "SELECT f.description "
  1079. "FROM %s%s f "
  1080. "where f.flag_id = '%s' "
  1081. "and f.type = '%s'",
  1082. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBFlag(),
  1083. key_value->key2, c_type))
  1084. {
  1085. delete mani_mysql;
  1086. return false;
  1087. }
  1088. if (row_count == 0)
  1089. {
  1090. OutputHelpText(ORANGE_CHAT, player_ptr, "Inserting class [%s] flag_id [%s]", c_type, key_value->key2);
  1091. // Setup flag record
  1092. if (!mani_mysql->ExecuteQuery(player_ptr, "INSERT INTO %s%s (flag_id, type, description) VALUES ('%s', '%s', '%s')",
  1093. gpManiDatabase->GetDBTablePrefix(),
  1094. gpManiDatabase->GetDBTBFlag(),
  1095. key_value->key2,
  1096. c_type,
  1097. desc))
  1098. {
  1099. delete mani_mysql;
  1100. return false;
  1101. }
  1102. }
  1103. else
  1104. {
  1105. mani_mysql->FetchRow();
  1106. if (strcmp(mani_mysql->GetString(0), desc) != 0)
  1107. {
  1108. OutputHelpText(ORANGE_CHAT, player_ptr, "Updating class [%s] flag_id [%s] with new description [%s]", c_type, key_value->key2, desc);
  1109. // Update to the new description
  1110. if (!mani_mysql->ExecuteQuery(player_ptr, "UPDATE %s%s SET description = '%s' WHERE flag_id = '%s' AND type = '%s'",
  1111. gpManiDatabase->GetDBTablePrefix(),
  1112. gpManiDatabase->GetDBTBFlag(),
  1113. desc,
  1114. key_value->key2,
  1115. c_type))
  1116. {
  1117. delete mani_mysql;
  1118. return false;
  1119. }
  1120. }
  1121. }
  1122. }
  1123. }
  1124. OutputHelpText(GREEN_CHAT, player_ptr, "Updating version id..");
  1125. mani_mysql->ExecuteQuery(player_ptr,
  1126. "UPDATE %s%s "
  1127. "SET version_id = '%s'",
  1128. gpManiDatabase->GetDBTablePrefix(),
  1129. gpManiDatabase->GetDBTBVersion(),
  1130. PLUGIN_CORE_VERSION);
  1131. delete mani_mysql;
  1132. return true;
  1133. }
  1134. //---------------------------------------------------------------------------------
  1135. // Purpose: Export data in memory to the database
  1136. //---------------------------------------------------------------------------------
  1137. bool ManiClient::ExportDataToDB(player_t *player_ptr)
  1138. {
  1139. char flag_string[2048];
  1140. OutputHelpText(GREEN_CHAT, player_ptr, "Exporting data from clients.txt to DB....");
  1141. ManiMySQL *mani_mysql = new ManiMySQL();
  1142. if (!mani_mysql->Init(player_ptr))
  1143. {
  1144. delete mani_mysql;
  1145. return false;
  1146. }
  1147. // Clean out tables for this server id
  1148. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_group_id = '%s'", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBGroup(), gpManiDatabase->GetServerGroupID()))
  1149. {
  1150. delete mani_mysql;
  1151. return false;
  1152. }
  1153. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_group_id = '%s'", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientGroup(), gpManiDatabase->GetServerGroupID()))
  1154. {
  1155. delete mani_mysql;
  1156. return false;
  1157. }
  1158. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_group_id = '%s'", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBLevel(), gpManiDatabase->GetServerGroupID()))
  1159. {
  1160. delete mani_mysql;
  1161. return false;
  1162. }
  1163. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_group_id = '%s'", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientLevel(), gpManiDatabase->GetServerGroupID()))
  1164. {
  1165. delete mani_mysql;
  1166. return false;
  1167. }
  1168. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_group_id = '%s'", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientFlag(), gpManiDatabase->GetServerGroupID()))
  1169. {
  1170. delete mani_mysql;
  1171. return false;
  1172. }
  1173. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_group_id = '%s'", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientServer(), gpManiDatabase->GetServerGroupID()))
  1174. {
  1175. delete mani_mysql;
  1176. return false;
  1177. }
  1178. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_id = %i", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer(), gpManiDatabase->GetServerID()))
  1179. {
  1180. delete mani_mysql;
  1181. return false;
  1182. }
  1183. OutputHelpText(GREEN_CHAT, player_ptr, "Deleted existing DB data for this server....");
  1184. // Do server details
  1185. if (!mani_mysql->ExecuteQuery(player_ptr,
  1186. "INSERT INTO %s%s VALUES (%i, '%s', '%s', %i, '%s', '%s', '%s')",
  1187. gpManiDatabase->GetDBTablePrefix(),
  1188. gpManiDatabase->GetDBTBServer(),
  1189. gpManiDatabase->GetServerID(),
  1190. gpManiDatabase->GetServerName(),
  1191. gpManiDatabase->GetServerIPAddress(),
  1192. gpManiDatabase->GetServerPort(),
  1193. gpManiDatabase->GetModName(),
  1194. gpManiDatabase->GetRCONPassword(),
  1195. gpManiDatabase->GetServerGroupID()
  1196. ))
  1197. {
  1198. delete mani_mysql;
  1199. return false;
  1200. }
  1201. OutputHelpText(GREEN_CHAT, player_ptr, "Generated server details....");
  1202. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  1203. {
  1204. const DualStrIntKey *key_value = NULL;
  1205. for (GlobalGroupFlag *g_flag = level_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = level_list.FindNext(c_type, &key_value))
  1206. {
  1207. Q_strcpy(flag_string, "");
  1208. if (g_flag->CatFlags(flag_string))
  1209. {
  1210. if (!mani_mysql->ExecuteQuery(player_ptr,
  1211. "INSERT IGNORE INTO %s%s (level_id, type, flag_string, server_group_id) VALUES (%i, '%s', '%s', '%s')",
  1212. gpManiDatabase->GetDBTablePrefix(),
  1213. gpManiDatabase->GetDBTBLevel(),
  1214. key_value->key2,
  1215. key_value->key1,
  1216. flag_string,
  1217. gpManiDatabase->GetServerGroupID()))
  1218. {
  1219. delete mani_mysql;
  1220. return false;
  1221. }
  1222. }
  1223. }
  1224. }
  1225. OutputHelpText(GREEN_CHAT, player_ptr, "Generated level groups....");
  1226. // Do the flag groups next
  1227. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  1228. {
  1229. const DualStriKey *key_value = NULL;
  1230. for (GlobalGroupFlag *g_flag = group_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = group_list.FindNext(c_type, &key_value))
  1231. {
  1232. Q_strcpy(flag_string, "");
  1233. if (g_flag->CatFlags(flag_string))
  1234. {
  1235. if (!mani_mysql->ExecuteQuery(player_ptr,
  1236. "INSERT IGNORE INTO %s%s (group_id, flag_string, type, server_group_id) VALUES ('%s', '%s', '%s', '%s')",
  1237. gpManiDatabase->GetDBTablePrefix(),
  1238. gpManiDatabase->GetDBTBGroup(),
  1239. key_value->key2,
  1240. flag_string,
  1241. key_value->key1,
  1242. gpManiDatabase->GetServerGroupID()))
  1243. {
  1244. delete mani_mysql;
  1245. return false;
  1246. }
  1247. }
  1248. }
  1249. }
  1250. OutputHelpText(GREEN_CHAT, player_ptr, "Generated DB global groups....");
  1251. OutputHelpText(GREEN_CHAT, player_ptr, "Building DB client data for %i clients", (int) c_list.size());
  1252. // Populate client list for players that already exist on the server
  1253. // and generate new clients if necessary with user ids
  1254. for (int i = 0; i != (int) c_list.size(); i ++)
  1255. {
  1256. int row_count;
  1257. OutputHelpText(GREEN_CHAT, player_ptr, "%i", (int) c_list.size() - i);
  1258. c_list[i]->SetUserID(-1);
  1259. if (!mani_mysql->ExecuteQuery(player_ptr,
  1260. &row_count,
  1261. "SELECT user_id FROM %s%s WHERE name = '%s'", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClient(), c_list[i]->GetName()))
  1262. {
  1263. delete mani_mysql;
  1264. return false;
  1265. }
  1266. if (row_count != 0)
  1267. {
  1268. if (!mani_mysql->FetchRow())
  1269. {
  1270. // Should get at least 1 row
  1271. delete mani_mysql;
  1272. return false;
  1273. }
  1274. c_list[i]->SetUserID(mani_mysql->GetInt(0));
  1275. }
  1276. else
  1277. {
  1278. if (!mani_mysql->ExecuteQuery(player_ptr,
  1279. "INSERT IGNORE INTO %s%s "
  1280. "(name, password, email, notes) "
  1281. "VALUES "
  1282. "('%s', '%s', '%s', '%s')",
  1283. gpManiDatabase->GetDBTablePrefix(),
  1284. gpManiDatabase->GetDBTBClient(),
  1285. c_list[i]->GetName(),
  1286. c_list[i]->GetPassword(),
  1287. c_list[i]->GetEmailAddress(),
  1288. c_list[i]->GetNotes()))
  1289. {
  1290. delete mani_mysql;
  1291. return false;
  1292. }
  1293. c_list[i]->SetUserID(mani_mysql->GetRowID());
  1294. }
  1295. // Setup steam ids
  1296. if (!mani_mysql->ExecuteQuery(player_ptr,
  1297. "DELETE FROM %s%s WHERE user_id = %i",
  1298. gpManiDatabase->GetDBTablePrefix(),
  1299. gpManiDatabase->GetDBTBSteam(),
  1300. c_list[i]->GetUserID()))
  1301. {
  1302. delete mani_mysql;
  1303. return false;
  1304. }
  1305. for (const char *steam_id = c_list[i]->steam_list.FindFirst(); steam_id != NULL; steam_id = c_list[i]->steam_list.FindNext())
  1306. {
  1307. if (!mani_mysql->ExecuteQuery(player_ptr,
  1308. "INSERT IGNORE INTO %s%s (user_id, steam_id) VALUES (%i, '%s')",
  1309. gpManiDatabase->GetDBTablePrefix(),
  1310. gpManiDatabase->GetDBTBSteam(),
  1311. c_list[i]->GetUserID(),
  1312. steam_id))
  1313. {
  1314. delete mani_mysql;
  1315. return false;
  1316. }
  1317. }
  1318. // Setup ip addresses
  1319. if (!mani_mysql->ExecuteQuery(player_ptr,
  1320. "DELETE FROM %s%s WHERE user_id = %i",
  1321. gpManiDatabase->GetDBTablePrefix(),
  1322. gpManiDatabase->GetDBTBIP(),
  1323. c_list[i]->GetUserID()))
  1324. {
  1325. delete mani_mysql;
  1326. return false;
  1327. }
  1328. for (const char *ip_address = c_list[i]->ip_address_list.FindFirst(); ip_address != NULL; ip_address = c_list[i]->ip_address_list.FindNext())
  1329. {
  1330. if (!mani_mysql->ExecuteQuery(player_ptr,
  1331. "INSERT IGNORE INTO %s%s (user_id, ip_address) VALUES (%i, '%s')",
  1332. gpManiDatabase->GetDBTablePrefix(),
  1333. gpManiDatabase->GetDBTBIP(),
  1334. c_list[i]->GetUserID(),
  1335. ip_address))
  1336. {
  1337. delete mani_mysql;
  1338. return false;
  1339. }
  1340. }
  1341. // Setup nickname ids
  1342. if (!mani_mysql->ExecuteQuery(player_ptr,
  1343. "DELETE FROM %s%s WHERE user_id = %i",
  1344. gpManiDatabase->GetDBTablePrefix(),
  1345. gpManiDatabase->GetDBTBNick(),
  1346. c_list[i]->GetUserID()))
  1347. {
  1348. delete mani_mysql;
  1349. return false;
  1350. }
  1351. for (const char *nick = c_list[i]->nick_list.FindFirst(); nick != NULL; nick = c_list[i]->nick_list.FindNext())
  1352. {
  1353. if (!mani_mysql->ExecuteQuery(player_ptr,
  1354. "INSERT IGNORE INTO %s%s (user_id, nick) VALUES (%i, '%s')",
  1355. gpManiDatabase->GetDBTablePrefix(),
  1356. gpManiDatabase->GetDBTBNick(),
  1357. c_list[i]->GetUserID(),
  1358. nick))
  1359. {
  1360. delete mani_mysql;
  1361. return false;
  1362. }
  1363. }
  1364. // Setup client_server record
  1365. if (!mani_mysql->ExecuteQuery(player_ptr,
  1366. "INSERT INTO %s%s (user_id, server_group_id) VALUES (%i, '%s')",
  1367. gpManiDatabase->GetDBTablePrefix(),
  1368. gpManiDatabase->GetDBTBClientServer(),
  1369. c_list[i]->GetUserID(),
  1370. gpManiDatabase->GetServerGroupID()))
  1371. {
  1372. delete mani_mysql;
  1373. return false;
  1374. }
  1375. Q_strcpy(flag_string, "");
  1376. // Client personal flags
  1377. // Search through known about flags
  1378. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  1379. {
  1380. if (c_list[i]->personal_flag_list.CatFlags(flag_string, c_type))
  1381. {
  1382. if (!mani_mysql->ExecuteQuery(player_ptr,
  1383. "INSERT IGNORE INTO %s%s (user_id, flag_string, type, server_group_id) VALUES (%i,'%s','%s','%s')",
  1384. gpManiDatabase->GetDBTablePrefix(),
  1385. gpManiDatabase->GetDBTBClientFlag(),
  1386. c_list[i]->GetUserID(),
  1387. flag_string,
  1388. c_type,
  1389. gpManiDatabase->GetServerGroupID()))
  1390. {
  1391. delete mani_mysql;
  1392. return false;
  1393. }
  1394. }
  1395. }
  1396. // Do the client_group flags next
  1397. const char *group_id = NULL;
  1398. for (const char *c_type = c_list[i]->group_list.FindFirst(&group_id); c_type != NULL; c_type = c_list[i]->group_list.FindNext(&group_id))
  1399. {
  1400. if (!mani_mysql->ExecuteQuery(player_ptr,
  1401. "INSERT IGNORE INTO %s%s (user_id, group_id, type, server_group_id) VALUES (%i,'%s','%s','%s')",
  1402. gpManiDatabase->GetDBTablePrefix(),
  1403. gpManiDatabase->GetDBTBClientGroup(),
  1404. c_list[i]->GetUserID(),
  1405. group_id,
  1406. c_type,
  1407. gpManiDatabase->GetServerGroupID()))
  1408. {
  1409. delete mani_mysql;
  1410. return false;
  1411. }
  1412. }
  1413. // Do the client_level flags next
  1414. const char *cl_type = NULL;
  1415. for (int level_id = c_list[i]->level_list.FindFirst(&cl_type); level_id != -99999; level_id = c_list[i]->level_list.FindNext(&cl_type))
  1416. {
  1417. if (!mani_mysql->ExecuteQuery(player_ptr,
  1418. "INSERT IGNORE INTO %s%s (user_id, level_id, type, server_group_id) VALUES (%i,%i,'%s','%s')",
  1419. gpManiDatabase->GetDBTablePrefix(),
  1420. gpManiDatabase->GetDBTBClientLevel(),
  1421. c_list[i]->GetUserID(),
  1422. level_id,
  1423. cl_type,
  1424. gpManiDatabase->GetServerGroupID()))
  1425. {
  1426. delete mani_mysql;
  1427. return false;
  1428. }
  1429. }
  1430. }
  1431. OutputHelpText(GREEN_CHAT, player_ptr, "Clients built on DB");
  1432. delete mani_mysql;
  1433. return true;
  1434. }
  1435. //---------------------------------------------------------------------------------
  1436. // Purpose: Export server id information
  1437. //---------------------------------------------------------------------------------
  1438. bool ManiClient::UploadServerID(player_t *player_ptr)
  1439. {
  1440. OutputHelpText(GREEN_CHAT, player_ptr, "Exporting data from database.txt to DB....");
  1441. ManiMySQL *mani_mysql = new ManiMySQL();
  1442. if (!mani_mysql->Init(player_ptr))
  1443. {
  1444. delete mani_mysql;
  1445. return false;
  1446. }
  1447. if (!mani_mysql->ExecuteQuery(player_ptr, "DELETE FROM %s%s WHERE server_id = %i",
  1448. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer(), gpManiDatabase->GetServerID()))
  1449. {
  1450. delete mani_mysql;
  1451. return false;
  1452. }
  1453. OutputHelpText(GREEN_CHAT, player_ptr, "Deleted existing server information for this server....");
  1454. // Do server details
  1455. if (!mani_mysql->ExecuteQuery(player_ptr,
  1456. "INSERT INTO %s%s VALUES (%i, '%s', '%s', %i, '%s', '%s', '%s')",
  1457. gpManiDatabase->GetDBTablePrefix(),
  1458. gpManiDatabase->GetDBTBServer(),
  1459. gpManiDatabase->GetServerID(),
  1460. gpManiDatabase->GetServerName(),
  1461. gpManiDatabase->GetServerIPAddress(),
  1462. gpManiDatabase->GetServerPort(),
  1463. gpManiDatabase->GetModName(),
  1464. gpManiDatabase->GetRCONPassword(),
  1465. gpManiDatabase->GetServerGroupID()
  1466. ))
  1467. {
  1468. delete mani_mysql;
  1469. return false;
  1470. }
  1471. OutputHelpText(GREEN_CHAT, player_ptr, "Generated server details....");
  1472. return true;
  1473. }
  1474. //---------------------------------------------------------------------------------
  1475. // Purpose: Get Client data from database
  1476. //---------------------------------------------------------------------------------
  1477. bool ManiClient::GetClientsFromDatabase(player_t *player_ptr)
  1478. {
  1479. bool found_flag;
  1480. int row_count;
  1481. char flags_string[2048];
  1482. // Upgrade the database to V1.2 Beta M functionality
  1483. UpgradeDB1();
  1484. OutputHelpText(GREEN_CHAT, player_ptr, "Getting client info from the database....");
  1485. ManiMySQL *mani_mysql = new ManiMySQL();
  1486. if (!mani_mysql->Init(player_ptr))
  1487. {
  1488. delete mani_mysql;
  1489. return false;
  1490. }
  1491. if (!mani_mysql->ExecuteQuery(player_ptr,
  1492. "UPDATE %s%s SET server_group_id = '%s' WHERE server_id = %i",
  1493. gpManiDatabase->GetDBTablePrefix(),
  1494. gpManiDatabase->GetDBTBServer(),
  1495. gpManiDatabase->GetServerGroupID(),
  1496. gpManiDatabase->GetServerID()))
  1497. {
  1498. delete mani_mysql;
  1499. mani_mysql = new ManiMySQL();
  1500. if (!mani_mysql->Init(player_ptr))
  1501. {
  1502. delete mani_mysql;
  1503. return false;
  1504. }
  1505. }
  1506. // Get admin groups
  1507. if (!mani_mysql->ExecuteQuery(player_ptr,
  1508. &row_count,
  1509. "SELECT g.group_id, g.flag_string, g.type "
  1510. "FROM %s%s g "
  1511. "WHERE g.server_group_id = '%s' ",
  1512. gpManiDatabase->GetDBTablePrefix(),
  1513. gpManiDatabase->GetDBTBGroup(),
  1514. gpManiDatabase->GetServerGroupID()))
  1515. {
  1516. delete mani_mysql;
  1517. return false;
  1518. }
  1519. if (row_count != 0)
  1520. {
  1521. // Found rows
  1522. while (mani_mysql->FetchRow())
  1523. {
  1524. char *group_id = mani_mysql->GetString(0);
  1525. Q_strcpy(flags_string, mani_mysql->GetString(1));
  1526. char *class_type = mani_mysql->GetString(2);
  1527. int flag_index = 0;
  1528. for (;;)
  1529. {
  1530. char *flag_id = SplitFlagString(flags_string, &flag_index);
  1531. if (flag_id == NULL)
  1532. {
  1533. break;
  1534. }
  1535. if (flag_desc_list.IsValidFlag(class_type, flag_id))
  1536. {
  1537. // Create/Update group/level
  1538. GlobalGroupFlag *g_flag = group_list.AddGroup(class_type, group_id);
  1539. if (g_flag)
  1540. {
  1541. g_flag->SetFlag(flag_id, true);
  1542. }
  1543. }
  1544. }
  1545. }
  1546. }
  1547. // Get admin levels
  1548. if (!mani_mysql->ExecuteQuery(player_ptr,
  1549. &row_count,
  1550. "SELECT l.level_id, l.flag_string, l.type "
  1551. "FROM %s%s l "
  1552. "WHERE l.server_group_id = '%s' "
  1553. "ORDER BY l.level_id",
  1554. gpManiDatabase->GetDBTablePrefix(),
  1555. gpManiDatabase->GetDBTBLevel(),
  1556. gpManiDatabase->GetServerGroupID()))
  1557. {
  1558. delete mani_mysql;
  1559. return false;
  1560. }
  1561. if (row_count != 0)
  1562. {
  1563. // Found rows
  1564. while (mani_mysql->FetchRow())
  1565. {
  1566. char *level_id = mani_mysql->GetString(0);
  1567. Q_strcpy(flags_string, mani_mysql->GetString(1));
  1568. char *class_type = mani_mysql->GetString(2);
  1569. int flag_index = 0;
  1570. for (;;)
  1571. {
  1572. char *flag_id = SplitFlagString(flags_string, &flag_index);
  1573. if (flag_id == NULL)
  1574. {
  1575. break;
  1576. }
  1577. if (flag_desc_list.IsValidFlag(class_type, flag_id))
  1578. {
  1579. // Create/Update group/level
  1580. GlobalGroupFlag *g_flag = level_list.AddGroup(class_type, atoi(level_id));
  1581. if (g_flag)
  1582. {
  1583. g_flag->SetFlag(flag_id, true);
  1584. }
  1585. }
  1586. }
  1587. }
  1588. }
  1589. // Get clients for this server
  1590. // Ridiculous search that brings back too many rows but ultimately
  1591. // is faster than doing all the seperate selects per client
  1592. // to do the same thing :(
  1593. OutputHelpText(GREEN_CHAT, player_ptr, "SQL server version [%s]", mani_mysql->GetServerVersion());
  1594. OutputHelpText(GREEN_CHAT, player_ptr, "Major [%i] Minor [%i] Issue [%i]", mani_mysql->GetMajor(), mani_mysql->GetMinor(), mani_mysql->GetIssue());
  1595. if (mani_mysql->IsHigherVer(5,0,11))
  1596. {
  1597. // Post 5.0.11
  1598. if (!mani_mysql->ExecuteQuery(player_ptr,
  1599. &row_count,
  1600. "select c.user_id, c.name, c.password, c.email, c.notes, "
  1601. "cf.type, cf.flag_string, "
  1602. "s.steam_id, n.nick, i.ip_address, "
  1603. "cg.type, cg.group_id, "
  1604. "cl.type, cl.level_id "
  1605. "from (%s%s c, %s%s cs) "
  1606. "LEFT JOIN (%s%s s) ON (s.user_id = c.user_id) "
  1607. "LEFT JOIN (%s%s cf) ON (cf.user_id = c.user_id) "
  1608. "LEFT JOIN (%s%s n) ON (n.user_id = c.user_id) "
  1609. "LEFT JOIN (%s%s i) ON (i.user_id = c.user_id) "
  1610. "LEFT JOIN (%s%s cg) ON (cg.user_id = c.user_id AND cg.server_group_id = cs.server_group_id) "
  1611. "LEFT JOIN (%s%s cl) ON (cl.user_id = c.user_id AND cl.server_group_id = cs.server_group_id) "
  1612. "where c.user_id = cs.user_id "
  1613. "and cs.server_group_id = '%s' "
  1614. "order by c.user_id, cf.type, s.steam_id, n.nick, i.ip_address, cg.type, "
  1615. "cg.group_id, cl.type, cl.level_id ",
  1616. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClient(),
  1617. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientServer(),
  1618. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBSteam(),
  1619. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientFlag(),
  1620. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBNick(),
  1621. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBIP(),
  1622. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientGroup(),
  1623. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientLevel(),
  1624. gpManiDatabase->GetServerGroupID()))
  1625. {
  1626. delete mani_mysql;
  1627. return false;
  1628. }
  1629. }
  1630. else
  1631. {
  1632. if (!mani_mysql->ExecuteQuery(player_ptr,
  1633. &row_count,
  1634. "select c.user_id, c.name, c.password, c.email, c.notes, "
  1635. "cf.type, cf.flag_string, "
  1636. "s.steam_id, n.nick, i.ip_address, "
  1637. "cg.type, cg.group_id, "
  1638. "cl.type, cl.level_id "
  1639. "from %s%s c, %s%s cs "
  1640. "LEFT JOIN %s%s s ON (s.user_id = c.user_id) "
  1641. "LEFT JOIN %s%s cf ON (cf.user_id = c.user_id) "
  1642. "LEFT JOIN %s%s n ON (n.user_id = c.user_id) "
  1643. "LEFT JOIN %s%s i ON (i.user_id = c.user_id) "
  1644. "LEFT JOIN %s%s cg ON (cg.user_id = c.user_id AND cg.server_group_id = cs.server_group_id) "
  1645. "LEFT JOIN %s%s cl ON (cl.user_id = c.user_id AND cl.server_group_id = cs.server_group_id) "
  1646. "where c.user_id = cs.user_id "
  1647. "and cs.server_group_id = '%s' "
  1648. "order by c.user_id, cf.type, s.steam_id, n.nick, i.ip_address, cg.type, "
  1649. "cg.group_id, cl.type, cl.level_id ",
  1650. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClient(),
  1651. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientServer(),
  1652. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBSteam(),
  1653. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientFlag(),
  1654. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBNick(),
  1655. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBIP(),
  1656. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientGroup(),
  1657. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBClientLevel(),
  1658. gpManiDatabase->GetServerGroupID()))
  1659. {
  1660. delete mani_mysql;
  1661. return false;
  1662. }
  1663. }
  1664. // Declare 'last' vars to keep track of changing data
  1665. int last_user_id = -1;
  1666. if (row_count != 0)
  1667. {
  1668. ClientPlayer *client_ptr = NULL;
  1669. // Found rows
  1670. while (mani_mysql->FetchRow())
  1671. {
  1672. if (last_user_id != mani_mysql->GetInt(0))
  1673. {
  1674. client_ptr = new ClientPlayer;
  1675. c_list.push_back(client_ptr);
  1676. client_ptr->SetUserID(mani_mysql->GetInt(0));
  1677. client_ptr->SetName(mani_mysql->GetString(1));
  1678. client_ptr->SetPassword(mani_mysql->GetString(2));
  1679. client_ptr->SetEmailAddress(mani_mysql->GetString(3));
  1680. client_ptr->SetNotes(mani_mysql->GetString(4));
  1681. last_user_id = client_ptr->GetUserID();
  1682. }
  1683. // Do personal flags first
  1684. if (mani_mysql->GetString(5) &&
  1685. mani_mysql->GetString(6))
  1686. {
  1687. Q_strcpy(flags_string, mani_mysql->GetString(6));
  1688. int flag_index = 0;
  1689. for (;;)
  1690. {
  1691. char *flag_id = this->SplitFlagString(flags_string, &flag_index);
  1692. if (flag_id == NULL)
  1693. {
  1694. break;
  1695. }
  1696. if (flag_desc_list.IsValidFlag(mani_mysql->GetString(5), flag_id))
  1697. {
  1698. // Set personal flag for class type
  1699. client_ptr->personal_flag_list.SetFlag(mani_mysql->GetString(5), flag_id, true);
  1700. }
  1701. }
  1702. }
  1703. // Group levels
  1704. if (mani_mysql->GetString(12) &&
  1705. mani_mysql->GetString(13))
  1706. {
  1707. // Ensure no duplicates
  1708. client_ptr->level_list.Add(mani_mysql->GetString(12), mani_mysql->GetInt(13));
  1709. }
  1710. // Check Steam ID
  1711. if (mani_mysql->GetString(7))
  1712. {
  1713. client_ptr->steam_list.Add(mani_mysql->GetString(7));
  1714. }
  1715. // Check Nick names
  1716. if (mani_mysql->GetString(8))
  1717. {
  1718. client_ptr->nick_list.Add(mani_mysql->GetString(8));
  1719. }
  1720. // Check IP Addresses
  1721. if (mani_mysql->GetString(9))
  1722. {
  1723. client_ptr->ip_address_list.Add(mani_mysql->GetString(9));
  1724. }
  1725. // Check admin groups
  1726. // Group levels
  1727. found_flag = false;
  1728. if (mani_mysql->GetString(10) &&
  1729. mani_mysql->GetString(11))
  1730. {
  1731. client_ptr->group_list.Add(mani_mysql->GetString(10), mani_mysql->GetString(11));
  1732. }
  1733. }
  1734. }
  1735. delete mani_mysql;
  1736. return true;
  1737. }
  1738. //---------------------------------------------------------------------------------
  1739. // Purpose: Process the ma_setflag command
  1740. //---------------------------------------------------------------------------------
  1741. PLUGIN_RESULT ManiClient::ProcessMaSetFlag(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  1742. {
  1743. int admin_index;
  1744. if (player_ptr)
  1745. {
  1746. // Check if player is admin
  1747. if (!this->HasAccess(player_ptr->index, ADMIN, ADMIN_SET_FLAG, war_mode)) return PLUGIN_BAD_ADMIN;
  1748. }
  1749. if (gpCmd->Cmd_Argc() < 4) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  1750. // Whoever issued the commmand is authorised to do it.
  1751. char *target_string = (char *) gpCmd->Cmd_Argv(1);
  1752. admin_index = this->FindClientIndex(target_string);
  1753. if (admin_index != -1)
  1754. {
  1755. OutputHelpText(ORANGE_CHAT, player_ptr, "%s", Translate(player_ptr, M_NO_TARGET, "%s", target_string));
  1756. return PLUGIN_STOP;
  1757. }
  1758. // Found an admin to update in memory via admin_index
  1759. // Loop through flags to set them
  1760. char *class_type = (char *) gpCmd->Cmd_Argv(2);
  1761. char *flags = (char *) gpCmd->Cmd_Argv(3);
  1762. int length = Q_strlen(flags);
  1763. ClientPlayer *client_ptr = c_list[admin_index];
  1764. bool add_flag = true;
  1765. for (int i = 0; i < length; i ++)
  1766. {
  1767. if (flags[i] == '+')
  1768. {
  1769. add_flag = true;
  1770. continue;
  1771. }
  1772. if (flags[i] == '-')
  1773. {
  1774. add_flag = false;
  1775. continue;
  1776. }
  1777. if (flags[i] == ' ') continue;
  1778. int flag_index = 0;
  1779. char *flag_id = this->SplitFlagString(flags, &flag_index);
  1780. if (flag_id)
  1781. {
  1782. if (flag_desc_list.IsValidFlag(class_type, flag_id))
  1783. {
  1784. client_ptr->personal_flag_list.SetFlag(class_type, flag_id, add_flag);
  1785. }
  1786. else
  1787. {
  1788. OutputHelpText(ORANGE_CHAT, player_ptr, "Flag %s is invalid", flag_id);
  1789. }
  1790. }
  1791. }
  1792. LogCommand (player_ptr, "%s [%s] [%s]\n", command_name, target_string, flags);
  1793. return PLUGIN_STOP;
  1794. }
  1795. //---------------------------------------------------------------------------------
  1796. // Purpose: Find an entry for the target string in the client list
  1797. //---------------------------------------------------------------------------------
  1798. int ManiClient::FindClientIndex
  1799. (
  1800. char *target_string
  1801. )
  1802. {
  1803. player_t player;
  1804. int client_index = -1;
  1805. player.entity = NULL;
  1806. // Whoever issued the commmand is authorised to do it.
  1807. int target_user_id = atoi(target_string);
  1808. char target_steam_id[MAX_NETWORKID_LENGTH];
  1809. player_t target_player;
  1810. if (!target_string) return -1;
  1811. if (FStrEq(target_string,"")) return -1;
  1812. // Try looking for user id first in players on server
  1813. if (target_user_id != 0)
  1814. {
  1815. target_player.user_id = target_user_id;
  1816. if (FindPlayerByUserID(&target_player))
  1817. {
  1818. client_index = this->FindClientIndex(&target_player);
  1819. if (client_index != -1)
  1820. {
  1821. return client_index;
  1822. }
  1823. }
  1824. }
  1825. // Try steam id next
  1826. Q_strcpy(target_steam_id, target_string);
  1827. if (Q_strlen(target_steam_id) > 6)
  1828. {
  1829. target_steam_id[6] = '\0';
  1830. if (FStruEq(target_steam_id, "STEAM_"))
  1831. {
  1832. for (int i = 0; i != (int) c_list.size(); i++)
  1833. {
  1834. if (c_list[i]->steam_list.Find(target_string))
  1835. {
  1836. return i;
  1837. }
  1838. }
  1839. }
  1840. }
  1841. // Try ip address next
  1842. for (int i = 0; i != (int) c_list.size(); i++)
  1843. {
  1844. if (c_list[i]->steam_list.Find(target_string))
  1845. {
  1846. return i;
  1847. }
  1848. }
  1849. // Try name id next
  1850. for (int i = 0; i != (int) c_list.size(); i++)
  1851. {
  1852. if (c_list[i]->GetName() && FStrEq(c_list[i]->GetName(), target_string))
  1853. {
  1854. return i;
  1855. }
  1856. }
  1857. // Try nick name next
  1858. for (int i = 0; i != (int) c_list.size(); i++)
  1859. {
  1860. if (c_list[i]->nick_list.Find(target_string))
  1861. {
  1862. return i;
  1863. }
  1864. }
  1865. return -1;
  1866. }
  1867. //---------------------------------------------------------------------------------
  1868. // Purpose: Find an entry for the target string in the client list
  1869. //---------------------------------------------------------------------------------
  1870. const char *ManiClient::FindClientName
  1871. (
  1872. player_t *player_ptr
  1873. )
  1874. {
  1875. int index = FindClientIndex(player_ptr);
  1876. if (index == -1)
  1877. {
  1878. return NULL;
  1879. }
  1880. return c_list[index]->GetName();
  1881. }
  1882. //---------------------------------------------------------------------------------
  1883. // Purpose: Handle ma_client command
  1884. //---------------------------------------------------------------------------------
  1885. PLUGIN_RESULT ManiClient::ProcessMaClient(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  1886. {
  1887. bool invalid_args = false;
  1888. if (player_ptr)
  1889. {
  1890. // Check if player is admin
  1891. if (!HasAccess(player_ptr->index, ADMIN, ADMIN_CLIENT_ADMIN)) return PLUGIN_BAD_ADMIN;
  1892. }
  1893. // Cover only command and subcommand being passed in
  1894. int argc = gpCmd->Cmd_Argc();
  1895. if (argc < 2) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  1896. char *sub_command = (char *) gpCmd->Cmd_Argv(1);
  1897. char *param1 = (char *) gpCmd->Cmd_Argv(2);
  1898. char *param2 = (char *) gpCmd->Cmd_Argv(3);
  1899. // Parse sub command
  1900. if (FStrEq(sub_command, "addclient"))
  1901. {
  1902. if (argc != 3) invalid_args = true;
  1903. else ProcessAddClient(player_ptr, param1);
  1904. }
  1905. else if (FStrEq(sub_command, "addsteam"))
  1906. {
  1907. if (argc != 4) invalid_args = true;
  1908. else ProcessAddSteam(player_ptr, param1, param2);
  1909. }
  1910. else if (FStrEq(sub_command, "addip"))
  1911. {
  1912. if (argc != 4) invalid_args = true;
  1913. else ProcessAddIP(player_ptr, param1, param2);
  1914. }
  1915. else if (FStrEq(sub_command, "addnick"))
  1916. {
  1917. if (argc != 4) invalid_args = true;
  1918. else ProcessAddNick(player_ptr, param1, param2);
  1919. }
  1920. else if (FStrEq(sub_command, "setname"))
  1921. {
  1922. if (argc != 4) invalid_args = true;
  1923. else ProcessSetName(player_ptr, param1, param2);
  1924. }
  1925. else if (FStrEq(sub_command, "setpassword"))
  1926. {
  1927. if (argc != 4) invalid_args = true;
  1928. else ProcessSetPassword(player_ptr, param1, param2);
  1929. }
  1930. else if (FStrEq(sub_command, "setemail"))
  1931. {
  1932. if (argc != 4) invalid_args = true;
  1933. else ProcessSetEmail(player_ptr, param1, param2);
  1934. }
  1935. else if (FStrEq(sub_command, "setnotes"))
  1936. {
  1937. if (argc != 4) invalid_args = true;
  1938. else ProcessSetNotes(player_ptr, param1, param2);
  1939. }
  1940. else if (FStrEq(sub_command, "setalevel"))
  1941. {
  1942. if (argc != 4) invalid_args = true;
  1943. else ProcessSetLevel(ADMIN, player_ptr, param1, param2);
  1944. }
  1945. else if (FStrEq(sub_command, "setilevel"))
  1946. {
  1947. if (argc != 4) invalid_args = true;
  1948. else ProcessSetLevel(IMMUNITY, player_ptr, param1, param2);
  1949. }
  1950. else if (FStrEq(sub_command, "addagroup"))
  1951. {
  1952. if (argc != 4) invalid_args = true;
  1953. else ProcessAddGroup(ADMIN, player_ptr, param1, param2);
  1954. }
  1955. else if (FStrEq(sub_command, "addigroup"))
  1956. {
  1957. if (argc != 4) invalid_args = true;
  1958. else ProcessAddGroup(IMMUNITY, player_ptr, param1, param2);
  1959. }
  1960. else if (FStrEq(sub_command, "setaflag"))
  1961. {
  1962. if (argc != 4) invalid_args = true;
  1963. else ProcessSetFlag(ADMIN, player_ptr, param1, param2);
  1964. }
  1965. else if (FStrEq(sub_command, "setiflag"))
  1966. {
  1967. if (argc != 4) invalid_args = true;
  1968. else ProcessSetFlag(IMMUNITY, player_ptr, param1, param2);
  1969. }
  1970. else if (FStrEq(sub_command, "removeclient"))
  1971. {
  1972. if (argc != 3) invalid_args = true;
  1973. else ProcessRemoveClient(player_ptr, param1);
  1974. }
  1975. else if (FStrEq(sub_command, "removesteam"))
  1976. {
  1977. if (argc != 4) invalid_args = true;
  1978. else ProcessRemoveSteam(player_ptr, param1, param2);
  1979. }
  1980. else if (FStrEq(sub_command, "removeip"))
  1981. {
  1982. if (argc != 4) invalid_args = true;
  1983. else ProcessRemoveIP(player_ptr, param1, param2);
  1984. }
  1985. else if (FStrEq(sub_command, "removenick"))
  1986. {
  1987. if (argc != 4) invalid_args = true;
  1988. else ProcessRemoveNick(player_ptr, param1, param2);
  1989. }
  1990. else if (FStrEq(sub_command, "removeagroup"))
  1991. {
  1992. if (argc != 4) invalid_args = true;
  1993. else ProcessRemoveGroup(ADMIN, player_ptr, param1, param2);
  1994. }
  1995. else if (FStrEq(sub_command, "removeigroup"))
  1996. {
  1997. if (argc != 4) invalid_args = true;
  1998. else ProcessRemoveGroup(IMMUNITY, player_ptr, param1, param2);
  1999. }
  2000. else if (FStrEq(sub_command, "status"))
  2001. {
  2002. if (argc == 3)
  2003. {
  2004. ProcessClientStatus(player_ptr, param1);
  2005. }
  2006. else if (argc == 2)
  2007. {
  2008. ProcessAllClientStatus(player_ptr);
  2009. }
  2010. else
  2011. {
  2012. invalid_args = true;
  2013. }
  2014. }
  2015. else if (FStrEq(sub_command, "aflag"))
  2016. {
  2017. if (argc == 3)
  2018. {
  2019. ProcessClientFlagDesc(ADMIN, player_ptr, param1);
  2020. }
  2021. else if (argc == 2)
  2022. {
  2023. ProcessAllClientFlagDesc(ADMIN, player_ptr);
  2024. }
  2025. else
  2026. {
  2027. invalid_args = true;
  2028. }
  2029. }
  2030. else if (FStrEq(sub_command, "iflag"))
  2031. {
  2032. if (argc == 3)
  2033. {
  2034. ProcessClientFlagDesc(IMMUNITY, player_ptr, param1);
  2035. }
  2036. else if (argc == 2)
  2037. {
  2038. ProcessAllClientFlagDesc(IMMUNITY, player_ptr);
  2039. }
  2040. else
  2041. {
  2042. invalid_args = true;
  2043. }
  2044. }
  2045. else if (FStrEq(sub_command, "upload"))
  2046. {
  2047. if (argc != 2) invalid_args = true;
  2048. else ProcessClientUpload(player_ptr);
  2049. }
  2050. else if (FStrEq(sub_command, "download"))
  2051. {
  2052. if (argc != 2) invalid_args = true;
  2053. else ProcessClientDownload(player_ptr);
  2054. }
  2055. else if (FStrEq(sub_command, "serverid"))
  2056. {
  2057. if (argc != 2) invalid_args = true;
  2058. else ProcessClientServerID(player_ptr);
  2059. }
  2060. else
  2061. {
  2062. invalid_args = true;
  2063. }
  2064. if (invalid_args)
  2065. {
  2066. gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  2067. }
  2068. return PLUGIN_STOP;
  2069. }
  2070. //---------------------------------------------------------------------------------
  2071. // Purpose: Handle ma_client sub command AddClient
  2072. //---------------------------------------------------------------------------------
  2073. void ManiClient::ProcessAddClient
  2074. (
  2075. player_t *player_ptr,
  2076. char *param1
  2077. )
  2078. {
  2079. ClientPlayer *client_ptr;
  2080. for (int i = 0; i != (int) c_list.size(); i ++)
  2081. {
  2082. if (FStrEq(c_list[i]->GetName(), param1))
  2083. {
  2084. // Bad, client already exists
  2085. OutputHelpText(ORANGE_CHAT, player_ptr, "ERROR: This client name already exists !!");
  2086. return;
  2087. }
  2088. }
  2089. // Add a new client
  2090. client_ptr = new ClientPlayer;
  2091. c_list.push_back(client_ptr);
  2092. client_ptr->SetName(param1);
  2093. WriteClients();
  2094. if (gpManiDatabase->GetDBEnabled())
  2095. {
  2096. SQLProcessBlock *ptr = new SQLAddClient();
  2097. ptr->in_params.AddParam("name", client_ptr->GetName());
  2098. client_sql_manager->AddRequest(ptr);
  2099. }
  2100. OutputHelpText(ORANGE_CHAT, player_ptr, "Client %s has been added", client_ptr->GetName());
  2101. }
  2102. //---------------------------------------------------------------------------------
  2103. // Purpose: Handle ma_client sub command AddSteam
  2104. //---------------------------------------------------------------------------------
  2105. void ManiClient::ProcessAddSteam
  2106. (
  2107. player_t *player_ptr,
  2108. char *param1,
  2109. char *param2
  2110. )
  2111. {
  2112. int client_index;
  2113. ClientPlayer *client_ptr;
  2114. client_index = FindClientIndex(param1);
  2115. if (client_index == -1)
  2116. {
  2117. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2118. return;
  2119. }
  2120. client_ptr = c_list[client_index];
  2121. BasicStr steam_id(param2);
  2122. steam_id.Upper();
  2123. if (strncmp("STEAM_", steam_id.str, 6) != 0)
  2124. {
  2125. OutputHelpText(ORANGE_CHAT, player_ptr, "[%s] is not a valid Steam ID", param1);
  2126. return;
  2127. }
  2128. client_ptr->steam_list.Add(steam_id.str);
  2129. this->SetupPlayersOnServer();
  2130. WriteClients();
  2131. if (gpManiDatabase->GetDBEnabled())
  2132. {
  2133. SQLProcessBlock *ptr = new SQLAddSteam();
  2134. ptr->in_params.AddParam("name", client_ptr->GetName());
  2135. ptr->in_params.AddParam("steam_id", steam_id.str);
  2136. client_sql_manager->AddRequest(ptr);
  2137. }
  2138. OutputHelpText(ORANGE_CHAT, player_ptr, "Added Steam ID [%s] for client [%s]", param2, client_ptr->GetName());
  2139. return;
  2140. }
  2141. //---------------------------------------------------------------------------------
  2142. // Purpose: Handle ma_client sub command AddIP
  2143. //---------------------------------------------------------------------------------
  2144. void ManiClient::ProcessAddIP
  2145. (
  2146. player_t *player_ptr,
  2147. char *param1,
  2148. char *param2
  2149. )
  2150. {
  2151. int client_index;
  2152. ClientPlayer *client_ptr;
  2153. client_index = FindClientIndex(param1);
  2154. if (client_index == -1)
  2155. {
  2156. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2157. return;
  2158. }
  2159. client_ptr = c_list[client_index];
  2160. int count = 0;
  2161. for (int i = 0; param2[i] != '\0'; i++)
  2162. {
  2163. if (param2[i] == '.')
  2164. {
  2165. count ++;
  2166. }
  2167. }
  2168. if (count < 3 || count > 3)
  2169. {
  2170. OutputHelpText(ORANGE_CHAT, player_ptr, "IP Address [%s] is invalid", param2);
  2171. return;
  2172. }
  2173. client_ptr->ip_address_list.Add(param2);
  2174. this->SetupPlayersOnServer();
  2175. WriteClients();
  2176. if (gpManiDatabase->GetDBEnabled())
  2177. {
  2178. SQLProcessBlock *ptr = new SQLAddIPAddress();
  2179. ptr->in_params.AddParam("name", client_ptr->GetName());
  2180. ptr->in_params.AddParam("ip_address", param2);
  2181. client_sql_manager->AddRequest(ptr);
  2182. }
  2183. OutputHelpText(ORANGE_CHAT, player_ptr, "Added IP Address [%s] for client [%s]", param2, client_ptr->GetName());
  2184. return;
  2185. }
  2186. //---------------------------------------------------------------------------------
  2187. // Purpose: Handle ma_client sub command AddNick
  2188. //---------------------------------------------------------------------------------
  2189. void ManiClient::ProcessAddNick
  2190. (
  2191. player_t *player_ptr,
  2192. char *param1,
  2193. char *param2
  2194. )
  2195. {
  2196. int client_index;
  2197. ClientPlayer *client_ptr;
  2198. client_index = FindClientIndex(param1);
  2199. if (client_index == -1)
  2200. {
  2201. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2202. return;
  2203. }
  2204. client_ptr = c_list[client_index];
  2205. client_ptr->nick_list.Add(param2);
  2206. this->SetupPlayersOnServer();
  2207. WriteClients();
  2208. if (gpManiDatabase->GetDBEnabled())
  2209. {
  2210. SQLProcessBlock *ptr = new SQLAddNick();
  2211. ptr->in_params.AddParam("name", client_ptr->GetName());
  2212. ptr->in_params.AddParam("nick", param2);
  2213. client_sql_manager->AddRequest(ptr);
  2214. }
  2215. OutputHelpText(ORANGE_CHAT, player_ptr, "Added Nickname [%s] for client [%s]", param2, client_ptr->GetName());
  2216. return;
  2217. }
  2218. //---------------------------------------------------------------------------------
  2219. // Purpose: Handle ma_client sub command SetName
  2220. //---------------------------------------------------------------------------------
  2221. void ManiClient::ProcessSetName
  2222. (
  2223. player_t *player_ptr,
  2224. char *param1,
  2225. char *param2
  2226. )
  2227. {
  2228. int client_index;
  2229. ClientPlayer *client_ptr;
  2230. char old_name[256];
  2231. if (param2 == NULL || FStrEq(param2, ""))
  2232. {
  2233. OutputHelpText(ORANGE_CHAT, player_ptr, "You cannot set a client name to be blank !!");
  2234. return;
  2235. }
  2236. client_index = FindClientIndex(param1);
  2237. if (client_index == -1)
  2238. {
  2239. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2240. return;
  2241. }
  2242. client_ptr = c_list[client_index];
  2243. if (FStrEq(client_ptr->GetName(), param2))
  2244. {
  2245. OutputHelpText(ORANGE_CHAT, player_ptr, "Both names [%s] and [%s] are the same !!", client_ptr->GetName(), param2);
  2246. return;
  2247. }
  2248. // Check for existing clients with the same name
  2249. for (int i = 0; i != (int) c_list.size(); i++)
  2250. {
  2251. // Skip target client name
  2252. if (i == client_index)
  2253. {
  2254. continue;
  2255. }
  2256. if (FStrEq(c_list[i]->GetName(), param2))
  2257. {
  2258. OutputHelpText(ORANGE_CHAT, player_ptr, "A Client already exists with this name !!");
  2259. return;
  2260. }
  2261. }
  2262. Q_strcpy(old_name, client_ptr->GetName());
  2263. client_ptr->SetName(param2);
  2264. WriteClients();
  2265. if (gpManiDatabase->GetDBEnabled())
  2266. {
  2267. SQLProcessBlock *ptr = new SQLSetName();
  2268. ptr->in_params.AddParam("old_name", old_name);
  2269. ptr->in_params.AddParam("new_name", param2);
  2270. client_sql_manager->AddRequest(ptr);
  2271. }
  2272. OutputHelpText(ORANGE_CHAT, player_ptr, "Set client [%s] with new name of [%s]", old_name, param2);
  2273. return;
  2274. }
  2275. //---------------------------------------------------------------------------------
  2276. // Purpose: Handle ma_client sub command SetPassword
  2277. //---------------------------------------------------------------------------------
  2278. void ManiClient::ProcessSetPassword
  2279. (
  2280. player_t *player_ptr,
  2281. char *param1,
  2282. char *param2
  2283. )
  2284. {
  2285. int client_index;
  2286. ClientPlayer *client_ptr;
  2287. client_index = FindClientIndex(param1);
  2288. if (client_index == -1)
  2289. {
  2290. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2291. return;
  2292. }
  2293. client_ptr = c_list[client_index];
  2294. client_ptr->SetPassword(param2);
  2295. this->SetupPlayersOnServer();
  2296. WriteClients();
  2297. if (gpManiDatabase->GetDBEnabled())
  2298. {
  2299. SQLProcessBlock *ptr = new SQLSetPassword();
  2300. ptr->in_params.AddParam("name", client_ptr->GetName());
  2301. ptr->in_params.AddParam("password", param2);
  2302. client_sql_manager->AddRequest(ptr);
  2303. }
  2304. OutputHelpText(ORANGE_CHAT, player_ptr, "Set client [%s] with new password of [%s]", client_ptr->GetName(), param2);
  2305. return;
  2306. }
  2307. //---------------------------------------------------------------------------------
  2308. // Purpose: Handle ma_client sub command SetEmail
  2309. //---------------------------------------------------------------------------------
  2310. void ManiClient::ProcessSetEmail
  2311. (
  2312. player_t *player_ptr,
  2313. char *param1,
  2314. char *param2
  2315. )
  2316. {
  2317. int client_index;
  2318. ClientPlayer *client_ptr;
  2319. client_index = FindClientIndex(param1);
  2320. if (client_index == -1)
  2321. {
  2322. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2323. return;
  2324. }
  2325. client_ptr = c_list[client_index];
  2326. client_ptr->SetEmailAddress(param2);
  2327. WriteClients();
  2328. if (gpManiDatabase->GetDBEnabled())
  2329. {
  2330. SQLProcessBlock *ptr = new SQLSetEmailAddress();
  2331. ptr->in_params.AddParam("name", client_ptr->GetName());
  2332. ptr->in_params.AddParam("email", param2);
  2333. client_sql_manager->AddRequest(ptr);
  2334. }
  2335. OutputHelpText(ORANGE_CHAT, player_ptr, "Set client [%s] with new email address of [%s]", client_ptr->GetName(), param2);
  2336. return;
  2337. }
  2338. //---------------------------------------------------------------------------------
  2339. // Purpose: Handle ma_client sub command AddNotes
  2340. //---------------------------------------------------------------------------------
  2341. void ManiClient::ProcessSetNotes
  2342. (
  2343. player_t *player_ptr,
  2344. char *param1,
  2345. char *param2
  2346. )
  2347. {
  2348. int client_index;
  2349. ClientPlayer *client_ptr;
  2350. client_index = FindClientIndex(param1);
  2351. if (client_index == -1)
  2352. {
  2353. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2354. return;
  2355. }
  2356. client_ptr = c_list[client_index];
  2357. client_ptr->SetNotes(param2);
  2358. WriteClients();
  2359. if (gpManiDatabase->GetDBEnabled())
  2360. {
  2361. SQLProcessBlock *ptr = new SQLSetEmailAddress();
  2362. ptr->in_params.AddParam("name", client_ptr->GetName());
  2363. ptr->in_params.AddParam("notes", param2);
  2364. client_sql_manager->AddRequest(ptr);
  2365. }
  2366. OutputHelpText(ORANGE_CHAT, player_ptr, "Set client [%s] with new notes of [%s]", client_ptr->GetName(), param2);
  2367. return;
  2368. }
  2369. //---------------------------------------------------------------------------------
  2370. // Purpose: Handle ma_client sub command SetLevel
  2371. //---------------------------------------------------------------------------------
  2372. void ManiClient::ProcessSetLevel
  2373. (
  2374. const char *class_type,
  2375. player_t *player_ptr,
  2376. char *param1,
  2377. char *param2
  2378. )
  2379. {
  2380. int client_index;
  2381. ClientPlayer *client_ptr;
  2382. int level_id;
  2383. client_index = FindClientIndex(param1);
  2384. if (client_index == -1)
  2385. {
  2386. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2387. return;
  2388. }
  2389. if (param2 == NULL || FStrEq(param2, ""))
  2390. {
  2391. level_id = -1;
  2392. }
  2393. else
  2394. {
  2395. level_id = atoi(param2);
  2396. }
  2397. client_ptr = c_list[client_index];
  2398. int old_level_id = client_ptr->level_list.FindFirst(class_type);
  2399. if (old_level_id != -99999)
  2400. {
  2401. client_ptr->level_list.Remove(class_type, old_level_id);
  2402. }
  2403. if (level_id != -1)
  2404. {
  2405. client_ptr->level_list.Add(class_type, level_id);
  2406. }
  2407. if (gpManiDatabase->GetDBEnabled())
  2408. {
  2409. SQLProcessBlock *ptr = new SQLSetLevel();
  2410. ptr->in_params.AddParam("name", client_ptr->GetName());
  2411. ptr->in_params.AddParam("class_type", class_type);
  2412. ptr->in_params.AddParam("level_id", level_id);
  2413. client_sql_manager->AddRequest(ptr);
  2414. }
  2415. OutputHelpText(ORANGE_CHAT, player_ptr, "Updated client [%s] with new %s level id [%s]", client_ptr->GetName(), class_type, param2);
  2416. this->SetupMasked();
  2417. WriteClients();
  2418. return;
  2419. }
  2420. //---------------------------------------------------------------------------------
  2421. // Purpose: Handle ma_client sub command AddGroup
  2422. //---------------------------------------------------------------------------------
  2423. void ManiClient::ProcessAddGroup
  2424. (
  2425. const char *class_type,
  2426. player_t *player_ptr,
  2427. char *param1,
  2428. char *param2
  2429. )
  2430. {
  2431. int client_index;
  2432. ClientPlayer *client_ptr;
  2433. bool found_group = false;
  2434. client_index = FindClientIndex(param1);
  2435. if (client_index == -1)
  2436. {
  2437. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2438. return;
  2439. }
  2440. client_ptr = c_list[client_index];
  2441. if (group_list.Find(class_type, param2))
  2442. {
  2443. found_group = true;
  2444. }
  2445. if (!found_group)
  2446. {
  2447. OutputHelpText(ORANGE_CHAT, player_ptr, "Group ID [%s] is invalid !!", param2);
  2448. return;
  2449. }
  2450. if (client_ptr->group_list.Find(class_type, param2))
  2451. {
  2452. OutputHelpText(ORANGE_CHAT, player_ptr, "Group ID [%s] is already setup for this user", param2);
  2453. return;
  2454. }
  2455. client_ptr->group_list.Add(class_type, param2);
  2456. this->SetupUnMasked();
  2457. this->SetupMasked();
  2458. WriteClients();
  2459. if (gpManiDatabase->GetDBEnabled())
  2460. {
  2461. SQLProcessBlock *ptr = new SQLAddGroup();
  2462. ptr->in_params.AddParam("name", client_ptr->GetName());
  2463. ptr->in_params.AddParam("class_type", class_type);
  2464. ptr->in_params.AddParam("group_id", param2);
  2465. client_sql_manager->AddRequest(ptr);
  2466. }
  2467. OutputHelpText(ORANGE_CHAT, player_ptr, "Client [%s] now has %s group [%s] access", client_ptr->GetName(), class_type, param2);
  2468. return;
  2469. }
  2470. //---------------------------------------------------------------------------------
  2471. // Purpose: Handle ma_clientgroup sub command AddGroup
  2472. //---------------------------------------------------------------------------------
  2473. void ManiClient::ProcessAddGroupType
  2474. (
  2475. const char *class_type,
  2476. player_t *player_ptr,
  2477. char *param1,
  2478. char *param2
  2479. )
  2480. {
  2481. bool insert_required = false;
  2482. // See if group already exists
  2483. GlobalGroupFlag *group_ptr = group_list.Find(class_type, param1);
  2484. if (group_ptr == NULL)
  2485. {
  2486. insert_required = true;
  2487. // No Group exists yet so we shall create one
  2488. group_ptr = group_list.AddGroup(class_type, param1);
  2489. }
  2490. int param2_index = 0;
  2491. for (;;)
  2492. {
  2493. bool flag_add;
  2494. // Scan for start of add/remove flag or end of string
  2495. while(param2[param2_index] != '\0' &&
  2496. param2[param2_index] != '-' &&
  2497. param2[param2_index] != '+')
  2498. {
  2499. param2_index ++;
  2500. }
  2501. if (param2[param2_index] == '\0')
  2502. {
  2503. // End of string reached
  2504. break;
  2505. }
  2506. if (param2[param2_index] == '+')
  2507. {
  2508. flag_add = true;
  2509. }
  2510. else
  2511. {
  2512. flag_add = false;
  2513. }
  2514. param2_index ++;
  2515. if (param2[param2_index] == '\0')
  2516. {
  2517. break;
  2518. }
  2519. if (param2[param2_index] == '#')
  2520. {
  2521. // Add/Remove all flags for this group
  2522. const DualStrKey *key_value = NULL;
  2523. for (const char *flag_id = flag_desc_list.FindFirst(class_type, &key_value); flag_id != NULL; flag_id = flag_desc_list.FindNext(class_type, &key_value))
  2524. {
  2525. group_ptr->SetFlag(key_value->key2, flag_add);
  2526. }
  2527. param2_index++;
  2528. if (param2[param2_index] == '\0')
  2529. {
  2530. break;
  2531. }
  2532. continue;
  2533. }
  2534. char *flag_id = this->SplitFlagString(param2, &param2_index);
  2535. if (flag_id)
  2536. {
  2537. if (flag_desc_list.IsValidFlag(class_type, flag_id))
  2538. {
  2539. group_ptr->SetFlag(flag_id, flag_add);
  2540. }
  2541. }
  2542. }
  2543. this->SetupUnMasked();
  2544. this->SetupMasked();
  2545. WriteClients();
  2546. if (gpManiDatabase->GetDBEnabled())
  2547. {
  2548. char flag_string[2048];
  2549. Q_strcpy (flag_string,"");
  2550. if (group_ptr->CatFlags(flag_string))
  2551. {
  2552. SQLProcessBlock *ptr = new SQLAddGroupType();
  2553. ptr->in_params.AddParam("class_type", class_type);
  2554. ptr->in_params.AddParam("group_id", param1);
  2555. ptr->in_params.AddParam("flag_string", flag_string);
  2556. ptr->in_params.AddParam("insert", insert_required);
  2557. client_sql_manager->AddRequest(ptr);
  2558. }
  2559. }
  2560. OutputHelpText(ORANGE_CHAT, player_ptr, "%s group [%s] updated", class_type, param1);
  2561. return;
  2562. }
  2563. //---------------------------------------------------------------------------------
  2564. // Purpose: Handle ma_clientgroup sub command RemoveGroup
  2565. //---------------------------------------------------------------------------------
  2566. void ManiClient::ProcessRemoveGroupType
  2567. (
  2568. const char *class_type,
  2569. player_t *player_ptr,
  2570. char *param1
  2571. )
  2572. {
  2573. // See if group already exists
  2574. if (group_list.Find(class_type, param1))
  2575. {
  2576. group_list.RemoveGroup(class_type, param1);
  2577. }
  2578. else
  2579. {
  2580. OutputHelpText(ORANGE_CHAT, player_ptr, "Group [%s] does not exist !!", param1);
  2581. return;
  2582. }
  2583. for (int i = 0; i != (int) c_list.size(); i++)
  2584. {
  2585. c_list[i]->group_list.Remove(class_type, param1);
  2586. }
  2587. this->SetupUnMasked();
  2588. this->SetupMasked();
  2589. this->WriteClients();
  2590. if (gpManiDatabase->GetDBEnabled())
  2591. {
  2592. SQLProcessBlock *ptr = new SQLRemoveGroupType();
  2593. ptr->in_params.AddParam("class_type", class_type);
  2594. ptr->in_params.AddParam("group_id", param1);
  2595. client_sql_manager->AddRequest(ptr);
  2596. }
  2597. OutputHelpText(ORANGE_CHAT, player_ptr, "%s group [%s] updated", class_type, param1);
  2598. return;
  2599. }
  2600. //---------------------------------------------------------------------------------
  2601. // Purpose: Handle ma_clientgroup sub command AddLevel
  2602. //---------------------------------------------------------------------------------
  2603. void ManiClient::ProcessAddLevelType
  2604. (
  2605. const char *class_type,
  2606. player_t *player_ptr,
  2607. char *param1,
  2608. char *param2
  2609. )
  2610. {
  2611. int level_id = 0;
  2612. bool insert_required = false;
  2613. level_id = atoi(param1);
  2614. GlobalGroupFlag *level_ptr = level_list.Find(class_type, level_id);
  2615. if (level_ptr == NULL)
  2616. {
  2617. insert_required = true;
  2618. // No Group exists yet so we shall create one
  2619. level_ptr = level_list.AddGroup(class_type, level_id);
  2620. }
  2621. int param2_index = 0;
  2622. for (;;)
  2623. {
  2624. bool flag_add;
  2625. // Scan for start of add/remove flag or end of string
  2626. while(param2[param2_index] != '\0' &&
  2627. param2[param2_index] != '-' &&
  2628. param2[param2_index] != '+')
  2629. {
  2630. param2_index ++;
  2631. }
  2632. if (param2[param2_index] == '\0')
  2633. {
  2634. // End of string reached
  2635. break;
  2636. }
  2637. if (param2[param2_index] == '+')
  2638. {
  2639. flag_add = true;
  2640. }
  2641. else
  2642. {
  2643. flag_add = false;
  2644. }
  2645. param2_index ++;
  2646. if (param2[param2_index] == '\0')
  2647. {
  2648. break;
  2649. }
  2650. if (param2[param2_index] == '#')
  2651. {
  2652. // Add/Remove all flags for this level
  2653. const DualStrKey *key_value = NULL;
  2654. for (const char *flag_id = flag_desc_list.FindFirst(class_type, &key_value); flag_id != NULL; flag_id = flag_desc_list.FindNext(class_type, &key_value))
  2655. {
  2656. level_ptr->SetFlag(key_value->key2, flag_add);
  2657. }
  2658. param2_index++;
  2659. if (param2[param2_index] == '\0')
  2660. {
  2661. break;
  2662. }
  2663. continue;
  2664. }
  2665. char *flag_id = this->SplitFlagString(param2, &param2_index);
  2666. if (flag_id)
  2667. {
  2668. if (flag_desc_list.IsValidFlag(class_type, flag_id))
  2669. {
  2670. level_ptr->SetFlag(flag_id, flag_add);
  2671. }
  2672. }
  2673. }
  2674. this->SetupUnMasked();
  2675. this->SetupMasked();
  2676. WriteClients();
  2677. if (gpManiDatabase->GetDBEnabled())
  2678. {
  2679. // Build the strings needed
  2680. char flag_string[2048]="";
  2681. level_ptr->CatFlags(flag_string);
  2682. SQLProcessBlock *ptr = new SQLAddLevelType();
  2683. ptr->in_params.AddParam("class_type", class_type);
  2684. ptr->in_params.AddParam("level_id", level_id);
  2685. ptr->in_params.AddParam("flag_string", flag_string);
  2686. ptr->in_params.AddParam("insert", insert_required);
  2687. client_sql_manager->AddRequest(ptr);
  2688. }
  2689. OutputHelpText(ORANGE_CHAT, player_ptr, "%s level [%s] updated", class_type, param1);
  2690. return;
  2691. }
  2692. //---------------------------------------------------------------------------------
  2693. // Purpose: Handle ma_clientgroup sub command RemoveLevel
  2694. //---------------------------------------------------------------------------------
  2695. void ManiClient::ProcessRemoveLevelType
  2696. (
  2697. const char *class_type,
  2698. player_t *player_ptr,
  2699. char *param1
  2700. )
  2701. {
  2702. int level_id = atoi(param1);
  2703. // See if level already exists
  2704. // See if group already exists
  2705. if (level_list.Find(class_type, level_id))
  2706. {
  2707. level_list.RemoveGroup(class_type, level_id);
  2708. }
  2709. else
  2710. {
  2711. OutputHelpText(ORANGE_CHAT, player_ptr, "Level [%s] does not exist !!", param1);
  2712. return;
  2713. }
  2714. for (int i = 0; i != (int) c_list.size(); i++)
  2715. {
  2716. c_list[i]->level_list.Remove(class_type, level_id);
  2717. }
  2718. this->SetupUnMasked();
  2719. this->SetupMasked();
  2720. this->WriteClients();
  2721. if (gpManiDatabase->GetDBEnabled())
  2722. {
  2723. SQLProcessBlock *ptr = new SQLRemoveLevelType();
  2724. ptr->in_params.AddParam("class_type", class_type);
  2725. ptr->in_params.AddParam("level_id", level_id);
  2726. client_sql_manager->AddRequest(ptr);
  2727. }
  2728. OutputHelpText(ORANGE_CHAT, player_ptr, "%s level [%s] updated", class_type, param1);
  2729. return;
  2730. }
  2731. //---------------------------------------------------------------------------------
  2732. // Purpose: Handle ma_client sub command SetFlag
  2733. //---------------------------------------------------------------------------------
  2734. void ManiClient::ProcessSetFlag
  2735. (
  2736. const char *class_type,
  2737. player_t *player_ptr,
  2738. char *param1,
  2739. char *param2
  2740. )
  2741. {
  2742. int client_index;
  2743. ClientPlayer *client_ptr;
  2744. int param2_index = 0;
  2745. client_index = FindClientIndex(param1);
  2746. if (client_index == -1)
  2747. {
  2748. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2749. return;
  2750. }
  2751. client_ptr = c_list[client_index];
  2752. for (;;)
  2753. {
  2754. bool flag_add;
  2755. // Scan for start of add/remove flag or end of string
  2756. while(param2[param2_index] != '\0' &&
  2757. param2[param2_index] != '-' &&
  2758. param2[param2_index] != '+')
  2759. {
  2760. param2_index ++;
  2761. }
  2762. if (param2[param2_index] == '\0')
  2763. {
  2764. // End of string reached
  2765. break;
  2766. }
  2767. if (param2[param2_index] == '+')
  2768. {
  2769. flag_add = true;
  2770. }
  2771. else
  2772. {
  2773. flag_add = false;
  2774. }
  2775. param2_index ++;
  2776. if (param2[param2_index] == '\0')
  2777. {
  2778. break;
  2779. }
  2780. if (param2[param2_index] == '#')
  2781. {
  2782. // Add/Remove all flags for this level
  2783. const DualStrKey *key_value = NULL;
  2784. for (const char *flag_id = flag_desc_list.FindFirst(class_type, &key_value); flag_id != NULL; flag_id = flag_desc_list.FindNext(class_type, &key_value))
  2785. {
  2786. client_ptr->personal_flag_list.SetFlag(class_type, key_value->key2, flag_add);
  2787. }
  2788. param2_index++;
  2789. if (param2[param2_index] == '\0')
  2790. {
  2791. break;
  2792. }
  2793. continue;
  2794. }
  2795. char *flag_id = this->SplitFlagString(param2, &param2_index);
  2796. if (flag_id)
  2797. {
  2798. if (flag_desc_list.IsValidFlag(class_type, flag_id))
  2799. {
  2800. client_ptr->personal_flag_list.SetFlag(class_type, flag_id, flag_add);
  2801. }
  2802. }
  2803. }
  2804. if (gpManiDatabase->GetDBEnabled())
  2805. {
  2806. char flag_string[2048];
  2807. client_ptr->personal_flag_list.CatFlags(flag_string, class_type);
  2808. SQLProcessBlock *ptr = new SQLSetFlag();
  2809. ptr->in_params.AddParam("name", client_ptr->GetName());
  2810. ptr->in_params.AddParam("class_type", class_type);
  2811. ptr->in_params.AddParam("flag_string", flag_string);
  2812. client_sql_manager->AddRequest(ptr);
  2813. }
  2814. this->SetupUnMasked();
  2815. this->SetupMasked();
  2816. WriteClients();
  2817. OutputHelpText(ORANGE_CHAT, player_ptr, "Processed %s flags to client [%s]", class_type, client_ptr->GetName());
  2818. return;
  2819. }
  2820. //---------------------------------------------------------------------------------
  2821. // Purpose: Handle ma_client sub command AddClient
  2822. //---------------------------------------------------------------------------------
  2823. void ManiClient::ProcessRemoveClient
  2824. (
  2825. player_t *player_ptr,
  2826. char *param1
  2827. )
  2828. {
  2829. ClientPlayer *client_ptr;
  2830. int client_index;
  2831. client_index = FindClientIndex(param1);
  2832. if (client_index == -1)
  2833. {
  2834. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2835. return;
  2836. }
  2837. client_ptr = c_list[client_index];
  2838. if (gpManiDatabase->GetDBEnabled())
  2839. {
  2840. SQLProcessBlock *ptr = new SQLRemoveClient();
  2841. ptr->in_params.AddParam("name", client_ptr->GetName());
  2842. client_sql_manager->AddRequest(ptr);
  2843. }
  2844. for (int i = 0; i < max_players; i++)
  2845. {
  2846. if (active_client_list[i] == client_ptr)
  2847. {
  2848. active_client_list[i] = NULL;
  2849. }
  2850. }
  2851. delete client_ptr;
  2852. int index = 0;
  2853. for (std::vector<ClientPlayer *>::iterator itr = c_list.begin(); itr != c_list.end(); ++itr)
  2854. {
  2855. if (index++ == client_index)
  2856. {
  2857. c_list.erase(itr);
  2858. break;
  2859. }
  2860. }
  2861. this->SetupUnMasked();
  2862. this->SetupMasked();
  2863. WriteClients();
  2864. OutputHelpText(ORANGE_CHAT, player_ptr, "Client %s has been removed !!", param1);
  2865. }
  2866. //---------------------------------------------------------------------------------
  2867. // Purpose: Handle ma_client sub command RemoveSteam
  2868. //---------------------------------------------------------------------------------
  2869. void ManiClient::ProcessRemoveSteam
  2870. (
  2871. player_t *player_ptr,
  2872. char *param1,
  2873. char *param2
  2874. )
  2875. {
  2876. ClientPlayer *client_ptr;
  2877. int client_index;
  2878. client_index = FindClientIndex(param1);
  2879. if (client_index == -1)
  2880. {
  2881. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2882. return;
  2883. }
  2884. client_ptr = c_list[client_index];
  2885. client_ptr->steam_list.Remove(param2);
  2886. this->SetupPlayersOnServer();
  2887. if (gpManiDatabase->GetDBEnabled())
  2888. {
  2889. SQLProcessBlock *ptr = new SQLRemoveSteam();
  2890. ptr->in_params.AddParam("name", client_ptr->GetName());
  2891. ptr->in_params.AddParam("steam_id", param2);
  2892. client_sql_manager->AddRequest(ptr);
  2893. }
  2894. WriteClients();
  2895. OutputHelpText(ORANGE_CHAT, player_ptr, "Client %s has had steam id [%s] removed", client_ptr->GetName(), param2);
  2896. }
  2897. //---------------------------------------------------------------------------------
  2898. // Purpose: Handle ma_client sub command RemoveIP
  2899. //---------------------------------------------------------------------------------
  2900. void ManiClient::ProcessRemoveIP
  2901. (
  2902. player_t *player_ptr,
  2903. char *param1,
  2904. char *param2
  2905. )
  2906. {
  2907. ClientPlayer *client_ptr;
  2908. int client_index;
  2909. client_index = FindClientIndex(param1);
  2910. if (client_index == -1)
  2911. {
  2912. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2913. return;
  2914. }
  2915. client_ptr = c_list[client_index];
  2916. client_ptr->ip_address_list.Remove(param2);
  2917. this->SetupPlayersOnServer();
  2918. if (gpManiDatabase->GetDBEnabled())
  2919. {
  2920. SQLProcessBlock *ptr = new SQLRemoveIPAddress();
  2921. ptr->in_params.AddParam("name", client_ptr->GetName());
  2922. ptr->in_params.AddParam("ip", param2);
  2923. client_sql_manager->AddRequest(ptr);
  2924. }
  2925. WriteClients();
  2926. OutputHelpText(ORANGE_CHAT, player_ptr, "Client %s has had IP Address [%s] removed", client_ptr->GetName(), param2);
  2927. }
  2928. //---------------------------------------------------------------------------------
  2929. // Purpose: Handle ma_client sub command RemoveNick
  2930. //---------------------------------------------------------------------------------
  2931. void ManiClient::ProcessRemoveNick
  2932. (
  2933. player_t *player_ptr,
  2934. char *param1,
  2935. char *param2
  2936. )
  2937. {
  2938. ClientPlayer *client_ptr;
  2939. int client_index;
  2940. client_index = FindClientIndex(param1);
  2941. if (client_index == -1)
  2942. {
  2943. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2944. return;
  2945. }
  2946. client_ptr = c_list[client_index];
  2947. client_ptr->nick_list.Remove(param2);
  2948. this->SetupPlayersOnServer();
  2949. if (gpManiDatabase->GetDBEnabled())
  2950. {
  2951. SQLProcessBlock *ptr = new SQLRemoveNick();
  2952. ptr->in_params.AddParam("name", client_ptr->GetName());
  2953. ptr->in_params.AddParam("nick", param2);
  2954. client_sql_manager->AddRequest(ptr);
  2955. }
  2956. WriteClients();
  2957. OutputHelpText(ORANGE_CHAT, player_ptr, "Client %s has had nickname [%s] removed", client_ptr->GetName(), param2);
  2958. }
  2959. //---------------------------------------------------------------------------------
  2960. // Purpose: Handle ma_client sub command RemoveGroup
  2961. //---------------------------------------------------------------------------------
  2962. void ManiClient::ProcessRemoveGroup
  2963. (
  2964. const char *class_type,
  2965. player_t *player_ptr,
  2966. char *param1,
  2967. char *param2
  2968. )
  2969. {
  2970. int client_index;
  2971. ClientPlayer *client_ptr;
  2972. client_index = FindClientIndex(param1);
  2973. if (client_index == -1)
  2974. {
  2975. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  2976. return;
  2977. }
  2978. client_ptr = c_list[client_index];
  2979. client_ptr->group_list.Remove(class_type, param2);
  2980. this->SetupUnMasked();
  2981. this->SetupMasked();
  2982. WriteClients();
  2983. if (gpManiDatabase->GetDBEnabled())
  2984. {
  2985. SQLProcessBlock *ptr = new SQLRemoveGroup();
  2986. ptr->in_params.AddParam("name", client_ptr->GetName());
  2987. ptr->in_params.AddParam("group_id", param2);
  2988. ptr->in_params.AddParam("class_type", class_type);
  2989. client_sql_manager->AddRequest(ptr);
  2990. }
  2991. OutputHelpText(ORANGE_CHAT, player_ptr, "Removed client [%s] from %s flag group [%s]", client_ptr->GetName(), class_type, param2);
  2992. }
  2993. //---------------------------------------------------------------------------------
  2994. // Purpose: Handle ma_client sub command Status
  2995. //---------------------------------------------------------------------------------
  2996. void ManiClient::ProcessAllClientFlagDesc
  2997. (
  2998. const char *class_type,
  2999. player_t *player_ptr
  3000. )
  3001. {
  3002. const DualStrKey *key_value = NULL;
  3003. for (const char *desc = flag_desc_list.FindFirst(class_type, &key_value); desc != NULL; desc = flag_desc_list.FindNext(class_type, &key_value))
  3004. {
  3005. OutputHelpText(ORANGE_CHAT, player_ptr, "%-20s %s", key_value->key2, desc);
  3006. }
  3007. }
  3008. //---------------------------------------------------------------------------------
  3009. // Purpose: Handle ma_client sub command Status
  3010. //---------------------------------------------------------------------------------
  3011. void ManiClient::ProcessClientFlagDesc
  3012. (
  3013. const char *class_type,
  3014. player_t *player_ptr,
  3015. char *param1
  3016. )
  3017. {
  3018. const DualStrKey *key_value = NULL;
  3019. for (const char *desc = flag_desc_list.FindFirst(class_type, &key_value); desc != NULL; desc = flag_desc_list.FindNext(class_type, &key_value))
  3020. {
  3021. if (strcmp(key_value->key2, param1) == 0)
  3022. {
  3023. OutputHelpText(ORANGE_CHAT, player_ptr, "%-20s %s", key_value->key2, desc);
  3024. return;
  3025. }
  3026. }
  3027. OutputHelpText(ORANGE_CHAT, player_ptr, "%s flag [%s] does not exist !!", class_type, param1);
  3028. }
  3029. //---------------------------------------------------------------------------------
  3030. // Purpose: Handle ma_client sub command Status
  3031. //---------------------------------------------------------------------------------
  3032. void ManiClient::ProcessAllClientStatus
  3033. (
  3034. player_t *player_ptr
  3035. )
  3036. {
  3037. if (c_list.empty())
  3038. {
  3039. OutputHelpText(ORANGE_CHAT, player_ptr, "No clients setup yet !!");
  3040. return;
  3041. }
  3042. OutputHelpText(ORANGE_CHAT, player_ptr, "List of clients, use ma_client status <name> for detailed info on a client");
  3043. for (int i = 0; i != (int) c_list.size(); i++)
  3044. {
  3045. OutputHelpText(ORANGE_CHAT, player_ptr, "%s", c_list[i]->GetName());
  3046. }
  3047. }
  3048. //---------------------------------------------------------------------------------
  3049. // Purpose: Handle ma_client sub command Status
  3050. //---------------------------------------------------------------------------------
  3051. void ManiClient::ProcessClientStatus
  3052. (
  3053. player_t *player_ptr,
  3054. char *param1 // player
  3055. )
  3056. {
  3057. int client_index;
  3058. ClientPlayer *client_ptr;
  3059. char temp_string[8192];
  3060. char temp_string2[512];
  3061. client_index = FindClientIndex(param1);
  3062. if (client_index == -1)
  3063. {
  3064. OutputHelpText(ORANGE_CHAT, player_ptr, "Unable to find target [%s]", param1);
  3065. return;
  3066. }
  3067. client_ptr = c_list[client_index];
  3068. OutputHelpText(ORANGE_CHAT, player_ptr, "Name : %s", client_ptr->GetName() ? client_ptr->GetName():"");
  3069. OutputHelpText(ORANGE_CHAT, player_ptr, "Email : %s", client_ptr->GetEmailAddress() ? client_ptr->GetEmailAddress():"");
  3070. OutputHelpText(ORANGE_CHAT, player_ptr, "Notes : %s", client_ptr->GetNotes() ? client_ptr->GetNotes():"");
  3071. OutputHelpText(ORANGE_CHAT, player_ptr, "Password : %s", client_ptr->GetPassword() ? client_ptr->GetPassword():"");
  3072. const char *c_type1 = NULL;
  3073. for (int level_id = client_ptr->level_list.FindFirst(&c_type1); level_id != -99999; level_id = client_ptr->level_list.FindNext(&c_type1))
  3074. {
  3075. OutputHelpText(ORANGE_CHAT, player_ptr, "%s Level ID : %i", c_type1, level_id);
  3076. }
  3077. if (!client_ptr->steam_list.IsEmpty())
  3078. {
  3079. Q_strcpy(temp_string, "Steam IDs : ");
  3080. for (const char *steam_id = client_ptr->steam_list.FindFirst(); steam_id != NULL; steam_id = client_ptr->steam_list.FindNext())
  3081. {
  3082. snprintf(temp_string2, sizeof(temp_string2), "%s ", steam_id);
  3083. strcat(temp_string, temp_string2);
  3084. }
  3085. OutputHelpText(ORANGE_CHAT, player_ptr, "%s", temp_string);
  3086. }
  3087. if (!client_ptr->ip_address_list.IsEmpty())
  3088. {
  3089. Q_strcpy(temp_string, "IP Addresses : ");
  3090. for (const char *ip_address = client_ptr->ip_address_list.FindFirst(); ip_address != NULL; ip_address = client_ptr->ip_address_list.FindNext())
  3091. {
  3092. snprintf(temp_string2, sizeof(temp_string2), "%s ", ip_address);
  3093. strcat(temp_string, temp_string2);
  3094. }
  3095. OutputHelpText(ORANGE_CHAT, player_ptr, "%s", temp_string);
  3096. }
  3097. if (!client_ptr->nick_list.IsEmpty())
  3098. {
  3099. Q_strcpy(temp_string, "Nicknames : ");
  3100. for (const char *nick = client_ptr->nick_list.FindFirst(); nick != NULL; nick = client_ptr->nick_list.FindNext())
  3101. {
  3102. snprintf(temp_string2, sizeof(temp_string2), "%s ", nick);
  3103. strcat(temp_string, temp_string2);
  3104. }
  3105. OutputHelpText(ORANGE_CHAT, player_ptr, "%s", temp_string);
  3106. }
  3107. const char *group_id = NULL;
  3108. for (const char *c_type = client_ptr->group_list.FindFirst(&group_id); c_type != NULL; c_type = client_ptr->group_list.FindNext(&group_id))
  3109. {
  3110. OutputHelpText(ORANGE_CHAT, player_ptr, "%s Group : %s", c_type, group_id);
  3111. }
  3112. // Build up flags we are using for this client
  3113. char string[2048];
  3114. bool found = false;
  3115. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  3116. {
  3117. if (client_ptr->personal_flag_list.CatFlags(string, c_type))
  3118. {
  3119. if (!found)
  3120. {
  3121. OutputHelpText(ORANGE_CHAT, player_ptr, "Personal Flags:-");
  3122. found = true;
  3123. }
  3124. OutputHelpText(ORANGE_CHAT, player_ptr, "%s flags: %s", c_type, string);
  3125. }
  3126. }
  3127. found = false;
  3128. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  3129. {
  3130. if (client_ptr->unmasked_list.CatFlags(string, c_type))
  3131. {
  3132. if (!found)
  3133. {
  3134. OutputHelpText(ORANGE_CHAT, player_ptr, "Flags including flags from groups:-");
  3135. found = true;
  3136. }
  3137. OutputHelpText(ORANGE_CHAT, player_ptr, "%s flags: %s", c_type, string);
  3138. }
  3139. }
  3140. found = false;
  3141. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  3142. {
  3143. if (client_ptr->masked_list.CatFlags(string, c_type))
  3144. {
  3145. if (!found)
  3146. {
  3147. OutputHelpText(ORANGE_CHAT, player_ptr, "Flags after level group mask applied:-");
  3148. found = true;
  3149. }
  3150. OutputHelpText(ORANGE_CHAT, player_ptr, "%s in game flags: %s", c_type, string);
  3151. }
  3152. }
  3153. }
  3154. //---------------------------------------------------------------------------------
  3155. // Purpose: Handle ma_clientgroup sub command Status
  3156. //---------------------------------------------------------------------------------
  3157. void ManiClient::ProcessClientGroupStatus
  3158. (
  3159. player_t *player_ptr,
  3160. char *param1 // type
  3161. )
  3162. {
  3163. char flags_string[2048] = "";
  3164. const DualStriKey *key_value1 = NULL;
  3165. for (GlobalGroupFlag *g_flag = group_list.FindFirst(param1, &key_value1); g_flag != NULL; g_flag = group_list.FindNext(param1, &key_value1))
  3166. {
  3167. if (g_flag->CatFlags(flags_string))
  3168. {
  3169. OutputHelpText(ORANGE_CHAT, player_ptr, "%s : %s => %s", key_value1->key1, key_value1->key2, flags_string);
  3170. }
  3171. }
  3172. const DualStrIntKey *key_value2 = NULL;
  3173. for (GlobalGroupFlag *g_flag = level_list.FindFirst(param1, &key_value2); g_flag != NULL; g_flag = level_list.FindNext(param1, &key_value2))
  3174. {
  3175. if (g_flag->CatFlags(flags_string))
  3176. {
  3177. OutputHelpText(ORANGE_CHAT, player_ptr, "%s : %i => %s", key_value2->key1, key_value2->key2, flags_string);
  3178. }
  3179. }
  3180. }
  3181. //---------------------------------------------------------------------------------
  3182. // Purpose: Handle ma_client sub command Upload
  3183. //---------------------------------------------------------------------------------
  3184. void ManiClient::ProcessClientUpload
  3185. (
  3186. player_t *player_ptr
  3187. )
  3188. {
  3189. if (!gpManiDatabase->GetDBEnabled())
  3190. {
  3191. OutputHelpText(ORANGE_CHAT, player_ptr, "Cannot upload as database functionality not enabled, see database.txt");
  3192. return;
  3193. }
  3194. // Upload to the database
  3195. OutputHelpText(ORANGE_CHAT, player_ptr, "Uploading data.....");
  3196. if (this->CreateDBTables(NULL))
  3197. {
  3198. if (this->CreateDBFlags(NULL))
  3199. {
  3200. this->ExportDataToDB(NULL);
  3201. OutputHelpText(ORANGE_CHAT, NULL, "Upload suceeded");
  3202. return;
  3203. }
  3204. }
  3205. OutputHelpText(ORANGE_CHAT, NULL, "Upload failed !!");
  3206. }
  3207. //---------------------------------------------------------------------------------
  3208. // Purpose: Handle ma_client sub command ServerID
  3209. //---------------------------------------------------------------------------------
  3210. void ManiClient::ProcessClientServerID
  3211. (
  3212. player_t *player_ptr
  3213. )
  3214. {
  3215. if (!gpManiDatabase->GetDBEnabled())
  3216. {
  3217. OutputHelpText(ORANGE_CHAT, player_ptr, "Cannot upload as database functionality not enabled, see database.txt");
  3218. return;
  3219. }
  3220. // Upload to the database
  3221. OutputHelpText(ORANGE_CHAT, player_ptr, "Uploading Server ID data.....");
  3222. if (!this->UploadServerID(player_ptr))
  3223. {
  3224. OutputHelpText(ORANGE_CHAT, player_ptr, "Upload failed !!");
  3225. return;
  3226. }
  3227. OutputHelpText(ORANGE_CHAT, player_ptr, "Upload suceeded");
  3228. }
  3229. //---------------------------------------------------------------------------------
  3230. // Purpose: Handle ma_client sub command Download
  3231. //---------------------------------------------------------------------------------
  3232. void ManiClient::ProcessClientDownload
  3233. (
  3234. player_t *player_ptr
  3235. )
  3236. {
  3237. if (!gpManiDatabase->GetDBEnabled())
  3238. {
  3239. OutputHelpText(ORANGE_CHAT, player_ptr, "Cannot download as database functionality not enabled, see database.txt");
  3240. return;
  3241. }
  3242. // Upload to the database
  3243. FreeClients();
  3244. OutputHelpText(ORANGE_CHAT, player_ptr, "Downloading data.....");
  3245. if (!this->GetClientsFromDatabase(player_ptr))
  3246. {
  3247. OutputHelpText(ORANGE_CHAT, player_ptr, "Download failed, using existing clients.txt file instead");
  3248. FreeClients();
  3249. LoadClients();
  3250. }
  3251. else
  3252. {
  3253. OutputHelpText(ORANGE_CHAT, player_ptr, "Download succeeded, updating clients.txt");
  3254. this->SetupUnMasked();
  3255. this->SetupMasked();
  3256. WriteClients();
  3257. }
  3258. }
  3259. //---------------------------------------------------------------------------------
  3260. // Purpose: Handle upgrade from versions prior to V1.2BetaM
  3261. //---------------------------------------------------------------------------------
  3262. void ManiClient::UpgradeDB1( void )
  3263. {
  3264. bool update_db = false;
  3265. char version_string[32];
  3266. int row_count = 0;
  3267. if (!gpManiDatabase->GetDBEnabled())
  3268. {
  3269. return;
  3270. }
  3271. ManiMySQL *mani_mysql = new ManiMySQL();
  3272. if (!mani_mysql->Init(NULL))
  3273. {
  3274. delete mani_mysql;
  3275. return;
  3276. }
  3277. if (!mani_mysql->ExecuteQuery(NULL,
  3278. &row_count,
  3279. "SELECT v.version_id "
  3280. "FROM %s%s v",
  3281. gpManiDatabase->GetDBTablePrefix(),
  3282. gpManiDatabase->GetDBTBVersion()))
  3283. {
  3284. delete mani_mysql;
  3285. return;
  3286. }
  3287. if (row_count != 0)
  3288. {
  3289. // Found rows
  3290. while (mani_mysql->FetchRow())
  3291. {
  3292. Q_strcpy(version_string, mani_mysql->GetString(0));
  3293. if (Q_strlen(version_string) < 8)
  3294. {
  3295. delete mani_mysql;
  3296. return;
  3297. }
  3298. char v_letter = version_string[7];
  3299. if (v_letter == 'A' ||
  3300. v_letter == 'B' ||
  3301. v_letter == 'C' ||
  3302. v_letter == 'D' ||
  3303. v_letter == 'E' ||
  3304. v_letter == 'F' ||
  3305. v_letter == 'G' ||
  3306. v_letter == 'H' ||
  3307. v_letter == 'I' ||
  3308. v_letter == 'J' ||
  3309. v_letter == 'K' ||
  3310. v_letter == 'L')
  3311. {
  3312. update_db = true;
  3313. }
  3314. break;
  3315. }
  3316. }
  3317. if (!update_db)
  3318. {
  3319. delete mani_mysql;
  3320. return;
  3321. }
  3322. MMsg("Updating database from pre V%s to new format\n", version_string);
  3323. bool column_exists;
  3324. if (!this->TestColumnExists(mani_mysql, gpManiDatabase->GetDBTBGroup(),"server_id", &column_exists)){delete mani_mysql; return;}
  3325. if (column_exists) if (!this->UpgradeServerIDToServerGroupID(mani_mysql, gpManiDatabase->GetDBTBGroup())) {delete mani_mysql; return;}
  3326. if (!this->TestColumnExists(mani_mysql, gpManiDatabase->GetDBTBClientGroup(),"server_id", &column_exists)){delete mani_mysql; return;}
  3327. if (column_exists) if (!this->UpgradeServerIDToServerGroupID(mani_mysql, gpManiDatabase->GetDBTBClientGroup())) {delete mani_mysql; return;}
  3328. if (!this->TestColumnExists(mani_mysql, gpManiDatabase->GetDBTBClientFlag(),"server_id", &column_exists)){delete mani_mysql; return;}
  3329. if (column_exists) if (!this->UpgradeServerIDToServerGroupID(mani_mysql, gpManiDatabase->GetDBTBClientFlag())) {delete mani_mysql; return;}
  3330. if (!this->TestColumnExists(mani_mysql, gpManiDatabase->GetDBTBClientLevel(),"server_id", &column_exists)){delete mani_mysql; return;}
  3331. if (column_exists) if (!this->UpgradeServerIDToServerGroupID(mani_mysql, gpManiDatabase->GetDBTBClientLevel())) {delete mani_mysql; return;}
  3332. if (!this->TestColumnExists(mani_mysql, gpManiDatabase->GetDBTBLevel(),"server_id", &column_exists)){delete mani_mysql; return;}
  3333. if (column_exists) if (!this->UpgradeServerIDToServerGroupID(mani_mysql, gpManiDatabase->GetDBTBLevel())) {delete mani_mysql; return;}
  3334. if (!this->TestColumnExists(mani_mysql, gpManiDatabase->GetDBTBClientServer(),"server_id", &column_exists)){delete mani_mysql; return;}
  3335. if (column_exists) if (!this->UpgradeServerIDToServerGroupID(mani_mysql, gpManiDatabase->GetDBTBClientServer())) {delete mani_mysql; return;}
  3336. bool column_matches;
  3337. if (!this->TestColumnType(mani_mysql, gpManiDatabase->GetDBTBClientFlag(), "type", "char(1)", &column_matches)) {delete mani_mysql;return;}
  3338. if (column_matches) if (!this->UpgradeClassTypes(mani_mysql, gpManiDatabase->GetDBTBClientFlag())) {delete mani_mysql; return;}
  3339. if (!this->TestColumnType(mani_mysql, gpManiDatabase->GetDBTBClientGroup(), "type", "char(1)", &column_matches)) {delete mani_mysql;return;}
  3340. if (column_matches) if (!this->UpgradeClassTypes(mani_mysql, gpManiDatabase->GetDBTBClientGroup())) {delete mani_mysql; return;}
  3341. if (!this->TestColumnType(mani_mysql, gpManiDatabase->GetDBTBClientLevel(), "type", "char(1)", &column_matches)) {delete mani_mysql;return;}
  3342. if (column_matches) if (!this->UpgradeClassTypes(mani_mysql, gpManiDatabase->GetDBTBClientLevel())) {delete mani_mysql; return;}
  3343. if (!this->TestColumnType(mani_mysql, gpManiDatabase->GetDBTBGroup(), "type", "char(1)", &column_matches)) {delete mani_mysql;return;}
  3344. if (column_matches) if (!this->UpgradeClassTypes(mani_mysql, gpManiDatabase->GetDBTBGroup())) {delete mani_mysql; return;}
  3345. if (!this->TestColumnType(mani_mysql, gpManiDatabase->GetDBTBLevel(), "type", "char(1)", &column_matches)) {delete mani_mysql;return;}
  3346. if (column_matches) if (!this->UpgradeClassTypes(mani_mysql, gpManiDatabase->GetDBTBLevel())) {delete mani_mysql; return;}
  3347. if (!this->TestColumnType(mani_mysql, gpManiDatabase->GetDBTBFlag(), "type", "char(1)", &column_matches)) {delete mani_mysql;return;}
  3348. if (column_matches) if (!this->UpgradeClassTypes(mani_mysql, gpManiDatabase->GetDBTBFlag())) {delete mani_mysql; return;}
  3349. MMsg("Updating table %s%s to have column 'server_group_id'....\n", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer());
  3350. if (!this->TestColumnExists(mani_mysql, gpManiDatabase->GetDBTBServer(),"server_group_id", &column_exists)){delete mani_mysql; return;}
  3351. if (!column_exists)
  3352. {
  3353. MMsg("Updating table %s%s to have column 'server_group_id'....\n", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer());
  3354. if (!mani_mysql->ExecuteQuery(NULL, "ALTER TABLE %s%s ADD server_group_id varchar(32) NOT NULL default ''",
  3355. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer()))
  3356. {
  3357. return ;
  3358. }
  3359. }
  3360. MMsg("Updating table %s%s to have 'Default' for server group id....\n", gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer());
  3361. if (!mani_mysql->ExecuteQuery(NULL, "UPDATE %s%s SET server_group_id = 'Default'",
  3362. gpManiDatabase->GetDBTablePrefix(), gpManiDatabase->GetDBTBServer()))
  3363. {
  3364. return ;
  3365. }
  3366. MMsg("Updating stored database version ID to %s....\n", PLUGIN_VERSION_ID2);
  3367. if (!mani_mysql->ExecuteQuery(NULL, "UPDATE %s%s SET version_id = '%s'",
  3368. gpManiDatabase->GetDBTablePrefix(),
  3369. gpManiDatabase->GetDBTBVersion(),
  3370. PLUGIN_VERSION_ID2))
  3371. {
  3372. delete mani_mysql;
  3373. return;
  3374. }
  3375. MMsg("Update completed successfully!\n", version_string);
  3376. delete mani_mysql;
  3377. }
  3378. //---------------------------------------------------------------------------------
  3379. // Purpose: Handle upgrade from versions prior to V1.2BetaM
  3380. //---------------------------------------------------------------------------------
  3381. bool ManiClient::UpgradeServerIDToServerGroupID
  3382. (
  3383. ManiMySQL *mani_mysql_ptr,
  3384. const char *table_name
  3385. )
  3386. {
  3387. MMsg("Updating 'server_id' to 'server_group_id' on table '%s%s'....\n", gpManiDatabase->GetDBTablePrefix(), table_name);
  3388. if (!mani_mysql_ptr->ExecuteQuery(NULL, "ALTER TABLE %s%s CHANGE server_id server_group_id varchar(32) NOT NULL default ''",
  3389. gpManiDatabase->GetDBTablePrefix(), table_name))
  3390. {
  3391. return false;
  3392. }
  3393. MMsg("Defaulting 'server_group_id' to 'Default' on table '%s%s'....\n", gpManiDatabase->GetDBTablePrefix(), table_name);
  3394. if (!mani_mysql_ptr->ExecuteQuery(NULL, "UPDATE %s%s t1 SET t1.server_group_id = 'Default'",
  3395. gpManiDatabase->GetDBTablePrefix(), table_name))
  3396. {
  3397. return false;
  3398. }
  3399. return true;
  3400. }
  3401. //---------------------------------------------------------------------------------
  3402. // Purpose: Test a column exists
  3403. //---------------------------------------------------------------------------------
  3404. bool ManiClient::TestColumnExists(ManiMySQL *mani_mysql_ptr, char *table_name, char *column_name, bool *found_column)
  3405. {
  3406. int row_count;
  3407. MMsg("Testing column '%s' exists on table '%s%s'....\n", column_name, gpManiDatabase->GetDBTablePrefix(), table_name);
  3408. if (!mani_mysql_ptr->ExecuteQuery(NULL, &row_count, "SHOW COLUMNS FROM %s%s LIKE '%s'",
  3409. gpManiDatabase->GetDBTablePrefix(), table_name, column_name))
  3410. {
  3411. *found_column = false;
  3412. return false;
  3413. }
  3414. if (row_count != 0)
  3415. {
  3416. MMsg("Column exists\n");
  3417. *found_column = true;
  3418. }
  3419. else
  3420. {
  3421. MMsg("Column does not exist\n");
  3422. *found_column = false;
  3423. }
  3424. return true;
  3425. }
  3426. //---------------------------------------------------------------------------------
  3427. // Purpose: Test a column type matches our one
  3428. //---------------------------------------------------------------------------------
  3429. bool ManiClient::TestColumnType(ManiMySQL *mani_mysql_ptr, char *table_name, char *column_name, char *column_type, bool *column_matches)
  3430. {
  3431. int row_count;
  3432. MMsg("Testing column type '%s' matches column '%s' on table '%s%s'....\n", column_type, column_name, gpManiDatabase->GetDBTablePrefix(), table_name);
  3433. if (!mani_mysql_ptr->ExecuteQuery(NULL, &row_count, "SHOW COLUMNS FROM %s%s LIKE '%s'",
  3434. gpManiDatabase->GetDBTablePrefix(), table_name, column_name))
  3435. {
  3436. *column_matches = false;
  3437. return false;
  3438. }
  3439. if (row_count == 0)
  3440. {
  3441. return false;
  3442. }
  3443. mani_mysql_ptr->FetchRow();
  3444. if (FStrEq(mani_mysql_ptr->GetString(1), column_type))
  3445. {
  3446. *column_matches = true;
  3447. return true;
  3448. }
  3449. *column_matches = true;
  3450. return true;
  3451. }
  3452. //---------------------------------------------------------------------------------
  3453. // Purpose: Handle upgrade from versions prior to V1.2BetaM
  3454. //---------------------------------------------------------------------------------
  3455. bool ManiClient::UpgradeClassTypes
  3456. (
  3457. ManiMySQL *mani_mysql_ptr,
  3458. const char *table_name
  3459. )
  3460. {
  3461. MMsg("Updating 'type' to be varchar(32) on table %s%s....\n", gpManiDatabase->GetDBTablePrefix(), table_name);
  3462. if (!mani_mysql_ptr->ExecuteQuery(NULL, "ALTER TABLE %s%s CHANGE type type varchar(32) NOT NULL default ''",
  3463. gpManiDatabase->GetDBTablePrefix(), table_name))
  3464. {
  3465. return false;
  3466. }
  3467. MMsg("Updating 'A' type to be 'Admin' on table %s%s....\n", gpManiDatabase->GetDBTablePrefix(), table_name);
  3468. if (!mani_mysql_ptr->ExecuteQuery(NULL, "UPDATE %s%s t1 SET t1.type = 'Admin' where type = 'A'",
  3469. gpManiDatabase->GetDBTablePrefix(), table_name))
  3470. {
  3471. return false;
  3472. }
  3473. MMsg("Updating 'I' type to be 'Immunity' on table %s%s....\n", gpManiDatabase->GetDBTablePrefix(), table_name);
  3474. if (!mani_mysql_ptr->ExecuteQuery(NULL, "UPDATE %s%s t1 SET t1.type = 'Immunity' where type = 'I'",
  3475. gpManiDatabase->GetDBTablePrefix(), table_name))
  3476. {
  3477. return false;
  3478. }
  3479. return true;
  3480. }
  3481. //---------------------------------------------------------------------------------
  3482. // Purpose: Con command for setting admin flags
  3483. //---------------------------------------------------------------------------------
  3484. SCON_COMMAND(ma_client, 2221, MaClient, true);
  3485. //---------------------------------------------------------------------------------
  3486. // Purpose: Handle ma_clientgroup command
  3487. //---------------------------------------------------------------------------------
  3488. PLUGIN_RESULT ManiClient::ProcessMaClientGroup(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  3489. {
  3490. bool invalid_args = false;
  3491. if (player_ptr)
  3492. {
  3493. // Check if player is admin
  3494. if (!HasAccess(player_ptr->index, ADMIN, ADMIN_CLIENT_ADMIN)) return PLUGIN_BAD_ADMIN;
  3495. }
  3496. int argc = gpCmd->Cmd_Argc();
  3497. // Cover only command and subcommand being passed in
  3498. if (argc < 3) return gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  3499. char *sub_command = (char *) gpCmd->Cmd_Argv(1);
  3500. char *param1 = (char *) gpCmd->Cmd_Argv(2);
  3501. char *param2 = (char *) gpCmd->Cmd_Argv(3);
  3502. // Parse sub command
  3503. if (FStrEq(sub_command, "addagroup"))
  3504. {
  3505. if (argc != 4) invalid_args = true;
  3506. else ProcessAddGroupType(ADMIN, player_ptr, param1, param2);
  3507. }
  3508. else if (FStrEq(sub_command, "addigroup"))
  3509. {
  3510. if (argc != 4) invalid_args = true;
  3511. else ProcessAddGroupType(IMMUNITY, player_ptr, param1, param2);
  3512. }
  3513. else if (FStrEq(sub_command, "addalevel"))
  3514. {
  3515. if (argc != 4) invalid_args = true;
  3516. else ProcessAddLevelType(ADMIN, player_ptr, param1, param2);
  3517. }
  3518. else if (FStrEq(sub_command, "addilevel"))
  3519. {
  3520. if (argc != 4) invalid_args = true;
  3521. else ProcessAddLevelType(IMMUNITY, player_ptr, param1, param2);
  3522. }
  3523. else if (FStrEq(sub_command, "removeagroup"))
  3524. {
  3525. if (argc != 3) invalid_args = true;
  3526. else ProcessRemoveGroupType(ADMIN, player_ptr, param1);
  3527. }
  3528. else if (FStrEq(sub_command, "removeigroup"))
  3529. {
  3530. if (argc != 3) invalid_args = true;
  3531. else ProcessRemoveGroupType(IMMUNITY, player_ptr, param1);
  3532. }
  3533. else if (FStrEq(sub_command, "removealevel"))
  3534. {
  3535. if (argc != 3) invalid_args = true;
  3536. else ProcessRemoveLevelType(ADMIN, player_ptr, param1);
  3537. }
  3538. else if (FStrEq(sub_command, "removeilevel"))
  3539. {
  3540. if (argc != 3) invalid_args = true;
  3541. else ProcessRemoveLevelType(IMMUNITY, player_ptr, param1);
  3542. }
  3543. else if (FStrEq(sub_command, "status"))
  3544. {
  3545. if (argc == 3)
  3546. {
  3547. ProcessClientGroupStatus(player_ptr, param1);
  3548. }
  3549. else
  3550. {
  3551. invalid_args = true;
  3552. }
  3553. }
  3554. else
  3555. {
  3556. invalid_args = true;
  3557. }
  3558. if (invalid_args)
  3559. {
  3560. gpManiHelp->ShowHelp(player_ptr, command_name, help_id, command_type);
  3561. }
  3562. return PLUGIN_STOP;
  3563. }
  3564. //---------------------------------------------------------------------------------
  3565. // Purpose: Con command for setting admin flags
  3566. //---------------------------------------------------------------------------------
  3567. SCON_COMMAND(ma_clientgroup, 2223, MaClientGroup, true);
  3568. //---------------------------------------------------------------------------------
  3569. // Purpose: Con command for setting admin flags
  3570. //---------------------------------------------------------------------------------
  3571. SCON_COMMAND(ma_setflag, 0, MaSetFlag, true);
  3572. //---------------------------------------------------------------------------------
  3573. // Purpose: Handle ma_clientgroup command
  3574. //---------------------------------------------------------------------------------
  3575. PLUGIN_RESULT ManiClient::ProcessMaReloadClients(player_t *player_ptr, const char *command_name, const int help_id, const int command_type)
  3576. {
  3577. if (player_ptr)
  3578. {
  3579. // Check if player is admin
  3580. if (!this->HasAccess(player_ptr->index, ADMIN, ADMIN_CLIENT_ADMIN)) return PLUGIN_BAD_ADMIN;
  3581. }
  3582. this->Init();
  3583. return PLUGIN_STOP;
  3584. }
  3585. //---------------------------------------------------------------------------------
  3586. // Purpose: Con command for re loading admin lists
  3587. //---------------------------------------------------------------------------------
  3588. SCON_COMMAND(ma_reloadclients, 2167, MaReloadClients, true);
  3589. //---------------------------------------------------------------------------------
  3590. // Purpose: Sets up immunity flags, if you add a new flag it needs to be intialised
  3591. // here !!
  3592. //---------------------------------------------------------------------------------
  3593. void ManiClient::InitImmunityFlags(void)
  3594. {
  3595. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GIMP].flag, IMMUNITY_ALLOW_GIMP_FLAG);
  3596. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GIMP].flag_desc,IMMUNITY_ALLOW_GIMP_DESC);
  3597. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_KICK].flag, IMMUNITY_ALLOW_KICK_FLAG);
  3598. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_KICK].flag_desc,IMMUNITY_ALLOW_KICK_DESC);
  3599. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SLAY].flag, IMMUNITY_ALLOW_SLAY_FLAG);
  3600. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SLAY].flag_desc,IMMUNITY_ALLOW_SLAY_DESC);
  3601. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BAN].flag, IMMUNITY_ALLOW_BAN_FLAG);
  3602. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BAN].flag_desc,IMMUNITY_ALLOW_BAN_DESC);
  3603. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_CEXEC].flag, IMMUNITY_ALLOW_CEXEC_FLAG);
  3604. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_CEXEC].flag_desc,IMMUNITY_ALLOW_CEXEC_DESC);
  3605. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BLIND].flag, IMMUNITY_ALLOW_BLIND_FLAG);
  3606. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BLIND].flag_desc,IMMUNITY_ALLOW_BLIND_DESC);
  3607. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SLAP].flag, IMMUNITY_ALLOW_SLAP_FLAG);
  3608. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SLAP].flag_desc,IMMUNITY_ALLOW_SLAP_DESC);
  3609. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_FREEZE].flag, IMMUNITY_ALLOW_FREEZE_FLAG);
  3610. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_FREEZE].flag_desc,IMMUNITY_ALLOW_FREEZE_DESC);
  3611. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_TELEPORT].flag, IMMUNITY_ALLOW_TELEPORT_FLAG);
  3612. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_TELEPORT].flag_desc,IMMUNITY_ALLOW_TELEPORT_DESC);
  3613. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_DRUG].flag, IMMUNITY_ALLOW_DRUG_FLAG);
  3614. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_DRUG].flag_desc,IMMUNITY_ALLOW_DRUG_DESC);
  3615. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SWAP].flag, IMMUNITY_ALLOW_SWAP_FLAG);
  3616. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SWAP].flag_desc,IMMUNITY_ALLOW_SWAP_DESC);
  3617. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_TAG].flag, IMMUNITY_ALLOW_TAG_FLAG);
  3618. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_TAG].flag_desc,IMMUNITY_ALLOW_TAG_DESC);
  3619. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BALANCE].flag, IMMUNITY_ALLOW_BALANCE_FLAG);
  3620. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BALANCE].flag_desc,IMMUNITY_ALLOW_BALANCE_DESC);
  3621. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BURN].flag, IMMUNITY_ALLOW_BURN_FLAG);
  3622. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BURN].flag_desc,IMMUNITY_ALLOW_BURN_DESC);
  3623. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_MUTE].flag, IMMUNITY_ALLOW_MUTE_FLAG);
  3624. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_MUTE].flag_desc,IMMUNITY_ALLOW_MUTE_DESC);
  3625. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_RESERVE].flag, IMMUNITY_ALLOW_RESERVE_FLAG);
  3626. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_RESERVE].flag_desc,IMMUNITY_ALLOW_RESERVE_DESC);
  3627. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SETSKIN].flag, IMMUNITY_ALLOW_SETSKIN_FLAG);
  3628. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_SETSKIN].flag_desc,IMMUNITY_ALLOW_SETSKIN_DESC);
  3629. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_RESERVE_SKIN].flag, IMMUNITY_ALLOW_RESERVE_SKIN_FLAG);
  3630. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_RESERVE_SKIN].flag_desc,IMMUNITY_ALLOW_RESERVE_SKIN_DESC);
  3631. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_TIMEBOMB].flag, IMMUNITY_ALLOW_TIMEBOMB_FLAG);
  3632. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_TIMEBOMB].flag_desc,IMMUNITY_ALLOW_TIMEBOMB_DESC);
  3633. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_FIREBOMB].flag, IMMUNITY_ALLOW_FIREBOMB_FLAG);
  3634. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_FIREBOMB].flag_desc,IMMUNITY_ALLOW_FIREBOMB_DESC);
  3635. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_FREEZEBOMB].flag, IMMUNITY_ALLOW_FREEZEBOMB_FLAG);
  3636. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_FREEZEBOMB].flag_desc,IMMUNITY_ALLOW_FREEZEBOMB_DESC);
  3637. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BEACON].flag, IMMUNITY_ALLOW_BEACON_FLAG);
  3638. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BEACON].flag_desc,IMMUNITY_ALLOW_BEACON_DESC);
  3639. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GHOST].flag, IMMUNITY_ALLOW_GHOST_FLAG);
  3640. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GHOST].flag_desc,IMMUNITY_ALLOW_GHOST_DESC);
  3641. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GIVE].flag, IMMUNITY_ALLOW_GIVE_FLAG);
  3642. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GIVE].flag_desc,IMMUNITY_ALLOW_GIVE_DESC);
  3643. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_COLOUR].flag, IMMUNITY_ALLOW_COLOUR_FLAG);
  3644. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_COLOUR].flag_desc, IMMUNITY_ALLOW_COLOUR_DESC);
  3645. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BASIC_IMMUNITY].flag, IMMUNITY_ALLOW_BASIC_IMMUNITY_FLAG);
  3646. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_BASIC_IMMUNITY].flag_desc, IMMUNITY_ALLOW_BASIC_IMMUNITY_DESC);
  3647. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GRAVITY].flag, IMMUNITY_ALLOW_GRAVITY_FLAG);
  3648. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_GRAVITY].flag_desc, IMMUNITY_ALLOW_GRAVITY_DESC);
  3649. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_AUTOJOIN].flag, IMMUNITY_ALLOW_AUTOJOIN_FLAG);
  3650. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_AUTOJOIN].flag_desc, IMMUNITY_ALLOW_AUTOJOIN_DESC);
  3651. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_AFK].flag, IMMUNITY_ALLOW_AFK_FLAG);
  3652. Q_strcpy(immunity_flag_list[IMMUNITY_ALLOW_AFK].flag_desc, IMMUNITY_ALLOW_AFK_DESC);
  3653. }
  3654. //---------------------------------------------------------------------------------
  3655. // Purpose: Sets up admin flags, if you add a new flag it needs to be intialised
  3656. // here !!
  3657. //---------------------------------------------------------------------------------
  3658. void ManiClient::InitAdminFlags(void)
  3659. {
  3660. Q_strcpy(admin_flag_list[ALLOW_GIMP].flag, ALLOW_GIMP_FLAG);
  3661. Q_strcpy(admin_flag_list[ALLOW_GIMP].flag_desc,ALLOW_GIMP_DESC);
  3662. Q_strcpy(admin_flag_list[ALLOW_KICK].flag, ALLOW_KICK_FLAG);
  3663. Q_strcpy(admin_flag_list[ALLOW_KICK].flag_desc,ALLOW_KICK_DESC);
  3664. Q_strcpy(admin_flag_list[ALLOW_RCON].flag, ALLOW_RCON_FLAG);
  3665. Q_strcpy(admin_flag_list[ALLOW_RCON].flag_desc,ALLOW_RCON_DESC);
  3666. Q_strcpy(admin_flag_list[ALLOW_RCON_MENU].flag, ALLOW_RCON_MENU_FLAG);
  3667. Q_strcpy(admin_flag_list[ALLOW_RCON_MENU].flag_desc,ALLOW_RCON_MENU_DESC);
  3668. Q_strcpy(admin_flag_list[ALLOW_EXPLODE].flag, ALLOW_EXPLODE_FLAG);
  3669. Q_strcpy(admin_flag_list[ALLOW_EXPLODE].flag_desc,ALLOW_EXPLODE_DESC);
  3670. Q_strcpy(admin_flag_list[ALLOW_SLAY].flag, ALLOW_SLAY_FLAG);
  3671. Q_strcpy(admin_flag_list[ALLOW_SLAY].flag_desc,ALLOW_SLAY_DESC);
  3672. Q_strcpy(admin_flag_list[ALLOW_BAN].flag, ALLOW_BAN_FLAG);
  3673. Q_strcpy(admin_flag_list[ALLOW_BAN].flag_desc,ALLOW_BAN_DESC);
  3674. Q_strcpy(admin_flag_list[ALLOW_SAY].flag, ALLOW_SAY_FLAG);
  3675. Q_strcpy(admin_flag_list[ALLOW_SAY].flag_desc,ALLOW_SAY_DESC);
  3676. Q_strcpy(admin_flag_list[ALLOW_CHAT].flag, ALLOW_CHAT_FLAG);
  3677. Q_strcpy(admin_flag_list[ALLOW_CHAT].flag_desc,ALLOW_CHAT_DESC);
  3678. Q_strcpy(admin_flag_list[ALLOW_PSAY].flag, ALLOW_PSAY_FLAG);
  3679. Q_strcpy(admin_flag_list[ALLOW_PSAY].flag_desc,ALLOW_PSAY_DESC);
  3680. Q_strcpy(admin_flag_list[ALLOW_CHANGEMAP].flag, ALLOW_CHANGEMAP_FLAG);
  3681. Q_strcpy(admin_flag_list[ALLOW_CHANGEMAP].flag_desc,ALLOW_CHANGEMAP_DESC);
  3682. Q_strcpy(admin_flag_list[ALLOW_PLAYSOUND].flag, ALLOW_PLAYSOUND_FLAG);
  3683. Q_strcpy(admin_flag_list[ALLOW_PLAYSOUND].flag_desc,ALLOW_PLAYSOUND_DESC);
  3684. Q_strcpy(admin_flag_list[ALLOW_RESTRICTWEAPON].flag, ALLOW_RESTRICTWEAPON_FLAG);
  3685. Q_strcpy(admin_flag_list[ALLOW_RESTRICTWEAPON].flag_desc,ALLOW_RESTRICTWEAPON_DESC);
  3686. Q_strcpy(admin_flag_list[ALLOW_CONFIG].flag, ALLOW_CONFIG_FLAG);
  3687. Q_strcpy(admin_flag_list[ALLOW_CONFIG].flag_desc,ALLOW_CONFIG_DESC);
  3688. Q_strcpy(admin_flag_list[ALLOW_CEXEC].flag, ALLOW_CEXEC_FLAG);
  3689. Q_strcpy(admin_flag_list[ALLOW_CEXEC].flag_desc,ALLOW_CEXEC_DESC);
  3690. Q_strcpy(admin_flag_list[ALLOW_CEXEC_MENU].flag, ALLOW_CEXEC_MENU_FLAG);
  3691. Q_strcpy(admin_flag_list[ALLOW_CEXEC_MENU].flag_desc,ALLOW_CEXEC_MENU_DESC);
  3692. Q_strcpy(admin_flag_list[ALLOW_BLIND].flag, ALLOW_BLIND_FLAG);
  3693. Q_strcpy(admin_flag_list[ALLOW_BLIND].flag_desc,ALLOW_BLIND_DESC);
  3694. Q_strcpy(admin_flag_list[ALLOW_SLAP].flag, ALLOW_SLAP_FLAG);
  3695. Q_strcpy(admin_flag_list[ALLOW_SLAP].flag_desc,ALLOW_SLAP_DESC);
  3696. Q_strcpy(admin_flag_list[ALLOW_FREEZE].flag, ALLOW_FREEZE_FLAG);
  3697. Q_strcpy(admin_flag_list[ALLOW_FREEZE].flag_desc,ALLOW_FREEZE_DESC);
  3698. Q_strcpy(admin_flag_list[ALLOW_TELEPORT].flag, ALLOW_TELEPORT_FLAG);
  3699. Q_strcpy(admin_flag_list[ALLOW_TELEPORT].flag_desc,ALLOW_TELEPORT_DESC);
  3700. Q_strcpy(admin_flag_list[ALLOW_DRUG].flag, ALLOW_DRUG_FLAG);
  3701. Q_strcpy(admin_flag_list[ALLOW_DRUG].flag_desc,ALLOW_DRUG_DESC);
  3702. Q_strcpy(admin_flag_list[ALLOW_SWAP].flag, ALLOW_SWAP_FLAG);
  3703. Q_strcpy(admin_flag_list[ALLOW_SWAP].flag_desc,ALLOW_SWAP_DESC);
  3704. Q_strcpy(admin_flag_list[ALLOW_RCON_VOTE].flag, ALLOW_RCON_VOTE_FLAG);
  3705. Q_strcpy(admin_flag_list[ALLOW_RCON_VOTE].flag_desc,ALLOW_RCON_VOTE_DESC);
  3706. Q_strcpy(admin_flag_list[ALLOW_MENU_RCON_VOTE].flag, ALLOW_MENU_RCON_VOTE_FLAG);
  3707. Q_strcpy(admin_flag_list[ALLOW_MENU_RCON_VOTE].flag_desc,ALLOW_MENU_RCON_VOTE_DESC);
  3708. Q_strcpy(admin_flag_list[ALLOW_RANDOM_MAP_VOTE].flag, ALLOW_RANDOM_MAP_VOTE_FLAG);
  3709. Q_strcpy(admin_flag_list[ALLOW_RANDOM_MAP_VOTE].flag_desc,ALLOW_RANDOM_MAP_VOTE_DESC);
  3710. Q_strcpy(admin_flag_list[ALLOW_MAP_VOTE].flag, ALLOW_MAP_VOTE_FLAG);
  3711. Q_strcpy(admin_flag_list[ALLOW_MAP_VOTE].flag_desc,ALLOW_MAP_VOTE_DESC);
  3712. Q_strcpy(admin_flag_list[ALLOW_QUESTION_VOTE].flag, ALLOW_QUESTION_VOTE_FLAG);
  3713. Q_strcpy(admin_flag_list[ALLOW_QUESTION_VOTE].flag_desc,ALLOW_QUESTION_VOTE_DESC);
  3714. Q_strcpy(admin_flag_list[ALLOW_MENU_QUESTION_VOTE].flag, ALLOW_MENU_QUESTION_VOTE_FLAG);
  3715. Q_strcpy(admin_flag_list[ALLOW_MENU_QUESTION_VOTE].flag_desc,ALLOW_MENU_QUESTION_VOTE_DESC);
  3716. Q_strcpy(admin_flag_list[ALLOW_CANCEL_VOTE].flag, ALLOW_CANCEL_VOTE_FLAG);
  3717. Q_strcpy(admin_flag_list[ALLOW_CANCEL_VOTE].flag_desc,ALLOW_CANCEL_VOTE_DESC);
  3718. Q_strcpy(admin_flag_list[ALLOW_ACCEPT_VOTE].flag, ALLOW_ACCEPT_VOTE_FLAG);
  3719. Q_strcpy(admin_flag_list[ALLOW_ACCEPT_VOTE].flag_desc,ALLOW_ACCEPT_VOTE_DESC);
  3720. Q_strcpy(admin_flag_list[ALLOW_MA_RATES].flag, ALLOW_MA_RATES_FLAG);
  3721. Q_strcpy(admin_flag_list[ALLOW_MA_RATES].flag_desc,ALLOW_MA_RATES_DESC);
  3722. Q_strcpy(admin_flag_list[ALLOW_BURN].flag, ALLOW_BURN_FLAG);
  3723. Q_strcpy(admin_flag_list[ALLOW_BURN].flag_desc,ALLOW_BURN_DESC);
  3724. Q_strcpy(admin_flag_list[ALLOW_NO_CLIP].flag, ALLOW_NO_CLIP_FLAG);
  3725. Q_strcpy(admin_flag_list[ALLOW_NO_CLIP].flag_desc,ALLOW_NO_CLIP_DESC);
  3726. Q_strcpy(admin_flag_list[ALLOW_WAR].flag, ALLOW_WAR_FLAG);
  3727. Q_strcpy(admin_flag_list[ALLOW_WAR].flag_desc,ALLOW_WAR_DESC);
  3728. Q_strcpy(admin_flag_list[ALLOW_MUTE].flag, ALLOW_MUTE_FLAG);
  3729. Q_strcpy(admin_flag_list[ALLOW_MUTE].flag_desc,ALLOW_MUTE_DESC);
  3730. Q_strcpy(admin_flag_list[ALLOW_RESET_ALL_RANKS].flag, ALLOW_RESET_ALL_RANKS_FLAG);
  3731. Q_strcpy(admin_flag_list[ALLOW_RESET_ALL_RANKS].flag_desc,ALLOW_RESET_ALL_RANKS_DESC);
  3732. Q_strcpy(admin_flag_list[ALLOW_CASH].flag, ALLOW_CASH_FLAG);
  3733. Q_strcpy(admin_flag_list[ALLOW_CASH].flag_desc,ALLOW_CASH_DESC);
  3734. Q_strcpy(admin_flag_list[ALLOW_RCONSAY].flag, ALLOW_RCONSAY_FLAG);
  3735. Q_strcpy(admin_flag_list[ALLOW_RCONSAY].flag_desc,ALLOW_RCONSAY_DESC);
  3736. Q_strcpy(admin_flag_list[ALLOW_SKINS].flag, ALLOW_SKINS_FLAG);
  3737. Q_strcpy(admin_flag_list[ALLOW_SKINS].flag_desc,ALLOW_SKINS_DESC);
  3738. Q_strcpy(admin_flag_list[ALLOW_SETSKINS].flag, ALLOW_SETSKINS_FLAG);
  3739. Q_strcpy(admin_flag_list[ALLOW_SETSKINS].flag_desc,ALLOW_SETSKINS_DESC);
  3740. Q_strcpy(admin_flag_list[ALLOW_DROPC4].flag, ALLOW_DROPC4_FLAG);
  3741. Q_strcpy(admin_flag_list[ALLOW_DROPC4].flag_desc,ALLOW_DROPC4_DESC);
  3742. Q_strcpy(admin_flag_list[ALLOW_SETADMINFLAG].flag, ALLOW_SETADMINFLAG_FLAG);
  3743. Q_strcpy(admin_flag_list[ALLOW_SETADMINFLAG].flag_desc,ALLOW_SETADMINFLAG_DESC);
  3744. Q_strcpy(admin_flag_list[ALLOW_COLOUR].flag, ALLOW_COLOUR_FLAG);
  3745. Q_strcpy(admin_flag_list[ALLOW_COLOUR].flag_desc,ALLOW_COLOUR_DESC);
  3746. Q_strcpy(admin_flag_list[ALLOW_TIMEBOMB].flag, ALLOW_TIMEBOMB_FLAG);
  3747. Q_strcpy(admin_flag_list[ALLOW_TIMEBOMB].flag_desc,ALLOW_TIMEBOMB_DESC);
  3748. Q_strcpy(admin_flag_list[ALLOW_FIREBOMB].flag, ALLOW_FIREBOMB_FLAG);
  3749. Q_strcpy(admin_flag_list[ALLOW_FIREBOMB].flag_desc,ALLOW_FIREBOMB_DESC);
  3750. Q_strcpy(admin_flag_list[ALLOW_FREEZEBOMB].flag, ALLOW_FREEZEBOMB_FLAG);
  3751. Q_strcpy(admin_flag_list[ALLOW_FREEZEBOMB].flag_desc,ALLOW_FREEZEBOMB_DESC);
  3752. Q_strcpy(admin_flag_list[ALLOW_HEALTH].flag, ALLOW_HEALTH_FLAG);
  3753. Q_strcpy(admin_flag_list[ALLOW_HEALTH].flag_desc,ALLOW_HEALTH_DESC);
  3754. Q_strcpy(admin_flag_list[ALLOW_BEACON].flag, ALLOW_BEACON_FLAG);
  3755. Q_strcpy(admin_flag_list[ALLOW_BEACON].flag_desc,ALLOW_BEACON_DESC);
  3756. Q_strcpy(admin_flag_list[ALLOW_GIVE].flag, ALLOW_GIVE_FLAG);
  3757. Q_strcpy(admin_flag_list[ALLOW_GIVE].flag_desc,ALLOW_GIVE_DESC);
  3758. Q_strcpy(admin_flag_list[ALLOW_BASIC_ADMIN].flag, ALLOW_BASIC_ADMIN_FLAG);
  3759. Q_strcpy(admin_flag_list[ALLOW_BASIC_ADMIN].flag_desc,ALLOW_BASIC_ADMIN_DESC);
  3760. Q_strcpy(admin_flag_list[ALLOW_CLIENT_ADMIN].flag, ALLOW_CLIENT_ADMIN_FLAG);
  3761. Q_strcpy(admin_flag_list[ALLOW_CLIENT_ADMIN].flag_desc,ALLOW_CLIENT_ADMIN_DESC);
  3762. Q_strcpy(admin_flag_list[ALLOW_PERM_BAN].flag, ALLOW_PERM_BAN_FLAG);
  3763. Q_strcpy(admin_flag_list[ALLOW_PERM_BAN].flag_desc,ALLOW_PERM_BAN_DESC);
  3764. Q_strcpy(admin_flag_list[ALLOW_SPRAY_TAG].flag, ALLOW_SPRAY_TAG_FLAG);
  3765. Q_strcpy(admin_flag_list[ALLOW_SPRAY_TAG].flag_desc,ALLOW_SPRAY_TAG_DESC);
  3766. Q_strcpy(admin_flag_list[ALLOW_GRAVITY].flag, ALLOW_GRAVITY_FLAG);
  3767. Q_strcpy(admin_flag_list[ALLOW_GRAVITY].flag_desc,ALLOW_GRAVITY_DESC);
  3768. Q_strcpy(admin_flag_list[ALLOW_UNBAN].flag, ALLOW_UNBAN_FLAG);
  3769. Q_strcpy(admin_flag_list[ALLOW_UNBAN].flag_desc, ALLOW_UNBAN_DESC);
  3770. }
  3771. //---------------------------------------------------------------------------------
  3772. // Purpose: Add custom flag and write flag descriptors
  3773. //---------------------------------------------------------------------------------
  3774. bool ManiClient::AddFlagDesc(const char *class_name, const char *flag_name, const char *description, bool replace_description)
  3775. {
  3776. if (flag_desc_list.AddFlag(class_name, flag_name, description, replace_description))
  3777. {
  3778. flag_desc_list.WriteFlags();
  3779. }
  3780. if (gpManiDatabase->GetDBEnabled())
  3781. {
  3782. SQLProcessBlock *ptr = new SQLAddFlagDesc();
  3783. ptr->in_params.AddParam("description", description);
  3784. ptr->in_params.AddParam("class_type", class_name);
  3785. ptr->in_params.AddParam("flag_id", flag_name);
  3786. client_sql_manager->AddRequest(ptr);
  3787. }
  3788. return true;
  3789. }
  3790. //---------------------------------------------------------------------------------
  3791. // Purpose: Add Mani Admin Plugin built in flags
  3792. //---------------------------------------------------------------------------------
  3793. void ManiClient::AddBuiltInFlags(void)
  3794. {
  3795. // Admin class first
  3796. flag_desc_list.AddFlag(ADMIN, ADMIN_KICK, Translate(NULL, 1501));
  3797. flag_desc_list.AddFlag(ADMIN, ADMIN_RCON, Translate(NULL, 1502));
  3798. flag_desc_list.AddFlag(ADMIN, ADMIN_RCON_MENU1, Translate(NULL, 1503));
  3799. flag_desc_list.AddFlag(ADMIN, ADMIN_RCON_MENU2, Translate(NULL, 1504));
  3800. flag_desc_list.AddFlag(ADMIN, ADMIN_RCON_MENU3, Translate(NULL, 1505));
  3801. flag_desc_list.AddFlag(ADMIN, ADMIN_EXPLODE, Translate(NULL, 1506));
  3802. flag_desc_list.AddFlag(ADMIN, ADMIN_SLAY, Translate(NULL, 1507));
  3803. flag_desc_list.AddFlag(ADMIN, ADMIN_BAN, Translate(NULL, 1508));
  3804. flag_desc_list.AddFlag(ADMIN, ADMIN_SAY, Translate(NULL, 1509));
  3805. flag_desc_list.AddFlag(ADMIN, ADMIN_CHAT, Translate(NULL, 1510));
  3806. flag_desc_list.AddFlag(ADMIN, ADMIN_PSAY, Translate(NULL, 1511));
  3807. flag_desc_list.AddFlag(ADMIN, ADMIN_CHANGEMAP, Translate(NULL, 1512));
  3808. flag_desc_list.AddFlag(ADMIN, ADMIN_PLAYSOUND, Translate(NULL, 1513));
  3809. flag_desc_list.AddFlag(ADMIN, ADMIN_RESTRICT_WEAPON, Translate(NULL, 1514));
  3810. flag_desc_list.AddFlag(ADMIN, ADMIN_CONFIG, Translate(NULL, 1515));
  3811. flag_desc_list.AddFlag(ADMIN, ADMIN_CEXEC, Translate(NULL, 1516));
  3812. flag_desc_list.AddFlag(ADMIN, ADMIN_CEXEC_MENU, Translate(NULL, 1517));
  3813. flag_desc_list.AddFlag(ADMIN, ADMIN_BLIND, Translate(NULL, 1518));
  3814. flag_desc_list.AddFlag(ADMIN, ADMIN_SLAP, Translate(NULL, 1519));
  3815. flag_desc_list.AddFlag(ADMIN, ADMIN_FREEZE, Translate(NULL, 1520));
  3816. flag_desc_list.AddFlag(ADMIN, ADMIN_TELEPORT, Translate(NULL, 1521));
  3817. flag_desc_list.AddFlag(ADMIN, ADMIN_DRUG, Translate(NULL, 1522));
  3818. flag_desc_list.AddFlag(ADMIN, ADMIN_SWAP, Translate(NULL, 1523));
  3819. flag_desc_list.AddFlag(ADMIN, ADMIN_RCON_VOTE, Translate(NULL, 1524));
  3820. flag_desc_list.AddFlag(ADMIN, ADMIN_MENU_RCON_VOTE, Translate(NULL, 1525));
  3821. flag_desc_list.AddFlag(ADMIN, ADMIN_RANDOM_MAP_VOTE, Translate(NULL, 1526));
  3822. flag_desc_list.AddFlag(ADMIN, ADMIN_MAP_VOTE, Translate(NULL, 1527));
  3823. flag_desc_list.AddFlag(ADMIN, ADMIN_QUESTION_VOTE, Translate(NULL, 1528));
  3824. flag_desc_list.AddFlag(ADMIN, ADMIN_MENU_QUESTION_VOTE, Translate(NULL, 1529));
  3825. flag_desc_list.AddFlag(ADMIN, ADMIN_CANCEL_VOTE, Translate(NULL, 1530));
  3826. flag_desc_list.AddFlag(ADMIN, ADMIN_ACCEPT_VOTE, Translate(NULL, 1531));
  3827. flag_desc_list.AddFlag(ADMIN, ADMIN_MA_RATES, Translate(NULL, 1532));
  3828. flag_desc_list.AddFlag(ADMIN, ADMIN_BURN, Translate(NULL, 1533));
  3829. flag_desc_list.AddFlag(ADMIN, ADMIN_NO_CLIP, Translate(NULL, 1534));
  3830. flag_desc_list.AddFlag(ADMIN, ADMIN_WAR, Translate(NULL, 1535));
  3831. flag_desc_list.AddFlag(ADMIN, ADMIN_MUTE, Translate(NULL, 1536));
  3832. flag_desc_list.AddFlag(ADMIN, ADMIN_RESET_ALL_RANKS, Translate(NULL, 1537));
  3833. flag_desc_list.AddFlag(ADMIN, ADMIN_CASH, Translate(NULL, 1538));
  3834. flag_desc_list.AddFlag(ADMIN, ADMIN_RCONSAY, Translate(NULL, 1539));
  3835. flag_desc_list.AddFlag(ADMIN, ADMIN_SKINS, Translate(NULL, 1540));
  3836. flag_desc_list.AddFlag(ADMIN, ADMIN_SETSKINS, Translate(NULL, 1541));
  3837. flag_desc_list.AddFlag(ADMIN, ADMIN_DROPC4, Translate(NULL, 1542));
  3838. flag_desc_list.AddFlag(ADMIN, ADMIN_SET_FLAG, Translate(NULL, 1543));
  3839. flag_desc_list.AddFlag(ADMIN, ADMIN_COLOUR, Translate(NULL, 1544));
  3840. flag_desc_list.AddFlag(ADMIN, ADMIN_TIMEBOMB, Translate(NULL, 1545));
  3841. flag_desc_list.AddFlag(ADMIN, ADMIN_FIREBOMB, Translate(NULL, 1546));
  3842. flag_desc_list.AddFlag(ADMIN, ADMIN_FREEZEBOMB, Translate(NULL, 1547));
  3843. flag_desc_list.AddFlag(ADMIN, ADMIN_HEALTH, Translate(NULL, 1548));
  3844. flag_desc_list.AddFlag(ADMIN, ADMIN_BEACON, Translate(NULL, 1549));
  3845. flag_desc_list.AddFlag(ADMIN, ADMIN_GIVE, Translate(NULL, 1550));
  3846. flag_desc_list.AddFlag(ADMIN, ADMIN_BASIC_ADMIN, Translate(NULL, 1551));
  3847. flag_desc_list.AddFlag(ADMIN, ADMIN_CLIENT_ADMIN, Translate(NULL, 1552));
  3848. flag_desc_list.AddFlag(ADMIN, ADMIN_PERM_BAN, Translate(NULL, 1553));
  3849. flag_desc_list.AddFlag(ADMIN, ADMIN_SPRAY_TAG, Translate(NULL, 1554));
  3850. flag_desc_list.AddFlag(ADMIN, ADMIN_GRAVITY, Translate(NULL, 1555));
  3851. flag_desc_list.AddFlag(ADMIN, ADMIN_UNBAN, Translate(NULL, 1556));
  3852. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_KICK, Translate(NULL, 1701));
  3853. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_SLAY, Translate(NULL, 1702));
  3854. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_BAN, Translate(NULL, 1703));
  3855. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_CEXEC, Translate(NULL, 1704));
  3856. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_BLIND, Translate(NULL, 1705));
  3857. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_SLAP, Translate(NULL, 1706));
  3858. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_FREEZE, Translate(NULL, 1707));
  3859. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_TELEPORT, Translate(NULL, 1708));
  3860. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_DRUG, Translate(NULL, 1709));
  3861. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_SWAP, Translate(NULL, 1710));
  3862. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_TAG, Translate(NULL, 1711));
  3863. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_BALANCE, Translate(NULL, 1712));
  3864. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_BURN, Translate(NULL, 1713));
  3865. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_MUTE, Translate(NULL, 1714));
  3866. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_RESERVE, Translate(NULL, 1715));
  3867. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_SETSKIN, Translate(NULL, 1716));
  3868. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_RESERVE_SKIN, Translate(NULL, 1717));
  3869. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_TIMEBOMB, Translate(NULL, 1718));
  3870. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_FIREBOMB, Translate(NULL, 1719));
  3871. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_FREEZEBOMB, Translate(NULL, 1720));
  3872. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_BEACON, Translate(NULL, 1721));
  3873. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_GHOST, Translate(NULL, 1722));
  3874. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_GIVE, Translate(NULL, 1723));
  3875. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_COLOUR, Translate(NULL, 1724));
  3876. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_GRAVITY, Translate(NULL, 1725));
  3877. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_AUTOJOIN, Translate(NULL, 1726));
  3878. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_AFK, Translate(NULL, 1727));
  3879. flag_desc_list.AddFlag(IMMUNITY, IMMUNITY_PING, Translate(NULL, 1728));
  3880. }
  3881. //---------------------------------------------------------------------------------
  3882. // Purpose: Checks if a player on the server has access
  3883. //---------------------------------------------------------------------------------
  3884. bool ManiClient::HasAccess
  3885. (
  3886. player_t *player_ptr,
  3887. const char *class_type,
  3888. const char *flag_name,
  3889. bool check_war,
  3890. bool check_unmasked_only
  3891. )
  3892. {
  3893. if (check_war)
  3894. {
  3895. OutputHelpText(ORANGE_CHAT, player_ptr, "Mani Admin Plugin: Command is disabled in war mode");
  3896. return false;
  3897. }
  3898. int index = FindClientIndex(player_ptr);
  3899. if (index == -1)
  3900. {
  3901. return false;
  3902. }
  3903. // Found a client, look for flag now
  3904. ClientPlayer *client_ptr = c_list[index];
  3905. // Get unmasked access first
  3906. bool unmasked_access = client_ptr->unmasked_list.IsFlagSet(class_type, flag_name);
  3907. if (!unmasked_access)
  3908. {
  3909. return false;
  3910. }
  3911. if (check_unmasked_only) return true;
  3912. if (!client_ptr->level_list.IsEmpty())
  3913. {
  3914. // Need to check masked access too
  3915. if (client_ptr->masked_list.IsFlagSet(class_type, flag_name))
  3916. {
  3917. return false;
  3918. }
  3919. }
  3920. return true;
  3921. }
  3922. //---------------------------------------------------------------------------------
  3923. // Purpose: Checks if client has access to functionality
  3924. //---------------------------------------------------------------------------------
  3925. bool ManiClient::HasAccess
  3926. (
  3927. int player_index,
  3928. const char *class_type,
  3929. const char *flag_name,
  3930. bool check_war,
  3931. bool check_unmasked_only
  3932. )
  3933. {
  3934. if (player_index < 1 || player_index > max_players) return false;
  3935. if (check_war)
  3936. {
  3937. player_t player;
  3938. player.index = player_index;
  3939. if (FindPlayerByIndex(&player))
  3940. {
  3941. OutputHelpText(ORANGE_CHAT, &player, "Mani Admin Plugin: Command is disabled in war mode");
  3942. }
  3943. return false;
  3944. }
  3945. // Found a client, look for flag now
  3946. if (!active_client_list[player_index - 1]) return false;
  3947. ClientPlayer *client_ptr = active_client_list[player_index - 1];
  3948. // Get unmasked access first
  3949. bool unmasked_access = client_ptr->unmasked_list.IsFlagSet(class_type, flag_name);
  3950. if (!unmasked_access)
  3951. {
  3952. return false;
  3953. }
  3954. if (check_unmasked_only) return true;
  3955. if (!client_ptr->level_list.IsEmpty())
  3956. {
  3957. // Need to check masked access too
  3958. if (client_ptr->masked_list.IsFlagSet(class_type, flag_name))
  3959. {
  3960. return false;
  3961. }
  3962. }
  3963. return true;
  3964. }
  3965. //---------------------------------------------------------------------------------
  3966. // Purpose: Free's up memory for an access list
  3967. //---------------------------------------------------------------------------------
  3968. int ManiClient::FindClientIndex
  3969. (
  3970. player_t *player_ptr
  3971. )
  3972. {
  3973. if (player_ptr->is_bot)
  3974. {
  3975. return -1;
  3976. }
  3977. const char *password = NULL;
  3978. if ( player_ptr->index != 0 )
  3979. password = engine->GetClientConVarValue(player_ptr->index, "_password" );
  3980. //Search through admin list for match
  3981. for (int i = 0; i != (int) c_list.size(); i ++)
  3982. {
  3983. // Check Steam ID
  3984. if (c_list[i]->steam_list.Find(player_ptr->steam_id))
  3985. {
  3986. return i;
  3987. }
  3988. // Check IP address
  3989. if (c_list[i]->ip_address_list.Find(player_ptr->ip_address))
  3990. {
  3991. return i;
  3992. }
  3993. // Check name password combo
  3994. if (password && c_list[i]->GetPassword() &&
  3995. strcmp(c_list[i]->GetPassword(), password) == 0 &&
  3996. c_list[i]->nick_list.Find(player_ptr->name))
  3997. {
  3998. return i;
  3999. }
  4000. }
  4001. return -1;
  4002. }
  4003. //---------------------------------------------------------------------------------
  4004. // Purpose: Sets up the unmasked flag accesses for a client
  4005. //---------------------------------------------------------------------------------
  4006. void ManiClient::SetupUnMasked(void)
  4007. {
  4008. // Loop through all client lists
  4009. for (int i = 0; i != (int) c_list.size(); i++)
  4010. {
  4011. ClientPlayer *client_ptr = c_list[i];
  4012. // Kill unmasked list if already setup
  4013. client_ptr->unmasked_list.Kill();
  4014. client_ptr->unmasked_list.Copy(client_ptr->personal_flag_list);
  4015. // Search groups that this client is a member of
  4016. const char *group_id = NULL;
  4017. for (const char *c_type = client_ptr->group_list.FindFirst(&group_id); c_type != NULL; c_type = client_ptr->group_list.FindNext(&group_id))
  4018. {
  4019. GlobalGroupFlag *g_flag = group_list.Find(c_type, group_id);
  4020. if (g_flag)
  4021. {
  4022. // Found a group for this client so OR in the flags
  4023. for(const char *flag_id = g_flag->FindFirst(); flag_id != NULL; flag_id = g_flag->FindNext())
  4024. {
  4025. client_ptr->unmasked_list.SetFlag(c_type, flag_id, true);
  4026. }
  4027. }
  4028. }
  4029. }
  4030. }
  4031. //---------------------------------------------------------------------------------
  4032. // Purpose: Sets up the masked flag accesses for a client
  4033. //---------------------------------------------------------------------------------
  4034. void ManiClient::SetupMasked(void)
  4035. {
  4036. mask_level_t *mask_list = NULL;
  4037. int mask_list_size = 0;
  4038. // Loop through all clients on server
  4039. for (int i = 0; i < max_players; i++)
  4040. {
  4041. if (active_client_list[i] != NULL)
  4042. {
  4043. // Found a client
  4044. ClientPlayer *client_ptr = active_client_list[i];
  4045. client_ptr->masked_list.Kill();
  4046. const char *c_type1 = NULL;
  4047. for (int level_id = client_ptr->level_list.FindFirst(&c_type1); level_id != -99999; level_id = client_ptr->level_list.FindNext(&c_type1))
  4048. {
  4049. // Has levels setup !!
  4050. if (level_id > -1)
  4051. {
  4052. AddToList((void **) &mask_list, sizeof(mask_level_t), &mask_list_size);
  4053. mask_level_t *mask_ptr = &(mask_list[mask_list_size - 1]);
  4054. mask_ptr->client_ptr = active_client_list[i];
  4055. mask_ptr->level_id = level_id;
  4056. Q_strcpy(mask_ptr->class_type, c_type1);
  4057. }
  4058. }
  4059. }
  4060. }
  4061. if (mask_list_size == 0)
  4062. {
  4063. // Nothing to do
  4064. return;
  4065. }
  4066. // Sort mask list
  4067. qsort(mask_list, mask_list_size, sizeof(mask_level_t), sort_mask_list);
  4068. for (int i = 0; i < mask_list_size; i ++)
  4069. {
  4070. for (int j = i; j < mask_list_size; j++)
  4071. {
  4072. if (strcmp(mask_list[j].class_type, mask_list[i].class_type) != 0)
  4073. {
  4074. break;
  4075. }
  4076. if (mask_list[j].level_id > mask_list[i].level_id)
  4077. {
  4078. // Found a candidate to apply the mask to
  4079. ClientPlayer *mclient_ptr = mask_list[j].client_ptr;
  4080. GlobalGroupFlag *g_flag = level_list.Find(mask_list[i].class_type, mask_list[i].level_id);
  4081. if (g_flag)
  4082. {
  4083. // Found a group for this client so OR in the flags
  4084. for(const char *flag_id = g_flag->FindFirst(); flag_id != NULL; flag_id = g_flag->FindNext())
  4085. {
  4086. // Set the clients masked flag enabled to true
  4087. mclient_ptr->masked_list.SetFlag(mask_list[i].class_type, flag_id, true);
  4088. }
  4089. }
  4090. }
  4091. }
  4092. }
  4093. FreeList((void **) &mask_list, &mask_list_size);
  4094. }
  4095. //---------------------------------------------------------------------------------
  4096. // Purpose: Loads into memory the super new style admin flags
  4097. //---------------------------------------------------------------------------------
  4098. void ManiClient::LoadClients(void)
  4099. {
  4100. char core_filename[256];
  4101. char version_string[32];
  4102. ManiKeyValues *kv_ptr;
  4103. kv_ptr = new ManiKeyValues("clients.txt");
  4104. snprintf(core_filename, sizeof (core_filename), "./cfg/%s/clients.txt", mani_path.GetString());
  4105. if (!kv_ptr->ReadFile(core_filename))
  4106. {
  4107. MMsg("Failed to load %s\n", core_filename);
  4108. kv_ptr->DeleteThis();
  4109. return;
  4110. }
  4111. // clients.txt key
  4112. read_t *rd_ptr = kv_ptr->GetPrimaryKey();
  4113. if (!rd_ptr)
  4114. {
  4115. kv_ptr->DeleteThis();
  4116. return;
  4117. }
  4118. Q_strcpy(version_string, kv_ptr->GetString("version", "NONE"));
  4119. if (strcmp(version_string, "NONE") == 0)
  4120. {
  4121. kv_ptr->DeleteThis();
  4122. // Load old style clients (will be saved in new format)
  4123. // Call old style
  4124. this->LoadClientsBeta();
  4125. this->WriteClients();
  4126. return;
  4127. }
  4128. // Find groups
  4129. read_t *groups_ptr = kv_ptr->FindKey(rd_ptr, "groups");
  4130. if (groups_ptr)
  4131. {
  4132. // Read in the groups
  4133. this->ReadGroups(kv_ptr, groups_ptr, true);
  4134. }
  4135. // Find levels
  4136. read_t *levels_ptr = kv_ptr->FindKey(rd_ptr, "levels");
  4137. if (levels_ptr)
  4138. {
  4139. // Read in the levels
  4140. this->ReadGroups(kv_ptr, levels_ptr, false);
  4141. }
  4142. // Find players
  4143. read_t *players_ptr = kv_ptr->FindKey(rd_ptr, "players");
  4144. if (players_ptr)
  4145. {
  4146. this->ReadPlayers(kv_ptr, players_ptr);
  4147. }
  4148. kv_ptr->DeleteThis();
  4149. // Calculates each clients unmasked flags (flags without levels applied)
  4150. SetupUnMasked();
  4151. return;
  4152. }
  4153. //---------------------------------------------------------------------------------
  4154. // Purpose: Loads into memory the super new style admin flags
  4155. //---------------------------------------------------------------------------------
  4156. void ManiClient::ReadGroups
  4157. (
  4158. ManiKeyValues *kv_ptr,
  4159. read_t *read_ptr,
  4160. bool group_type
  4161. )
  4162. {
  4163. for (;;)
  4164. {
  4165. read_t *class_ptr = kv_ptr->GetNextKey(read_ptr);
  4166. if (class_ptr == NULL)
  4167. {
  4168. return;
  4169. }
  4170. for (;;)
  4171. {
  4172. char *class_name = class_ptr->sub_key_name;
  4173. kv_ptr->ResetKeyIndex();
  4174. for (;;)
  4175. {
  4176. char *name = NULL;
  4177. char *value = kv_ptr->GetNextKeyValue(&name);
  4178. // Value = Flag string (multiple flags in a string)
  4179. // Name = Group ID
  4180. if (value == NULL)
  4181. {
  4182. // No more flags for this class
  4183. break;
  4184. }
  4185. int i = 0;
  4186. // Get individual flags
  4187. for (;;)
  4188. {
  4189. char *flag_id = SplitFlagString(value, &i);
  4190. if (flag_id == NULL)
  4191. {
  4192. break;
  4193. }
  4194. if (flag_desc_list.IsValidFlag(class_name, flag_id))
  4195. {
  4196. // Create/Update group/level
  4197. if (group_type)
  4198. {
  4199. GlobalGroupFlag *g_flag = group_list.AddGroup(class_name, name);
  4200. if (g_flag)
  4201. {
  4202. g_flag->SetFlag(flag_id, true);
  4203. }
  4204. }
  4205. else
  4206. {
  4207. GlobalGroupFlag *g_flag = level_list.AddGroup(class_name, atoi(name));
  4208. if (g_flag)
  4209. {
  4210. g_flag->SetFlag(flag_id, true);
  4211. }
  4212. }
  4213. }
  4214. }
  4215. }
  4216. class_ptr = kv_ptr->GetNextKey(read_ptr);
  4217. if (!class_ptr)
  4218. {
  4219. break;
  4220. }
  4221. }
  4222. }
  4223. }
  4224. //---------------------------------------------------------------------------------
  4225. // Purpose: Takes a string an picks out the individual flags (not thread safe!)
  4226. //---------------------------------------------------------------------------------
  4227. char *ManiClient::SplitFlagString(char *flags_ptr, int *index)
  4228. {
  4229. static char flag_name[4096];
  4230. // Skip space seperators
  4231. while (flags_ptr[*index] == ';' || flags_ptr[*index] == ' ' || flags_ptr[*index] == '\t')
  4232. {
  4233. *index = *index + 1;
  4234. }
  4235. if (flags_ptr[*index] == '\0') return NULL;
  4236. int i = 0;
  4237. while (flags_ptr[*index] != ' ' &&
  4238. flags_ptr[*index] != ';' &&
  4239. flags_ptr[*index] != '\t' &&
  4240. flags_ptr[*index] != '\0')
  4241. {
  4242. flag_name[i++] = flags_ptr[*index];
  4243. *index = *index + 1;
  4244. }
  4245. flag_name[i] = '\0';
  4246. return flag_name;
  4247. }
  4248. //---------------------------------------------------------------------------------
  4249. // Purpose: Loads into memory the players details
  4250. //---------------------------------------------------------------------------------
  4251. void ManiClient::ReadPlayers
  4252. (
  4253. ManiKeyValues *kv_ptr,
  4254. read_t *read_ptr
  4255. )
  4256. {
  4257. char temp_string[256];
  4258. for (;;)
  4259. {
  4260. // Get Player unique id {Client_1_1}
  4261. read_t *player_ptr = kv_ptr->GetNextKey(read_ptr);
  4262. if (player_ptr == NULL)
  4263. {
  4264. return;
  4265. }
  4266. // Add a new client
  4267. ClientPlayer *client_ptr = new ClientPlayer;
  4268. c_list.push_back(client_ptr);
  4269. // Do simple stuff first
  4270. client_ptr->SetEmailAddress(kv_ptr->GetString("email", ""));
  4271. client_ptr->SetName(kv_ptr->GetString("name", ""));
  4272. client_ptr->SetPassword(kv_ptr->GetString("password", ""));
  4273. client_ptr->SetNotes(kv_ptr->GetString("notes", ""));
  4274. /* Handle single steam id */
  4275. Q_strcpy(temp_string, kv_ptr->GetString("steam", ""));
  4276. if (!FStrEq(temp_string, ""))
  4277. {
  4278. client_ptr->steam_list.Add(temp_string);
  4279. }
  4280. /* Handle single ip */
  4281. Q_strcpy(temp_string, kv_ptr->GetString("ip", ""));
  4282. if (!FStrEq(temp_string, ""))
  4283. {
  4284. client_ptr->ip_address_list.Add(temp_string);
  4285. }
  4286. /* Handle single nickname */
  4287. Q_strcpy(temp_string, kv_ptr->GetString("nick", ""));
  4288. if (!FStrEq(temp_string, ""))
  4289. {
  4290. client_ptr->nick_list.Add(temp_string);
  4291. }
  4292. // Steam IDs
  4293. if (kv_ptr->FindKey(player_ptr, "steam"))
  4294. {
  4295. kv_ptr->ResetKeyIndex();
  4296. for (;;)
  4297. {
  4298. char *name = NULL;
  4299. char *value = kv_ptr->GetNextKeyValue(&name);
  4300. if (value == NULL)
  4301. {
  4302. // No more steam ids
  4303. break;
  4304. }
  4305. client_ptr->steam_list.Add(value);
  4306. }
  4307. }
  4308. // IP Addresses
  4309. if (kv_ptr->FindKey(player_ptr, "ip"))
  4310. {
  4311. kv_ptr->ResetKeyIndex();
  4312. for (;;)
  4313. {
  4314. char *name = NULL;
  4315. char *value = kv_ptr->GetNextKeyValue(&name);
  4316. if (value == NULL)
  4317. {
  4318. // No more ip addresses
  4319. break;
  4320. }
  4321. client_ptr->ip_address_list.Add(value);
  4322. }
  4323. }
  4324. // Player nicknames
  4325. if (kv_ptr->FindKey(player_ptr, "nick"))
  4326. {
  4327. kv_ptr->ResetKeyIndex();
  4328. for (;;)
  4329. {
  4330. char *name = NULL;
  4331. char *value = kv_ptr->GetNextKeyValue(&name);
  4332. if (value == NULL)
  4333. {
  4334. // No more nick names
  4335. break;
  4336. }
  4337. client_ptr->nick_list.Add(value);
  4338. }
  4339. }
  4340. // Player groups
  4341. if (kv_ptr->FindKey(player_ptr, "groups"))
  4342. {
  4343. kv_ptr->ResetKeyIndex();
  4344. for (;;)
  4345. {
  4346. char *name = NULL;
  4347. char *value = kv_ptr->GetNextKeyValue(&name);
  4348. if (value == NULL)
  4349. {
  4350. // No more groups
  4351. break;
  4352. }
  4353. if (group_list.Find(name, value))
  4354. {
  4355. client_ptr->group_list.Add(name, value);
  4356. }
  4357. }
  4358. }
  4359. // Player levels
  4360. if (kv_ptr->FindKey(player_ptr, "levels"))
  4361. {
  4362. kv_ptr->ResetKeyIndex();
  4363. for (;;)
  4364. {
  4365. char *name = NULL;
  4366. char *value = kv_ptr->GetNextKeyValue(&name);
  4367. if (value == NULL)
  4368. {
  4369. // No more groups
  4370. break;
  4371. }
  4372. int level_id = atoi(value);
  4373. client_ptr->level_list.Add(name, level_id);
  4374. }
  4375. }
  4376. // Last but not least we need to do the personal flags
  4377. if (kv_ptr->FindKey(player_ptr, "flags"))
  4378. {
  4379. kv_ptr->ResetKeyIndex();
  4380. for (;;)
  4381. {
  4382. char *class_type = NULL;
  4383. char *value = kv_ptr->GetNextKeyValue(&class_type);
  4384. if (value == NULL)
  4385. {
  4386. // No more flags
  4387. break;
  4388. }
  4389. int i = 0;
  4390. // Get individual flags
  4391. for (;;)
  4392. {
  4393. char *flag_id = SplitFlagString(value, &i);
  4394. if (flag_id == NULL)
  4395. {
  4396. break;
  4397. }
  4398. if (flag_desc_list.IsValidFlag(class_type, flag_id))
  4399. {
  4400. // Create flag
  4401. client_ptr->personal_flag_list.SetFlag(class_type, flag_id, true);
  4402. }
  4403. }
  4404. }
  4405. }
  4406. }
  4407. }
  4408. //---------------------------------------------------------------------------------
  4409. // Purpose: Writes to the clients.txt file based on data in memory
  4410. //---------------------------------------------------------------------------------
  4411. void ManiClient::WriteClients(void)
  4412. {
  4413. char temp_string[2048];
  4414. char core_filename[256];
  4415. ManiKeyValues *client;
  4416. snprintf(core_filename, sizeof (core_filename), "./cfg/%s/clients.txt", mani_path.GetString());
  4417. client = new ManiKeyValues( "clients.txt" );
  4418. if (!client->WriteStart(core_filename))
  4419. {
  4420. MMsg("Failed to write %s\n", core_filename);
  4421. delete client;
  4422. return;
  4423. }
  4424. client->WriteKey("version", "1");
  4425. client->WriteCR();
  4426. client->WriteComment("This key group lists all your client players");
  4427. client->WriteNewSubKey("players");
  4428. // MMsg("Writing %i client(s)\n", c_list_size);
  4429. // Loop through all clients
  4430. for (int i = 0; i != (int) c_list.size(); i ++)
  4431. {
  4432. ClientPlayer *client_ptr = c_list[i];
  4433. if (!client_ptr->GetName() || FStrEq(client_ptr->GetName(), ""))
  4434. {
  4435. // No name set up
  4436. if (gpManiDatabase->GetDBEnabled())
  4437. {
  4438. /* Need unique name !! */
  4439. snprintf(temp_string, sizeof(temp_string), "Client_%i_%s", i+1,
  4440. gpManiDatabase->GetServerGroupID());
  4441. }
  4442. else
  4443. {
  4444. snprintf(temp_string, sizeof(temp_string), "Client_%i", i+1);
  4445. }
  4446. client_ptr->SetName(temp_string);
  4447. }
  4448. else
  4449. {
  4450. snprintf(temp_string, sizeof(temp_string), "%s", client_ptr->GetName());
  4451. }
  4452. client->WriteComment("This must be a unique client name");
  4453. client->WriteNewSubKey(temp_string);
  4454. if (client_ptr->GetEmailAddress()) client->WriteKey("email", client_ptr->GetEmailAddress());
  4455. if (client_ptr->GetName())
  4456. {
  4457. client->WriteComment("Client real name");
  4458. client->WriteKey("name", client_ptr->GetName());
  4459. }
  4460. if (client_ptr->GetPassword()) client->WriteKey("password", client_ptr->GetPassword());
  4461. if (client_ptr->GetNotes()) client->WriteKey("notes", client_ptr->GetNotes());
  4462. if (client_ptr->steam_list.Size() == 1)
  4463. {
  4464. client->WriteComment("Steam ID for client");
  4465. client->WriteKey("steam", client_ptr->steam_list.FindFirst());
  4466. }
  4467. if (client_ptr->ip_address_list.Size() == 1) client->WriteKey("ip", client_ptr->ip_address_list.FindFirst());
  4468. if (client_ptr->nick_list.Size() == 1) client->WriteKey("nick", client_ptr->nick_list.FindFirst());
  4469. // Write Steam IDs if needed.
  4470. if (client_ptr->steam_list.Size() > 1)
  4471. {
  4472. client->WriteComment("This sub key is for multiple steam ids");
  4473. client->WriteNewSubKey("steam");
  4474. int j = 1;
  4475. for (const char *steam_id = client_ptr->steam_list.FindFirst(); steam_id != NULL; steam_id = client_ptr->steam_list.FindNext())
  4476. {
  4477. snprintf(temp_string, sizeof(temp_string), "steam%i", j++);
  4478. client->WriteKey(temp_string, steam_id);
  4479. }
  4480. client->WriteEndSubKey();
  4481. }
  4482. // Write IP Addresses if needed.
  4483. if (client_ptr->ip_address_list.Size() > 1)
  4484. {
  4485. client->WriteComment("This sub key is for multiple ip addresses");
  4486. client->WriteNewSubKey("ip");
  4487. int j = 1;
  4488. for (const char *ip_address = client_ptr->ip_address_list.FindFirst(); ip_address != NULL; ip_address = client_ptr->ip_address_list.FindNext())
  4489. {
  4490. snprintf(temp_string, sizeof(temp_string), "IP%i", j++);
  4491. client->WriteKey(temp_string, ip_address);
  4492. }
  4493. client->WriteEndSubKey();
  4494. }
  4495. // Write Player Nicknames if needed.
  4496. if (client_ptr->nick_list.Size() > 1)
  4497. {
  4498. client->WriteComment("This sub key is for multiple player nick names");
  4499. client->WriteNewSubKey("nick");
  4500. int j = 1;
  4501. for (const char *nick = client_ptr->nick_list.FindFirst(); nick != NULL; nick = client_ptr->nick_list.FindNext())
  4502. {
  4503. snprintf(temp_string, sizeof(temp_string), "nick%i", j++);
  4504. client->WriteKey(temp_string, nick);
  4505. }
  4506. client->WriteEndSubKey();
  4507. }
  4508. bool found_flags = false;
  4509. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  4510. {
  4511. bool start_flag = true;
  4512. while(client_ptr->personal_flag_list.CatFlags(temp_string, c_type, 60, start_flag))
  4513. {
  4514. if (!found_flags)
  4515. {
  4516. client->WriteComment("These are personal access flags for a player");
  4517. client->WriteNewSubKey("flags");
  4518. found_flags = true;
  4519. }
  4520. if (start_flag)
  4521. {
  4522. start_flag = false;
  4523. }
  4524. client->WriteKey(c_type, temp_string);
  4525. }
  4526. }
  4527. if (found_flags) client->WriteEndSubKey();
  4528. // Write out the groups we belong to
  4529. if (!client_ptr->group_list.IsEmpty())
  4530. {
  4531. client->WriteNewSubKey("groups");
  4532. const char *group_id = NULL;
  4533. for (const char *c_type = client_ptr->group_list.FindFirst(&group_id); c_type != NULL; c_type = client_ptr->group_list.FindNext(&group_id))
  4534. {
  4535. client->WriteKey(c_type, group_id);
  4536. }
  4537. client->WriteEndSubKey();
  4538. }
  4539. // Write out the levels we belong to
  4540. if (!client_ptr->level_list.IsEmpty())
  4541. {
  4542. client->WriteNewSubKey("levels");
  4543. const char *c_type = NULL;
  4544. for (int level_id = client_ptr->level_list.FindFirst(&c_type); level_id != -99999; level_id = client_ptr->level_list.FindNext(&c_type))
  4545. {
  4546. client->WriteKey(c_type, level_id);
  4547. }
  4548. client->WriteEndSubKey();
  4549. }
  4550. client->WriteEndSubKey();
  4551. if (i != ((int) c_list.size() - 1))
  4552. {
  4553. // Pad out the spacing between players
  4554. client->WriteCR();
  4555. }
  4556. }
  4557. // End Players
  4558. client->WriteEndSubKey();
  4559. client->WriteCR();
  4560. // Need to write out our global groups and levels now
  4561. bool written_primary_key = false;
  4562. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  4563. {
  4564. bool new_class_type = true;
  4565. const DualStriKey *key_value = NULL;
  4566. for (GlobalGroupFlag *g_flag = group_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = group_list.FindNext(c_type, &key_value))
  4567. {
  4568. if (!written_primary_key)
  4569. {
  4570. client->WriteComment("These are global groups of flags that can be assigned to clients");
  4571. client->WriteNewSubKey("groups");
  4572. written_primary_key = true;
  4573. }
  4574. bool start = true;
  4575. while(g_flag->CatFlags(temp_string, 60, start))
  4576. {
  4577. start = false;
  4578. if (new_class_type)
  4579. {
  4580. // Write key 'Admin', 'Immunity' etc
  4581. client->WriteNewSubKey(c_type);
  4582. new_class_type = false;
  4583. }
  4584. // Write each flag
  4585. client->WriteKey(key_value->key2, temp_string);
  4586. }
  4587. }
  4588. if (!new_class_type)
  4589. {
  4590. // Write class type end of key
  4591. client->WriteEndSubKey();
  4592. }
  4593. }
  4594. if (written_primary_key)
  4595. {
  4596. client->WriteEndSubKey();
  4597. client->WriteCR();
  4598. }
  4599. written_primary_key = false;
  4600. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  4601. {
  4602. bool new_class_type = true;
  4603. const DualStrIntKey *key_value = NULL;
  4604. for (GlobalGroupFlag *g_flag = level_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = level_list.FindNext(c_type, &key_value))
  4605. {
  4606. if (!written_primary_key)
  4607. {
  4608. client->WriteComment("These are global groups of flags that can be assigned to clients");
  4609. client->WriteNewSubKey("levels");
  4610. written_primary_key = true;
  4611. }
  4612. bool start = true;
  4613. while(g_flag->CatFlags(temp_string, 60, start))
  4614. {
  4615. start = false;
  4616. if (new_class_type)
  4617. {
  4618. // Write key 'Admin', 'Immunity' etc
  4619. client->WriteNewSubKey(c_type);
  4620. new_class_type = false;
  4621. }
  4622. // Write each flag
  4623. char str_key[32];
  4624. snprintf(str_key, sizeof(str_key), "%d", key_value->key2);
  4625. client->WriteKey(str_key, temp_string);
  4626. }
  4627. }
  4628. if (!new_class_type)
  4629. {
  4630. // Write class type end of key
  4631. client->WriteEndSubKey();
  4632. }
  4633. }
  4634. if (written_primary_key)
  4635. {
  4636. client->WriteEndSubKey();
  4637. client->WriteCR();
  4638. }
  4639. client->WriteEnd();
  4640. delete client;
  4641. return;
  4642. }
  4643. //---------------------------------------------------------------------------------
  4644. // Purpose: Loads into memory the new style admin flags from Pre Beta RC2
  4645. //---------------------------------------------------------------------------------
  4646. void ManiClient::LoadClientsBeta(void)
  4647. {
  4648. char core_filename[256];
  4649. bool found_match;
  4650. KeyValues *base_key_ptr;
  4651. // MMsg("*********** Loading admin section of clients.txt ************\n");
  4652. // Read the clients.txt file
  4653. KeyValues *kv_ptr = new KeyValues("clients.txt");
  4654. snprintf(core_filename, sizeof (core_filename), "./cfg/%s/clients.txt", mani_path.GetString());
  4655. if (!kv_ptr->LoadFromFile( filesystem, core_filename, NULL))
  4656. {
  4657. MMsg("Failed to load clients.txt\n");
  4658. kv_ptr->deleteThis();
  4659. return;
  4660. }
  4661. //////////////////////////////////////////////
  4662. base_key_ptr = kv_ptr->GetFirstTrueSubKey();
  4663. if (!base_key_ptr)
  4664. {
  4665. // MMsg("No true subkey found\n");
  4666. kv_ptr->deleteThis();
  4667. return;
  4668. }
  4669. found_match = false;
  4670. // Find our groups first
  4671. for (;;)
  4672. {
  4673. if (FStrEq(base_key_ptr->GetName(), "admingroups"))
  4674. {
  4675. found_match = true;
  4676. break;
  4677. }
  4678. base_key_ptr = base_key_ptr->GetNextKey();
  4679. if (!base_key_ptr)
  4680. {
  4681. break;
  4682. }
  4683. }
  4684. if (found_match)
  4685. {
  4686. // Get all the groups in
  4687. GetAdminGroupsBeta(base_key_ptr);
  4688. }
  4689. //////////////////////////////////////////////
  4690. base_key_ptr = kv_ptr->GetFirstTrueSubKey();
  4691. if (!base_key_ptr)
  4692. {
  4693. // MMsg("No true subkey found\n");
  4694. kv_ptr->deleteThis();
  4695. return;
  4696. }
  4697. found_match = false;
  4698. // Find our immunity groups
  4699. for (;;)
  4700. {
  4701. if (FStrEq(base_key_ptr->GetName(), "immunitygroups"))
  4702. {
  4703. found_match = true;
  4704. break;
  4705. }
  4706. base_key_ptr = base_key_ptr->GetNextKey();
  4707. if (!base_key_ptr)
  4708. {
  4709. break;
  4710. }
  4711. }
  4712. if (found_match)
  4713. {
  4714. // Get all the groups in
  4715. GetImmunityGroupsBeta(base_key_ptr);
  4716. }
  4717. //////////////////////////////////////////////
  4718. base_key_ptr = kv_ptr->GetFirstTrueSubKey();
  4719. if (!base_key_ptr)
  4720. {
  4721. // MMsg("No true subkey found\n");
  4722. kv_ptr->deleteThis();
  4723. return;
  4724. }
  4725. found_match = false;
  4726. // Find our levels next
  4727. for (;;)
  4728. {
  4729. if (FStrEq(base_key_ptr->GetName(), "adminlevels"))
  4730. {
  4731. found_match = true;
  4732. break;
  4733. }
  4734. base_key_ptr = base_key_ptr->GetNextKey();
  4735. if (!base_key_ptr)
  4736. {
  4737. break;
  4738. }
  4739. }
  4740. if (found_match)
  4741. {
  4742. // Get all the levels in
  4743. GetAdminLevelsBeta(base_key_ptr);
  4744. }
  4745. //////////////////////////////////////////////
  4746. base_key_ptr = kv_ptr->GetFirstTrueSubKey();
  4747. if (!base_key_ptr)
  4748. {
  4749. // MMsg("No true subkey found\n");
  4750. kv_ptr->deleteThis();
  4751. return;
  4752. }
  4753. found_match = false;
  4754. // Find our levels next
  4755. for (;;)
  4756. {
  4757. if (FStrEq(base_key_ptr->GetName(), "immunitylevels"))
  4758. {
  4759. found_match = true;
  4760. break;
  4761. }
  4762. base_key_ptr = base_key_ptr->GetNextKey();
  4763. if (!base_key_ptr)
  4764. {
  4765. break;
  4766. }
  4767. }
  4768. if (found_match)
  4769. {
  4770. // Get all the levels in
  4771. GetImmunityLevelsBeta(base_key_ptr);
  4772. }
  4773. //////////////////////////////////////////////
  4774. base_key_ptr = kv_ptr->GetFirstTrueSubKey();
  4775. if (!base_key_ptr)
  4776. {
  4777. // MMsg("No true subkey found\n");
  4778. kv_ptr->deleteThis();
  4779. return;
  4780. }
  4781. found_match = false;
  4782. // Find our clients next
  4783. for (;;)
  4784. {
  4785. if (FStrEq(base_key_ptr->GetName(), "players"))
  4786. {
  4787. found_match = true;
  4788. break;
  4789. }
  4790. base_key_ptr = base_key_ptr->GetNextKey();
  4791. if (!base_key_ptr)
  4792. {
  4793. break;
  4794. }
  4795. }
  4796. if (found_match)
  4797. {
  4798. // Get all the clients in
  4799. GetClientsBeta(base_key_ptr);
  4800. }
  4801. }
  4802. //---------------------------------------------------------------------------------
  4803. // Purpose: Loads into memory the new style admin groups from Pre Beta 1.2RC2
  4804. //---------------------------------------------------------------------------------
  4805. void ManiClient::GetAdminGroupsBeta(KeyValues *ptr)
  4806. {
  4807. KeyValues *kv_ptr;
  4808. char flag_string[4096];
  4809. char group_name[128];
  4810. admin_group_t admin_group;
  4811. kv_ptr = ptr->GetFirstValue();
  4812. if (!kv_ptr)
  4813. {
  4814. return;
  4815. }
  4816. for (;;)
  4817. {
  4818. Q_memset(&admin_group, 0, sizeof(admin_group_t));
  4819. Q_strcpy(group_name, kv_ptr->GetName());
  4820. Q_strcpy(flag_string, kv_ptr->GetString());
  4821. Q_strcpy(admin_group.group_id, group_name);
  4822. if (!FStrEq("", flag_string))
  4823. {
  4824. int flag_string_index = 0;
  4825. while(flag_string[flag_string_index] != '\0')
  4826. {
  4827. char *flag_name = this->SplitFlagString(flag_string, &flag_string_index);
  4828. if (flag_name != NULL)
  4829. {
  4830. if (flag_desc_list.IsValidFlag(ADMIN, flag_name))
  4831. {
  4832. GlobalGroupFlag *g_flag = group_list.AddGroup(ADMIN, admin_group.group_id);
  4833. if (g_flag)
  4834. {
  4835. g_flag->SetFlag(flag_name, true);
  4836. }
  4837. }
  4838. }
  4839. }
  4840. }
  4841. kv_ptr = kv_ptr->GetNextValue();
  4842. if (!kv_ptr)
  4843. {
  4844. break;
  4845. }
  4846. }
  4847. }
  4848. //---------------------------------------------------------------------------------
  4849. // Purpose: Loads into memory the new style immunity groups from Pre Beta 1.2RC2
  4850. //---------------------------------------------------------------------------------
  4851. void ManiClient::GetImmunityGroupsBeta(KeyValues *ptr)
  4852. {
  4853. KeyValues *kv_ptr;
  4854. char flag_string[4096];
  4855. char group_name[128];
  4856. immunity_group_t immunity_group;
  4857. kv_ptr = ptr->GetFirstValue();
  4858. if (!kv_ptr)
  4859. {
  4860. return;
  4861. }
  4862. for (;;)
  4863. {
  4864. Q_memset(&immunity_group, 0, sizeof(immunity_group_t));
  4865. Q_strcpy(group_name, kv_ptr->GetName());
  4866. Q_strcpy(flag_string, kv_ptr->GetString());
  4867. Q_strcpy(immunity_group.group_id, group_name);
  4868. if (!FStrEq("", flag_string))
  4869. {
  4870. int flag_string_index = 0;
  4871. while(flag_string[flag_string_index] != '\0')
  4872. {
  4873. char *flag_name = this->SplitFlagString(flag_string, &flag_string_index);
  4874. if (flag_name != NULL)
  4875. {
  4876. if (flag_desc_list.IsValidFlag("Immunity", flag_name))
  4877. {
  4878. GlobalGroupFlag *g_flag = group_list.AddGroup(IMMUNITY, immunity_group.group_id);
  4879. if (g_flag)
  4880. {
  4881. g_flag->SetFlag(flag_name, true);
  4882. }
  4883. }
  4884. }
  4885. }
  4886. }
  4887. kv_ptr = kv_ptr->GetNextValue();
  4888. if (!kv_ptr)
  4889. {
  4890. break;
  4891. }
  4892. }
  4893. }
  4894. //---------------------------------------------------------------------------------
  4895. // Purpose: Loads into memory the new style admin levels Pre Beta RC2
  4896. //---------------------------------------------------------------------------------
  4897. void ManiClient::GetAdminLevelsBeta(KeyValues *ptr)
  4898. {
  4899. KeyValues *kv_ptr;
  4900. char flag_string[4096];
  4901. kv_ptr = ptr->GetFirstValue();
  4902. if (!kv_ptr)
  4903. {
  4904. return;
  4905. }
  4906. for (;;)
  4907. {
  4908. Q_strcpy(flag_string, kv_ptr->GetString());
  4909. if (!FStrEq("", flag_string))
  4910. {
  4911. int flag_string_index = 0;
  4912. while(flag_string[flag_string_index] != '\0')
  4913. {
  4914. char *flag_name = this->SplitFlagString(flag_string, &flag_string_index);
  4915. if (flag_name != NULL)
  4916. {
  4917. if (flag_desc_list.IsValidFlag(ADMIN, flag_name))
  4918. {
  4919. GlobalGroupFlag *g_flag = level_list.AddGroup(ADMIN, atoi(kv_ptr->GetName()));
  4920. if (g_flag)
  4921. {
  4922. g_flag->SetFlag(flag_name, true);
  4923. }
  4924. }
  4925. }
  4926. }
  4927. }
  4928. kv_ptr = kv_ptr->GetNextValue();
  4929. if (!kv_ptr)
  4930. {
  4931. break;
  4932. }
  4933. }
  4934. }
  4935. //---------------------------------------------------------------------------------
  4936. // Purpose: Loads into memory the new style immunity levels pre Beta 1.2RC2
  4937. //---------------------------------------------------------------------------------
  4938. void ManiClient::GetImmunityLevelsBeta(KeyValues *ptr)
  4939. {
  4940. KeyValues *kv_ptr;
  4941. char flag_string[4096];
  4942. kv_ptr = ptr->GetFirstValue();
  4943. if (!kv_ptr)
  4944. {
  4945. return;
  4946. }
  4947. for (;;)
  4948. {
  4949. Q_strcpy(flag_string, kv_ptr->GetString());
  4950. if (!FStrEq("", flag_string))
  4951. {
  4952. int flag_string_index = 0;
  4953. while(flag_string[flag_string_index] != '\0')
  4954. {
  4955. char *flag_name = this->SplitFlagString(flag_string, &flag_string_index);
  4956. if (flag_name != NULL)
  4957. {
  4958. if (flag_desc_list.IsValidFlag(ADMIN, flag_name))
  4959. {
  4960. GlobalGroupFlag *g_flag = level_list.AddGroup(IMMUNITY, atoi(kv_ptr->GetName()));
  4961. if (g_flag)
  4962. {
  4963. g_flag->SetFlag(flag_name, true);
  4964. }
  4965. }
  4966. }
  4967. }
  4968. }
  4969. kv_ptr = kv_ptr->GetNextValue();
  4970. if (!kv_ptr)
  4971. {
  4972. break;
  4973. }
  4974. }
  4975. }
  4976. //---------------------------------------------------------------------------------
  4977. // Purpose: Loads into memory the new style clients flags Pre Beta 1.2RC2
  4978. // This will upgrade the old style clients.txt file to be stored in the new format
  4979. //---------------------------------------------------------------------------------
  4980. void ManiClient::GetClientsBeta(KeyValues *ptr)
  4981. {
  4982. KeyValues *players_ptr;
  4983. KeyValues *kv_ptr;
  4984. KeyValues *temp_ptr;
  4985. char flag_string[4096];
  4986. char temp_string[256];
  4987. ClientPlayer *client_ptr;
  4988. // Should be at key 'players'
  4989. players_ptr = ptr->GetFirstSubKey();
  4990. if (!players_ptr)
  4991. {
  4992. return;
  4993. }
  4994. for (;;)
  4995. {
  4996. client_ptr = (ClientPlayer *) new ClientPlayer;
  4997. c_list.push_back(client_ptr);
  4998. kv_ptr = players_ptr;
  4999. // Do simple stuff first
  5000. client_ptr->SetEmailAddress(kv_ptr->GetString("email"));
  5001. int admin_level_id = kv_ptr->GetInt("admin_level", -1);
  5002. if (admin_level_id != -1)
  5003. {
  5004. client_ptr->level_list.Add(ADMIN, admin_level_id);
  5005. }
  5006. int immunity_level_id = kv_ptr->GetInt("immunity_level", -1);
  5007. if (immunity_level_id != -1)
  5008. {
  5009. client_ptr->level_list.Add(IMMUNITY, immunity_level_id);
  5010. }
  5011. client_ptr->SetName(kv_ptr->GetString("name"));
  5012. client_ptr->SetPassword(kv_ptr->GetString("password"));
  5013. client_ptr->SetNotes(kv_ptr->GetString("notes"));
  5014. /* Handle single steam id */
  5015. Q_strcpy(temp_string, kv_ptr->GetString("steam", ""));
  5016. if (!FStrEq(temp_string, ""))
  5017. {
  5018. client_ptr->steam_list.Add(temp_string);
  5019. }
  5020. /* Handle single ip */
  5021. Q_strcpy(temp_string, kv_ptr->GetString("ip", ""));
  5022. if (!FStrEq(temp_string, ""))
  5023. {
  5024. client_ptr->ip_address_list.Add(temp_string);
  5025. }
  5026. /* Handle single nickname */
  5027. Q_strcpy(temp_string, kv_ptr->GetString("nick", ""));
  5028. if (!FStrEq(temp_string, ""))
  5029. {
  5030. client_ptr->nick_list.Add(temp_string);
  5031. }
  5032. /* Handle single admin group */
  5033. Q_strcpy(temp_string, kv_ptr->GetString("admingroups", ""));
  5034. if (!FStrEq(temp_string, ""))
  5035. {
  5036. client_ptr->group_list.Add(ADMIN, temp_string);
  5037. }
  5038. /* Handle single immunity group */
  5039. Q_strcpy(temp_string, kv_ptr->GetString("immunitygroups", ""));
  5040. if (!FStrEq(temp_string, ""))
  5041. {
  5042. client_ptr->group_list.Add(IMMUNITY, temp_string);
  5043. }
  5044. // Steam IDs
  5045. temp_ptr = kv_ptr->FindKey("steam", false);
  5046. if (temp_ptr)
  5047. {
  5048. temp_ptr = temp_ptr->GetFirstValue();
  5049. if (temp_ptr)
  5050. {
  5051. for (;;)
  5052. {
  5053. client_ptr->steam_list.Add(temp_ptr->GetString());
  5054. temp_ptr = temp_ptr->GetNextValue();
  5055. if (!temp_ptr)
  5056. {
  5057. break;
  5058. }
  5059. }
  5060. }
  5061. }
  5062. // IP Addresses
  5063. temp_ptr = kv_ptr->FindKey("ip", false);
  5064. if (temp_ptr)
  5065. {
  5066. temp_ptr = temp_ptr->GetFirstValue();
  5067. if (temp_ptr)
  5068. {
  5069. for (;;)
  5070. {
  5071. client_ptr->ip_address_list.Add(temp_ptr->GetString());
  5072. temp_ptr = temp_ptr->GetNextValue();
  5073. if (!temp_ptr)
  5074. {
  5075. break;
  5076. }
  5077. }
  5078. }
  5079. }
  5080. // Player nicknames
  5081. temp_ptr = kv_ptr->FindKey("nick", false);
  5082. if (temp_ptr)
  5083. {
  5084. temp_ptr = temp_ptr->GetFirstValue();
  5085. if (temp_ptr)
  5086. {
  5087. for (;;)
  5088. {
  5089. client_ptr->nick_list.Add(temp_ptr->GetString());
  5090. temp_ptr = temp_ptr->GetNextValue();
  5091. if (!temp_ptr)
  5092. {
  5093. break;
  5094. }
  5095. }
  5096. }
  5097. }
  5098. // Admin Groups
  5099. temp_ptr = kv_ptr->FindKey("admingroups", false);
  5100. if (temp_ptr)
  5101. {
  5102. temp_ptr = temp_ptr->GetFirstValue();
  5103. if (temp_ptr)
  5104. {
  5105. for (;;)
  5106. {
  5107. if (group_list.Find(ADMIN, temp_ptr->GetString()))
  5108. {
  5109. client_ptr->group_list.Add(ADMIN, temp_ptr->GetString());
  5110. }
  5111. temp_ptr = temp_ptr->GetNextValue();
  5112. if (!temp_ptr)
  5113. {
  5114. break;
  5115. }
  5116. }
  5117. }
  5118. }
  5119. // Immunity Groups
  5120. temp_ptr = kv_ptr->FindKey("immunitygroups", false);
  5121. if (temp_ptr)
  5122. {
  5123. temp_ptr = temp_ptr->GetFirstValue();
  5124. if (temp_ptr)
  5125. {
  5126. for (;;)
  5127. {
  5128. if (group_list.Find(IMMUNITY, temp_ptr->GetString()))
  5129. {
  5130. client_ptr->group_list.Add(IMMUNITY, temp_ptr->GetString());
  5131. }
  5132. temp_ptr = temp_ptr->GetNextValue();
  5133. if (!temp_ptr)
  5134. {
  5135. break;
  5136. }
  5137. }
  5138. }
  5139. }
  5140. // do the admin flags
  5141. temp_ptr = kv_ptr->FindKey("adminflags", false);
  5142. if (temp_ptr)
  5143. {
  5144. temp_ptr = temp_ptr->GetFirstValue();
  5145. if (temp_ptr)
  5146. {
  5147. for (;;)
  5148. {
  5149. Q_strcpy(flag_string, temp_ptr->GetString());
  5150. if (!FStrEq("", flag_string))
  5151. {
  5152. int flag_string_index = 0;
  5153. while(flag_string[flag_string_index] != '\0')
  5154. {
  5155. char *flag_id = this->SplitFlagString(flag_string, &flag_string_index);
  5156. if (flag_id != NULL)
  5157. {
  5158. if (flag_desc_list.IsValidFlag(ADMIN, flag_id))
  5159. {
  5160. // Create flag
  5161. client_ptr->personal_flag_list.SetFlag(ADMIN, flag_id, true);
  5162. }
  5163. }
  5164. }
  5165. }
  5166. temp_ptr = temp_ptr->GetNextValue();
  5167. if (!temp_ptr)
  5168. {
  5169. break;
  5170. }
  5171. }
  5172. }
  5173. }
  5174. // Do the immunity flags
  5175. temp_ptr = kv_ptr->FindKey("immunityflags", false);
  5176. if (temp_ptr)
  5177. {
  5178. temp_ptr = temp_ptr->GetFirstValue();
  5179. if (temp_ptr)
  5180. {
  5181. for (;;)
  5182. {
  5183. Q_strcpy(flag_string, temp_ptr->GetString());
  5184. if (!FStrEq("", flag_string))
  5185. {
  5186. int flag_string_index = 0;
  5187. while(flag_string[flag_string_index] != '\0')
  5188. {
  5189. char *flag_id = this->SplitFlagString(flag_string, &flag_string_index);
  5190. if (flag_id != NULL)
  5191. {
  5192. if (flag_desc_list.IsValidFlag(IMMUNITY, flag_id))
  5193. {
  5194. // Create flag
  5195. client_ptr->personal_flag_list.SetFlag(IMMUNITY, flag_id, true);
  5196. }
  5197. }
  5198. }
  5199. }
  5200. temp_ptr = temp_ptr->GetNextValue();
  5201. if (!temp_ptr)
  5202. {
  5203. break;
  5204. }
  5205. }
  5206. }
  5207. }
  5208. players_ptr = players_ptr->GetNextKey();
  5209. if (!players_ptr)
  5210. {
  5211. break;
  5212. }
  5213. }
  5214. // Calculates each clients unmasked flags (flags without levels applied)
  5215. SetupUnMasked();
  5216. }
  5217. //---------------------------------------------------------------------------------
  5218. // Purpose: Checks index of player to see if they are a client
  5219. //---------------------------------------------------------------------------------
  5220. bool ManiClient::IsClient(int id)
  5221. {
  5222. if (id < 1 || id > max_players) return false;
  5223. return ((active_client_list[id - 1] == NULL) ? false:true);
  5224. }
  5225. //---------------------------------------------------------------------------------
  5226. // Purpose: Finds a user by name and updates their user_id
  5227. //---------------------------------------------------------------------------------
  5228. void ManiClient::UpdateClientUserID(const int user_id, const char *name)
  5229. {
  5230. for (int i = 0; i != (int) c_list.size(); i++)
  5231. {
  5232. if (strcmp(c_list[i]->GetName(), name) == 0)
  5233. {
  5234. c_list[i]->SetUserID(user_id);
  5235. break;
  5236. }
  5237. }
  5238. }
  5239. //---------------------------------------------------------------------------------
  5240. // Loads the simple IP list into a ManiKeyValues structure
  5241. //---------------------------------------------------------------------------------
  5242. bool ManiClient::LoadIPList() {
  5243. char core_filename[256];
  5244. KeyValues *kv_ptr;
  5245. kv_ptr = new KeyValues("client_ip_history.txt");
  5246. snprintf(core_filename, sizeof (core_filename), "./cfg/%s/data/client_ip_history.txt", mani_path.GetString());
  5247. ip_list.clear();
  5248. if ( !kv_ptr->LoadFromFile(filesystem, core_filename) ) {
  5249. MMsg("Failed to load %s\n", core_filename);
  5250. kv_ptr->deleteThis();
  5251. return false;
  5252. }
  5253. KeyValues *acct_type = kv_ptr->GetFirstSubKey(); // A = Admin, R = Reserved Slot
  5254. while ( acct_type ) {
  5255. bool admin = ( FStrEq(acct_type->GetName(), "a" ) );
  5256. KeyValues *steam_info = acct_type->GetFirstSubKey();
  5257. while ( steam_info ) {
  5258. IPClient *client = new IPClient(steam_info->GetName(), admin );
  5259. ip_list.push_back(client);
  5260. KeyValues *data = steam_info->GetFirstValue();
  5261. while ( data ) {
  5262. client->AddIP(data->GetName(), data->GetInt());
  5263. data = data->GetNextValue();
  5264. }
  5265. steam_info = steam_info->GetNextKey();
  5266. }
  5267. acct_type = acct_type->GetNextKey();
  5268. }
  5269. return true;
  5270. }
  5271. //---------------------------------------------------------------------------------
  5272. // Writes the simple IP list into a ManiKeyValues structure
  5273. //---------------------------------------------------------------------------------
  5274. bool ManiClient::WriteIPList() {
  5275. char core_filename[256];
  5276. KeyValues *kv_ptr = new KeyValues("client_ip_history.txt");
  5277. KeyValues *admin = new KeyValues("A");
  5278. KeyValues *reserved = new KeyValues("R");
  5279. snprintf(core_filename, sizeof (core_filename), "./cfg/%s/data/client_ip_history.txt", mani_path.GetString());
  5280. KeyValues *client = NULL;
  5281. CleanupIPList( mani_reserve_slots_ip_keep_history.GetInt() );
  5282. for ( int i = 0; i < (int)ip_list.size(); i++ ) {
  5283. if ( ip_list[i]->int_ip_list.size() == 0 )
  5284. continue; // this should not happen after cleanup!
  5285. client = new KeyValues(ip_list[i]->_steamid);
  5286. for ( int x = 0; x < (int)ip_list[i]->int_ip_list.size(); x++ ) {
  5287. client->SetInt(ip_list[i]->int_ip_list[x].ip, ip_list[i]->int_ip_list[x].last_played);
  5288. }
  5289. if ( ip_list[i]->_admin )
  5290. admin->AddSubKey(client);
  5291. else
  5292. reserved->AddSubKey(client);
  5293. }
  5294. kv_ptr->AddSubKey(admin);
  5295. kv_ptr->AddSubKey(reserved);
  5296. kv_ptr->SaveToFile( filesystem, core_filename );
  5297. return true;
  5298. }
  5299. //---------------------------------------------------------------------------------
  5300. // Cleans stale records from the IP list
  5301. //---------------------------------------------------------------------------------
  5302. int ManiClient::CleanupIPList(int days) {
  5303. int count = 0;
  5304. std::vector<IPClient *>::iterator i;
  5305. for ( i = ip_list.begin(); i != ip_list.end(); ) {
  5306. count += (*i)->RemoveStale(days);
  5307. if ( (*i)->int_ip_list.size() == 0 )
  5308. i = ip_list.erase(i);
  5309. else
  5310. i++;
  5311. }
  5312. return count;
  5313. }
  5314. //---------------------------------------------------------------------------------
  5315. // Returns whether or not the IP address is linked to an admin player
  5316. //---------------------------------------------------------------------------------
  5317. bool ManiClient::IPLinksToAdmin ( const char *ip ) {
  5318. std::vector<IPClient *>::iterator i;
  5319. bool admin = false;
  5320. for ( i = ip_list.begin(); i != ip_list.end(); i++ ) {
  5321. if ( (*i)->FindIP(ip) ) {
  5322. admin = (*i)->_admin;
  5323. }
  5324. if ( admin ) {
  5325. for (int x = 0; x != (int) c_list.size(); x++)
  5326. {
  5327. ClientPlayer *client_ptr = c_list[x];
  5328. if ( client_ptr->steam_list.Find( (*i)->_steamid )) {
  5329. bool unmasked = client_ptr->unmasked_list.IsFlagSet( ADMIN, ADMIN_BASIC_ADMIN );
  5330. bool masked = false;
  5331. if (!client_ptr->level_list.IsEmpty())
  5332. {
  5333. masked = client_ptr->masked_list.IsFlagSet(ADMIN, ADMIN_BASIC_ADMIN);
  5334. }
  5335. return masked || unmasked;
  5336. }
  5337. }
  5338. }
  5339. }
  5340. return false;
  5341. }
  5342. //---------------------------------------------------------------------------------
  5343. // Returns whether or not the IP address is linked to a reserve slot
  5344. //---------------------------------------------------------------------------------
  5345. bool ManiClient::IPLinksToReservedSlot ( const char *ip ) {
  5346. std::vector<IPClient *>::iterator i;
  5347. for ( i = ip_list.begin(); i != ip_list.end(); i++ )
  5348. if ( (*i)->FindIP(ip) )
  5349. return !(*i)->_admin;
  5350. return false;
  5351. }
  5352. //---------------------------------------------------------------------------------
  5353. // Adds a player to the list ( upon disconnect )
  5354. //---------------------------------------------------------------------------------
  5355. bool ManiClient::UpdatePlayer( player_t *player_ptr ) {
  5356. std::vector<IPClient *>::iterator i;
  5357. time_t now;
  5358. time(&now);
  5359. bool updated = false;
  5360. bool admin = false;
  5361. bool reserve = false;
  5362. admin = HasAccess(player_ptr, ADMIN, ADMIN_BASIC_ADMIN);
  5363. if ( !admin )
  5364. reserve = gpManiReservedSlot->IsPlayerInReserveList(player_ptr);
  5365. if ( !admin && !reserve )
  5366. return false;
  5367. for ( i = ip_list.begin(); i != ip_list.end(); i++ )
  5368. if ( FStrEq( (*i)->_steamid, player_ptr->steam_id ) ) {
  5369. updated = true;
  5370. (*i)->AddIP( player_ptr->ip_address, (int)now );
  5371. break;
  5372. }
  5373. if ( !updated ) {
  5374. IPClient *client = new IPClient( player_ptr->steam_id, admin );
  5375. client->AddIP ( player_ptr->ip_address, int(now) );
  5376. ip_list.push_back(client);
  5377. }
  5378. return true;
  5379. }
  5380. //---------------------------------------------------------------------------------
  5381. // Menus for client admin
  5382. //---------------------------------------------------------------------------------
  5383. int ClientOrGroupItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5384. {
  5385. char *sub_option;
  5386. if (!this->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5387. if (strcmp("client", sub_option) == 0)
  5388. {
  5389. MENUPAGE_CREATE(ClientOptionPage, player_ptr, 0, -1);
  5390. return NEW_MENU;
  5391. }
  5392. else if (strcmp("group", sub_option) == 0)
  5393. {
  5394. MENUPAGE_CREATE(GroupOptionPage, player_ptr, 0, -1);
  5395. return NEW_MENU;
  5396. }
  5397. else if (strcmp("level", sub_option) == 0)
  5398. {
  5399. MENUPAGE_CREATE(LevelOptionPage, player_ptr, 0, -1);
  5400. return NEW_MENU;
  5401. }
  5402. return CLOSE_MENU;
  5403. }
  5404. bool ClientOrGroupPage::PopulateMenuPage(player_t *player_ptr)
  5405. {
  5406. this->SetEscLink("%s", Translate(player_ptr, 2601));
  5407. this->SetTitle("%s", Translate(player_ptr, 2602));
  5408. MENUOPTION_CREATE(ClientOrGroupItem, 2603, client);
  5409. MENUOPTION_CREATE(ClientOrGroupItem, 2604, group);
  5410. MENUOPTION_CREATE(ClientOrGroupItem, 2605, level);
  5411. return true;
  5412. }
  5413. //---------------------------------------------------------------------------------
  5414. int GroupOptionItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5415. {
  5416. char *sub_option;
  5417. if (!this->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5418. if (strcmp("update", sub_option) == 0)
  5419. {
  5420. MENUPAGE_CREATE_PARAM(GroupClassTypePage, player_ptr, AddParam("sub_option", "update"), 0, -1);
  5421. return NEW_MENU;
  5422. }
  5423. else if (strcmp("add", sub_option) == 0)
  5424. {
  5425. MENUPAGE_CREATE_PARAM(ChooseClassTypePage, player_ptr, AddParam("sub_option", "add_group_type"), 0, -1);
  5426. return NEW_MENU;
  5427. }
  5428. else if (strcmp("remove", sub_option) == 0)
  5429. {
  5430. MENUPAGE_CREATE(GroupRemovePage, player_ptr, 0, -1);
  5431. return NEW_MENU;
  5432. }
  5433. else if (strcmp("client", sub_option) == 0)
  5434. {
  5435. MENUPAGE_CREATE_PARAM(GroupClassTypePage, player_ptr, AddParam("sub_option", "client"), 0, -1);
  5436. return NEW_MENU;
  5437. }
  5438. return CLOSE_MENU;
  5439. }
  5440. bool GroupOptionPage::PopulateMenuPage(player_t *player_ptr)
  5441. {
  5442. this->SetEscLink("%s", Translate(player_ptr, 2610));
  5443. this->SetTitle("%s", Translate(player_ptr, 2611));
  5444. MENUOPTION_CREATE(GroupOptionItem, 2612, update);
  5445. MENUOPTION_CREATE(GroupOptionItem, 2613, add);
  5446. MENUOPTION_CREATE(GroupOptionItem, 2614, remove);
  5447. MENUOPTION_CREATE(GroupOptionItem, 2615, client);
  5448. return true;
  5449. }
  5450. //---------------------------------------------------------------------------------
  5451. int GroupClassTypeItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5452. {
  5453. char *sub_option;
  5454. char *class_type;
  5455. char *group_id;
  5456. if (!this->params.GetParam("class_type", &class_type) ||
  5457. !this->params.GetParam("group_id", &group_id) ||
  5458. !m_page_ptr->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5459. if (strcmp(sub_option, "update") == 0)
  5460. {
  5461. MENUPAGE_CREATE_PARAM2(GroupUpdatePage, player_ptr, AddParam("class_type", class_type), AddParam("group_id", group_id), 0, -1);
  5462. }
  5463. else if (strcmp(sub_option, "client") == 0)
  5464. {
  5465. MENUPAGE_CREATE_PARAM2(GroupClientPage, player_ptr, AddParam("class_type", class_type), AddParam("group_id", group_id), 0, -1);
  5466. }
  5467. return NEW_MENU;
  5468. }
  5469. bool GroupClassTypePage::PopulateMenuPage(player_t *player_ptr)
  5470. {
  5471. this->SetEscLink("%s", Translate(player_ptr, 2630));
  5472. this->SetTitle("%s", Translate(player_ptr, 2631));
  5473. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  5474. {
  5475. const DualStriKey *key_value = NULL;
  5476. for (GlobalGroupFlag *g_flag = gpManiClient->group_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = gpManiClient->group_list.FindNext(c_type, &key_value))
  5477. {
  5478. MenuItem *ptr = new GroupClassTypeItem();
  5479. ptr->params.AddParam("class_type", key_value->key1);
  5480. ptr->params.AddParam("group_id", key_value->key2);
  5481. ptr->SetDisplayText("%s -> %s", key_value->key1, key_value->key2);
  5482. this->AddItem(ptr);
  5483. }
  5484. }
  5485. this->SortDisplay();
  5486. return true;
  5487. }
  5488. //---------------------------------------------------------------------------------
  5489. int GroupRemoveItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5490. {
  5491. char *class_type;
  5492. char *group_id;
  5493. if (!this->params.GetParam("class_type", &class_type) ||
  5494. !this->params.GetParam("group_id", &group_id)) return CLOSE_MENU;
  5495. gpManiClient->ProcessRemoveGroupType(class_type, player_ptr, group_id);
  5496. return REPOP_MENU;
  5497. }
  5498. bool GroupRemovePage::PopulateMenuPage(player_t *player_ptr)
  5499. {
  5500. this->SetEscLink("%s", Translate(player_ptr, 2710));
  5501. this->SetTitle("%s", Translate(player_ptr, 2711));
  5502. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  5503. {
  5504. const DualStriKey *key_value = NULL;
  5505. for (GlobalGroupFlag *g_flag = gpManiClient->group_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = gpManiClient->group_list.FindNext(c_type, &key_value))
  5506. {
  5507. MenuItem *ptr = new GroupRemoveItem();
  5508. ptr->params.AddParam("class_type", key_value->key1);
  5509. ptr->params.AddParam("group_id", key_value->key2);
  5510. ptr->SetDisplayText("%s -> %s", key_value->key1, key_value->key2);
  5511. this->AddItem(ptr);
  5512. }
  5513. }
  5514. this->SortDisplay();
  5515. return true;
  5516. }
  5517. //---------------------------------------------------------------------------------
  5518. int GroupUpdateItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5519. {
  5520. char *class_type;
  5521. char *group_id;
  5522. char *flag_id;
  5523. if (!this->params.GetParam("class_type", &class_type) ||
  5524. !this->params.GetParam("group_id", &group_id) ||
  5525. !this->params.GetParam("flag_id", &flag_id)) return CLOSE_MENU;
  5526. gpManiClient->ProcessAddGroupType(class_type, player_ptr, group_id, flag_id);
  5527. return REPOP_MENU;
  5528. }
  5529. bool GroupUpdatePage::PopulateMenuPage(player_t *player_ptr)
  5530. {
  5531. char *class_type;
  5532. char *group_id;
  5533. if (!this->params.GetParam("class_type", &class_type) ||
  5534. !this->params.GetParam("group_id", &group_id)) return false;
  5535. GlobalGroupFlag *g_flag = gpManiClient->group_list.Find(class_type, group_id);
  5536. this->SetEscLink("%s", Translate(player_ptr, 2640));
  5537. this->SetTitle("%s", Translate(player_ptr, 2641, "%s%s", class_type, group_id));
  5538. MenuItem *ptr = new GroupUpdateItem();
  5539. ptr->params.AddParam("class_type", class_type);
  5540. ptr->params.AddParam("group_id", group_id);
  5541. ptr->params.AddParam("flag_id", "+#");
  5542. ptr->SetDisplayText("%s", Translate(player_ptr, 2642));
  5543. ptr->SetHiddenText("1");
  5544. this->AddItem(ptr);
  5545. ptr = new GroupUpdateItem();
  5546. ptr->params.AddParam("class_type", class_type);
  5547. ptr->params.AddParam("group_id", group_id);
  5548. ptr->params.AddParam("flag_id", "-#");
  5549. ptr->SetDisplayText("%s", Translate(player_ptr, 2643));
  5550. ptr->SetHiddenText("2");
  5551. this->AddItem(ptr);
  5552. // Search for flags we can use for this type
  5553. const DualStrKey *key_value = NULL;
  5554. for (const char *desc = gpManiClient->flag_desc_list.FindFirst(class_type, &key_value); desc != NULL; desc = gpManiClient->flag_desc_list.FindNext(class_type, &key_value))
  5555. {
  5556. if (strcmp(key_value->key1, class_type) == 0)
  5557. {
  5558. ptr = new GroupUpdateItem();
  5559. if (g_flag && g_flag->IsFlagSet(key_value->key2))
  5560. {
  5561. ptr->SetDisplayText("* %s", desc);
  5562. ptr->params.AddParamVar("flag_id", "-%s", key_value->key2);
  5563. }
  5564. else
  5565. {
  5566. ptr->SetDisplayText("%s", desc);
  5567. ptr->params.AddParamVar("flag_id", "+%s", key_value->key2);
  5568. }
  5569. ptr->params.AddParam("class_type", class_type);
  5570. ptr->params.AddParam("group_id", group_id);
  5571. ptr->SetHiddenText("%s", desc);
  5572. this->AddItem(ptr);
  5573. }
  5574. }
  5575. this->SortHidden();
  5576. return true;
  5577. }
  5578. //---------------------------------------------------------------------------------
  5579. int LevelOptionItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5580. {
  5581. char *sub_option;
  5582. if (!this->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5583. if (strcmp("update", sub_option) == 0)
  5584. {
  5585. MENUPAGE_CREATE_PARAM(LevelClassTypePage, player_ptr, AddParam("sub_option", "update"), 0, -1);
  5586. return NEW_MENU;
  5587. }
  5588. else if (strcmp("add", sub_option) == 0)
  5589. {
  5590. MENUPAGE_CREATE_PARAM(ChooseClassTypePage, player_ptr, AddParam("sub_option", "add_level_type"), 0, -1);
  5591. return NEW_MENU;
  5592. }
  5593. else if (strcmp("remove", sub_option) == 0)
  5594. {
  5595. MENUPAGE_CREATE(LevelRemovePage, player_ptr, 0, -1);
  5596. return NEW_MENU;
  5597. }
  5598. else if (strcmp("client", sub_option) == 0)
  5599. {
  5600. MENUPAGE_CREATE_PARAM(LevelClassTypePage, player_ptr, AddParam("sub_option", "client"), 0, -1);
  5601. return NEW_MENU;
  5602. }
  5603. return CLOSE_MENU;
  5604. }
  5605. bool LevelOptionPage::PopulateMenuPage(player_t *player_ptr)
  5606. {
  5607. this->SetEscLink("%s", Translate(player_ptr, 2620));
  5608. this->SetTitle("%s", Translate(player_ptr, 2621));
  5609. MENUOPTION_CREATE(LevelOptionItem, 2622, update);
  5610. MENUOPTION_CREATE(LevelOptionItem, 2623, add);
  5611. MENUOPTION_CREATE(LevelOptionItem, 2624, remove);
  5612. MENUOPTION_CREATE(LevelOptionItem, 2625, client);
  5613. return true;
  5614. }
  5615. //---------------------------------------------------------------------------------
  5616. int LevelClassTypeItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5617. {
  5618. char *class_type;
  5619. char *sub_option;
  5620. int level_id;
  5621. if (!this->params.GetParam("class_type", &class_type) ||
  5622. !this->params.GetParam("level_id", &level_id) ||
  5623. !m_page_ptr->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5624. if (strcmp(sub_option, "update") == 0)
  5625. {
  5626. MENUPAGE_CREATE_PARAM2(LevelUpdatePage, player_ptr, AddParam("class_type", class_type), AddParam("level_id", level_id), 0, -1);
  5627. }
  5628. else if (strcmp(sub_option, "client") == 0)
  5629. {
  5630. MENUPAGE_CREATE_PARAM2(LevelClientPage, player_ptr, AddParam("class_type", class_type), AddParam("level_id", level_id), 0, -1);
  5631. }
  5632. return NEW_MENU;
  5633. }
  5634. bool LevelClassTypePage::PopulateMenuPage(player_t *player_ptr)
  5635. {
  5636. this->SetEscLink("%s", Translate(player_ptr, 2650));
  5637. this->SetTitle("%s", Translate(player_ptr, 2651));
  5638. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  5639. {
  5640. const DualStrIntKey *key_value = NULL;
  5641. for (GlobalGroupFlag *g_flag = gpManiClient->level_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = gpManiClient->level_list.FindNext(c_type, &key_value))
  5642. {
  5643. MenuItem *ptr = new LevelClassTypeItem();
  5644. ptr->params.AddParam("class_type", key_value->key1);
  5645. ptr->params.AddParam("level_id", key_value->key2);
  5646. ptr->SetDisplayText("%s -> %i", key_value->key1, key_value->key2);
  5647. this->AddItem(ptr);
  5648. }
  5649. }
  5650. this->SortDisplay();
  5651. return true;
  5652. }
  5653. //---------------------------------------------------------------------------------
  5654. int LevelClientItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5655. {
  5656. char *class_type;
  5657. char *name;
  5658. bool add;
  5659. int level_id;
  5660. if (!m_page_ptr->params.GetParam("class_type", &class_type) ||
  5661. !m_page_ptr->params.GetParam("level_id", &level_id) ||
  5662. !this->params.GetParam("add", &add) ||
  5663. !this->params.GetParam("name", &name)) return CLOSE_MENU;
  5664. char level_id_str[16];
  5665. snprintf(level_id_str, sizeof(level_id_str), "%i", level_id);
  5666. if (add)
  5667. {
  5668. gpManiClient->ProcessSetLevel(class_type, player_ptr, name, level_id_str);
  5669. }
  5670. else
  5671. {
  5672. gpManiClient->ProcessSetLevel(class_type, player_ptr, name, "-1");
  5673. }
  5674. return REPOP_MENU;
  5675. }
  5676. bool LevelClientPage::PopulateMenuPage(player_t *player_ptr)
  5677. {
  5678. char *class_type;
  5679. int level_id;
  5680. this->params.GetParam("class_type", &class_type);
  5681. this->params.GetParam("level_id", &level_id);
  5682. this->SetEscLink("%s", Translate(player_ptr, 2730));
  5683. this->SetTitle("%s", Translate(player_ptr, 2731, "%s%i", class_type, level_id));
  5684. MenuItem *ptr;
  5685. for (int i = 0; i != (int) gpManiClient->c_list.size(); i ++)
  5686. {
  5687. ClientPlayer *c_ptr = gpManiClient->c_list[i];
  5688. ptr = new LevelClientItem();
  5689. int old_level_id = c_ptr->level_list.FindFirst(class_type);
  5690. if (old_level_id != -99999)
  5691. {
  5692. ptr->SetDisplayText("* %s -> Level %i", c_ptr->name.str, old_level_id);
  5693. ptr->params.AddParam("add", false);
  5694. }
  5695. else
  5696. {
  5697. ptr->SetDisplayText("%s", c_ptr->name.str);
  5698. ptr->params.AddParam("add", true);
  5699. }
  5700. ptr->params.AddParam("name", c_ptr->name.str);
  5701. ptr->SetHiddenText("%s", c_ptr->name.str);
  5702. this->AddItem(ptr);
  5703. }
  5704. this->SortHidden();
  5705. return true;
  5706. }
  5707. //---------------------------------------------------------------------------------
  5708. int GroupClientItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5709. {
  5710. char *class_type;
  5711. char *name;
  5712. bool add;
  5713. char *group_id;
  5714. if (!m_page_ptr->params.GetParam("class_type", &class_type) ||
  5715. !m_page_ptr->params.GetParam("group_id", &group_id) ||
  5716. !this->params.GetParam("add", &add) ||
  5717. !this->params.GetParam("name", &name)) return CLOSE_MENU;
  5718. if (add)
  5719. {
  5720. gpManiClient->ProcessAddGroup(class_type, player_ptr, name, group_id);
  5721. }
  5722. else
  5723. {
  5724. gpManiClient->ProcessRemoveGroup(class_type, player_ptr, name, group_id);
  5725. }
  5726. return REPOP_MENU;
  5727. }
  5728. bool GroupClientPage::PopulateMenuPage(player_t *player_ptr)
  5729. {
  5730. char *class_type;
  5731. char *group_id;
  5732. this->params.GetParam("class_type", &class_type);
  5733. this->params.GetParam("group_id", &group_id);
  5734. this->SetEscLink("%s", Translate(player_ptr, 2720));
  5735. this->SetTitle("%s", Translate(player_ptr, 2721, "%s%s", class_type, group_id));
  5736. MenuItem *ptr;
  5737. for (int i = 0; i != (int) gpManiClient->c_list.size(); i ++)
  5738. {
  5739. ClientPlayer *c_ptr = gpManiClient->c_list[i];
  5740. ptr = new GroupClientItem();
  5741. if (c_ptr->group_list.Find(class_type, group_id))
  5742. {
  5743. ptr->SetDisplayText("* %s", c_ptr->name.str);
  5744. ptr->params.AddParam("add", false);
  5745. }
  5746. else
  5747. {
  5748. ptr->SetDisplayText("%s", c_ptr->name.str);
  5749. ptr->params.AddParam("add", true);
  5750. }
  5751. ptr->params.AddParam("name", c_ptr->name.str);
  5752. ptr->SetHiddenText("%s", c_ptr->name.str);
  5753. this->AddItem(ptr);
  5754. }
  5755. this->SortHidden();
  5756. return true;
  5757. }
  5758. //---------------------------------------------------------------------------------
  5759. int LevelRemoveItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5760. {
  5761. char *class_type;
  5762. int level_id;
  5763. if (!this->params.GetParam("class_type", &class_type) ||
  5764. !this->params.GetParam("level_id", &level_id)) return CLOSE_MENU;
  5765. char level_id_str[16];
  5766. snprintf(level_id_str, sizeof(level_id_str), "%i", level_id);
  5767. gpManiClient->ProcessRemoveLevelType(class_type, player_ptr, level_id_str);
  5768. return REPOP_MENU;
  5769. }
  5770. bool LevelRemovePage::PopulateMenuPage(player_t *player_ptr)
  5771. {
  5772. this->SetEscLink("%s", Translate(player_ptr, 2701));
  5773. this->SetTitle("%s", Translate(player_ptr, 2701));
  5774. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  5775. {
  5776. const DualStrIntKey *key_value = NULL;
  5777. for (GlobalGroupFlag *g_flag = gpManiClient->level_list.FindFirst(c_type, &key_value); g_flag != NULL; g_flag = gpManiClient->level_list.FindNext(c_type, &key_value))
  5778. {
  5779. MenuItem *ptr = new LevelClassTypeItem();
  5780. ptr->params.AddParam("class_type", key_value->key1);
  5781. ptr->params.AddParam("level_id", key_value->key2);
  5782. ptr->SetDisplayText("%s -> %i", key_value->key1, key_value->key2);
  5783. this->AddItem(ptr);
  5784. }
  5785. }
  5786. this->SortDisplay();
  5787. return true;
  5788. }
  5789. //---------------------------------------------------------------------------------
  5790. int LevelUpdateItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5791. {
  5792. char *class_type;
  5793. int level_id;
  5794. char *flag_id;
  5795. if (!this->params.GetParam("class_type", &class_type) ||
  5796. !this->params.GetParam("level_id", &level_id) ||
  5797. !this->params.GetParam("flag_id", &flag_id)) return CLOSE_MENU;
  5798. char level_id_str[16];
  5799. snprintf(level_id_str, sizeof(level_id_str), "%i", level_id);
  5800. gpManiClient->ProcessAddLevelType(class_type, player_ptr, level_id_str, flag_id);
  5801. return REPOP_MENU;
  5802. }
  5803. bool LevelUpdatePage::PopulateMenuPage(player_t *player_ptr)
  5804. {
  5805. char *class_type;
  5806. int level_id;
  5807. if (!this->params.GetParam("class_type", &class_type) ||
  5808. !this->params.GetParam("level_id", &level_id)) return false;
  5809. GlobalGroupFlag *g_flag = gpManiClient->level_list.Find(class_type, level_id);
  5810. this->SetEscLink("%s", Translate(player_ptr, 2660));
  5811. this->SetTitle("%s", Translate(player_ptr, 2661, "%s%i", class_type, level_id));
  5812. MenuItem *ptr = new LevelUpdateItem();
  5813. ptr->params.AddParam("class_type", class_type);
  5814. ptr->params.AddParam("level_id", level_id);
  5815. ptr->params.AddParam("flag_id", "+#");
  5816. ptr->SetDisplayText("%s", Translate(player_ptr, 2642));
  5817. ptr->SetHiddenText("1");
  5818. this->AddItem(ptr);
  5819. ptr = new LevelUpdateItem();
  5820. ptr->params.AddParam("class_type", class_type);
  5821. ptr->params.AddParam("level_id", level_id);
  5822. ptr->params.AddParam("flag_id", "-#");
  5823. ptr->SetDisplayText("%s", Translate(player_ptr, 2643));
  5824. ptr->SetHiddenText("2");
  5825. this->AddItem(ptr);
  5826. // Search for flags we can use for this type
  5827. const DualStrKey *key_value = NULL;
  5828. for (const char *desc = gpManiClient->flag_desc_list.FindFirst(class_type, &key_value); desc != NULL; desc = gpManiClient->flag_desc_list.FindNext(class_type, &key_value))
  5829. {
  5830. if (strcmp(key_value->key1, class_type) == 0)
  5831. {
  5832. ptr = new LevelUpdateItem();
  5833. if (g_flag && g_flag->IsFlagSet(key_value->key2))
  5834. {
  5835. ptr->SetDisplayText("* %s", desc);
  5836. ptr->params.AddParamVar("flag_id", "-%s", key_value->key2);
  5837. }
  5838. else
  5839. {
  5840. ptr->SetDisplayText("%s", desc);
  5841. ptr->params.AddParamVar("flag_id", "+%s", key_value->key2);
  5842. }
  5843. ptr->params.AddParam("class_type", class_type);
  5844. ptr->params.AddParam("level_id", level_id);
  5845. ptr->SetHiddenText("%s", desc);
  5846. this->AddItem(ptr);
  5847. }
  5848. }
  5849. this->SortHidden();
  5850. return true;
  5851. }
  5852. //---------------------------------------------------------------------------------
  5853. int ChooseClassTypeItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5854. {
  5855. char *class_type;
  5856. char *sub_option;
  5857. if (!this->params.GetParam("class_type", &class_type) ||
  5858. !m_page_ptr->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5859. if (strcmp(sub_option, "add_level_type") == 0)
  5860. {
  5861. INPUTPAGE_CREATE_PARAM(CreateLevelPage, player_ptr, AddParam("class_type", class_type), 0, -1);
  5862. }
  5863. else if (strcmp(sub_option, "add_group_type") == 0)
  5864. {
  5865. INPUTPAGE_CREATE_PARAM(CreateGroupPage, player_ptr, AddParam("class_type", class_type), 0, -1);
  5866. }
  5867. return NEW_MENU;
  5868. }
  5869. bool ChooseClassTypePage::PopulateMenuPage(player_t *player_ptr)
  5870. {
  5871. this->SetEscLink("%s", Translate(player_ptr, 2670));
  5872. this->SetTitle("%s", Translate(player_ptr, 2671));
  5873. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  5874. {
  5875. MenuItem *ptr = new ChooseClassTypeItem();
  5876. ptr->params.AddParam("class_type", c_type);
  5877. ptr->SetDisplayText("%s", c_type);
  5878. this->AddItem(ptr);
  5879. }
  5880. this->SortDisplay();
  5881. return true;
  5882. }
  5883. //---------------------------------------------------------------------------------
  5884. int CreateLevelItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5885. {
  5886. char *class_type;
  5887. if (!m_page_ptr->params.GetParam("class_type", &class_type)) return CLOSE_MENU;
  5888. gpManiClient->ProcessAddLevelType(class_type, player_ptr, (char *) gpCmd->Cmd_Args(), "");
  5889. return PREVIOUS_MENU;
  5890. }
  5891. bool CreateLevelPage::PopulateMenuPage(player_t *player_ptr)
  5892. {
  5893. // This is an input object
  5894. this->SetEscLink("%s", Translate(player_ptr, 2680));
  5895. this->SetTitle("%s", Translate(player_ptr, 2681));
  5896. MenuItem *ptr = new CreateLevelItem();
  5897. this->AddItem(ptr);
  5898. return true;
  5899. }
  5900. //---------------------------------------------------------------------------------
  5901. int CreateGroupItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5902. {
  5903. char *class_type;
  5904. if (!m_page_ptr->params.GetParam("class_type", &class_type)) return CLOSE_MENU;
  5905. gpManiClient->ProcessAddGroupType(class_type, player_ptr, (char *) gpCmd->Cmd_Args(), "");
  5906. return PREVIOUS_MENU;
  5907. }
  5908. bool CreateGroupPage::PopulateMenuPage(player_t *player_ptr)
  5909. {
  5910. // This is an input object
  5911. this->SetEscLink("%s", Translate(player_ptr, 2690));
  5912. this->SetTitle("%s", Translate(player_ptr, 2691));
  5913. MenuItem *ptr = new CreateGroupItem();
  5914. this->AddItem(ptr);
  5915. return true;
  5916. }
  5917. //---------------------------------------------------------------------------------
  5918. int ClientOptionItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5919. {
  5920. char *sub_option;
  5921. if (!this->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5922. if (strcmp("update", sub_option) == 0)
  5923. {
  5924. MENUPAGE_CREATE_PARAM(SelectClientPage, player_ptr, AddParam("sub_option", "update"), 0, -1);
  5925. return NEW_MENU;
  5926. }
  5927. else if (strcmp("add", sub_option) == 0)
  5928. {
  5929. MENUPAGE_CREATE_PARAM(AddClientOptionPage, player_ptr, AddParam("sub_option", "add"), 0, -1);
  5930. return NEW_MENU;
  5931. }
  5932. else if (strcmp("remove", sub_option) == 0)
  5933. {
  5934. MENUPAGE_CREATE_PARAM(SelectClientPage, player_ptr, AddParam("sub_option", "remove"), 0, -1);
  5935. return NEW_MENU;
  5936. }
  5937. else if (strcmp("show", sub_option) == 0)
  5938. {
  5939. MENUPAGE_CREATE_PARAM(SelectClientPage, player_ptr, AddParam("sub_option", "show"), 0, -1);
  5940. return NEW_MENU;
  5941. }
  5942. return CLOSE_MENU;
  5943. }
  5944. bool ClientOptionPage::PopulateMenuPage(player_t *player_ptr)
  5945. {
  5946. this->SetEscLink("%s", Translate(player_ptr, 2740));
  5947. this->SetTitle("%s", Translate(player_ptr, 2741));
  5948. MENUOPTION_CREATE(ClientOptionItem, 2742, update);
  5949. MENUOPTION_CREATE(ClientOptionItem, 2743, add);
  5950. MENUOPTION_CREATE(ClientOptionItem, 2744, remove);
  5951. MENUOPTION_CREATE(ClientOptionItem, 2745, show);
  5952. return true;
  5953. }
  5954. //---------------------------------------------------------------------------------
  5955. int SelectClientItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5956. {
  5957. char *sub_option;
  5958. char *name;
  5959. if (!this->params.GetParam("name", &name) ||
  5960. !m_page_ptr->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  5961. if (strcmp(sub_option, "update") == 0)
  5962. {
  5963. MENUPAGE_CREATE_PARAM(ClientUpdateOptionPage, player_ptr, AddParam("name", name), 0, -1);
  5964. return NEW_MENU;
  5965. }
  5966. else if (strcmp(sub_option, "remove") == 0)
  5967. {
  5968. gpManiClient->ProcessRemoveClient(player_ptr, name);
  5969. return REPOP_MENU;
  5970. }
  5971. else if (strcmp(sub_option, "show") == 0)
  5972. {
  5973. gpManiClient->ProcessClientStatus(player_ptr, name);
  5974. return REPOP_MENU;
  5975. }
  5976. return CLOSE_MENU;
  5977. }
  5978. bool SelectClientPage::PopulateMenuPage(player_t *player_ptr)
  5979. {
  5980. this->SetEscLink("%s", Translate(player_ptr, 2750));
  5981. this->SetTitle("%s", Translate(player_ptr, 2751));
  5982. for (int i = 0; i != (int) gpManiClient->c_list.size(); i++)
  5983. {
  5984. ClientPlayer *c_ptr = gpManiClient->c_list[i];
  5985. MenuItem *ptr = new SelectClientItem();
  5986. ptr->params.AddParam("name", c_ptr->name.str);
  5987. ptr->SetDisplayText("%s", c_ptr->name.str);
  5988. this->AddItem(ptr);
  5989. }
  5990. this->SortDisplay();
  5991. return true;
  5992. }
  5993. //---------------------------------------------------------------------------------
  5994. int ClientUpdateOptionItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  5995. {
  5996. char *sub_option;
  5997. char *name;
  5998. if (!this->params.GetParam("sub_option", &sub_option) ||
  5999. !m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6000. if (strcmp("set_name", sub_option) == 0)
  6001. {
  6002. MENUPAGE_CREATE_PARAM(ClientNamePage, player_ptr, AddParam("name", name), 0, -1);
  6003. return NEW_MENU;
  6004. }
  6005. else if (strcmp("add_steam", sub_option) == 0)
  6006. {
  6007. MENUPAGE_CREATE_PARAM(ClientSteamPage, player_ptr, AddParam("name", name), 0, -1);
  6008. return NEW_MENU;
  6009. }
  6010. else if (strcmp("set_flags", sub_option) == 0)
  6011. {
  6012. MENUPAGE_CREATE_PARAM(SetPersonalClassPage, player_ptr, AddParam("name", name), 0, -1);
  6013. return NEW_MENU;
  6014. }
  6015. else if (strcmp("remove_steam", sub_option) == 0)
  6016. {
  6017. MENUPAGE_CREATE_PARAM(RemoveSteamPage, player_ptr, AddParam("name", name), 0, -1);
  6018. return NEW_MENU;
  6019. }
  6020. else if (strcmp("add_ip", sub_option) == 0)
  6021. {
  6022. MENUPAGE_CREATE_PARAM(ClientIPPage, player_ptr, AddParam("name", name), 0, -1);
  6023. return NEW_MENU;
  6024. }
  6025. else if (strcmp("remove_ip", sub_option) == 0)
  6026. {
  6027. MENUPAGE_CREATE_PARAM(RemoveIPPage, player_ptr, AddParam("name", name), 0, -1);
  6028. return NEW_MENU;
  6029. }
  6030. else if (strcmp("add_nick", sub_option) == 0)
  6031. {
  6032. MENUPAGE_CREATE_PARAM(ClientNickPage, player_ptr, AddParam("name", name), 0, -1);
  6033. return NEW_MENU;
  6034. }
  6035. else if (strcmp("remove_nick", sub_option) == 0)
  6036. {
  6037. MENUPAGE_CREATE_PARAM(RemoveNickPage, player_ptr, AddParam("name", name), 0, -1);
  6038. return NEW_MENU;
  6039. }
  6040. else if (strcmp("set_password", sub_option) == 0)
  6041. {
  6042. MENUPAGE_CREATE_PARAM(SetPasswordPage, player_ptr, AddParam("name", name), 0, -1);
  6043. return NEW_MENU;
  6044. }
  6045. else if (strcmp("remove_password", sub_option) == 0)
  6046. {
  6047. gpManiClient->ProcessSetPassword(player_ptr, name, "");
  6048. return REPOP_MENU;
  6049. }
  6050. else if (strcmp("set_email", sub_option) == 0)
  6051. {
  6052. INPUTPAGE_CREATE_PARAM(SetEmailPage, player_ptr, AddParam("name", name), 0, -1);
  6053. return NEW_MENU;
  6054. }
  6055. else if (strcmp("set_notes", sub_option) == 0)
  6056. {
  6057. INPUTPAGE_CREATE_PARAM(SetNotesPage, player_ptr, AddParam("name", name), 0, -1);
  6058. return NEW_MENU;
  6059. }
  6060. return CLOSE_MENU;
  6061. }
  6062. bool ClientUpdateOptionPage::PopulateMenuPage(player_t *player_ptr)
  6063. {
  6064. char temp_string[128];
  6065. char *name;
  6066. this->params.GetParam("name", &name);
  6067. int client_index = gpManiClient->FindClientIndex(name);
  6068. if (client_index == -1)
  6069. {
  6070. return false;
  6071. }
  6072. this->SetEscLink("%s", Translate(player_ptr, 2760));
  6073. this->SetTitle("%s", Translate(player_ptr, 2761, "%s", name));
  6074. MENUOPTION_CREATE(ClientUpdateOptionItem, 2773, set_flags);
  6075. MENUOPTION_CREATE(ClientUpdateOptionItem, 2762, set_name);
  6076. ClientPlayer *c_ptr = gpManiClient->c_list[client_index];
  6077. MenuItem *ptr = new ClientUpdateOptionItem();
  6078. Q_strcpy(temp_string, "");
  6079. int l_size = (int) c_ptr->steam_list.Size();
  6080. if (l_size != 0)
  6081. {
  6082. if (l_size > 1)
  6083. {
  6084. snprintf(temp_string, sizeof(temp_string), " | %s,...", c_ptr->steam_list.FindFirst());
  6085. }
  6086. else
  6087. {
  6088. snprintf(temp_string, sizeof(temp_string), " | %s", c_ptr->steam_list.FindFirst());
  6089. }
  6090. }
  6091. ptr->params.AddParam("sub_option", "add_steam");
  6092. ptr->SetDisplayText("%s%s", Translate(player_ptr, 2763), temp_string);
  6093. this->AddItem(ptr);
  6094. MENUOPTION_CREATE(ClientUpdateOptionItem, 2764, remove_steam);
  6095. ptr = new ClientUpdateOptionItem();
  6096. Q_strcpy(temp_string, "");
  6097. l_size = c_ptr->ip_address_list.Size();
  6098. if (l_size != 0)
  6099. {
  6100. if (l_size > 1)
  6101. {
  6102. snprintf(temp_string, sizeof(temp_string), " | %s,...", c_ptr->ip_address_list.FindFirst());
  6103. }
  6104. else
  6105. {
  6106. snprintf(temp_string, sizeof(temp_string), " | %s", c_ptr->ip_address_list.FindFirst());
  6107. }
  6108. }
  6109. ptr->params.AddParam("sub_option", "add_ip");
  6110. ptr->SetDisplayText("%s%s", Translate(player_ptr, 2765), temp_string);
  6111. this->AddItem(ptr);
  6112. MENUOPTION_CREATE(ClientUpdateOptionItem, 2766, remove_ip);
  6113. ptr = new ClientUpdateOptionItem();
  6114. Q_strcpy(temp_string, "");
  6115. l_size = c_ptr->nick_list.Size();
  6116. if (l_size != 0)
  6117. {
  6118. if (l_size > 1)
  6119. {
  6120. snprintf(temp_string, sizeof(temp_string), " | %s,...", c_ptr->nick_list.FindFirst());
  6121. }
  6122. else
  6123. {
  6124. snprintf(temp_string, sizeof(temp_string), " | %s", c_ptr->nick_list.FindFirst());
  6125. }
  6126. }
  6127. ptr->params.AddParam("sub_option", "add_nick");
  6128. ptr->SetDisplayText("%s%s", Translate(player_ptr, 2767), temp_string);
  6129. this->AddItem(ptr);
  6130. MENUOPTION_CREATE(ClientUpdateOptionItem, 2768, remove_nick);
  6131. ptr = new ClientUpdateOptionItem();
  6132. Q_strcpy(temp_string, "");
  6133. if (c_ptr->password.str && strcmp(c_ptr->password.str, "") != 0)
  6134. {
  6135. if (snprintf(temp_string, 15, " | %s", c_ptr->password.str) == 15)
  6136. {
  6137. strcat(temp_string, "...");
  6138. }
  6139. }
  6140. ptr->params.AddParam("sub_option", "set_password");
  6141. ptr->SetDisplayText("%s%s", Translate(player_ptr, 2769), temp_string);
  6142. this->AddItem(ptr);
  6143. MENUOPTION_CREATE(ClientUpdateOptionItem, 2770, remove_password);
  6144. ptr = new ClientUpdateOptionItem();
  6145. Q_strcpy(temp_string, "");
  6146. if (c_ptr->email_address.str && strcmp(c_ptr->email_address.str, "") != 0)
  6147. {
  6148. if (snprintf(temp_string, 15, " | %s", c_ptr->email_address.str) == 15)
  6149. {
  6150. strcat(temp_string, "...");
  6151. }
  6152. }
  6153. ptr->params.AddParam("sub_option", "set_email");
  6154. ptr->SetDisplayText("%s%s", Translate(player_ptr, 2771), temp_string);
  6155. this->AddItem(ptr);
  6156. ptr = new ClientUpdateOptionItem();
  6157. Q_strcpy(temp_string, "");
  6158. if (c_ptr->notes.str && strcmp(c_ptr->notes.str, "") != 0)
  6159. {
  6160. if (snprintf(temp_string, 15, " | %s", c_ptr->notes.str) == 15)
  6161. {
  6162. strcat(temp_string, "...");
  6163. }
  6164. }
  6165. ptr->params.AddParam("sub_option", "set_notes");
  6166. ptr->SetDisplayText("%s%s", Translate(player_ptr, 2772), temp_string);
  6167. this->AddItem(ptr);
  6168. return true;
  6169. }
  6170. //---------------------------------------------------------------------------------
  6171. int SetNotesItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6172. {
  6173. char *name;
  6174. if (!this->params.GetParam("name", &name)) return false;
  6175. gpManiClient->ProcessSetNotes(player_ptr, name, (char *) gpCmd->Cmd_Args());
  6176. return PREVIOUS_MENU;
  6177. }
  6178. bool SetNotesPage::PopulateMenuPage(player_t *player_ptr)
  6179. {
  6180. char *name;
  6181. if (!this->params.GetParam("name", &name)) return false;
  6182. // This is an input object
  6183. this->SetEscLink("%s", Translate(player_ptr, 2840));
  6184. this->SetTitle("%s", Translate(player_ptr, 2841, "%s", name));
  6185. MenuItem *ptr = new SetNotesItem();
  6186. this->AddItem(ptr);
  6187. return true;
  6188. }
  6189. //---------------------------------------------------------------------------------
  6190. int SetEmailItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6191. {
  6192. char *name;
  6193. if (!m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6194. gpManiClient->ProcessSetEmail(player_ptr, name, (char *) gpCmd->Cmd_Args());
  6195. return PREVIOUS_MENU;
  6196. }
  6197. bool SetEmailPage::PopulateMenuPage(player_t *player_ptr)
  6198. {
  6199. char *name;
  6200. this->params.GetParam("name", &name);
  6201. // This is an input object
  6202. this->SetEscLink("%s", Translate(player_ptr, 2830));
  6203. this->SetTitle("%s", Translate(player_ptr, 2831, "%s", name));
  6204. MenuItem *ptr = new SetEmailItem();
  6205. this->AddItem(ptr);
  6206. return true;
  6207. }
  6208. //---------------------------------------------------------------------------------
  6209. int SetPasswordItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6210. {
  6211. char *name;
  6212. if (!m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6213. gpManiClient->ProcessSetPassword(player_ptr, name, (char *) gpCmd->Cmd_Args());
  6214. return PREVIOUS_MENU;
  6215. }
  6216. bool SetPasswordPage::PopulateMenuPage(player_t *player_ptr)
  6217. {
  6218. char *name;
  6219. this->params.GetParam("name", &name);
  6220. // This is an input object
  6221. this->SetEscLink("%s", Translate(player_ptr, 2820));
  6222. this->SetTitle("%s", Translate(player_ptr, 2821, "%s", name));
  6223. MenuItem *ptr = new SetPasswordItem();
  6224. this->AddItem(ptr);
  6225. return true;
  6226. }
  6227. //---------------------------------------------------------------------------------
  6228. int ClientNameItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6229. {
  6230. char *sub_option;
  6231. char *name;
  6232. if (!this->params.GetParam("sub_option", &sub_option) ||
  6233. !m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6234. if (strcmp("type_name", sub_option) == 0)
  6235. {
  6236. INPUTPAGE_CREATE_PARAM(SetNamePage, player_ptr, AddParam("name", name), 0, -1);
  6237. return NEW_MENU;
  6238. }
  6239. else if (strcmp("player", sub_option) == 0)
  6240. {
  6241. MENUPAGE_CREATE_PARAM(PlayerNamePage, player_ptr, AddParam("name", name), 0, -1);
  6242. return NEW_MENU;
  6243. }
  6244. return CLOSE_MENU;
  6245. }
  6246. bool ClientNamePage::PopulateMenuPage(player_t *player_ptr)
  6247. {
  6248. char *name;
  6249. this->params.GetParam("name", &name);
  6250. this->SetEscLink("%s", Translate(player_ptr, 2850));
  6251. this->SetTitle("%s", Translate(player_ptr, 2851, "%s", name));
  6252. MENUOPTION_CREATE(ClientNameItem, 2852, type_name);
  6253. MENUOPTION_CREATE(ClientNameItem, 2853, player);
  6254. return true;
  6255. }
  6256. //---------------------------------------------------------------------------------
  6257. int SetNameItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6258. {
  6259. char *name;
  6260. if (!m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6261. gpManiClient->ProcessSetName(player_ptr, name, (char *) gpCmd->Cmd_Args());
  6262. return PREVIOUS_MENU;
  6263. }
  6264. bool SetNamePage::PopulateMenuPage(player_t *player_ptr)
  6265. {
  6266. char *name;
  6267. if (!this->params.GetParam("name", &name)) return false;
  6268. // This is an input object
  6269. this->SetEscLink("%s", Translate(player_ptr, 2780));
  6270. this->SetTitle("%s", Translate(player_ptr, 2781, "%s", name));
  6271. MenuItem *ptr = new SetNameItem();
  6272. this->AddItem(ptr);
  6273. return true;
  6274. }
  6275. //---------------------------------------------------------------------------------
  6276. int PlayerNameItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6277. {
  6278. char *name;
  6279. int user_id;
  6280. if (!m_page_ptr->params.GetParam("name", &name) ||
  6281. !this->params.GetParam("user_id", &user_id)) return CLOSE_MENU;
  6282. player_t player;
  6283. player.user_id = user_id;
  6284. if (!FindPlayerByUserID(&player)) return PREVIOUS_MENU;
  6285. gpManiClient->ProcessSetName(player_ptr, name, player.name);
  6286. return PREVIOUS_MENU;
  6287. }
  6288. bool PlayerNamePage::PopulateMenuPage(player_t *player_ptr)
  6289. {
  6290. char *name;
  6291. this->params.GetParam("name", &name);
  6292. this->SetEscLink("%s", Translate(player_ptr, 2920));
  6293. this->SetTitle("%s", Translate(player_ptr, 2921, "%s", name));
  6294. for (int i = 1; i <= max_players; i++)
  6295. {
  6296. player_t player;
  6297. player.index = i;
  6298. if (!FindPlayerByIndex(&player)) continue;
  6299. if (player.is_bot) continue;
  6300. // Ignore unicode players
  6301. bool found_unicode = false;
  6302. for (int j = 0; j < Q_strlen(player.name); j++)
  6303. {
  6304. if (player.name[j] & 0x80)
  6305. {
  6306. found_unicode = true;
  6307. break;
  6308. }
  6309. }
  6310. if (found_unicode) continue;
  6311. MenuItem *ptr = new PlayerNameItem();
  6312. ptr->params.AddParam("user_id", player.user_id);
  6313. ptr->SetDisplayText("%s", player.name);
  6314. this->AddItem(ptr);
  6315. }
  6316. this->SortDisplay();
  6317. return true;
  6318. }
  6319. //---------------------------------------------------------------------------------
  6320. int ClientSteamItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6321. {
  6322. char *sub_option;
  6323. char *name;
  6324. if (!this->params.GetParam("sub_option", &sub_option) ||
  6325. !m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6326. if (strcmp("type_name", sub_option) == 0)
  6327. {
  6328. INPUTPAGE_CREATE_PARAM(SetSteamPage, player_ptr, AddParam("name", name), 0, -1);
  6329. return NEW_MENU;
  6330. }
  6331. else if (strcmp("player", sub_option) == 0)
  6332. {
  6333. MENUPAGE_CREATE_PARAM(PlayerSteamPage, player_ptr, AddParam("name", name), 0, -1);
  6334. return NEW_MENU;
  6335. }
  6336. return CLOSE_MENU;
  6337. }
  6338. bool ClientSteamPage::PopulateMenuPage(player_t *player_ptr)
  6339. {
  6340. char *name;
  6341. this->params.GetParam("name", &name);
  6342. this->SetEscLink("%s", Translate(player_ptr, 2860));
  6343. this->SetTitle("%s", Translate(player_ptr, 2861, "%s", name));
  6344. MENUOPTION_CREATE(ClientSteamItem, 2862, type_name);
  6345. MENUOPTION_CREATE(ClientSteamItem, 2863, player);
  6346. return true;
  6347. }
  6348. //---------------------------------------------------------------------------------
  6349. int SetSteamItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6350. {
  6351. char *name;
  6352. if (!m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6353. gpManiClient->ProcessAddSteam(player_ptr, name, (char *) gpCmd->Cmd_Args());
  6354. return PREVIOUS_MENU;
  6355. }
  6356. bool SetSteamPage::PopulateMenuPage(player_t *player_ptr)
  6357. {
  6358. char *name;
  6359. if (!this->params.GetParam("name", &name)) return false;
  6360. // This is an input object
  6361. this->SetEscLink("%s", Translate(player_ptr, 2790));
  6362. this->SetTitle("%s", Translate(player_ptr, 2791, "%s", name));
  6363. MenuItem *ptr = new SetSteamItem();
  6364. this->AddItem(ptr);
  6365. return true;
  6366. }
  6367. //---------------------------------------------------------------------------------
  6368. int PlayerSteamItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6369. {
  6370. char *name;
  6371. char *steam_id;
  6372. if (!m_page_ptr->params.GetParam("name", &name) ||
  6373. !this->params.GetParam("steam_id", &steam_id)) return CLOSE_MENU;
  6374. gpManiClient->ProcessAddSteam(player_ptr, name, steam_id);
  6375. return PREVIOUS_MENU;
  6376. }
  6377. bool PlayerSteamPage::PopulateMenuPage(player_t *player_ptr)
  6378. {
  6379. char *name;
  6380. this->params.GetParam("name", &name);
  6381. this->SetEscLink("%s", Translate(player_ptr, 2920));
  6382. this->SetTitle("%s", Translate(player_ptr, 2921, "%s", name));
  6383. for (int i = 1; i <= max_players; i++)
  6384. {
  6385. player_t player;
  6386. player.index = i;
  6387. if (!FindPlayerByIndex(&player)) continue;
  6388. if (player.is_bot) continue;
  6389. if (strcmp(player.steam_id, "STEAM_ID_PENDING") == 0) continue;
  6390. if (strcmp(player.steam_id, "STEAM_ID_LAN") == 0) continue;
  6391. MenuItem *ptr = new PlayerSteamItem();
  6392. ptr->params.AddParam("steam_id", player.steam_id);
  6393. ptr->SetDisplayText("%s", player.name);
  6394. this->AddItem(ptr);
  6395. }
  6396. this->SortDisplay();
  6397. return true;
  6398. }
  6399. //---------------------------------------------------------------------------------
  6400. int ClientIPItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6401. {
  6402. char *sub_option;
  6403. char *name;
  6404. if (!this->params.GetParam("sub_option", &sub_option) ||
  6405. !m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6406. if (strcmp("type_name", sub_option) == 0)
  6407. {
  6408. INPUTPAGE_CREATE_PARAM(SetIPPage, player_ptr, AddParam("name", name), 0, -1);
  6409. return NEW_MENU;
  6410. }
  6411. else if (strcmp("player", sub_option) == 0)
  6412. {
  6413. MENUPAGE_CREATE_PARAM(PlayerIPPage, player_ptr, AddParam("name", name), 0, -1);
  6414. return NEW_MENU;
  6415. }
  6416. return CLOSE_MENU;
  6417. }
  6418. bool ClientIPPage::PopulateMenuPage(player_t *player_ptr)
  6419. {
  6420. char *name;
  6421. this->params.GetParam("name", &name);
  6422. this->SetEscLink("%s", Translate(player_ptr, 2870));
  6423. this->SetTitle("%s", Translate(player_ptr, 2871, "%s", name));
  6424. MENUOPTION_CREATE(ClientIPItem, 2872, type_name);
  6425. MENUOPTION_CREATE(ClientIPItem, 2873, player);
  6426. return true;
  6427. }
  6428. //---------------------------------------------------------------------------------
  6429. int SetIPItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6430. {
  6431. char *name;
  6432. if (!m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6433. gpManiClient->ProcessAddIP(player_ptr, name, (char *) gpCmd->Cmd_Args());
  6434. return PREVIOUS_MENU;
  6435. }
  6436. bool SetIPPage::PopulateMenuPage(player_t *player_ptr)
  6437. {
  6438. char *name;
  6439. if (!this->params.GetParam("name", &name)) return false;
  6440. // This is an input object
  6441. this->SetEscLink("%s", Translate(player_ptr, 2800));
  6442. this->SetTitle("%s", Translate(player_ptr, 2801, "%s", name));
  6443. MenuItem *ptr = new SetIPItem();
  6444. this->AddItem(ptr);
  6445. return true;
  6446. }
  6447. //---------------------------------------------------------------------------------
  6448. int PlayerIPItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6449. {
  6450. char *name;
  6451. char *ip;
  6452. if (!m_page_ptr->params.GetParam("name", &name) ||
  6453. !this->params.GetParam("ip", &ip)) return CLOSE_MENU;
  6454. gpManiClient->ProcessAddIP(player_ptr, name, ip);
  6455. return PREVIOUS_MENU;
  6456. }
  6457. bool PlayerIPPage::PopulateMenuPage(player_t *player_ptr)
  6458. {
  6459. char *name;
  6460. this->params.GetParam("name", &name);
  6461. this->SetEscLink("%s", Translate(player_ptr, 2920));
  6462. this->SetTitle("%s", Translate(player_ptr, 2921, "%s", name));
  6463. for (int i = 1; i <= max_players; i++)
  6464. {
  6465. player_t player;
  6466. player.index = i;
  6467. if (!FindPlayerByIndex(&player)) continue;
  6468. if (player.is_bot) continue;
  6469. MenuItem *ptr = new PlayerIPItem();
  6470. ptr->params.AddParam("ip", player.ip_address);
  6471. ptr->SetDisplayText("%s", player.name);
  6472. this->AddItem(ptr);
  6473. }
  6474. this->SortDisplay();
  6475. return true;
  6476. }
  6477. //---------------------------------------------------------------------------------
  6478. int ClientNickItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6479. {
  6480. char *sub_option;
  6481. char *name;
  6482. if (!this->params.GetParam("sub_option", &sub_option) ||
  6483. !m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6484. if (strcmp("type_name", sub_option) == 0)
  6485. {
  6486. INPUTPAGE_CREATE_PARAM(SetNickPage, player_ptr, AddParam("name", name), 0, -1);
  6487. return NEW_MENU;
  6488. }
  6489. else if (strcmp("player", sub_option) == 0)
  6490. {
  6491. MENUPAGE_CREATE_PARAM(PlayerNickPage, player_ptr, AddParam("name", name), 0, -1);
  6492. return NEW_MENU;
  6493. }
  6494. return CLOSE_MENU;
  6495. }
  6496. bool ClientNickPage::PopulateMenuPage(player_t *player_ptr)
  6497. {
  6498. char *name;
  6499. this->params.GetParam("name", &name);
  6500. this->SetEscLink("%s", Translate(player_ptr, 2880));
  6501. this->SetTitle("%s", Translate(player_ptr, 2881, "%s", name));
  6502. MENUOPTION_CREATE(ClientNickItem, 2882, type_name);
  6503. MENUOPTION_CREATE(ClientNickItem, 2883, player);
  6504. return true;
  6505. }
  6506. //---------------------------------------------------------------------------------
  6507. int SetNickItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6508. {
  6509. char *name;
  6510. if (!m_page_ptr->params.GetParam("name", &name)) return CLOSE_MENU;
  6511. gpManiClient->ProcessAddNick(player_ptr, name, (char *) gpCmd->Cmd_Args());
  6512. return PREVIOUS_MENU;
  6513. }
  6514. bool SetNickPage::PopulateMenuPage(player_t *player_ptr)
  6515. {
  6516. char *name;
  6517. if (!this->params.GetParam("name", &name)) return false;
  6518. // This is an input object
  6519. this->SetEscLink("%s", Translate(player_ptr, 2810));
  6520. this->SetTitle("%s", Translate(player_ptr, 2811, "%s", name));
  6521. MenuItem *ptr = new SetNickItem();
  6522. this->AddItem(ptr);
  6523. return true;
  6524. }
  6525. //---------------------------------------------------------------------------------
  6526. int PlayerNickItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6527. {
  6528. char *name;
  6529. char *nick;
  6530. if (!m_page_ptr->params.GetParam("name", &name) ||
  6531. !this->params.GetParam("nick", &nick)) return CLOSE_MENU;
  6532. gpManiClient->ProcessAddNick(player_ptr, name, nick);
  6533. return PREVIOUS_MENU;
  6534. }
  6535. bool PlayerNickPage::PopulateMenuPage(player_t *player_ptr)
  6536. {
  6537. char *name;
  6538. this->params.GetParam("name", &name);
  6539. this->SetEscLink("%s", Translate(player_ptr, 2920));
  6540. this->SetTitle("%s", Translate(player_ptr, 2921, "%s", name));
  6541. for (int i = 1; i <= max_players; i++)
  6542. {
  6543. player_t player;
  6544. player.index = i;
  6545. if (!FindPlayerByIndex(&player)) continue;
  6546. if (player.is_bot) continue;
  6547. MenuItem *ptr = new PlayerNickItem();
  6548. ptr->params.AddParam("nick", player.name);
  6549. ptr->SetDisplayText("%s", player.name);
  6550. this->AddItem(ptr);
  6551. }
  6552. this->SortDisplay();
  6553. return true;
  6554. }
  6555. //---------------------------------------------------------------------------------
  6556. int RemoveSteamItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6557. {
  6558. char *name;
  6559. char *steam_id;
  6560. if (!m_page_ptr->params.GetParam("name", &name) ||
  6561. !this->params.GetParam("steam_id", &steam_id)) return CLOSE_MENU;
  6562. gpManiClient->ProcessRemoveSteam(player_ptr, name, steam_id);
  6563. return PREVIOUS_MENU;
  6564. }
  6565. bool RemoveSteamPage::PopulateMenuPage(player_t *player_ptr)
  6566. {
  6567. char *name;
  6568. this->params.GetParam("name", &name);
  6569. this->SetEscLink("%s", Translate(player_ptr, 2890));
  6570. this->SetTitle("%s", Translate(player_ptr, 2891, "%s", name));
  6571. int client_index = gpManiClient->FindClientIndex(name);
  6572. if (client_index == -1) return false;
  6573. ClientPlayer *c_ptr = gpManiClient->c_list[client_index];
  6574. for (const char *steam_id = c_ptr->steam_list.FindFirst(); steam_id != NULL; steam_id = c_ptr->steam_list.FindNext())
  6575. {
  6576. MenuItem *ptr = new RemoveSteamItem();
  6577. ptr->params.AddParam("steam_id", steam_id);
  6578. ptr->SetDisplayText("%s", steam_id);
  6579. this->AddItem(ptr);
  6580. }
  6581. this->SortDisplay();
  6582. return true;
  6583. }
  6584. //---------------------------------------------------------------------------------
  6585. int RemoveIPItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6586. {
  6587. char *name;
  6588. char *ip;
  6589. if (!m_page_ptr->params.GetParam("name", &name) ||
  6590. !this->params.GetParam("ip", &ip)) return CLOSE_MENU;
  6591. gpManiClient->ProcessRemoveIP(player_ptr, name, ip);
  6592. return PREVIOUS_MENU;
  6593. }
  6594. bool RemoveIPPage::PopulateMenuPage(player_t *player_ptr)
  6595. {
  6596. char *name;
  6597. this->params.GetParam("name", &name);
  6598. this->SetEscLink("%s", Translate(player_ptr, 2900));
  6599. this->SetTitle("%s", Translate(player_ptr, 2901, "%s", name));
  6600. int client_index = gpManiClient->FindClientIndex(name);
  6601. if (client_index == -1) return false;
  6602. ClientPlayer *c_ptr = gpManiClient->c_list[client_index];
  6603. for (const char *ip = c_ptr->ip_address_list.FindFirst(); ip != NULL; ip = c_ptr->ip_address_list.FindNext())
  6604. {
  6605. MenuItem *ptr = new RemoveIPItem();
  6606. ptr->params.AddParam("ip", ip);
  6607. ptr->SetDisplayText("%s", ip);
  6608. this->AddItem(ptr);
  6609. }
  6610. this->SortDisplay();
  6611. return true;
  6612. }
  6613. //---------------------------------------------------------------------------------
  6614. int RemoveNickItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6615. {
  6616. char *name;
  6617. char *nick;
  6618. if (!m_page_ptr->params.GetParam("name", &name) ||
  6619. !this->params.GetParam("nick", &nick)) return CLOSE_MENU;
  6620. gpManiClient->ProcessRemoveNick(player_ptr, name, nick);
  6621. return PREVIOUS_MENU;
  6622. }
  6623. bool RemoveNickPage::PopulateMenuPage(player_t *player_ptr)
  6624. {
  6625. char *name;
  6626. this->params.GetParam("name", &name);
  6627. this->SetEscLink("%s", Translate(player_ptr, 2910));
  6628. this->SetTitle("%s", Translate(player_ptr, 2911, "%s", name));
  6629. int client_index = gpManiClient->FindClientIndex(name);
  6630. if (client_index == -1) return false;
  6631. ClientPlayer *c_ptr = gpManiClient->c_list[client_index];
  6632. for (const char *nick = c_ptr->nick_list.FindFirst(); nick != NULL; nick = c_ptr->nick_list.FindNext())
  6633. {
  6634. MenuItem *ptr = new RemoveNickItem();
  6635. ptr->params.AddParam("nick", nick);
  6636. ptr->SetDisplayText("%s", nick);
  6637. this->AddItem(ptr);
  6638. }
  6639. this->SortDisplay();
  6640. return true;
  6641. }
  6642. //---------------------------------------------------------------------------------
  6643. int SetPersonalClassItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6644. {
  6645. char *name;
  6646. char *class_type;
  6647. if (!m_page_ptr->params.GetParam("name", &name) ||
  6648. !this->params.GetParam("class_type", &class_type)) return CLOSE_MENU;
  6649. MENUPAGE_CREATE_PARAM2(SetPersonalFlagPage, player_ptr, AddParam("class_type", class_type), AddParam("name", name), 0, -1);
  6650. return NEW_MENU;
  6651. }
  6652. bool SetPersonalClassPage::PopulateMenuPage(player_t *player_ptr)
  6653. {
  6654. char *name;
  6655. this->params.GetParam("name", &name);
  6656. this->SetEscLink("%s", Translate(player_ptr, 2930));
  6657. this->SetTitle("%s", Translate(player_ptr, 2931, "%s", name));
  6658. for (const char *c_type = class_type_list.FindFirst(); c_type != NULL; c_type = class_type_list.FindNext())
  6659. {
  6660. MenuItem *ptr = new SetPersonalClassItem();
  6661. ptr->params.AddParam("class_type", c_type);
  6662. ptr->params.AddParam("name", name);
  6663. ptr->SetDisplayText("%s", c_type);
  6664. this->AddItem(ptr);
  6665. }
  6666. this->SortDisplay();
  6667. return true;
  6668. }
  6669. //---------------------------------------------------------------------------------
  6670. int SetPersonalFlagItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6671. {
  6672. char *class_type;
  6673. char *name;
  6674. char *flag_id;
  6675. if (!m_page_ptr->params.GetParam("class_type", &class_type) ||
  6676. !m_page_ptr->params.GetParam("name", &name) ||
  6677. !this->params.GetParam("flag_id", &flag_id)) return CLOSE_MENU;
  6678. gpManiClient->ProcessSetFlag(class_type, player_ptr, name, flag_id);
  6679. return REPOP_MENU;
  6680. }
  6681. bool SetPersonalFlagPage::PopulateMenuPage(player_t *player_ptr)
  6682. {
  6683. char *class_type;
  6684. char *name;
  6685. if (!this->params.GetParam("class_type", &class_type) ||
  6686. !this->params.GetParam("name", &name)) return false;
  6687. int client_index = gpManiClient->FindClientIndex(name);
  6688. if (client_index == -1) return false;
  6689. ClientPlayer *c_ptr = gpManiClient->c_list[client_index];
  6690. this->SetEscLink("%s", Translate(player_ptr, 2940));
  6691. this->SetTitle("%s", Translate(player_ptr, 2941, "%s%s", name, class_type));
  6692. MenuItem *ptr = new SetPersonalFlagItem();
  6693. ptr->params.AddParam("flag_id", "+#");
  6694. ptr->SetDisplayText("%s", Translate(player_ptr, 2642));
  6695. ptr->SetHiddenText("1");
  6696. this->AddItem(ptr);
  6697. ptr = new SetPersonalFlagItem();
  6698. ptr->params.AddParam("flag_id", "-#");
  6699. ptr->SetDisplayText("%s", Translate(player_ptr, 2643));
  6700. ptr->SetHiddenText("2");
  6701. this->AddItem(ptr);
  6702. // Search for flags we can use for this type
  6703. const DualStrKey *key_value = NULL;
  6704. for (const char *desc = gpManiClient->flag_desc_list.FindFirst(class_type, &key_value); desc != NULL; desc = gpManiClient->flag_desc_list.FindNext(class_type, &key_value))
  6705. {
  6706. if (strcmp(key_value->key1, class_type) == 0)
  6707. {
  6708. ptr = new SetPersonalFlagItem();
  6709. if (c_ptr->personal_flag_list.IsFlagSet(class_type, key_value->key2))
  6710. {
  6711. ptr->SetDisplayText("* %s", desc);
  6712. ptr->params.AddParamVar("flag_id", "-%s", key_value->key2);
  6713. }
  6714. else
  6715. {
  6716. ptr->SetDisplayText("%s", desc);
  6717. ptr->params.AddParamVar("flag_id", "+%s", key_value->key2);
  6718. }
  6719. ptr->SetHiddenText("%s", desc);
  6720. this->AddItem(ptr);
  6721. }
  6722. }
  6723. this->SortHidden();
  6724. return true;
  6725. }
  6726. //---------------------------------------------------------------------------------
  6727. int AddClientOptionItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6728. {
  6729. char *sub_option;
  6730. if (!this->params.GetParam("sub_option", &sub_option)) return CLOSE_MENU;
  6731. if (strcmp("manual", sub_option) == 0)
  6732. {
  6733. INPUTPAGE_CREATE(NewNamePage, player_ptr, 0, -1);
  6734. return NEW_MENU;
  6735. }
  6736. else if (strcmp("player", sub_option) == 0)
  6737. {
  6738. MENUPAGE_CREATE(NameOnServerPage, player_ptr, 0, -1);
  6739. return NEW_MENU;
  6740. }
  6741. else if (strcmp("steam", sub_option) == 0)
  6742. {
  6743. MENUPAGE_CREATE(SteamOnServerPage, player_ptr, 0, -1);
  6744. return NEW_MENU;
  6745. }
  6746. else if (strcmp("ip", sub_option) == 0)
  6747. {
  6748. MENUPAGE_CREATE(IPOnServerPage, player_ptr, 0, -1);
  6749. return NEW_MENU;
  6750. }
  6751. return CLOSE_MENU;
  6752. }
  6753. bool AddClientOptionPage::PopulateMenuPage(player_t *player_ptr)
  6754. {
  6755. this->SetEscLink("%s", Translate(player_ptr, 2950));
  6756. this->SetTitle("%s", Translate(player_ptr, 2951));
  6757. MENUOPTION_CREATE(AddClientOptionItem, 2952, manual);
  6758. MENUOPTION_CREATE(AddClientOptionItem, 2953, player);
  6759. MENUOPTION_CREATE(AddClientOptionItem, 2954, steam);
  6760. MENUOPTION_CREATE(AddClientOptionItem, 2955, ip);
  6761. return true;
  6762. }
  6763. //---------------------------------------------------------------------------------
  6764. int NewNameItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6765. {
  6766. gpManiClient->ProcessAddClient(player_ptr, (char *) gpCmd->Cmd_Args());
  6767. return PREVIOUS_MENU;
  6768. }
  6769. bool NewNamePage::PopulateMenuPage(player_t *player_ptr)
  6770. {
  6771. // This is an input object
  6772. this->SetEscLink("%s", Translate(player_ptr, 2960));
  6773. this->SetTitle("%s", Translate(player_ptr, 2961));
  6774. MenuItem *ptr = new NewNameItem();
  6775. this->AddItem(ptr);
  6776. return true;
  6777. }
  6778. //---------------------------------------------------------------------------------
  6779. int NameOnServerItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6780. {
  6781. char *name;
  6782. if (!this->params.GetParam("name", &name)) return CLOSE_MENU;
  6783. gpManiClient->ProcessAddClient(player_ptr, name);
  6784. return PREVIOUS_MENU;
  6785. }
  6786. bool NameOnServerPage::PopulateMenuPage(player_t *player_ptr)
  6787. {
  6788. this->SetEscLink("%s", Translate(player_ptr, 2970));
  6789. this->SetTitle("%s", Translate(player_ptr, 2971));
  6790. for (int i = 1; i <= max_players; i++)
  6791. {
  6792. player_t player;
  6793. player.index = i;
  6794. if (!FindPlayerByIndex(&player)) continue;
  6795. if (player.is_bot) continue;
  6796. MenuItem *ptr = new NameOnServerItem();
  6797. ptr->params.AddParam("name", player.name);
  6798. ptr->SetDisplayText("%s", player.name);
  6799. this->AddItem(ptr);
  6800. }
  6801. this->SortDisplay();
  6802. return true;
  6803. }
  6804. //---------------------------------------------------------------------------------
  6805. int SteamOnServerItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6806. {
  6807. char *name;
  6808. char *steam_id;
  6809. if (!this->params.GetParam("name", &name) ||
  6810. !this->params.GetParam("steam_id", &steam_id)) return CLOSE_MENU;
  6811. gpManiClient->ProcessAddClient(player_ptr, name);
  6812. gpManiClient->ProcessAddSteam(player_ptr, name, steam_id);
  6813. return PREVIOUS_MENU;
  6814. }
  6815. bool SteamOnServerPage::PopulateMenuPage(player_t *player_ptr)
  6816. {
  6817. this->SetEscLink("%s", Translate(player_ptr, 2980));
  6818. this->SetTitle("%s", Translate(player_ptr, 2981));
  6819. for (int i = 1; i <= max_players; i++)
  6820. {
  6821. player_t player;
  6822. player.index = i;
  6823. if (!FindPlayerByIndex(&player)) continue;
  6824. if (player.is_bot) continue;
  6825. if (strcmp(player.steam_id, "STEAM_ID_PENDING") == 0) continue;
  6826. if (strcmp(player.steam_id, "STEAM_ID_LAN") == 0) continue;
  6827. MenuItem *ptr = new SteamOnServerItem();
  6828. ptr->params.AddParam("name", player.name);
  6829. ptr->params.AddParam("steam_id", player.steam_id);
  6830. ptr->SetDisplayText("%s", player.name);
  6831. this->AddItem(ptr);
  6832. }
  6833. this->SortDisplay();
  6834. return true;
  6835. }
  6836. //---------------------------------------------------------------------------------
  6837. int IPOnServerItem::MenuItemFired(player_t *player_ptr, MenuPage *m_page_ptr)
  6838. {
  6839. char *name;
  6840. char *ip;
  6841. if (!this->params.GetParam("name", &name) ||
  6842. !this->params.GetParam("ip", &ip)) return CLOSE_MENU;
  6843. gpManiClient->ProcessAddClient(player_ptr, name);
  6844. gpManiClient->ProcessAddIP(player_ptr, name, ip);
  6845. return PREVIOUS_MENU;
  6846. }
  6847. bool IPOnServerPage::PopulateMenuPage(player_t *player_ptr)
  6848. {
  6849. this->SetEscLink("%s", Translate(player_ptr, 2990));
  6850. this->SetTitle("%s", Translate(player_ptr, 2991));
  6851. for (int i = 1; i <= max_players; i++)
  6852. {
  6853. player_t player;
  6854. player.index = i;
  6855. if (!FindPlayerByIndex(&player)) continue;
  6856. if (player.is_bot) continue;
  6857. MenuItem *ptr = new IPOnServerItem();
  6858. ptr->params.AddParam("name", player.name);
  6859. ptr->params.AddParam("ip", player.ip_address);
  6860. ptr->SetDisplayText("%s", player.name);
  6861. this->AddItem(ptr);
  6862. }
  6863. this->SortDisplay();
  6864. return true;
  6865. }
  6866. bool IPClient::SetSteam(const char *steamid) {
  6867. if ( !steamid || (steamid[0] == 0) ) return false;
  6868. Q_memset( _steamid, 0, sizeof(_steamid) );
  6869. Q_strcpy ( _steamid, steamid );
  6870. return true;
  6871. }
  6872. bool IPClient::AddIP ( const char *ip, int tm ) {
  6873. if ( !ip || (ip[0] == 0 ) ) return false;
  6874. time_t expire = (time_t)(tm);
  6875. bool updated = false;
  6876. std::vector<IP_entry_t>::iterator index;
  6877. for ( index = int_ip_list.begin(); index != int_ip_list.end(); index++ )
  6878. if ( FStrEq ( ip, index->ip ) ) {
  6879. updated = true;
  6880. index->last_played = expire;
  6881. break;
  6882. }
  6883. if ( !updated ) {
  6884. IP_entry_t entry;
  6885. Q_memset ( &entry, 0, sizeof(entry) );
  6886. Q_strcpy( entry.ip, ip );
  6887. entry.last_played = expire;
  6888. int_ip_list.push_back(entry);
  6889. }
  6890. return true;
  6891. }
  6892. int IPClient::RemoveStale(int days) {
  6893. int count = 0;
  6894. int seconds = ( days * 86400 ); // 86400 seconds/day
  6895. time_t now;
  6896. time (&now);
  6897. std::vector<IP_entry_t>::iterator index;
  6898. for ( index = int_ip_list.begin(); index != int_ip_list.end(); ) {
  6899. if ((index->last_played + seconds ) < now) {
  6900. count++;
  6901. index = int_ip_list.erase(index);
  6902. } else
  6903. index++;
  6904. }
  6905. return count;
  6906. }
  6907. bool IPClient::FindIP(const char *ip) {
  6908. std::vector<IP_entry_t>::iterator index;
  6909. for ( index = int_ip_list.begin(); index != int_ip_list.end(); index++ )
  6910. if ( FStrEq ( ip, index->ip ) )
  6911. return true;
  6912. return false;
  6913. }
  6914. ManiClient g_ManiClient;
  6915. ManiClient *gpManiClient;
  6916. /*
  6917. select c.user_id, c.name, cf.flag_string, cf.type, s.steam_id, n.nick, i.ip_address, cg.group_id, cg.type, cl.level_id, cl.type
  6918. from map_client c, map_client_server cs
  6919. LEFT JOIN map_steam s ON s.user_id = c.user_id
  6920. LEFT JOIN map_client_flag cf ON cf.user_id = c.user_id
  6921. LEFT JOIN map_nick n ON n.user_id = c.user_id
  6922. LEFT JOIN map_ip i ON i.user_id = c.user_id
  6923. LEFT JOIN map_client_group cg ON cg.user_id = c.user_id AND cg.server_group_id = cs.server_group_id
  6924. LEFT JOIN map_client_level cl ON cl.user_id = c.user_id AND cl.server_group_id = cs.server_group_id
  6925. where c.user_id = cs.user_id
  6926. and cs.server_group_id = 1
  6927. order by 1, 4, 5,6,7,9, 8, 11, 10
  6928. */