Guest User

Base Registro/Login SQLite (s/ Hash & c/ explicação)

a guest
Mar 5th, 2016
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.79 KB | None | 0 0
  1. /* ______________________________________
  2. |__SISTEMA_BASE_DE_REGISTRO_&_LOGIN__|
  3. |______________BY_F1N4L______________|
  4. |_____________05_03_2016_____________|
  5. |_______________v_0.3z_______________|
  6. */
  7.  
  8. #include < a_samp > // By SA:MP Team
  9. #include < sscanf2 > // By Y_Less
  10. #include < zcmd > // By Zeex
  11.  
  12. #undef MAX_PLAYERS // Desabilita a função nativa MAX_PLAYERS
  13. #define MAX_PLAYERS ( 50 ) // Habilita a função nativa MAX_PLAYERS e atribui um valor a ela
  14.  
  15. #define DIALOG_LOGIN ( 100 ) // Atribui o valor da DIALOG_LOGIN
  16. #define DIALOG_REGISTER ( 101 ) // Atribui o valor da DIALOG_REGISTER
  17.  
  18. #define _UDB_ "Server.db" // Nome do Banco de Dados a ser criado na pasta Scriptfiles
  19. #define USER_DB "Users" // Atribui o nome da TABLE
  20.  
  21. enum pInfo // Define o enum
  22. {
  23. pID, // Var ID
  24. tkNOME[ MAX_PLAYER_NAME ], // Var NOME
  25. pSENHA[ 129 ], // Var SENHA
  26. pADMIN, // Var ADMIN
  27.  
  28. bool:pLOGADO // Bool LOGADO (true/false)
  29. };
  30. new
  31. USER[ MAX_PLAYERS ][ pInfo ] // Var + enum
  32. ;
  33. new
  34. DB: User_Database // Nome da Var do Banco de Dados
  35. ;
  36.  
  37. public OnFilterScriptInit ( )
  38. {
  39. new
  40. Query_User [ 500 ]
  41. ;
  42.  
  43. if ( ( User_Database = db_open ( _UDB_ ) ) == DB:0 ) // Abre o banco de dados, se a caso não encontrá-lo, fecha o executável
  44. {
  45. SendRconCommand ( "exit" ); // Fecha o samp-server.exe
  46. }
  47. else
  48. {
  49. strcat ( Query_User, "CREATE TABLE IF NOT EXISTS `"USER_DB"`" ); // Cria a TABLE com o nome que você definiu no macro
  50. strcat ( Query_User, "(`ID` INTEGER PRIMARY KEY AUTOINCREMENT," ); // Cria a coluna ID e define-a para aumentar de 1 em 1
  51. strcat ( Query_User, "`NOME` TEXT," ); // Cria a coluna NOME
  52. strcat ( Query_User, "`SENHA` TEXT," ); // Cria a coluna SENHA
  53. strcat ( Query_User, "`ADMIN` NUMERIC )" ); // Cria a coluna ADMIN
  54. db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  55. }
  56.  
  57. return 1;
  58. }
  59.  
  60. public OnFilterScriptExit ( )
  61. {
  62. db_close ( User_Database ); // Nunca esqueça de fechar o Banco de Dados
  63. return 1;
  64. }
  65.  
  66. public OnPlayerConnect ( playerid )
  67. {
  68. new Reset[ pInfo ];
  69. USER[ playerid ] = Reset; // Reseta os valores do enum
  70.  
  71. new
  72. Query_User [ 200 ],
  73. DBResult: Resultado // Var de resultado da pesquisa
  74. ;
  75.  
  76. format ( Query_User, sizeof ( Query_User ) , "SELECT `SENHA` FROM `"USER_DB"` WHERE `NOME` = '%s'", DB_Escape ( pName ( playerid ) ) ); // SELECIONA a coluna SENHA na TABLE 'USERS' ONDE NOME = Nome Do Player Conectado
  77. Resultado = db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  78. if ( db_num_rows ( Resultado ) ) // Condicional que verifica se o player existe no Banco de Dados (Nesta condicional existe)
  79. {
  80. db_get_field_assoc ( Resultado, "SENHA", USER[ playerid ][ pSENHA ], 129 ); // Geta o valor da SENHA e a define na Variável. OBS: Se usar Whirlpool é obrigatório o uso de 129 células
  81.  
  82. ShowPlayerDialog ( playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Painel de Login", "Bem Vindo novamente ao nosso servidor\nLogue-se para continuar de onde parou:", "LOGAR","SAIR" );
  83. }
  84. else // Caso não exista o player determinado, retornará a dialog REGISTRO
  85. {
  86. ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Painel de Registro", "Bem Vindo ao nosso servidor\nRegistre-se para salvar seu dados:", "REGISTRAR","SAIR" );
  87. }
  88. db_query ( User_Database, Query_User ); // Essa função é usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  89. db_free_result ( Resultado ); // Libera o resultado da memória alocada a partir de db_query.
  90.  
  91. return 1;
  92. }
  93.  
  94. public OnPlayerDisconnect ( playerid, reason )
  95. {
  96. new
  97. Query_User [ 500 ]
  98. ;
  99.  
  100. format ( Query_User, sizeof ( Query_User ) , "UPDATE `"USER_DB"` SET `ADMIN` = '%i' WHERE `NOME` = '%s'", USER[ playerid ][ pADMIN ], DB_Escape ( pName ( playerid ) ) );
  101. db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  102.  
  103. new Reset[ pInfo ];
  104. USER[ playerid ] = Reset; // Reseta os valores do enum
  105.  
  106. return 1;
  107. }
  108.  
  109. public OnDialogResponse ( playerid, dialogid, response, listitem, inputtext[ ] )
  110. {
  111. if ( dialogid == DIALOG_REGISTER )
  112. {
  113. if ( response )
  114. {
  115. if ( !IsValidPassword ( inputtext ) ) // Checa se o player digitou caracteres válidos
  116. {
  117. ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Painel de Registro", "Bem Vindo ao nosso servidor\nRegistre-se para salvar seu dados:", "REGISTRAR","SAIR" );
  118. SendClientMessage ( playerid, -1, "Utilize apenas LETRAS e NÚMEROS." );
  119. return 0;
  120. }
  121. if ( strlen ( inputtext ) < 3 || strlen ( inputtext ) > 20 ) // Checa o tamanho da senha
  122. {
  123. ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Painel de Registro", "Bem Vindo ao nosso servidor\nRegistre-se para salvar seu dados:", "REGISTRAR","SAIR" );
  124. SendClientMessage ( playerid, -1, "A senha deve ser entre 3-20." );
  125. return 0;
  126. }
  127.  
  128. new
  129. Query_User [ 500 ]
  130. ;
  131.  
  132. format ( Query_User, sizeof ( Query_User ) , "INSERT INTO `"USER_DB"` ( `NOME` ) VALUES ( '%s' ) ", DB_Escape ( pName ( playerid ) ) ); // Insere um Linha no Banco de Dados e seta a Coluna NOME com o nome do player
  133. db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  134. format ( Query_User, sizeof ( Query_User ) , "UPDATE `"USER_DB"` SET `SENHA` = '%s' WHERE `NOME` = '%s'", DB_Escape ( inputtext ) , DB_Escape ( pName ( playerid ) ) ); // Atualiza a mesma Linha, porém seta a coluna SENHA com a senha Criptografada
  135. db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  136. format ( Query_User, sizeof ( Query_User ) , "UPDATE `"USER_DB"` SET `ADMIN` = '0' WHERE `NOME` = '%s'", DB_Escape ( pName ( playerid ) ) ); // Atualiza a mesma Linha, porém seta a coluna ADMIN para o valor de 0 (Zero)
  137. db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  138.  
  139. USER[playerid][pLOGADO] = true;
  140.  
  141. SendClientMessage ( playerid, -1, "Sua conta foir criada com sucesso e você foi automaticamente logado!" );
  142. }
  143. else
  144. {
  145. Kick(playerid); // Caso o player não se registrar será kickado
  146. }
  147. }
  148. if ( dialogid == DIALOG_LOGIN )
  149. {
  150. if ( response )
  151. {
  152. new
  153. Query_User[ 500 ],
  154. DBResult: Resultado
  155. ;
  156.  
  157. if ( strcmp ( inputtext, USER[ playerid ][ pSENHA ], false ) == 0 ) // Verifica se a senha Criptografada é igual à senha digitada. (Nesta condicional, é igual)
  158. {
  159. format ( Query_User, sizeof ( Query_User ) , "SELECT * FROM `"USER_DB"` WHERE `NOME` = '%s'", DB_Escape ( pName ( playerid ) ) ); // Seleciona TODAS as colunas do Banco de Dados de determinado player
  160. Resultado = db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  161. if ( db_num_rows ( Resultado ) ) // Condicional que verifica se o player existe no Banco de Dados (Nesta condicional existe)
  162. {
  163. db_get_field_assoc ( Resultado, "ID", Query_User, 3 ); // Pega o valor da TABLE 'ID'
  164. USER[ playerid ][ pID ] = strval ( Query_User ); // Seta o valor de 'ID' para a Var 'pID'
  165.  
  166. db_get_field_assoc ( Resultado, "ADMIN", Query_User, 6 ); // Pega o valor da TABLE 'ADMIN'
  167. USER[ playerid ][ pADMIN ] = strval ( Query_User ); // Seta o valor de 'ADMIN' para a Var 'pADMIN'
  168. }
  169. db_query ( User_Database, Query_User ); // Função usada para executar uma consulta SQL em um banco de dados SQLite aberto.
  170. db_free_result ( Resultado ); // Libera o resultado da memória alocada a partir de db_query.
  171.  
  172. SendClientMessage ( playerid, -1, "Você logou com sucesso!" );
  173.  
  174. USER[playerid][pLOGADO] = true; // Seta o jogador como LOGADO
  175. }
  176. else // Caso o player erra a senha
  177. {
  178. SendClientMessage ( playerid, -1, "Você errou a senha!" );
  179. ShowPlayerDialog ( playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Painel de Login", "Bem Vindo novamente ao nosso servidor\nLogue-se para continuar de onde parou:", "LOGAR","SAIR" );
  180. }
  181. }
  182. else
  183. {
  184. Kick(playerid); // Kicka o player se ele não logar
  185. }
  186. }
  187.  
  188. return 1;
  189. }
  190.  
  191. CMD:setlevel ( playerid, params[] ) // Exemplo de comando
  192. {
  193. new
  194. Target,
  195. Level,
  196. String[129]
  197. ;
  198.  
  199. if ( sscanf ( params, "ui", Target, Level ) ) return SendClientMessage(playerid, -1, "/SETLEVEL [ID] [LEVEL]");
  200.  
  201. format ( String, sizeof ( String ), "Admin %s setou level admin %i para o player %s", pName ( playerid ), Level, pName ( Target ) );
  202. SendClientMessageToAll(-1, String);
  203. format ( String, sizeof ( String ), "Admin %s setou seu level admin para %i", pName ( playerid ), Level );
  204. SendClientMessageToAll(-1, String);
  205.  
  206. USER[playerid][pADMIN] = Level;
  207.  
  208. return 1;
  209. }
  210.  
  211. stock pName ( playerid ) // Stock para Getar o nome do player
  212. {
  213. new
  214. GetName[ MAX_PLAYER_NAME ]
  215. ;
  216.  
  217. GetPlayerName ( playerid, GetName, sizeof ( GetName ) );
  218.  
  219. return GetName;
  220. }
  221.  
  222. stock DB_Escape ( text[ ] ) // Stock obrigatória para guardar o valor das srings no Banco de Dados
  223. {
  224. new
  225. ret[ 80 * 2 ],
  226. ch,
  227. i,
  228. j;
  229. while ( ( ch = text[ i++ ] ) && j < sizeof ( ret ) )
  230. {
  231. if ( ch == '\'' ) //'
  232. {
  233. if ( j < sizeof ( ret ) - 2 )
  234. {
  235. ret[ j++ ] = '\'';
  236. ret[ j++ ] = '\'';
  237. }
  238. }
  239. else if ( j < sizeof ( ret ) )
  240. {
  241. ret[ j++ ] = ch;
  242. }
  243. else
  244. {
  245. j++;
  246. }
  247. }
  248. ret[ sizeof ( ret ) - 1 ] = '\0';
  249. return ret;
  250. }
  251.  
  252. stock IsValidPassword ( const numeric[ ] ) // Checa se é número
  253. {
  254. for ( new i = 0; numeric[ i ] != EOS; ++i )
  255. {
  256. switch ( numeric[ i ] )
  257. {
  258. case '0'..'9', 'A'..'Z', 'a'..'z': continue;
  259. default: return 0;
  260. }
  261. }
  262. return 1;
  263. }
Advertisement
Add Comment
Please, Sign In to add comment