Advertisement
willbedie

[MySQL R41-4] Login / Register Base Script (BCrypt)

Feb 24th, 2019
6,061
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.75 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <bcrypt>
  4. #include <zcmd>
  5. #include <easyDialog>
  6.  
  7. #define BCRYPT_COST 12
  8.  
  9. #define MYSQL_HOSTNAME "localhost" // Change this to your own MySQL hostname
  10. #define MYSQL_USERNAME "root" // Change this
  11. #define MYSQL_PASSWORD "" // If you have a password, type it there. If you don't leave it blank.
  12. #define MYSQL_DATABASE "willbedie" // Change this
  13.  
  14. new
  15. MySQL: Database,
  16. bool:LoggedIn[MAX_PLAYERS]
  17. ;
  18.  
  19. enum PlayerData
  20. {
  21. user_id,
  22. user_cash,
  23. user_kills,
  24. user_deaths
  25. };
  26. new PlayerInfo[MAX_PLAYERS][PlayerData];
  27.  
  28. public OnGameModeInit()
  29. {
  30. Database = mysql_connect(MYSQL_HOSTNAME, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE);
  31. if(Database == MYSQL_INVALID_HANDLE || mysql_errno(Database) != 0)
  32. {
  33. print("SERVER: MySQL Connection failed, shutting the server down!");
  34. SendRconCommand("exit");
  35. return 1;
  36. }
  37.  
  38. SetGameModeText("willbedie");
  39. print("SERVER: MySQL Connection was successful.");
  40. return 1;
  41. }
  42.  
  43. public OnPlayerConnect(playerid)
  44. {
  45. new query[200];
  46. mysql_format(Database, query, sizeof(query), "SELECT * FROM `players` WHERE `Username` = '%e'", GetName(playerid));
  47. mysql_tquery(Database, query, "CheckAccount", "d", playerid);
  48. return 1;
  49. }
  50.  
  51. public OnPlayerDisconnect(playerid)
  52. {
  53. new query[200];
  54. mysql_format(Database, query, sizeof(query), "UPDATE `players` SET `Cash` = '%i', `Kills` = '%i', `Deaths` = '%i' WHERE `ID` = '%i'", PlayerInfo[playerid][user_cash], PlayerInfo[playerid][user_kills], PlayerInfo[playerid][user_deaths], PlayerInfo[playerid][user_id]);
  55. mysql_query(Database, query);
  56. return 1;
  57. }
  58.  
  59. forward CheckAccount(playerid);
  60. public CheckAccount(playerid)
  61. {
  62. new string[300];
  63. if(cache_num_rows())
  64. {
  65. format(string, sizeof(string), "{FFFFFF}Welcome back to {AFAFAF}Server{FFFFFF}%s. Please input your password below to log-in.", GetName(playerid));
  66. Dialog_Show(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login to the server", string, "Login", "Dip");
  67. }
  68. else
  69. {
  70. format(string, sizeof(string), "{FFFFFF}Welcome to our server, %s. Please type a strong password below to continue.", GetName(playerid));
  71. Dialog_Show(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register to the server", string, "Register", "Dip");
  72. }
  73. return 1;
  74. }
  75.  
  76. Dialog:DIALOG_REGISTER(playerid, response, listitem, inputtext[])
  77. {
  78. if(response)
  79. {
  80. bcrypt_hash(inputtext, BCRYPT_COST, "OnPasswordHashed", "d", playerid);
  81. }
  82. else
  83. Kick(playerid);
  84. return 1;
  85. }
  86.  
  87. Dialog:DIALOG_LOGIN(playerid, response, listitem, inputtext[])
  88. {
  89. if(response)
  90. {
  91. new query[300], Password[BCRYPT_HASH_LENGTH];
  92. mysql_format(Database, query, sizeof(query), "SELECT `Password` FROM `players` WHERE `Username` = '%e'", GetName(playerid));
  93. mysql_query(Database, query);
  94. cache_get_value_name(0, "Password", Password, BCRYPT_HASH_LENGTH);
  95. bcrypt_check(inputtext, Password, "OnPasswordChecked", "d", playerid);
  96. }
  97. else
  98. Kick(playerid);
  99. return 1;
  100. }
  101.  
  102. forward OnPasswordHashed(playerid);
  103. public OnPasswordHashed(playerid)
  104. {
  105. new hash[BCRYPT_HASH_LENGTH], query[300];
  106. bcrypt_get_hash(hash);
  107. mysql_format(Database, query, sizeof(query), "INSERT INTO `players` (`Username`, `Password`, `IPAddress`, `Cash`, `Kills`, `Deaths`) VALUES ('%e', '%e', '%e', 0, 0, 0)", GetName(playerid), hash, ReturnIP(playerid));
  108. mysql_tquery(Database, query, "OnPlayerRegister", "d", playerid);
  109. return 1;
  110. }
  111.  
  112. forward OnPlayerRegister(playerid);
  113. public OnPlayerRegister(playerid)
  114. {
  115. SpawnPlayer(playerid);
  116. SendClientMessage(playerid, -1, "You have been successfully registered in our server.");
  117. return 1;
  118. }
  119.  
  120. forward OnPasswordChecked(playerid);
  121. public OnPasswordChecked(playerid)
  122. {
  123. new bool:match = bcrypt_is_equal();
  124. if(match)
  125. {
  126. new query[300];
  127. mysql_format(Database, query, sizeof(query), "SELECT * FROM `players` WHERE `Username` = '%e'", GetName(playerid));
  128. mysql_tquery(Database, query, "OnPlayerLoad", "d", playerid);
  129. }
  130. else
  131. {
  132. new string[100];
  133. format(string, sizeof(string), "Wrong Password!\nPlease type your correct password below.");
  134. Dialog_Show(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login to our server", string, "Register", "Dip");
  135. }
  136. return 1;
  137. }
  138.  
  139. forward OnPlayerLoad(playerid);
  140. public OnPlayerLoad(playerid)
  141. {
  142. cache_get_value_name_int(0, "ID", PlayerInfo[playerid][user_id]);
  143. cache_get_value_name_int(0, "Cash", PlayerInfo[playerid][user_cash]);
  144. cache_get_value_name_int(0, "Kills", PlayerInfo[playerid][user_kills]);
  145. cache_get_value_name_int(0, "Deaths", PlayerInfo[playerid][user_deaths]);
  146.  
  147. LoggedIn[playerid] = true;
  148. SendClientMessage(playerid, -1, "Welcome back to our server.");
  149. return 1;
  150. }
  151.  
  152. CMD:changepassword(playerid, params[])
  153. {
  154. new string[128];
  155. format(string, sizeof(string), "{FFFFFF}Password Change\nInput the new password you want to have for your account.");
  156. Dialog_Show(playerid, DIALOG_PASSWORDCHANGE, DIALOG_STYLE_PASSWORD, "Change your password", string, "Change", "Close");
  157. return 1;
  158. }
  159.  
  160. Dialog:DIALOG_PASSWORDCHANGE(playerid, response, listitem, inputtext[])
  161. {
  162. if(response)
  163. {
  164. bcrypt_hash(inputtext, BCRYPT_COST, "OnPasswordChanged", "i", playerid);
  165. }
  166. return 1;
  167. }
  168.  
  169. forward OnPasswordChanged(playerid);
  170. public OnPasswordChanged(playerid)
  171. {
  172. new hash[BCRYPT_HASH_LENGTH], query[300];
  173. bcrypt_get_hash(hash);
  174. mysql_format(Database, query, sizeof(query), "UPDATE `players` SET `Password` = '%e' WHERE `Username` = '%e'", hash, GetName(playerid));
  175. mysql_query(Database, query);
  176. SendClientMessage(playerid, -1, "You have successfully changed your password.");
  177. return 1;
  178. }
  179.  
  180. GetName(playerid)
  181. {
  182. new name[MAX_PLAYER_NAME];
  183. GetPlayerName(playerid, name, sizeof(name));
  184. return name;
  185. }
  186.  
  187. ReturnIP(playerid)
  188. {
  189. new PlayerIP[17];
  190. GetPlayerIp(playerid, PlayerIP, sizeof(PlayerIP));
  191. return PlayerIP;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement