F1N4L_

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

Mar 19th, 2016
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.85 KB | None | 0 0
  1. /*
  2. ______________________________________
  3. |__SISTEMA_BASE_DE_REGISTRO_&_LOGIN__|http://forum.sa-mp.com/showthread.php?p=3673290#post3673290
  4. |______________BY_F1N4L______________|http://forum.sa-mp.com/member.php?u=204784
  5. |_____________13_04_2016_____________|
  6. |__________v_0.3z_&_v_0.3.7__________|
  7.  
  8.  
  9. ::Escrever em um arquivo de texto uma sequência de caracteres (letras / números / símbolos);
  10. CallBack INI_WriteString("arquivo", "key", "valor")
  11.  
  12. ::Escrever em um arquivo de texto números com casas decimais;
  13. CallBack INI_WriteFloat("arquivo", "key", "valor")
  14.  
  15. ::Escrever em um arquivo de texto apenas números inteiros;
  16. CallBack INI_WriteInt("arquivo", "key", "valor")
  17.  
  18. ::Escrever em um arquivo de texto valores true/false;
  19. CallBack INI_WriteBool("arquivo", "key", "bool:valor")
  20.  
  21. ::Fazer a leitura do arquivo em determinada Palavra-Chave, neste caso, uma sequência de caracteres (letras / números / símbolos);
  22. CallBack INI_ReadString("arquivo", "key")
  23.  
  24. ::Fazer a leitura do arquivo em determinada Palavra-Chave, neste caso, apenas números inteiros;
  25. CallBack INI_ReadInt("arquivo", "key")
  26.  
  27. ::Faz a leitura do arquivo em determinada Palavra-Chave, neste caso, números com casas decimais;
  28. CallBack INI_ReadFloat("arquivo", "key")
  29.  
  30. ::Fazer a leitura do arquivo em determinada Palavra-Chave, neste caso, valores true/false;
  31. CallBack INI_ReadBool("arquivo", "key")
  32.  
  33. ::Criar um arquivo com o formato especificado;
  34. CallBack INI_Create("arquivo")
  35.  
  36. ::Deletar determinado arquivo;
  37. CallBack INI_Delete("arquivo")
  38.  
  39. ::Abrir determinado arquivo;
  40. CallBack INI_Open("arquivo")
  41.  
  42. ::Salvar todos os dados.
  43. CallBack INI_Save()
  44.  
  45. ::Printar no console o nome de determinada Palavra-Chave e seu respectivo valor.
  46. CallBack INI_Print()
  47. */
  48.  
  49. #include a_samp // By SA:MP Team
  50. #include zcmd // By Zeex
  51. #include sscanf2 // By Y_Less
  52. #include bini // By Ips Bruno
  53. native WP_Hash(buffer[], len, const str[]);
  54.  
  55. /*
  56. Vamos criar os macros para os diálogos.
  57. */
  58. #define DIALOG_REGISTRO 1000
  59. #define DIALOG_LOGIN 1001
  60.  
  61. /*
  62. Vamos criar agora o enumerador responsável pelos seguintes dados:
  63. *Nome
  64. *Senha
  65. *Dinheiro
  66. *IP
  67. *Admin
  68. *Logado
  69. */
  70. enum pInfo
  71. {
  72. pNome[MAX_PLAYER_NAME],
  73. pSenha[20],
  74. pDinheiro,
  75. pScore,
  76. pIP[20],
  77. pAdmin,
  78.  
  79. bool:pLogado
  80. }
  81. /*
  82. Criamos a variável onde será armazenado os valores obtidos no enumerador.
  83. */
  84. new User[MAX_PLAYERS][pInfo];
  85.  
  86. public OnGameModeInit()
  87. {
  88. return 1;
  89. }
  90.  
  91. public OnGameModeExit()
  92. {
  93. /*
  94. Ao finalizar o servidor precisamo fechar o arquivo do player.
  95. */
  96. INI_Exit();
  97. return 1;
  98. }
  99.  
  100. /*
  101. Obviamente precisamos verificar se o player está ou não registrado.
  102. Para isso criamos uma condicional para checar se o arquivo com seu nome existe.
  103. */
  104. public OnPlayerConnect(playerid)
  105. {
  106. for(new i; pInfo:i < pInfo; i++)
  107. {
  108. User[playerid][pInfo:i] = 0;
  109. }
  110.  
  111. if(fexist(PastaContas(playerid)))
  112. {
  113. /*
  114. Se o arquivo com o nome do player existe, vamos abrir o arquivo
  115. e pegar o valor da senha para compará-la com o que o player digitar.
  116. */
  117. INI_Open(PastaContas(playerid));
  118. INI_ReadString(PastaContas(playerid), "Senha");
  119. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "TITULO DA DIALOG", "TEXTO DA DIALOG DE LOGIN", "LOGAR","SAIR");
  120. }
  121. else
  122. {
  123. /*
  124. Se o arquivo com o nome do player não existir, irá abrir o diálogo DIALOG_REGISTRO.
  125. */
  126. ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "TITULO DA DIALOG", "TEXTO DA DIALOG DE REGISTRO", "REGISTRAR","SAIR");
  127. }
  128.  
  129. return 1;
  130. }
  131.  
  132. /*
  133. Salvaremos os seguintes dados:
  134. *Dinheiro
  135. *Admin
  136.  
  137. Por que não salvamos...?
  138. *Nome
  139. *IP
  140. *Senha
  141.  
  142. RE: Simplesmente porque esses dados não precisam ser alterados posteriormente,
  143. pois são salvos ao se registrar e por isso não precisamos fazê-lo novamente.
  144.  
  145. Caso queiramos alterar Nome/IP/Senha ingame.
  146. Neste caso não iremos guardar o valor de Nome/IP/Senha em uma variável,
  147. mas sim, escrever diretamente nos arquivos, caso contrário a modificação
  148. não será salva.
  149. */
  150. public OnPlayerDisconnect(playerid, reason)
  151. {
  152. /*
  153. Verificamos se o player está logado.
  154. */
  155. if(User[playerid][pLogado] == true)
  156. {
  157. /*
  158. Escrevemos dentro do arquivo os valores respectivos das variáveis.
  159. */
  160. INI_WriteInt(PastaContas(playerid), "Dinheiro", User[playerid][pDinheiro]);
  161. INI_WriteInt(PastaContas(playerid), "Admin", User[playerid][pAdmin]);
  162. INI_WriteInt(PastaContas(playerid), "Score", User[playerid][pScore]);
  163. /*
  164. Salvamos os dados do player.
  165. OBS: BINI não necessita de INI_Save, pois salva automaticamente dentro do arquivo .amx.
  166. Porém, como dito por ele (Bruno): Para evitar problemas com crash/bug, adicionamos por segurança.
  167. */
  168. INI_Save();
  169. }
  170.  
  171. for(new i; pInfo:i < pInfo; i++)
  172. {
  173. User[playerid][pInfo:i] = 0;
  174. }
  175.  
  176. return 1;
  177. }
  178.  
  179. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  180. {
  181. /*
  182. Definimos a resposta do diálogo DIALOG_REGISTRO.
  183. */
  184. if(dialogid == DIALOG_REGISTRO)
  185. {
  186. if(response)
  187. {
  188. /*
  189. OBS: Não usarei condicional para verificar se o player digitou uma senha válida.
  190.  
  191. Verificamos se o player deixou em branco o campo do inputtext.
  192. */
  193. if(!strlen(inputtext))
  194. {
  195. SendClientMessage(playerid, -1, "Senha inválida!");
  196. ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "TITULO DA DIALOG", "TEXTO DA DIALOG DE REGISTRO", "REGISTRAR","SAIR");
  197. return 1;
  198. }
  199. /*
  200. Verificamos se o player digitou uma senha entre 3 - 20 caracteres.
  201. */
  202. if(strlen(inputtext) < 3 || strlen(inputtext) > 20)
  203. {
  204. SendClientMessage(playerid, -1, "Tamanho de senha inválido. Utilize entre 3 - 20");
  205. ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "TITULO DA DIALOG", "TEXTO DA DIALOG DE REGISTRO", "REGISTRAR","SAIR");
  206. return 1;
  207. }
  208. new
  209. HASHPASS[129]
  210. ;
  211. WP_Hash(HASHPASS, sizeof(HASHPASS), inputtext);
  212. /*
  213. Criaremos o arquivo com o nome do player.
  214. */
  215. INI_Create(PastaContas(playerid));
  216. /*
  217. Escrevemos os valores dentro do arquivo nas seguintes Palavras-Chave.
  218. */
  219. INI_WriteString(PastaContas(playerid), "Nome", GetName(playerid));
  220. INI_WriteString(PastaContas(playerid), "Senha", HASHPASS);
  221. INI_WriteString(PastaContas(playerid), "IP", GetIP(playerid));
  222. INI_WriteInt(PastaContas(playerid), "Dinheiro", User[playerid][pDinheiro]=0);
  223. INI_WriteInt(PastaContas(playerid), "Score", User[playerid][pScore]=0);
  224. INI_WriteInt(PastaContas(playerid), "Admin", User[playerid][pAdmin]=0);
  225. /*
  226. Setamos o player como logado.
  227. */
  228. User[playerid][pLogado] = true;
  229.  
  230. SendClientMessage(playerid, -1, "Você se registrou com sucesso no servidor.");
  231. }
  232. else
  233. {
  234. /*
  235. Caso a resposta seja SAIR o player tomará um Kick.
  236. */
  237. Kick(playerid);
  238. }
  239. }
  240. /*
  241. Definimos a resposta do diálogo DIALOG_LOGIN.
  242. */
  243. else if(dialogid == DIALOG_LOGIN)
  244. {
  245. if(response)
  246. {
  247. /*
  248. Verificamos se o player deixou em branco o campo do inputtext.
  249. */
  250. if(!strlen(inputtext))
  251. {
  252. SendClientMessage(playerid, -1, "Você errou a senha!");
  253. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "TITULO DA DIALOG", "TEXTO DA DIALOG DE LOGIN", "LOGAR","SAIR");
  254. return 1;
  255. }
  256. new
  257. HASHPASS[129]
  258. ;
  259. WP_Hash(HASHPASS, sizeof(HASHPASS), inputtext);
  260. /*
  261. Vamos comparar se a senha digitada no inputtext é EXATAMENTE a mesma contida no arquivo .ini (por isso o uso de FALSE).
  262. TRUE = Não diferencia os caracteres [Letras maiúsculas/minúsculas]
  263. FALSE = Diferencia os caracteres [Letras maiúsculas/minúsculas]
  264. */
  265. if(strcmp(HASHPASS, INI_ReadString(PastaContas(playerid), "Senha"), false) == 0)
  266. {
  267. /*
  268. Caso a senha esteja correta, irá fazer a leitura das seguintes Keys:
  269. *Dinheiro
  270. *Admin
  271. *Score
  272. */
  273. User[playerid][pDinheiro] = INI_ReadInt(PastaContas(playerid), "Dinheiro");
  274. ResetPlayerMoney(playerid);
  275. GivePlayerMoney(playerid, User[playerid][pDinheiro]);
  276. User[playerid][pAdmin] = INI_ReadInt(PastaContas(playerid), "Admin");
  277. User[playerid][pScore] = INI_ReadInt(PastaContas(playerid), "Score");
  278. SetPlayerScore(playerid, User[playerid][pScore]);
  279. /*
  280. Setamos o player como logado.
  281. */
  282. User[playerid][pLogado] = true;
  283.  
  284. SendClientMessage(playerid, -1, "Você logou com sucesso!");
  285. }
  286. else
  287. {
  288. /*
  289. Caso a senha for incorreta.
  290. */
  291. SendClientMessage(playerid, -1, "Você errou a senha!");
  292. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "TITULO DA DIALOG", "TEXTO DA DIALOG DE LOGIN", "LOGAR","SAIR");
  293. }
  294. }
  295. else
  296. {
  297. /*
  298. Caso a resposta seja SAIR o player tomará um Kick.
  299. */
  300. Kick(playerid);
  301. }
  302. }
  303. return 1;
  304. }
  305. /*
  306. Alguns comandos para exemplificar cada função.
  307. */
  308. CMD:setdinheiro(playerid, params[])
  309. {
  310. new ID, Quantia, String[128];
  311.  
  312. if(sscanf(params, "ui", ID, Quantia)) return SendClientMessage(playerid, -1, "/setdinheiro [id] [quantia]");
  313.  
  314. /*
  315. Resetamos o dinheiro, para posteriormente definir um valor a ele, junto com a variável de dinheiro.
  316. */
  317. ResetPlayerMoney(ID);
  318. GivePlayerMoney(ID, User[ID][pDinheiro] = Quantia);
  319.  
  320. format(String, sizeof(String), "Você setou %i de dinheiro para o player %s", Quantia, GetName(ID));
  321. SendClientMessage(playerid, -1, String);
  322.  
  323. return 1;
  324. }
  325.  
  326. CMD:mym(playerid, params[])
  327. {
  328. new String[128];
  329. format(String, sizeof(String), "Você tem R$ %i de dinheiro.", User[playerid][pDinheiro]);
  330. SendClientMessage(playerid, -1, String);
  331.  
  332. return 1;
  333. }
  334.  
  335. CMD:setscore(playerid, params[])
  336. {
  337. new ID, Score, String[128];
  338.  
  339. if(sscanf(params, "ui", ID, Score)) return SendClientMessage(playerid, -1, "/setscore [id] [score]");
  340.  
  341. /*
  342. Setamos o valor do score na variável e automaticamente InGame.
  343. */
  344. SetPlayerScore(ID, User[ID][pScore] = Score);
  345.  
  346. format(String, sizeof(String), "Você setou %i de score para o player %s", Score, GetName(ID));
  347. SendClientMessage(playerid, -1, String);
  348.  
  349. return 1;
  350. }
  351.  
  352. CMD:setadmin(playerid, params[])
  353. {
  354. new ID, Level, String[128];
  355.  
  356. if(sscanf(params, "ui", ID, Level)) return SendClientMessage(playerid, -1, "/setadmin [id] [level]");
  357.  
  358. /*
  359. Setamos o valor da variável igual ao valor da var Level.
  360. */
  361. User[ID][pAdmin] = Level;
  362.  
  363. format(String, sizeof(String), "Você setou level admin %i para o player %s", Level, GetName(ID));
  364. SendClientMessage(playerid, -1, String);
  365.  
  366. return 1;
  367. }
  368. /*
  369. Pegamos o Nick do player.
  370. */
  371. stock GetName(playerid)
  372. {
  373. new Nome[MAX_PLAYER_NAME];
  374.  
  375. GetPlayerName(playerid, Nome, sizeof(Nome));
  376.  
  377. return Nome;
  378. }
  379. /*
  380. Pegamos o IP do player.
  381. */
  382. stock GetIP(playerid)
  383. {
  384. new IP[30];
  385.  
  386. GetPlayerIp(playerid, IP, sizeof(IP));
  387.  
  388. return IP;
  389. }
  390. /*
  391. Definimos o local do arquivo e o nome desse arquivo.
  392. */
  393. stock PastaContas(playerid)
  394. {
  395. new Contas[24];
  396.  
  397. format(Contas, sizeof(Contas), "Contas/%s.ini", GetName(playerid));
  398.  
  399. return Contas;
  400. }
Advertisement
Add Comment
Please, Sign In to add comment