Advertisement
S4T3K

s_register

Apr 14th, 2014
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.19 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <hash>
  4. #include <sscanf2>
  5. #include <s_useful>
  6.  
  7. #define MAILER_URL "s4t3kx.alwaysdata.net/mailer.php"
  8. #define MAIL_ADMIN "s4t3kx@alwaysdata.net"
  9. #include <mailer>
  10.  
  11. #define HOTE ""
  12. #define USER ""
  13. #define DB ""
  14. #define PASS ""
  15.  
  16. #define D_LOGIN 1998
  17. #define D_REGISTER 1999
  18. #define D_AEMAIL 2000
  19. #define D_SEMAIL 2001
  20. #define D_ITEL 2002
  21.  
  22. #define WH_LENGHT WHIRLPOOL_LENGTH
  23.  
  24. static MySQL, requete[1024];
  25. static bool:haveLoggedIn[MAX_PLAYERS char];
  26. static pName[MAX_PLAYERS][21];
  27.  
  28. #if defined GetName
  29.     #undef GetName
  30. #endif
  31.  
  32. #define GetName(%1) (pName[%1])
  33.  
  34. forward KickPublic(playerid);
  35. forward OnResponseSpawn(playerid);
  36. public KickPublic(playerid) { Kick(playerid); }
  37.  
  38. stock KickWithMessage(playerid, message[])
  39. {
  40.     if(!IsPlayerConnected(playerid)) return 0;
  41.     SendClientMessage(playerid, -1, message);
  42.     SetTimerEx("KickPublic", 2, false, "i", playerid);
  43.     return 1;
  44. }
  45.  
  46. stock FinInscription(playerid)
  47. {
  48.     SendClientMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Inscription terminée ! Vous allez maintenant pouvoir Spawn !");
  49.     SpawnPlayer(playerid);
  50.         haveLoggedIn{playerid} = true;
  51.     mysql_format(MySQL, requete, sizeof(requete), "UPDATE `Joueurs` SET `fin_inscription` = 1 WHERE `pseudo` = '%s'", GetName(playerid));
  52.     mysql_tquery(MySQL, requete);
  53.     return 1;
  54. }
  55.  
  56. public OnFilterScriptInit()
  57. {
  58.     MySQL = mysql_connect(HOTE, USER, DB, PASS);
  59.     if(MySQL) print(">> Connexion a l'hote reussie !");
  60.     else mysql_reconnect(MySQL);
  61.     print(">> s_register chargé !");
  62.     return 1;
  63. }
  64.  
  65. public OnFilterScriptExit()
  66. {
  67.     mysql_close(MySQL);
  68.     if(!MySQL) printf(">> Déconnexion de l'hôte réussie.");
  69.     else mysql_close(MySQL);
  70.     printf(">> s_register déchargé !");
  71.     return 1;
  72. }
  73.  
  74. public OnPlayerRequestSpawn(playerid)
  75. {
  76.         if(haveLoggedIn{playerid}) return 0;
  77.     GetPlayerName(playerid, pName[playerid], 21);
  78.     mysql_format(MySQL, requete, sizeof(requete), "SELECT * FROM `Joueurs` WHERE `pseudo` = '%s'", GetName(playerid));
  79.     mysql_tquery(MySQL, requete, "OnResponseSpawn", "i", playerid);
  80.     return 0;
  81. }
  82.  
  83. public OnPlayerRequestClass(playerid, classid)
  84. {
  85.     #pragma unused classid
  86.     SendClientMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Cliquez sur \"Spawn\" pour vous connecter/enregistrer.");
  87.     return 0;
  88. }
  89.  
  90. public OnPlayerDisconnect(playerid, reason)
  91. {
  92.     #pragma unused reason // inutile mais au moins c'est clair
  93.     haveLoggedIn{playerid} = false;
  94.     return 1;
  95. }
  96.  
  97. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  98. {
  99.     if(dialogid == D_LOGIN)
  100.     {
  101.         if(!response) return KickWithMessage(playerid, "{FF0000}[Erreur]{FFFFFF} Vous devez être connecté pour spawn sur le serveur.");
  102.         mysql_format(MySQL, requete, sizeof(requete), "SELECT `password` FROM `Joueurs` WHERE `pseudo` = '%s'", GetName(playerid));
  103.         mysql_tquery(MySQL, requete);
  104.         if(cache_num_rows() > 0)
  105.         {
  106.             new hashed[WH_LENGHT+1], actual_pass[WH_LENGHT+1], salt[WH_LENGHT+1], salted[150], essais;
  107.             cache_get_field_content(0, "password", actual_pass, MySQL, WH_LENGHT+1);
  108.             cache_get_field_content(0, "salt", salt, MySQL, WH_LENGHT+1);
  109.             strcat(salted, inputtext);
  110.             strcat(salted, salt);
  111.             whirlpool(salted, hashed, WH_LENGHT+1);
  112.             if(strcmp(hashed, actual_pass, false) != 0)
  113.             {
  114.                 if(essais < 2)
  115.                 {
  116.                     ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_PASSWORD, "{04AB94}Connexion", "Le mot de passe entré est incorrect. Entrez votre \n mot de passe dans la case ci-dessous.", "Valider", "Retour");
  117.                     essais++;
  118.                 }
  119.                 else
  120.                 {
  121.                     ShowPlayerDialog(playerid, D_SEMAIL, DIALOG_STYLE_INPUT, "{04AB94}Récupération", "Vous avez entré trois fois de suite un mauvais mot de passe. Par conséquent, \n vous devez entrer votre adresse e-mail mise à l'inscription pour récupérer \n votre compte perdu. Si l'adresse mail n'est pas identique deux fois de suite, votre compte \n sera banni.", "Valider", "");
  122.                 }
  123.             }
  124.             else SpawnPlayer(playerid), haveLoggedIn{playerid} = true;
  125.             return 1;
  126.         }
  127.     }
  128.  
  129.     if(dialogid == D_REGISTER)
  130.     {
  131.         if(!response) return KickWithMessage(playerid, "Vous devez être enregistré pour jouer.");
  132.         if(strlen(inputtext) < 6)
  133.         {
  134.             ShowPlayerDialog(playerid, D_REGISTER, DIALOG_STYLE_PASSWORD, "{04AB94}Enregistrement", "La taille du mot de passe doit être comprise entre {04AB94}6{FFFFFF} et {04AB94}64{FFFFFF} caractères.", "Valider", "Retour");
  135.             return 1;
  136.         }
  137.         new salt[WH_LENGHT+1], whashed[WH_LENGHT+1], heure[6], salted1[258];
  138.         random_string(129, salt, 129);
  139.         strcat(salted1, inputtext);
  140.         strcat(salted1, salt);
  141.         whirlpool(salted1, whashed, WH_LENGHT+1);
  142.         getdate(heure[0], heure[1], heure[2]);
  143.         gettime(heure[3], heure[4], heure[5]);
  144.         mysql_format(MySQL, requete, sizeof(requete), "INSERT INTO `Joueurs` VALUES (NULL, '%s', '%s', '%s', '%d-%d-%d %d:%d:%d', NULL, NULL, 0)", GetName(playerid), whashed, salt, heure[0], heure[1], heure[2], heure[3], heure[4], heure[5]);
  145.         mysql_tquery(MySQL, requete);
  146.         if(cache_affected_rows() > 0)
  147.         {
  148.             SendClientMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Votre compte a été créé avec succès !");
  149.             ShowPlayerDialog(playerid, D_AEMAIL, DIALOG_STYLE_INPUT, "{04AB94}Enregistrement", "Ajoutez votre adresse e-mail pour pouvoir directement réinitialiser votre mot de passe \n en cas d'oubli.", "Valider", "Retour");
  150.             //SpawnPlayer(playerid);
  151.         }
  152.         else return KickWithMessage(playerid, "{FF0000}[Admin]{FFFFFF} Le système d'enregistrement a rencontré un problème lors de la création de votre compte. Veuillez vous déconnecter et recréer votre compte.");
  153.     }
  154.  
  155.     if(dialogid == D_AEMAIL)
  156.     {
  157.         if(!response) return KickWithMessage(playerid, "{FF0000}[Admin]{FFFFFF} Vous devez entrer une adresse e-mail.");
  158.         if(!strfind(inputtext, "@") || !strfind(inputtext, "."))
  159.         {
  160.             ShowPlayerDialog(playerid, D_AEMAIL, DIALOG_STYLE_INPUT, "{04AB94}Enregistrement", "L'adresse email entrée est invalide. Veuillez l'entrer à nouveau.", "Valider", "Retour");
  161.             return 1;
  162.         }
  163.         else
  164.         {
  165.             mysql_format(MySQL, requete, sizeof(requete), "SELECT `pseudo` FROM `Joueurs` WHERE `e_mail` = '%s'", inputtext);
  166.             mysql_tquery(MySQL, requete);
  167.             if(cache_num_rows() > 0)
  168.             {
  169.                 new mess[144], pseudow[MAX_PLAYER_NAME+1];
  170.                 cache_get_field_content(0, "pseudo", pseudow, MySQL, sizeof(pseudow));
  171.                 mysql_format(MySQL, mess, sizeof(mess), "{FF0000}[Admin]{FFFFFF} L'adresse email renseignée est déjà liée à un compte (Pseudo : %s)", pseudow);
  172.                 KickWithMessage(playerid, mess);
  173.                 return 1;
  174.             }
  175.             mysql_format(MySQL, requete, sizeof(requete), "UPDATE `Joueurs` SET `e_mail` = '%e' WHERE `pseudo` = '%s'", inputtext, GetName(playerid));
  176.             mysql_tquery(MySQL, requete);
  177.             if(cache_affected_rows() > 0)
  178.             {
  179.                 SendClientMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Votre adresse e-mail a été liée à votre compte avec succès !");
  180.                 ShowPlayerDialog(playerid, D_ITEL, DIALOG_STYLE_INPUT, "{04AB94}Enregistrement", "Veuillez ajouter votre numéro de téléphone InRealLife également. Il servira également de moyen de récupération de mot de passe en cas d'oubli.", "Valider", "Retour");
  181.                 //SpawnPlayer(playerid);
  182.                 return 1;
  183.             }
  184.             else return KickWithMessage(playerid, "{FF0000}[Admin]{FFFFFF} Une erreur a eu lieu lors de la liaison de votre adresse e-mail à votre compte.");
  185.         }
  186.     }
  187.  
  188.     if(dialogid == D_SEMAIL)
  189.     {
  190.         if(!response)
  191.         {
  192.             ShowPlayerDialog(playerid, D_SEMAIL, DIALOG_STYLE_INPUT, "{04AB94}Récupération", "Vous devez entrer une adresse e-mail valide.", "Valider", "");
  193.             return 1;
  194.         }
  195.         mysql_format(MySQL, requete, sizeof(requete), "SELECT `e_mail` FROM `Joueurs` WHERE `pseudo` = '%s' LIMIT 1", GetName(playerid));
  196.         mysql_tquery(MySQL, requete);
  197.         if(cache_num_rows() <= 0) return Ban(playerid);
  198.         else
  199.         {
  200.             new email[60];
  201.             cache_get_field_content(0, "e_mail", email, MySQL, sizeof(email));
  202.             if(!strcmp(inputtext, email, true)) return Ban(playerid);
  203.             else
  204.             {
  205.                 new mess[1024], mess1[256], rand_pass[16], salt[129], salted[150], hashed_random[WH_LENGHT+1];
  206.                 cache_get_field_content(0, "salt", salt, MySQL, 129);
  207.                 random_string(16, rand_pass, 16);
  208.                 strcat(salted, rand_pass);
  209.                 strcat(salted, salt);
  210.                 whirlpool(salted, hashed_random, WH_LENGHT+1);
  211.                 mysql_format(MySQL, requete, sizeof(requete), "UPDATE `Joueurs` SET `password` = '%s' WHERE `pseudo` = '%s'", hashed_random, GetName(playerid));
  212.                 mysql_tquery(MySQL, requete);
  213.                 mess = "Bonjour. Ce mail vous est envoyé à la suite de votre demande de réinitialisation de mot de passe.\n Un nouveau mot de passe a été généré aléatoirement à partir d'un algorithme puissant et sécurisé, puis re-hashé pour votre sécurité.";
  214.                 format(mess1, sizeof(mess1), "Si vous rencontrez des difficultés, demandez conseil à l'Admin de votre serveur. Personne ne lit les mails de cette boîte : c'est un automate.\n\n\n Le nouveau mot de passe généré aléatoirement est : %s . Pour encore plus de sécurité, il vous est recommandé de le changer une fois InGame via la commande /changepass.\n\n Toute l'équipe vous souhaite un excellent jeu parmi nous.", rand_pass);
  215.                 strcat(mess, mess1);
  216.                 SendMail(inputtext, MAIL_ADMIN, "Autobot [s_register]", "Réintialisation de mot de passe [s_register]", mess);
  217.                 return 1;
  218.             }
  219.         }
  220.     }
  221.  
  222.     if(dialogid == D_ITEL)
  223.     {
  224.         if(!response)
  225.         {
  226.             ShowPlayerDialog(playerid, D_ITEL, DIALOG_STYLE_INPUT, "{04AB94}Enregistrement", "Vous devez entrer un numéro de téléphone valide (commençant par {04AB94}06{FFFFFF} ou par {04AB94}07{FFFFFF}). Les téléphones fixes sont aussi acceptés, à condition qu'ils lisent les SMS.", "Valider", "Retour");
  227.             return 1;
  228.         }
  229.         new debut[3];
  230.         strmid(debut, inputtext, 0, 2);
  231.         if(!strcmp(debut, "01", true) || !strcmp(debut, "02", true) || !strcmp(debut, "03", true) || !strcmp(debut, "04", true) || !strcmp(debut, "05", true) || !strcmp(debut, "06", true) || !strcmp(debut, "07", true) || !strcmp(debut, "09", true))
  232.         {
  233.             ShowPlayerDialog(playerid, D_ITEL, DIALOG_STYLE_INPUT, "{04AB94}Enregistrement", "Vous devez entrer un numéro de téléphone valide (commençant par {04AB94}06{FFFFFF} ou par {04AB94}07{FFFFFF}). Les téléphones fixes sont aussi acceptés, à condition qu'ils lisent les SMS.", "Valider", "Retour");
  234.             return 1;
  235.         }
  236.         if(strlen(inputtext) != 10)
  237.         {
  238.             ShowPlayerDialog(playerid, D_ITEL, DIALOG_STYLE_INPUT, "{04AB94}Enregistrement", "Vous devez entrer un numéro de téléphone valide (commençant par {04AB94}06{FFFFFF} ou par {04AB94}07{FFFFFF}). Les téléphones fixes sont aussi acceptés, à condition qu'ils lisent les SMS.", "Valider", "Retour");
  239.             return 1;
  240.         }
  241.         mysql_format(MySQL, requete, sizeof(requete), "UPDATE `Joueurs` SET `telephone` = '%e' WHERE `pseudo` = '%s'", inputtext, GetName(playerid));
  242.         mysql_tquery(MySQL, requete);
  243.         if(cache_affected_rows() > 0)
  244.         {
  245.             FinInscription(playerid);
  246.             return 1;
  247.         }
  248.         else return KickWithMessage(playerid, "{FF0000}[Admin]{FFFFFF} Il y a eu un problème d'insertion de numéro de téléphone. Veuillez vous reconnecter et recommencer l'inscription.");
  249.  
  250.     }
  251.     return 0;
  252. }
  253.  
  254.  
  255. public OnPlayerCommandText(playerid, cmdtext[])
  256. {
  257.     new cmd[26], params[128];
  258.     sscanf(cmdtext, "'/'s[26] s[128]", cmd, params);
  259.  
  260.     if(!strcmp(cmd, "changepass", true))
  261.     {
  262.         if(!haveLoggedIn{playerid}) return 0;
  263.         if(!strlen(params)) return SendClientMessage(playerid, -1, "{33CCFF}USAGE:{FFFFFF} /changepass [Nouveau pass]");
  264.         new pass[20], hpass[WH_LENGHT+1];
  265.         sscanf(params, "s[20]", pass);
  266.         whirlpool(pass, hpass, WH_LENGHT+1);
  267.         mysql_format(MySQL, requete, sizeof(requete), "UPDATE `Joueurs` SET `password` = '%e' WHERE `pseudo` = '%s'", hpass, GetName(playerid));
  268.         mysql_tquery(MySQL, requete);
  269.         if(cache_num_rows() > 0) return SendClientMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Votre mot de passe a été changé avec succès. Il a également été hashé par mesure de sécurité.");
  270.         else return SendClientMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Il y a eu un problème lors du changement de votre mot de passe. Veuillez réessayer avec la commande.");
  271.     }
  272.  
  273.     if(!strcmp(cmd, "achangepass", true))
  274.     {
  275.         if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "{FF0000}[Erreur]{FFFFFF} Vous n'êtes pas autorisé à utiliser cette commande (admins rcon connectés seulement)");
  276.         if(!strlen(params)) return SendClientMessage(playerid, -1, "{33CCFF}USAGE:{FFFFFF} /achangepass [Nom d'utilisateur] [Nouveau pass]");
  277.         new pass[20], user[MAX_PLAYER_NAME+1], hpass[WH_LENGHT+1];
  278.         sscanf(params, "s[MAX_PLAYER_NAME+1] s[20]", user, pass);
  279.         whirlpool(pass, hpass, WH_LENGHT+1);
  280.         mysql_format(MySQL, requete, sizeof(requete), "UPDATE `Joueurs` SET `password` = '%e' WHERE `pseudo` = '%s'", hpass, user);
  281.         mysql_tquery(MySQL, requete);
  282.         if(cache_num_rows() > 0) return SendClientMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Le mot de passe de %s a été changé. Par mesure de sécurité, il a également été hashé.");
  283.         else return SendClientFormattedMessage(playerid, -1, "{FF0000}[Admin]{FFFFFF} Il y a eu un problème lors du changement de mot de passe de %s. Veuillez réessayer avec la commande.", user);
  284.     }
  285.     return 0;
  286. }
  287.  
  288. public OnResponseSpawn(playerid)
  289. {
  290.     new phrase_login[512];
  291.     if(cache_num_rows() > 0)
  292.     {
  293.         new var = cache_get_field_content_int(0, "fin_inscription", MySQL);
  294.         if(var == 0)
  295.         {
  296.             ShowPlayerDialog(playerid, D_AEMAIL, DIALOG_STYLE_INPUT, "{04AB94}Enregistrement{FFFFFF} (reprise)", "Vous reprenez l'inscription à l'insertion d'adresse e-mail.", "Valider", "Retour");
  297.             return 1;
  298.         }
  299.         else
  300.         {
  301.             format(phrase_login, sizeof(phrase_login), "Bienvenue sur le serveur, %s.\n Il semblerait que votre compte soit enregistré. Entrez votre mot de passe\n dans la barre ci-dessous. Attention : Les mots de passe sont sensibles à la casse !", GetName(playerid));
  302.             ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_PASSWORD, "{04AB94}Connexion", phrase_login, "Valider", "Retour");
  303.         }
  304.     }
  305.     else
  306.     {
  307.         format(phrase_login, sizeof(phrase_login), "Bienvenue sur le serveur, %s.\n Il semblerait que vous ne soyez pas inscrit sur le serveur. Entrez votre\n mot de passe désiré dans la barre ci-dessous.", GetName(playerid));
  308.         ShowPlayerDialog(playerid, D_REGISTER, DIALOG_STYLE_PASSWORD, "{04AB94}Enregistrement", phrase_login, "Valider", "Retour");
  309.     }
  310.     return 1;
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement