BE-Shomy

Basic MySQL mode by Unkovic

Mar 14th, 2018
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <sscanf2>
  4.  
  5. #undef MAX_PLAYERS
  6. #define MAX_PLAYERS 50
  7.  
  8. #define MYSQL_HOST "127.0.0.1"
  9. #define MYSQL_USER "root"
  10. #define MYSQL_PASSWORD ""
  11. #define MYSQL_DATABASE "server"
  12.  
  13. #define SCM SendClientMessage
  14. #define SPD ShowPlayerDialog
  15. #define DSP DIALOG_STYLE_PASSWORD
  16. #define DSI DIALOG_STYLE_INPUT
  17. #define DSM DIALOG_STYLE_MSGBOX
  18.  
  19. #define func%0(%1) forward%0(%1); public%0(%1)
  20.  
  21. new MySQL: g_SQL;
  22.  
  23. enum E_PLAYERS
  24. {
  25. ID,
  26. Name[MAX_PLAYER_NAME],
  27. Password[65],
  28. Salt[17],
  29. Kills,
  30. Deaths,
  31.  
  32. Cache: Cache_ID,
  33. };
  34. new PI[MAX_PLAYERS][E_PLAYERS];
  35.  
  36. new g_MysqlRaceCheck[MAX_PLAYERS];
  37.  
  38. enum
  39. {
  40.  
  41. DIALOG_LOGIN,
  42. DIALOG_REGISTER
  43. };
  44.  
  45. static Test;
  46.  
  47. main() {}
  48.  
  49.  
  50. public OnGameModeInit()
  51. {
  52. new MySQLOpt: option_id = mysql_init_options();
  53.  
  54. mysql_set_option(option_id, AUTO_RECONNECT, true);
  55.  
  56. g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id); // AUTO_RECONNECT is enabled for this connection handle only
  57. if (g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)
  58. {
  59. print("MySQL konekcija neuspesna. Proverite podatke i databazu");
  60. SendRconCommand("exit");
  61. return 1;
  62. }
  63.  
  64. print("MySQL konekcija, uspesna");
  65.  
  66. SetupPlayerTable();
  67. return 1;
  68. }
  69.  
  70. public OnGameModeExit()
  71. {
  72. mysql_close(g_SQL);
  73. return 1;
  74. }
  75.  
  76. public OnPlayerConnect(playerid)
  77. {
  78. g_MysqlRaceCheck[playerid]++;
  79.  
  80. static const empty_player[E_PLAYERS];
  81. PI[playerid] = empty_player;
  82.  
  83. GetPlayerName(playerid, PI[playerid][Name], MAX_PLAYER_NAME);
  84.  
  85. new query[103];
  86. mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", PI[playerid][Name]);
  87. mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
  88. return 1;
  89. }
  90.  
  91. public OnPlayerDisconnect(playerid, reason)
  92. {
  93. g_MysqlRaceCheck[playerid]++;
  94.  
  95. if (cache_is_valid(PI[playerid][Cache_ID]))
  96. {
  97. cache_delete(PI[playerid][Cache_ID]);
  98. PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
  99. }
  100. return 1;
  101. }
  102.  
  103. public OnPlayerDeath(playerid, killerid, reason)
  104. {
  105. new query[125];
  106. mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `kills` = %d, `deaths` = %d WHERE `id` = %d", PI[playerid][Kills], PI[playerid][Deaths], PI[playerid][ID]);
  107. mysql_tquery(g_SQL, query);
  108.  
  109. mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `kills` = %d, `deaths` = %d WHERE `id` = %d", PI[killerid][Kills], PI[killerid][Deaths], PI[killerid][ID]);
  110. mysql_tquery(g_SQL, query);
  111. return 1;
  112. }
  113.  
  114. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  115. {
  116. switch (dialogid)
  117. {
  118. case DIALOG_LOGIN:
  119. {
  120. if (!response) return Kick(playerid);
  121.  
  122. new hashed_pass[65];
  123. SHA256_PassHash(inputtext, PI[playerid][Salt], hashed_pass, 65);
  124.  
  125. if (strcmp(hashed_pass, PI[playerid][Password]) == 0)
  126. {
  127. SCM(playerid, -1, "Uspesno ste se ulogovali");
  128.  
  129. cache_set_active(PI[playerid][Cache_ID]);
  130.  
  131. AssignPlayerData(playerid);
  132.  
  133. cache_delete(PI[playerid][Cache_ID]);
  134. PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
  135.  
  136. SpawnPlayer(playerid);
  137. }
  138. else
  139. {
  140. SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Pogresna lozinka!\nUnesite vasu lozinku ispod", "Login", "Izlaz");
  141. }
  142. }
  143. case DIALOG_REGISTER:
  144. {
  145. if (!response) return Kick(playerid);
  146.  
  147. if (strlen(inputtext) <= 5) return SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vasa lozinka ne sme biti ispod 5 karaktera", "Registruj se", "Izlaz");
  148.  
  149. for (new i = 0; i < 16; i++) PI[playerid][Salt][i] = random(94) + 33;
  150. SHA256_PassHash(inputtext, PI[playerid][Salt], PI[playerid][Password], 65);
  151.  
  152. new query[221];
  153. mysql_format(g_SQL, query, sizeof query, "INSERT INTO `players` (`username`, `password`, `salt`) VALUES ('%e', '%s', '%e')", PI[playerid][Name], PI[playerid][Password], PI[playerid][Salt]);
  154. mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
  155. }
  156. }
  157. return 1;
  158. }
  159.  
  160. //-----------------------------------------------------
  161.  
  162. func OnPlayerDataLoaded(playerid, race_check)
  163. {
  164. if (race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);
  165.  
  166. if(cache_num_rows() > 0)
  167. {
  168. cache_get_value(0, "password", PI[playerid][Password], 65);
  169. cache_get_value(0, "salt", PI[playerid][Salt], 17);
  170.  
  171. PI[playerid][Cache_ID] = cache_save();
  172.  
  173. SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Vas nalog postoji", "Login", "Izlaz");
  174.  
  175. }
  176. else
  177. {
  178. SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vas nalog ne postoji\nUnesite lozinku", "Registracija", "Izlaz");
  179. }
  180. return 1;
  181. }
  182.  
  183. func OnPlayerRegister(playerid)
  184. {
  185. PI[playerid][ID] = cache_insert_id();
  186.  
  187. SpawnPlayer(playerid);
  188. return 1;
  189. }
  190.  
  191. //-----------------------------------------------------
  192.  
  193. AssignPlayerData(playerid)
  194. {
  195. cache_get_value_int(0, "id", PI[playerid][ID]);
  196.  
  197. cache_get_value_int(0, "kills", PI[playerid][Kills]);
  198. cache_get_value_int(0, "deaths", PI[playerid][Deaths]);
  199.  
  200. return 1;
  201. }
  202.  
  203. SetupPlayerTable()
  204. {
  205. mysql_tquery(g_SQL, "CREATE TABLE IF NOT EXISTS `players` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(24) NOT NULL,`password` char(64) NOT NULL,`salt` char(16) NOT NULL,`kills` mediumint(8) NOT NULL DEFAULT '0',`deaths` mediumint(8) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`))");
  206. return 1;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment