F1N4L_

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

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