Advertisement
RyDeR_

Hash.inc ─ Register/Login Example

Feb 21st, 2012
992
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 4.71 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. #include "../includes/zcmd.inc"
  4. #include "../includes/a_mysql.inc"
  5. #include "../filterscripts/Hash.inc"
  6.  
  7. #define MySQL_Host "localhost"
  8. #define MySQL_User "root"
  9. #define MySQL_Pass ""
  10. #define MySQL_DB "PlayerData"
  11.  
  12. static stock
  13.     g_szBuffer[1024]
  14. ;
  15.  
  16. #define formatEx(%0,%1) \
  17.     (format(g_szBuffer, sizeof(g_szBuffer), %0, %1), g_szBuffer)
  18.  
  19. enum e_Flags(<<= 1) {
  20.     e_Registering = 0b1,
  21.     e_Logged
  22. };
  23.  
  24. new
  25.     e_Flags: g_eFlags[MAX_PLAYERS]
  26. ;
  27.  
  28. CMD:register(playerid, params[]) {
  29.     new
  30.         szName[MAX_PLAYER_NAME]
  31.     ;
  32.     GetPlayerName(playerid, szName, sizeof(szName));
  33.    
  34.     if(AccountExists(szName)) {
  35.         return SendClientMessage(playerid, 0xFF0000FF, "Error: You already have an account! Please login.");
  36.     }
  37.     if(isnull(params)) {
  38.         return SendClientMessage(playerid, 0xFF0000FF, "Syntax: /register [password]");
  39.     }
  40.     if(!(4 <= strlen(params) <= 32)) {
  41.         return SendClientMessage(playerid, 0xFF0000FF, "Error: You password is either too long or too short.");
  42.     }
  43.     g_eFlags[playerid] |= e_Registering;
  44.    
  45.     Hash(WHIRLPOOL, playerid, params);
  46.     SendClientMessage(playerid, 0x00FF00FF, "Info: Please wait, connecting to servers...");
  47.    
  48.     return 1;
  49. }
  50.  
  51. CMD:login(playerid, params[]) {
  52.     new
  53.         szName[MAX_PLAYER_NAME]
  54.     ;
  55.     GetPlayerName(playerid, szName, sizeof(szName));
  56.    
  57.     if(!AccountExists(szName)) {
  58.         return SendClientMessage(playerid, 0xFF0000FF, "Error: You don't have an account! Please register first.");
  59.     }
  60.     if(isnull(params)) {
  61.         return SendClientMessage(playerid, 0xFF0000FF, "Syntax: /login [password]");
  62.     }
  63.     Hash(WHIRLPOOL, playerid, params);
  64.     SendClientMessage(playerid, 0x00FF00FF, "Info: Please wait, connecting to servers...");
  65.    
  66.     return 1;
  67. }
  68.  
  69. public OnHashUpdate(const iIdx, szHash[]) {
  70.     if(-1 < iIdx < sizeof(g_eFlags)) { // Check if iIdx is a playerid
  71.         if((g_eFlags[iIdx] & e_Registering)) { // Register
  72.             static
  73.                 szName[MAX_PLAYER_NAME]
  74.             ;
  75.             GetPlayerName(iIdx, szName, sizeof(szName));
  76.            
  77.             mysql_query(formatEx("INSERT INTO `Players` (`Name`, `Password`, `Score`) VALUES ('%s', '%s', '%d')", szName, szHash, GetPlayerScore(iIdx)));
  78.             mysql_free_result();
  79.            
  80.             g_eFlags[iIdx] &= ~e_Registering;
  81.            
  82.             SendClientMessage(iIdx, 0x00FF00FF, "Info: You have been succesfuly registered! Use /login to login.");
  83.         } else if(!(g_eFlags[iIdx] & e_Logged)){ // Login
  84.             static
  85.                 szName[MAX_PLAYER_NAME]
  86.             ;
  87.             GetPlayerName(iIdx, szName, sizeof(szName));
  88.            
  89.             mysql_query(formatEx("SELECT `Score` FROM `Players` WHERE `Name` = '%s' AND `Password` = '%s'", szName, szHash));
  90.             mysql_store_result();
  91.            
  92.             if(mysql_num_rows()) {
  93.                 SetPlayerScore(iIdx, mysql_fetch_int());
  94.                
  95.                 g_eFlags[iIdx] |= e_Logged;
  96.                
  97.                 SendClientMessage(iIdx, 0x00FF00FF, "Info: You have succesfuly logged in!");
  98.             } else {
  99.                 SendClientMessage(iIdx, 0xFF0000FF, "Error: Wrong password!");
  100.             }
  101.             mysql_free_result();
  102.         }
  103.     }
  104.     return 1;
  105. }
  106.  
  107. public OnPlayerConnect(playerid) {
  108.     static
  109.         szName[MAX_PLAYER_NAME]
  110.     ;
  111.     GetPlayerName(playerid, szName, sizeof(szName));
  112.    
  113.     if(AccountExists(szName)) {
  114.         SendClientMessage(playerid, 0xFFFFFFFF, "You have an account. Use /login to login.");
  115.     } else {
  116.         SendClientMessage(playerid, 0xFFFFFFFF, "You don't have an account. Use /register to create an account!");
  117.     }
  118.     return 1;
  119. }
  120.  
  121. public OnPlayerDisconnect(playerid, reason) {
  122.     if((g_eFlags[playerid] & e_Logged)) {
  123.         SavePlayerData(playerid);
  124.     }
  125.     g_eFlags[playerid] = e_Flags: 0;
  126.     return 1;
  127. }
  128.  
  129. stock SavePlayerData(playerid) {
  130.     static
  131.         szName[MAX_PLAYER_NAME]
  132.     ;
  133.     GetPlayerName(playerid, szName, sizeof(szName));
  134.        
  135.     mysql_query(formatEx("UPDATE `Players` SET `Score` = '%d' WHERE `Name` = '%s'", GetPlayerScore(playerid), szName));
  136.     mysql_free_result();
  137. }
  138.  
  139. stock AccountExists(const szAccount[]) {
  140.     static
  141.         szName[MAX_PLAYER_NAME]
  142.     ;
  143.     szName[0] = EOS;
  144.    
  145.     mysql_real_escape_string(szAccount, szName);
  146.     mysql_query(formatEx("SELECT * FROM `Players` WHERE `Name` = '%s' LIMIT 1", szName));
  147.     mysql_store_result();
  148.    
  149.     new
  150.         iResult = mysql_num_rows()
  151.     ;
  152.     mysql_free_result();
  153.    
  154.     return !!iResult;
  155. }
  156.  
  157. public OnFilterScriptInit() {
  158.     mysql_debug(0);
  159.     mysql_connect(MySQL_Host, MySQL_User, MySQL_DB, MySQL_Pass);
  160.    
  161.     if(mysql_ping() == 1) {
  162.         printf(" » [MySQL]: Succesfuly connected! ");
  163.     } else {
  164.         new
  165.             iAttempts
  166.         ;
  167.         Attempts: {
  168.             mysql_connect(MySQL_Host, MySQL_User, MySQL_DB, MySQL_Pass);
  169.            
  170.             if(mysql_ping() == 1) {
  171.                 printf(" » [MySQL]: Succesfuly connected! ");
  172.             } else {
  173.                 if(iAttempts++ < 3) {
  174.                     printf(" » [MySQL]: Unable to connect! Retrying (%d). ", iAttempts);
  175.                     goto Attempts;
  176.                 } else {
  177.                     printf(" » [MySQL]: Unable to connect! Shuting down server. ");
  178.                     SendRconCommand("exit");
  179.                 }
  180.             }
  181.         }
  182.     }
  183.     return 1;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement