· 9 years ago · May 15, 2017, 09:44 PM
1//-------------------------------------------------------------------//
2//**************************** INCLUDES *****************************//
3//-------------------------------------------------------------------//
4
5#include <a_samp>
6#include <crashdetect>
7#include <YSI\y_iterate>
8#include <a_mysql>
9#include <a_mysql_yinline>
10#include <CTime>
11#include <Pawn.CMD>
12#include <sscanf2>
13
14//-------------------------------------------------------------------//
15//************************* DEFINIÇÕES ******************************//
16//********************* Você pode alterar ***************************//
17//-------------------------------------------------------------------//
18
19// --> Configurações
20#define SERVER_NAME ("EasyWay")
21#define SERVER_VERSION ("0.1")
22#define MAX_LOGIN_ATTEMPTS (3) // --> Máximo de tentativas para acertar a senha
23#define MAX_CONNECTIONS_FROM_IP (3) // --> Máximo de IPs conectados ao mesmo tempo
24#define MINUTES_TO_LOGIN (5) // --> Em minutos, tempo limite para o jogador se logar / registrar.
25
26// --> Mensagens
27#define MSG_CMD_WITHOUT_PERMISSION "Você não tem permissão para usar este comando."
28#define MSG_PLAYER_OFF "Jogador não conectado."
29
30// --> Cores
31#define COLOR_BLUE (0x2641FEFF)
32#define COLOR_GREY (0xAFAFAFFF)
33#define COLOR_LIGHTRED (0xFF6347FF)
34#define COLOR_LIGHTBLUE (0x33CCFFAA)
35#define COLOR_LIGHTGREEN (0x66ff66FF)
36#define COLOR_CLIENT (0xAAC4E5FF)
37#define COLOR_TEAL (0x00A180FF)
38#define COLOR_ORANGE (0xFF9409FF)
39#define COLOR_PURPLE (0xD0AEEBFF)
40#define COLOR_OPENSERV (0xFFBD9DFF)
41#define COLOR_WHITE (0xFFFFFFFF)
42#define COLOR_PINK (0xFF66FFAA)
43#define COLOR_RED (0xFF0000AA)
44#define COLOR_YELLOW (0xFFFF00AA)
45#define COLOR_GREEN (0x33AA33AA)
46#define COLOR_LIGHTBLUE2 (0x99ccffAA)
47#define COLOR_BROWN (0xA8623EAA)
48#define COLOR_LIGHTBROWN (0xf4ac94AA)
49#define COLOR_LIGHTBROWN2 (0xc7a6afAA)
50
51// --> Cores para dialogs e afins
52#define COLOR_TITLE_DIALOG "{00a180}"
53#define COLORT_GREEN "{49ad00}"
54#define COLORT_YELLOW "{fff600}"
55#define COLORT_WHITE "{ffffff}"
56#define COLORT_LIGHTRED "{e44235}"
57#define COLORT_ORANGE "{ff9409}"
58#define COLORT_ORANGE2 "{f2bb73}"
59#define COLORT_GREY "{a4a4a4}"
60
61//-------------------------------------------------------------------//
62//************************ !DEFINIÇÕES! *****************************//
63//******************** Cuidado ao alterar ***************************//
64//-------------------------------------------------------------------//
65
66#define DIALOG_REGISTER (1) // até 20
67#define DIALOG_LOGIN (21) // até 24
68#define DIALOG_KICK (25)
69#define DIALOG_MESSAGE (26)
70#define DIALOG_UNBAN (27)
71
72#define sendServerMessage(%0,%1) \
73 sendClientMessageEx(%0, COLOR_TEAL, "[SERVER]:{FFFFFF} "%1)
74
75#define sendSyntaxMessage(%0,%1) \
76 sendClientMessageEx(%0, COLOR_GREY, "[USO CORRETO]:{FFFFFF} "%1)
77
78#define sendErrorMessage(%0,%1) \
79 sendClientMessageEx(%0, COLOR_LIGHTRED, "[ERRO]:{FFFFFF} "%1)
80
81#define sendAdminAction(%0,%1) \
82 sendClientMessageEx(%0, COLOR_CLIENT, "[ADMIN]:{FFFFFF} "%1)
83
84#define sendWarningMessage(%0,%1) \
85 sendClientMessageEx(%0, COLOR_YELLOW, "[AVISO]: "%1)
86
87#define MENU_LOGIN_INDEX (1)
88#define MENU_LOGIN_REGISTER (2)
89#define MENU_LOGIN_REGISTER_STAGE_1 (3)
90#define MENU_LOGIN_REGISTER_STAGE_2 (4)
91#define MENU_LOGIN_REGISTER_STAGE_3 (5)
92
93//-------------------------------------------------------------------//
94//*************************** VARIÃVEIS *****************************//
95//-------------------------------------------------------------------//
96
97new Dialog[2048],
98 String[1024],
99 Query[1024],
100 MySQL:MySQL_Connection = MYSQL_INVALID_HANDLE;
101
102enum enum_Player
103{
104 // Data
105 ORM:pORM,
106 pAccountID,
107 pName[24],
108 pPassword[65],
109 pEmail[64],
110 pRegisterDate,
111 pLastLogin,
112 pAdmin,
113
114 // Non-data
115 pDialogID,
116 bool:pKicked,
117 bool:pLogged,
118 pMaxLoginAttempts,
119 pTimerPlayer,
120 pIP[64],
121 pTimeToLogin,
122
123 // Registro
124 registerPassword[30]
125}
126
127new Player[MAX_PLAYERS][enum_Player];
128
129//-------------------------------------------------------------------//
130//**************************** FORWARDS *****************************//
131//-------------------------------------------------------------------//
132
133forward KickTimer(playerid);
134forward OnPlayerDataLoaded(playerid);
135forward OnPlayerRegister(playerid);
136forward OnPlayerUpdateEx(playerid);
137forward TimerOneMinute();
138
139//-------------------------------------------------------------------//
140
141main()
142{
143 print("\n----------------------------------");
144 printf("%s [v%s]", SERVER_NAME, SERVER_VERSION);
145 print("----------------------------------\n");
146}
147
148public OnGameModeInit()
149{
150 print("[MySQL] Estabelecendo conexão com o servidor..");
151
152 MySQL_Connection = mysql_connect_file("mysql_connection.ini");
153 mysql_log(ALL);
154
155 if(MySQL_Connection == MYSQL_INVALID_HANDLE)
156 {
157 print("[MySQL] Não foi possÃvel realizar a conexão, desligando servidor..");
158 SendRconCommand("exit");
159 }
160 else
161 print("[MySQL] Conexão estabelecida com sucesso.");
162
163 format(String, sizeof(String), "%s [v%s]", SERVER_NAME, SERVER_VERSION);
164 SetGameModeText(String);
165
166 SetTimer("TimerOneMinute", 1000*60, true);
167
168 AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
169 return 1;
170}
171
172public OnGameModeExit()
173{
174 mysql_close(MySQL_Connection);
175 return 1;
176}
177
178public OnPlayerConnect(playerid)
179{
180 static connecting_ip[64];
181 GetPlayerIp(playerid, connecting_ip, 64);
182
183 if(getNumberOfPlayersOnThisIP(connecting_ip) > MAX_CONNECTIONS_FROM_IP)
184 return Kick(playerid);
185
186 if(!IsPlayerNPC(playerid))
187 {
188 SetSpawnInfo(playerid, 0, 23, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
189 clearPlayerVars(playerid);
190 loadPlayer(playerid);
191
192 Player[playerid][pTimerPlayer] = SetTimerEx("OnPlayerUpdateEx", 1000, true, "i", playerid);
193 }
194 return 1;
195}
196
197public OnPlayerRequestClass(playerid, classid)
198{
199 if(!IsPlayerNPC(playerid))
200 {
201 TogglePlayerSpectating(playerid, true);
202 InterpolateCameraPos(playerid, 1350.289306, -1399.634887, 39.952976, 1346.096069, -989.852233, 74.761276, 1000*40);
203 InterpolateCameraLookAt(playerid, 1350.505981, -1394.746826, 38.923583, 1348.108398, -985.276794, 74.885650, 1000*40);
204
205 orm_setkey(Player[playerid][pORM], "Name");
206 orm_select(Player[playerid][pORM], "OnPlayerDataLoaded", "d", playerid);
207 }
208 return 1;
209}
210
211
212public OnPlayerDataLoaded(playerid)
213{
214 orm_setkey(Player[playerid][pORM], "ID");
215
216 switch(orm_errno(Player[playerid][pORM]))
217 {
218 case ERROR_INVALID:
219 {
220 sendServerMessage(playerid, "Ocorreu algum problema, entre novamente..");
221 kickEx(playerid);
222 }
223 case ERROR_OK: showLoginMenu(playerid, MENU_LOGIN_INDEX);
224 case ERROR_NO_DATA: showLoginMenu(playerid, MENU_LOGIN_REGISTER);
225 }
226
227 mysql_format(MySQL_Connection, Query, sizeof(Query), "SELECT * FROM `banlist` WHERE (`AccountID` = '%d' OR `IP` = '%e') LIMIT 1", Player[playerid][pAccountID], Player[playerid][pIP]);
228 inline OnPlayerBanned()
229 {
230 if(cache_num_rows()) // --> Checar se existe algum resultado
231 {
232 static IP[64], bannedBy[24], reason[30], date, banTime, banID;
233
234 cache_get_value_name_int(0, "Date", date);
235 cache_get_value_name_int(0, "BanTime", banTime);
236 cache_get_value_name(0, "IP", IP);
237 cache_get_value_name(0, "BannedBy", bannedBy);
238 cache_get_value_name(0, "Reason", reason);
239 cache_get_value_name_int(0, "BanID", banID);
240
241 if(banTime > gettime())
242 {
243 // --> Ainda está banido
244 Dialog[0] = EOS;
245
246 format(Dialog, sizeof(Dialog),
247 ""#COLORT_YELLOW"Você está banido!\n\n\
248 "#COLORT_WHITE"Nick: "#COLORT_GREY"%s\n\
249 "#COLORT_WHITE"IP: "#COLORT_GREY"%s\n\
250 "#COLORT_WHITE"Banido pelo Administrador: "#COLORT_GREY"%s\n\
251 "#COLORT_WHITE"Motivo: "#COLORT_GREY"%s\n\
252 "#COLORT_WHITE"Ocorrido em: "#COLORT_GREY"%s\n\
253 "#COLORT_WHITE"Banido até "#COLORT_GREY"%s",
254 Player[playerid][pName], IP, bannedBy, reason, timestampToDate(date), timestampToDate(banTime));
255
256 showPlayerDialogEx(playerid, DIALOG_KICK, DIALOG_STYLE_MSGBOX, ""#COLOR_TITLE_DIALOG"Banido", Dialog, "Fechar", "");
257 kickEx(playerid);
258 }
259 else
260 {
261 // --> Banimento chegou ao fim
262 format(Query, sizeof(Query), "DELETE FROM `banlist` WHERE `BanID` = '%d'", banID);
263 mysql_tquery(MySQL_Connection, Query);
264 }
265 }
266 }
267 mysql_tquery_inline(MySQL_Connection, Query, using inline OnPlayerBanned);
268}
269
270public OnPlayerRegister(playerid)
271{
272 sendServerMessage(playerid, "Conta criada com sucesso! Você foi o %dº a criar uma conta.", Player[playerid][pAccountID]);
273 Player[playerid][pLogged] = true;
274 TogglePlayerSpectating(playerid, false);
275}
276
277
278public OnPlayerDisconnect(playerid, reason)
279{
280 if(!IsPlayerNPC(playerid))
281 {
282 if(Player[playerid][pTimerPlayer] != 0)
283 KillTimer(Player[playerid][pTimerPlayer]);
284
285 if(Player[playerid][pLogged])
286 orm_update(Player[playerid][pORM]);
287
288 orm_destroy(Player[playerid][pORM]);
289 clearPlayerVars(playerid);
290 }
291 return 1;
292}
293
294public OnPlayerSpawn(playerid)
295{
296 return 1;
297}
298
299public OnPlayerDeath(playerid, killerid, reason)
300{
301 return 1;
302}
303
304public OnPlayerText(playerid, text[])
305{
306 return 1;
307}
308
309public OnPlayerStateChange(playerid, newstate, oldstate)
310{
311 return 1;
312}
313
314public OnRconCommand(cmd[])
315{
316 return 1;
317}
318
319public OnPlayerRequestSpawn(playerid)
320{
321 if(!Player[playerid][pLogged])
322 return false;
323
324 return SpawnPlayer(playerid);
325}
326
327
328public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
329{
330 return 1;
331}
332
333public OnRconLoginAttempt(ip[], password[], success)
334{
335 return 1;
336}
337
338public OnPlayerUpdate(playerid)
339{
340 return 1;
341}
342
343public OnPlayerUpdateEx(playerid)
344{
345 if(!Player[playerid][pLogged])
346 {
347 Player[playerid][pTimeToLogin]++;
348
349 if(Player[playerid][pTimeToLogin] > (MINUTES_TO_LOGIN*60))
350 {
351 sendWarningMessage(playerid, "Você foi kickado por exceder o limite de tempo sem realizar log-in.");
352 kickEx(playerid);
353 return true;
354 }
355 }
356
357 return true;
358}
359
360public TimerOneMinute()
361{
362 foreach(new i : Player)
363 {
364 if(!Player[i][pLogged])
365 continue;
366
367 orm_update(Player[i][pORM]);
368 }
369}
370
371public OnPlayerClickPlayer(playerid, clickedplayerid, source)
372{
373 return 1;
374}
375
376public KickTimer(playerid)
377{
378 if(Player[playerid][pKicked])
379 return Kick(playerid);
380
381 return false;
382}
383
384public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
385{
386 if(!Player[playerid][pLogged])
387 return false;
388
389 return true;
390}
391
392public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
393{
394 if(result == -1)
395 {
396 sendErrorMessage(playerid, "Comando \"/%s\" não existente.", cmd);
397 return false;
398 }
399
400 return true;
401}
402
403
404
405public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
406{
407 if(Player[playerid][pDialogID] != dialogid)
408 {
409 BOT_setPlayerBan(playerid, 30, "Dialog-Hack");
410 sendWarningMessage(playerid, "Você foi kickado por suspeita de utilizar Dialog-Hack.");
411 return true;
412 }
413
414 switch(dialogid)
415 {
416 case DIALOG_REGISTER:
417 {
418 if(!response)
419 {
420 sendServerMessage(playerid, "Tudo bem, volte quando quiser criar uma conta!");
421 kickEx(playerid);
422 return true;
423 }
424
425 showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_1);
426 return true;
427 }
428 case DIALOG_REGISTER+1:
429 {
430 if(!response)
431 {
432 sendServerMessage(playerid, "Tudo bem, volte quando quiser criar uma conta!");
433 kickEx(playerid);
434 return true;
435 }
436
437 if(isnull(inputtext))
438 return showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_1, ""#COLORT_LIGHTRED"Você precisa digitar uma senha!");
439
440 if(!isValidPassword(inputtext))
441 return showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_1, ""#COLORT_LIGHTRED"Senha inválida (somente 6 à 30 dÃgitos).");
442
443 format(Player[playerid][registerPassword], 30, inputtext);
444 showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_2);
445 return true;
446 }
447 case DIALOG_REGISTER+2:
448 {
449 if(!response)
450 {
451 Player[playerid][registerPassword][0] = EOS;
452 showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_1);
453 return true;
454 }
455
456 if(isnull(inputtext))
457 return showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_2, ""#COLORT_LIGHTRED"Você precisa confirmar sua senha!");
458
459 if(!strcmp(Player[playerid][registerPassword], inputtext))
460 showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_3);
461 else
462 showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_2, ""#COLORT_LIGHTRED"As senhas não combinam!");
463
464 return true;
465 }
466 case DIALOG_REGISTER+3:
467 {
468 if(!response)
469 {
470 Player[playerid][registerPassword][0] = EOS;
471 showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_1);
472 return true;
473 }
474
475 if(isnull(inputtext))
476 return showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_3, ""#COLORT_LIGHTRED"Você precisa digitar algum e-mail!");
477
478 if(!isValidEmail(inputtext))
479 return showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_3, ""#COLORT_LIGHTRED"Digite um e-mail válido!");
480
481 if(SQL_verifyEmail(inputtext))
482 return showLoginMenu(playerid, MENU_LOGIN_REGISTER_STAGE_3, ""#COLORT_LIGHTRED"Este e-mail já está em uso.");
483
484 // --> Registro concluido
485
486 SHA256_PassHash(Player[playerid][registerPassword], "EveryBodyHatesCris", Player[playerid][pPassword], 65);
487 format(Player[playerid][pEmail], 64, inputtext);
488
489 Player[playerid][pRegisterDate] = gettime();
490 Player[playerid][pLastLogin] = gettime();
491
492 orm_insert(Player[playerid][pORM], "OnPlayerRegister", "d", playerid);
493 }
494 case DIALOG_LOGIN:
495 {
496 if(!response)
497 {
498 sendServerMessage(playerid, "Volte sempre.");
499 kickEx(playerid);
500 return true;
501 }
502
503 if(isnull(inputtext))
504 return showLoginMenu(playerid, MENU_LOGIN_INDEX, ""#COLORT_LIGHTRED"Digite sua senha!");
505
506 static hash[65];
507 SHA256_PassHash(inputtext, "EveryBodyHatesCris", hash, 65);
508
509 if(!strcmp(hash, Player[playerid][pPassword]))
510 {
511 Player[playerid][pLogged] = true;
512
513 sendServerMessage(playerid, "Logado com suceso!");
514 sendServerMessage(playerid, "Seu último login foi em %s.", timestampToDate(Player[playerid][pLastLogin]));
515
516 Player[playerid][pLastLogin] = gettime();
517
518 TogglePlayerSpectating(playerid, false);
519 }
520 else
521 {
522 Player[playerid][pMaxLoginAttempts]++;
523
524 if(Player[playerid][pMaxLoginAttempts] == MAX_LOGIN_ATTEMPTS)
525 {
526 sendWarningMessage(playerid, "Você foi kickado por excessos de tentativas.");
527 kickEx(playerid);
528 }
529 else showLoginMenu(playerid, MENU_LOGIN_INDEX, ""#COLORT_LIGHTRED"Senha inválida.");
530 }
531
532 return true;
533 }
534 case DIALOG_UNBAN:
535 {
536 if(!response)
537 {
538 DeletePVar(playerid, "BanID");
539 DeletePVar(playerid, "params");
540 return true;
541 }
542
543 static banID, params[64];
544 banID = GetPVarInt(playerid, "BanID");
545 GetPVarString(playerid, "params", params, sizeof(params));
546
547 switch(listitem)
548 {
549 case 0: // Unban Account
550 {
551 format(Query, sizeof(Query), "UPDATE `banlist` SET `AccountID` = '-1' WHERE `BanID` = '%d'", banID);
552 mysql_tquery(MySQL_Connection, Query);
553
554 sendAdminAction(playerid, "Você desbaniu a conta \"%s\".", params);
555 }
556 case 1: // Unban IP
557 {
558 format(Query, sizeof(Query), "UPDATE `banlist` SET `IP` = 'N/A' WHERE `BanID` = '%d'", banID);
559 mysql_tquery(MySQL_Connection, Query);
560
561 sendAdminAction(playerid, "Você desbaniu o IP \"%s\".", params);
562 }
563 case 2: // Unban all
564 {
565 format(Query, sizeof(Query),"DELETE FROM `banlist` WHERE `BanID` = '%d'", banID);
566 mysql_tquery(MySQL_Connection, Query);
567
568 sendAdminAction(playerid, "Você desbaniu tudo de \"%s\".", params);
569 }
570 }
571
572 return true;
573 }
574 }
575
576 return false;
577}
578
579//-------------------------------------------------------------------//
580//*************************** COMANDOS ******************************//
581//-------------------------------------------------------------------//
582
583CMD:setadmin(playerid, params[])
584{
585 if(!IsPlayerAdmin(playerid))
586 return sendErrorMessage(playerid, MSG_CMD_WITHOUT_PERMISSION);
587
588 static id, level;
589
590 if(sscanf(params, "ui", id, level))
591 return sendSyntaxMessage(playerid, "/setadmin <playerid/nick> <level>");
592
593 if(id == INVALID_PLAYER_ID)
594 return sendErrorMessage(playerid, MSG_PLAYER_OFF);
595
596 if(!(level >= 0 && level <= 5))
597 return sendSyntaxMessage(playerid, "/setadmin <playerid/nick> <level 0 a 5>");
598
599 Player[id][pAdmin] = level;
600
601 sendAdminAction(id, "%s setou você de level %d de Administrador.", Player[playerid][pName], level);
602 sendAdminAction(playerid, "Você setou %s de level %d de Administrador.", Player[id][pName], level);
603 return true;
604}
605
606CMD:ban(playerid, params[])
607{
608 if(Player[playerid][pAdmin] < 1)
609 return sendErrorMessage(playerid, MSG_CMD_WITHOUT_PERMISSION);
610
611 static id, dias, reason[30];
612
613 if(sscanf(params, "uds[30]", id, dias, reason))
614 return sendSyntaxMessage(playerid, "/ban <playerid/nick> <dias> <motivo>");
615
616 if(id == INVALID_PLAYER_ID)
617 return sendErrorMessage(playerid, MSG_PLAYER_OFF);
618
619 sendClientMessageToAllEx(COLOR_LIGHTRED, "[ADMIN]: %s foi banido pelo Admin %s por %d dias, motivo: %s", Player[id][pName], Player[playerid][pName], dias, reason);
620
621 setPlayerBan(playerid, id, dias, reason);
622 return true;
623}
624
625CMD:unban(playerid, params[])
626{
627 if(Player[playerid][pAdmin] < 1)
628 return sendErrorMessage(playerid, MSG_CMD_WITHOUT_PERMISSION);
629
630 if(isnull(params))
631 return sendSyntaxMessage(playerid, "/unban <accountid ou ip>");
632
633 mysql_format(MySQL_Connection, Query, sizeof(Query), "SELECT * FROM `banlist` WHERE (`AccountID` = '%d' OR `IP` = '%e') LIMIT 1", strval(params), params);
634 inline UnbanPlayer(tmp[])
635 {
636 if(cache_num_rows())
637 {
638 static banID, accountID, IP[64];
639 cache_get_value_name_int(0, "BanID", banID);
640 cache_get_value_name_int(0, "AccountID", accountID);
641 cache_get_value_name(0, "IP", IP);
642
643 SetPVarInt(playerid, "BanID", banID);
644 SetPVarString(playerid, "params", tmp);
645
646 format(Dialog, sizeof(Dialog), "Desbanir Conta "#COLORT_GREY"[%d]\n"#COLORT_WHITE"Desbanir IP "#COLORT_GREY"[%s]\n"#COLORT_WHITE"Desbanir ambos", accountID, IP);
647 showPlayerDialogEx(playerid, DIALOG_UNBAN, DIALOG_STYLE_LIST, ""#COLOR_TITLE_DIALOG"Unban", Dialog, "Selecionar", "Cancelar");
648 }
649 else sendErrorMessage(playerid, "Não foi possivel encontrar \"%s\" no banco de dados.", params);
650 }
651 mysql_tquery_inline(MySQL_Connection, Query, using inline UnbanPlayer, "s", params);
652 return true;
653}
654
655//-------------------------------------------------------------------//
656//**************************** FUNÇÕES ******************************//
657//-------------------------------------------------------------------//
658
659// --> Player
660
661stock loadPlayer(playerid)
662{
663 GetPlayerName(playerid, Player[playerid][pName], 24);
664 GetPlayerIp(playerid, Player[playerid][pIP], 64);
665
666 new ORM:ormid = Player[playerid][pORM] = orm_create("players");
667 orm_addvar_int(ormid, Player[playerid][pAccountID], "ID");
668 orm_addvar_string(ormid, Player[playerid][pName], 24, "Name");
669 orm_addvar_string(ormid, Player[playerid][pPassword], 65, "Password");
670 orm_addvar_string(ormid, Player[playerid][pEmail], 64, "Email");
671 orm_addvar_int(ormid, Player[playerid][pLastLogin], "LastLogin");
672 orm_addvar_int(ormid, Player[playerid][pRegisterDate], "RegisterDate");
673 orm_addvar_int(ormid, Player[playerid][pAdmin], "Admin");
674}
675
676stock showLoginMenu(playerid, menuid, message[] = "")
677{
678 switch(menuid)
679 {
680 case MENU_LOGIN_INDEX:
681 {
682 format(String, sizeof(String), "%s\n\n", message);
683 format(Dialog, sizeof(Dialog), ""#COLORT_WHITE"Bem-vindo novamente "#COLORT_YELLOW"%s!\n\n%s"#COLORT_WHITE"Digite sua senha para logar:", Player[playerid][pName], (isnull(message) ? "" : String));
684 showPlayerDialogEx(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, ""#COLOR_TITLE_DIALOG"Login", Dialog, "Entrar", "Sair");
685 }
686 case MENU_LOGIN_REGISTER:
687 {
688 format(Dialog, sizeof(Dialog), ""#COLORT_WHITE"Bem-vindo "#COLORT_YELLOW"%s!\n\n"#COLORT_WHITE"Vejo que você não tem uma conta, vamos criar uma?", Player[playerid][pName]);
689 showPlayerDialogEx(playerid, DIALOG_REGISTER, DIALOG_STYLE_MSGBOX, ""#COLOR_TITLE_DIALOG"Registro", Dialog, "Sim", "Não");
690 }
691 case MENU_LOGIN_REGISTER_STAGE_1:
692 {
693 format(String, sizeof(String), "%s\n\n", message);
694 format(Dialog, sizeof(Dialog), "%s"COLORT_WHITE"Para começar, digite uma senha de 6 à 30 dÃgitos:", (isnull(message) ? "" : String));
695 showPlayerDialogEx(playerid, DIALOG_REGISTER+1, DIALOG_STYLE_PASSWORD, ""#COLOR_TITLE_DIALOG"Registro [1/3]", Dialog, "Prosseguir", "Sair");
696 }
697 case MENU_LOGIN_REGISTER_STAGE_2:
698 {
699 format(String, sizeof(String), "%s\n\n", message);
700 format(Dialog, sizeof(Dialog), "%s"COLORT_WHITE"Agora para confirmar, digite novamente a senha escolhida:", (isnull(message) ? "" : String));
701 showPlayerDialogEx(playerid, DIALOG_REGISTER+2, DIALOG_STYLE_PASSWORD, ""#COLOR_TITLE_DIALOG"Registro [2/3]", Dialog, "Prosseguir", "Voltar");
702 }
703 case MENU_LOGIN_REGISTER_STAGE_3:
704 {
705 format(String, sizeof(String), "%s\n\n", message);
706 format(Dialog, sizeof(Dialog), "%s"COLORT_WHITE"Para terminar, digite um e-mail válido:", (isnull(message) ? "" : String));
707 showPlayerDialogEx(playerid, DIALOG_REGISTER+3, DIALOG_STYLE_INPUT, ""#COLOR_TITLE_DIALOG"Registro [3/3]", Dialog, "Concluir", "Voltar");
708 }
709 }
710 return true;
711}
712
713stock clearPlayerVars(playerid)
714{
715 // Data
716 Player[playerid][pName][0] = EOS;
717 Player[playerid][pAccountID] = 0;
718 Player[playerid][pPassword][0] = EOS;
719 Player[playerid][pEmail][0] = EOS;
720 Player[playerid][pRegisterDate] = 0;
721 Player[playerid][pLastLogin] = 0;
722
723 // Non-data
724 Player[playerid][pKicked] = false;
725 Player[playerid][pDialogID] = 0;
726 Player[playerid][pLogged] = false;
727 Player[playerid][pMaxLoginAttempts] = 0;
728 Player[playerid][pIP][0] = EOS;
729 Player[playerid][pTimerPlayer] = 0;
730 Player[playerid][pTimeToLogin] = 0;
731
732 // Registro
733 Player[playerid][registerPassword][0] = EOS;
734}
735
736stock SQL_isPlayerBanned(playerid)
737{
738 static Cache:result, exists;
739
740 mysql_format(MySQL_Connection, Query, sizeof(Query), "SELECT * FROM `banlist` WHERE (`Name` = '%e' OR `IP` = '%e') LIMIT 1", Player[playerid][pName]);
741 result = mysql_query(MySQL_Connection, Query, true);
742 exists = !!cache_num_rows();
743
744 cache_delete(result);
745 return exists;
746}
747
748stock setPlayerBan(adminid, id, days, reason[])
749{
750 static accountid;
751 accountid = Player[id][pAccountID];
752
753 if(accountid == 0)
754 accountid = -1;
755
756 days = gettime()+((60*60*24)*days);
757
758 mysql_format(MySQL_Connection, Query, sizeof(Query), "INSERT INTO `banlist`(`AccountID`, `IP`, `Reason`, `Date`, `BannedBy`, `BanTime`) VALUES('%d', '%e', '%e', '%d', '%e', '%d')", accountid, Player[id][pIP], reason, gettime(), Player[adminid][pName], days);
759 mysql_tquery(MySQL_Connection, Query);
760 return kickEx(id);
761}
762
763stock BOT_setPlayerBan(id, days, reason[])
764{
765 static accountid;
766 accountid = Player[id][pAccountID];
767
768 if(accountid == 0)
769 accountid = -1;
770
771 days = gettime()+((60*60*24)*days);
772
773 mysql_format(MySQL_Connection, Query, sizeof(Query), "INSERT INTO `banlist`(`AccountID`, `IP`, `Reason`, `Date`, `BannedBy`, `BanTime`) VALUES('%d', '%e', '%e', '%d', 'BOT', '%d')", accountid, Player[id][pIP], reason, gettime(), days);
774 mysql_tquery(MySQL_Connection, Query);
775 return Kick(id);
776}
777
778
779// --> Utilidades
780
781stock sendClientMessageToAllEx(color, const str[], va_args<>)
782{
783 va_format(String, 144, str, va_start<2>);
784 return SendClientMessageToAll(color, String);
785}
786
787stock sendClientMessageEx(playerid, color, const str[], va_args<>)
788{
789 va_format(String, 144, str, va_start<3>);
790 return SendClientMessage(playerid, color, String);
791}
792
793stock showPlayerDialogEx(playerid, dialogid, style, caption[], info[], button1[], button2[])
794{
795 Player[playerid][pDialogID] = dialogid;
796 ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
797 return dialogid;
798}
799
800stock kickEx(playerid)
801{
802 if(Player[playerid][pKicked])
803 return false;
804
805 Player[playerid][pKicked] = true;
806 SetTimerEx("KickTimer", 200, false, "d", playerid);
807 return true;
808}
809
810stock isValidPassword(password[])
811{
812 if(30 < strlen(password) || strlen(password) < 6)
813 return false;
814
815 return true;
816}
817
818stock SQL_verifyEmail(email[]) // Checar se o email já é usado, true = sim, false = não
819{
820 static Cache:result, exists;
821
822 mysql_format(MySQL_Connection, Query, sizeof(Query), "SELECT * FROM `players` WHERE `Email` = '%e' LIMIT 1", email);
823 result = mysql_query(MySQL_Connection, Query, true);
824 exists = !!cache_num_rows();
825
826 cache_delete(result);
827 return exists;
828}
829
830stock isValidEmail(email[])
831{
832 static const ValidEmails[17][16] = {
833 {"@gmail.com"},
834 {"@hotmail.com.br"},
835 {"@hotmail.com"},
836 {"@globo.com"},
837 {"@globomail.com"},
838 {"@uol.com"},
839 {"@outlook.com"},
840 {"@live.com"},
841 {"@msn.com"},
842 {"@yahoo.com.br"},
843 {"@ymail.com"},
844 {"@rocketmail.com"},
845 {"@ig.com.br"},
846 {"@pop.com.br"},
847 {"@bol.com.br"},
848 {"@oi.com.br"},
849 {"@r7.com"}
850 };
851
852 for(new i; i < sizeof ValidEmails; i++)
853 if(strfind(email, ValidEmails[i], false) != -1)
854 return true;
855
856 return false;
857}
858
859stock timestampToDate(datetime, style = 0)
860{
861 static tm<timestamp>;
862 localtime(Time:datetime, timestamp);
863
864 switch(style)
865 {
866 case 0: strftime(String, 64, "%d/%m/%Y Ã s %X", timestamp);
867 case 1: strftime(String, 64, "%d/%m/%Y", timestamp);
868 }
869 return String;
870}
871
872stock hideDialog(playerid)
873 return showPlayerDialogEx(playerid, -1, DIALOG_STYLE_MSGBOX, " ", " ", " ", " ");
874
875stock getNumberOfPlayersOnThisIP(test_ip[]) // --> by maxips.pwn, atualizei para uma versão mais compacta
876{
877 static against_ip[64], count;
878 count = 0;
879
880 foreach(new i : Player)
881 {
882 GetPlayerIp(i, against_ip, 64);
883 if(!strcmp(against_ip, test_ip))
884 count++;
885 }
886
887 return count;
888}