-DeimoS-

Регистрация MySQL R40

Sep 9th, 2016 (edited)
3,203
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //http://pro-pawn.ru/showthread.php?10548-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0-MySQL-R39-R40
  2.  
  3.  
  4. #include <a_samp>
  5. #include <a_mysql>
  6.  
  7. #define MYSQL_HOST                "localhost"//Адрес, по которому расположен MySQL-Сервер
  8. #define MYSQL_USER                "root"//Имя пользователя, на которого была создана база данных
  9. #define MYSQL_DATABASE            "sa-mp"// Имя базы данных
  10. #define MYSQL_PASSWORD            ""//Пароль для доступа к серверу MySQL
  11.  
  12. new MySQL: mysql_connect_ID;
  13.  
  14. enum e_DIALOG_IDs
  15. {
  16.     dKickMessage,
  17.     dRegister,
  18.     dLogin
  19. };
  20.  
  21. enum e_PLAYER_INFO
  22. {
  23.     pID,
  24.     pName[MAX_PLAYER_NAME],
  25.     pPassword[31]
  26. };
  27. new pInfo[MAX_PLAYERS][e_PLAYER_INFO];
  28. new player_is_authorized[MAX_PLAYERS char];
  29.  
  30. //Макросы-функции
  31. #define IsPlayerAuthorized(%0)             player_is_authorized{%0}
  32. #define SetPlayerAuthorized(%0,%1)         player_is_authorized{%0} = %1
  33.  
  34. //Макросы для удобства
  35. #define PLAYER_OFFLINE          0
  36. #define PLAYER_ONLINE           1
  37.  
  38. main()
  39. {
  40.     print("\n----------------------------------");
  41.     print(" Blank Gamemode by your name here");
  42.     print("----------------------------------\n");
  43. }
  44.  
  45. public OnGameModeInit()
  46. {
  47.     mysql_connect_ID = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);
  48.     switch(mysql_errno())
  49.     {
  50.         case 0: print("Подключение к базе данных удалось");
  51.         case 1044: print("Подключение к базе данных не удалось [Указано неизвестное имя пользователя]");
  52.         case 1045: print("Подключение к базе данных не удалось [Указан неизвестный пароль]");
  53.         case 1049: print("Подключение к базе данных не удалось [Указана неизвестная база данных]");
  54.         case 2003: print("Подключение к базе данных не удалось [Хостинг с базой данных недоступен]");
  55.         case 2005: print("Подключение к базе данных не удалось [Указан неизвестный адрес хостинга]");
  56.         default: printf("Подключение к базе данных не удалось [Неизвестная ошибка. Код ошибки: %d]", mysql_errno());
  57.     }
  58.    
  59.    
  60.     mysql_query(mysql_connect_ID, "SET character_set_client = 'cp1251'", false);
  61.     mysql_query(mysql_connect_ID, "SET character_set_results = 'cp1251'", false);
  62.     mysql_query(mysql_connect_ID, "SET SESSION character_set_server='utf8'", false);
  63.  
  64.     // Don't use these lines if it's a filterscript
  65.     SetGameModeText("pro-pawn.ru");
  66.     AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
  67.     return 1;
  68. }
  69.  
  70. public OnGameModeExit()
  71. {
  72.     mysql_close(mysql_connect_ID);
  73.     return 1;
  74. }
  75.  
  76. public OnPlayerRequestClass(playerid, classid)
  77. {
  78.     SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
  79.     SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
  80.     SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
  81.     return 1;
  82. }
  83.  
  84. public OnPlayerConnect(playerid)
  85. {
  86.     GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME);
  87.     new query_string[49+MAX_PLAYER_NAME-4];
  88.     format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);
  89.     mysql_tquery(mysql_connect_ID, query_string, "FindPlayerInTable","i", playerid);
  90.     return 1;
  91. }
  92.  
  93. public OnPlayerDisconnect(playerid, reason)
  94. {
  95.     SaveAccount(playerid);
  96.     RemovePlayerInfo(playerid);
  97.     return 1;
  98. }
  99.  
  100. public OnPlayerSpawn(playerid)
  101. {
  102.     return 1;
  103. }
  104.  
  105. public OnPlayerDeath(playerid, killerid, reason)
  106. {
  107.     return 1;
  108. }
  109.  
  110. public OnVehicleSpawn(vehicleid)
  111. {
  112.     return 1;
  113. }
  114.  
  115. public OnVehicleDeath(vehicleid, killerid)
  116. {
  117.     return 1;
  118. }
  119.  
  120. public OnPlayerText(playerid, text[])
  121. {
  122.     if(!IsPlayerAuthorized(playerid))
  123.     {
  124.         SendClientMessage(playerid, -1, "Вы не авторизировались и не можете писать в чат!");
  125.         return 0;
  126.     }
  127.     return 1;
  128. }
  129.  
  130. public OnPlayerCommandText(playerid, cmdtext[])
  131. {
  132.     if(!IsPlayerAuthorized(playerid)) return SendClientMessage(playerid, -1, "Вы не авторизировались и не можете использовать команды!");
  133.     if (strcmp("/mycommand", cmdtext, true, 10) == 0)
  134.     {
  135.         // Do something here
  136.         return 1;
  137.     }
  138.     return 0;
  139. }
  140.  
  141. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  142. {
  143.     return 1;
  144. }
  145.  
  146. public OnPlayerExitVehicle(playerid, vehicleid)
  147. {
  148.     return 1;
  149. }
  150.  
  151. public OnPlayerStateChange(playerid, newstate, oldstate)
  152. {
  153.     return 1;
  154. }
  155.  
  156. public OnPlayerEnterCheckpoint(playerid)
  157. {
  158.     return 1;
  159. }
  160.  
  161. public OnPlayerLeaveCheckpoint(playerid)
  162. {
  163.     return 1;
  164. }
  165.  
  166. public OnPlayerEnterRaceCheckpoint(playerid)
  167. {
  168.     return 1;
  169. }
  170.  
  171. public OnPlayerLeaveRaceCheckpoint(playerid)
  172. {
  173.     return 1;
  174. }
  175.  
  176. public OnRconCommand(cmd[])
  177. {
  178.     return 1;
  179. }
  180.  
  181. public OnPlayerRequestSpawn(playerid)
  182. {
  183.     return 1;
  184. }
  185.  
  186. public OnObjectMoved(objectid)
  187. {
  188.     return 1;
  189. }
  190.  
  191. public OnPlayerObjectMoved(playerid, objectid)
  192. {
  193.     return 1;
  194. }
  195.  
  196. public OnPlayerPickUpPickup(playerid, pickupid)
  197. {
  198.     return 1;
  199. }
  200.  
  201. public OnVehicleMod(playerid, vehicleid, componentid)
  202. {
  203.     return 1;
  204. }
  205.  
  206. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  207. {
  208.     return 1;
  209. }
  210.  
  211. public OnVehicleRespray(playerid, vehicleid, color1, color2)
  212. {
  213.     return 1;
  214. }
  215.  
  216. public OnPlayerSelectedMenuRow(playerid, row)
  217. {
  218.     return 1;
  219. }
  220.  
  221. public OnPlayerExitedMenu(playerid)
  222. {
  223.     return 1;
  224. }
  225.  
  226. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  227. {
  228.     return 1;
  229. }
  230.  
  231. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  232. {
  233.     return 1;
  234. }
  235.  
  236. public OnRconLoginAttempt(ip[], password[], success)
  237. {
  238.     return 1;
  239. }
  240.  
  241. public OnPlayerUpdate(playerid)
  242. {
  243.     return 1;
  244. }
  245.  
  246. public OnPlayerStreamIn(playerid, forplayerid)
  247. {
  248.     return 1;
  249. }
  250.  
  251. public OnPlayerStreamOut(playerid, forplayerid)
  252. {
  253.     return 1;
  254. }
  255.  
  256. public OnVehicleStreamIn(vehicleid, forplayerid)
  257. {
  258.     return 1;
  259. }
  260.  
  261. public OnVehicleStreamOut(vehicleid, forplayerid)
  262. {
  263.     return 1;
  264. }
  265.  
  266. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  267. {
  268.     switch(dialogid)
  269.     {
  270.         case dRegister:
  271.         {
  272.             if(!response)
  273.             {
  274.                 ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от регистрации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Выход", "");
  275.                 return Kick(playerid);
  276.             }
  277.             if(!strlen(inputtext)) return ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить регистрацию не введя пароль!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
  278.             else if(strlen(inputtext) < 4) return ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль слишком короткий!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
  279.             else if(strlen(inputtext) > 30) return ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль слишком длинный!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
  280.             for(new i = strlen(inputtext)-1; i != -1; i--)
  281.             {
  282.                 switch(inputtext[i])
  283.                 {
  284.                     case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue;
  285.                     default: return ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль содержит запрещённые символы!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
  286.                 }
  287.             }
  288.             pInfo[playerid][pPassword][0] = EOS;
  289.             strins(pInfo[playerid][pPassword], inputtext, 0);
  290.             CreateNewAccount(playerid, pInfo[playerid][pPassword]);
  291.             return 1;
  292.         }
  293.         case dLogin:
  294.         {
  295.             if(!response)
  296.             {
  297.                 ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от авторизации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Выход", "");
  298.                 return Kick(playerid);
  299.             }
  300.             if(!strlen(inputtext)) return ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить авторизацию не введя пароль!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
  301.             for(new i = strlen(inputtext)-1; i != -1; i--)
  302.             {
  303.                 switch(inputtext[i])
  304.                 {
  305.                     case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue;
  306.                     default: return ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
  307.                 }
  308.             }
  309.             if(!strcmp(pInfo[playerid][pPassword], inputtext))
  310.             {
  311.                 new query_string[49+MAX_PLAYER_NAME];
  312.                 format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);
  313.                 mysql_tquery(mysql_connect_ID, query_string, "UploadPlayerAccount","i", playerid);
  314.             }
  315.             else
  316.             {
  317.                 switch(GetPVarInt(playerid, "WrongPassword"))
  318.                 {
  319.                     case 0: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 3 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
  320.                     case 1: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 2 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
  321.                     case 2: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 1 попытка.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
  322.                     case 3: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталась последняя попытка, после чего Вас кикнет.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
  323.                     default:
  324.                     {
  325.                         ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Превышен лимит попыток на ввод пароля.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Выход", "");
  326.                         return Kick(playerid);
  327.                     }
  328.                 }
  329.                 SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")+1);
  330.             }
  331.             return 1;
  332.         }
  333.     }
  334.     return 1;
  335. }
  336.  
  337. public OnPlayerClickPlayer(playerid, clickedplayerid, source)
  338. {
  339.     return 1;
  340. }
  341.  
  342. forward FindPlayerInTable(playerid);
  343. public FindPlayerInTable(playerid)
  344. {
  345.     new rows;
  346.     cache_get_row_count(rows);
  347.  
  348.     if(!rows)
  349.     {
  350.         ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "Введите пароль для регистрации нового аккаунта:", "Регистрация", "Выход");
  351.     }
  352.     else
  353.     {
  354.         ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "Введите пароль от аккаунта для того, чтоб продолжить игру:", "Вход", "Выход");
  355.         cache_get_value_name(0, "password", pInfo[playerid][pPassword], 31);
  356.     }
  357.     return 1;
  358. }
  359.  
  360. stock CreateNewAccount(playerid, password[])
  361. {
  362.     new query_string[66+MAX_PLAYER_NAME-4+30];
  363.     format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`player_name`, `password`) VALUES ('%s', '%s')", pInfo[playerid][pName], password);
  364.     mysql_tquery(mysql_connect_ID, query_string, "UploadPlayerAccountNumber", "i", playerid);
  365.  
  366.  
  367.     format(query_string, sizeof(query_string), "Аккаунт %s успешно зарегистрирован. Администрация желает Вам приятной игры!", pInfo[playerid][pName]);
  368.     SendClientMessage(playerid, 0xFFFFFF00, query_string);
  369.     SpawnPlayer(playerid);
  370.     SetPlayerAuthorized(playerid, PLAYER_ONLINE);
  371.     return 1;
  372. }
  373.  
  374. forward UploadPlayerAccountNumber(playerid);
  375. public UploadPlayerAccountNumber(playerid) pInfo[playerid][pID] = cache_insert_id();
  376.  
  377. forward UploadPlayerAccount(playerid);
  378. public UploadPlayerAccount(playerid)
  379. {
  380.     cache_get_value_name_int(0, "id", pInfo[playerid][pID]);
  381.     SendClientMessage(playerid, 0xFFFFFF00, "Вы успешно авторизировались!");
  382.     SpawnPlayer(playerid);
  383.     SetPlayerAuthorized(playerid, PLAYER_ONLINE);
  384.     return 1;
  385. }
  386.  
  387. stock SaveAccount(playerid)
  388. {
  389.     new query_string[(21)+(16+11)+(20+MAX_PLAYER_NAME)+(16+30)] = "UPDATE `accounts` SET";
  390.  
  391.     format(query_string, sizeof(query_string), "%s `player_name` = '%s',", query_string, pInfo[playerid][pName]);
  392.     format(query_string, sizeof(query_string), "%s `password` = '%s'", query_string, pInfo[playerid][pPassword]);
  393.  
  394.     format(query_string, sizeof(query_string), "%s WHERE `id` = '%d'", query_string, pInfo[playerid][pID]);
  395.     mysql_tquery(mysql_connect_ID, query_string, "", "");
  396.     return 1;
  397. }
  398.  
  399. stock RemovePlayerInfo(playerid)
  400. {
  401.     pInfo[playerid][pID] = 0;
  402.     pInfo[playerid][pName][0] = EOS;
  403.     pInfo[playerid][pPassword][0] = EOS;
  404.     return 1;
  405. }
RAW Paste Data