Xakep_SDK Posted November 16, 2012 Share Posted November 16, 2012 Есть скрипт, почти всё сделал. Не знаю как пописать регистрацию. Файл с окошком: function createLoginWindow() local X = 0.375 local Y = 0.375 local Width = 0.30 local Height = 0.30 wdwLogin = guiCreateWindow(X, Y, Width, Height, "Пожалуйста, залогиньтесь", true) tabPanel = guiCreateTabPanel(0, 0.1, 1, 1, true, wdwLogin) tabLog = guiCreateTab("Залогиниться", tabPanel) tabReg = guiCreateTab("Зарегестрироваться", tabPanel) --Логин X = 0.0825 Y = 0.2 Width = 0.25 Heidht = 0.25 guiCreateLabel(X, Y, Width, Height, "Имя", true, tabLog) Y = 0.5 guiCreateLabel(X, Y, Width, Height, "Пароль", true, tabLog) X = 0.415 Y = 0.2 Width = 0.5 Height = 0.15 edtUser = guiCreateEdit(X, Y, Width, Height, "", true, tabLog) Y = 0.5 edtPass = guiCreateEdit(X, Y, Width, Height, "", true, tabLog) guiEditSetMaxLength(edtUser, 50) guiEditSetMaxLength(edtPass, 50) X = 0.415 Y = 0.750 Width = 0.25 Height = 0.2 btnLogin = guiCreateButton(X, Y, Width, Height, "Логин", true, tabLog) guiSetVisible(wdwLogin, false) --Регистрация X = 0.0825 Y = 0.2 Width = 0.25 Heidht = 0.25 guiCreateLabel(X, Y, Width, Height, "Имя", true, tabReg) Y = 0.5 guiCreateLabel(X, Y, Width, Height, "Пароль", true, tabReg) X = 0.415 Y = 0.2 Width = 0.5 Height = 0.15 edtUserR = guiCreateEdit(X, Y, Width, Height, "", true, tabReg) Y = 0.5 edtPassR = guiCreateEdit(X, Y, Width, Height, "", true, tabReg) guiEditSetMaxLength(edtUser, 50) guiEditSetMaxLength(edtPass, 50) guiEditSetMaxLength(edtMail, 50) X = 0.415 Y = 0.750 Width = 0.25 Height = 0.2 btnReg = guiCreateButton(X, Y, Width, Height, "Войти", true, tabReg) guiSetVisible(wdwLogin, false) addEventHandler("onClientGUIClick", btnLogin, clientSubmitLogin, false) end addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), function() createLoginWindow() outputChatBox("Добро пожаловать на мой MTA:SA сервер, пожалуйста зологиньтесь") if(wdwLogin ~=nil) then guiSetVisible(wdwLogin, true) else outputChatBox("Ошибка, GUI не был создан.") end showCursor(true) guiSetInputEnabled(true) end ) function clientSubmitLogin(button,state) if button == "left" and state == "up" then local username = guiGetText(edtUser) local password = guiGetText(edtPass) if username and password then triggerServerEvent("submitLogin", getRootElement(), username, password) guiSetInputEnabled(false) guiSetVisible(wdwLogin, false) showCursor(false) else outputChatBox("Пожалуйста, введите логин и пароль.") end end end function clientSubmitReg(button,state) if button == "left" and state == "up" then local usernameR = guiGetText(edtUserR) local passwordR = guiGetText(edtPassR) if username and password then triggerServerEvent("submitLoginR", getRootElement(), usernameR, passwordR) guiSetInputEnabled(false) guiSetVisible(wdwLogin, false) showCursor(false) else outputChatBox("Пожалуйста, заполните все поля!") end end end Файл с функциями спавна: local spawnX, spawnY, spawnZ = -711, 957, 13 P_CONNECTION = dbConnect( 'sqlite', 'users.db' ) function Login( sLogin, sPassword ) local pQuery = dbQuery( P_CONNECTION, "SELECT * FROM `users` WHERE `login` = '" .. sLogin .. "'" ) local aQuery = dbPoll( pQuery, - 1 ) if type( aQuery ) == 'table' and #aQuery > 0 then --Аккаунт найден if sPassword == aQuery[ 1 ][ 'password' ] then spawnPlayer(client, spawnX, spawnY, spawnZ) fadeCamera(client, true) setCameraTarget(client, client) outputChatBox("Добро пожаловать на мой сервер.", client) end else outputChatBox("Неправильный логин или пароль!") end end function Register( sLoginR, sPasswordR ) local pExec = dbExec( P_CONNECTION, "INSERT INTO `users` VALUES(login, password, mail)", "sLoginR", "sPasswordR" ) end function ifUserDead() spawnPlayer(source, spawnX, spawnY, spawnZ) fadeCamera(source, true) setCameraTarget(source, source) end function playerDied(totalAmmo, killer, killerWeapon, bodypart) outputChatBox(getPlayerName(source).." Умер!") end addEvent("submitLogin",true) addEventHandler("submitLogin", root, Login) addEvent("submitLoginR",true) addEventHandler("submitLoginR", root, Register) addEventHandler("onPlayerWasted", getRootElement(), ifUserDead) addEventHandler("onPlayerWasted", getRootElement(), playerDied) Link to comment
Flaker Posted November 16, 2012 Share Posted November 16, 2012 Что конкретно не получается? Если алгоритм не знаешь какой, то: 1) После нажатия кнопки зарегестрироваться, получаешь данные (E-Mail, Login, Pass) из эдитбоксов. 2) Проверяешь данные на валидность. 3) Если все верно, добавляешь данные в базу данных, и пишешь игроку, что он зареган, если данные наверны, то показываешь ошибку. Link to comment
Xakep_SDK Posted November 16, 2012 Author Share Posted November 16, 2012 Не пойму как сделать первое. Link to comment
Kenix Posted November 16, 2012 Share Posted November 16, 2012 https://wiki.multitheftauto.com/wiki/GuiGetText https://wiki.multitheftauto.com/wiki/OnClientGUIClick Link to comment
Xakep_SDK Posted November 16, 2012 Author Share Posted November 16, 2012 Это я знаю, я не знаю как получить эти данные из клиентского gui.lua в серверный spawn.lua Link to comment
Flaker Posted November 16, 2012 Share Posted November 16, 2012 Переслать с клиента на сервер можно так: https://wiki.multitheftauto.com/wiki/TriggerServerEvent Link to comment
Kernell Posted November 16, 2012 Share Posted November 16, 2012 Что конкретно не получается?Если алгоритм не знаешь какой, то: 1) После нажатия кнопки зарегестрироваться, получаешь данные (E-Mail, Login, Pass) из эдитбоксов. 2) Проверяешь данные на валидность. 3) Если все верно, добавляешь данные в базу данных, и пишешь игроку, что он зареган, если данные наверны, то показываешь ошибку. 2.1) Проверяешь существует ли пользователь с такими данными Link to comment
Flaker Posted November 16, 2012 Share Posted November 16, 2012 Что конкретно не получается?Если алгоритм не знаешь какой, то: 1) После нажатия кнопки зарегестрироваться, получаешь данные (E-Mail, Login, Pass) из эдитбоксов. 2) Проверяешь данные на валидность. 3) Если все верно, добавляешь данные в базу данных, и пишешь игроку, что он зареган, если данные наверны, то показываешь ошибку. 2.1) Проверяешь существует ли пользователь с такими данными Именно так) Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 Вот еще вопрос: local pExec = dbExec( P_CONNECTION, "INSERT INTO `users` VALUES(login, password)", "WHERE `login` = '" .. LoginR .. "', WHERE `password` = '" .. PasswordR .. "'" ) Можете поправить? Link to comment
Flaker Posted November 18, 2012 Share Posted November 18, 2012 INSERT это когда добавить! Тебе нужно использовать UPDATE. Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 Эм. Мне в таблицу в поля нужно добавить значения. Как я знаю для этого нужен insert. Link to comment
Kernell Posted November 18, 2012 Share Posted November 18, 2012 Вот еще вопрос: local pExec = dbExec( P_CONNECTION, "INSERT INTO `users` VALUES(login, password)", "WHERE `login` = '" .. LoginR .. "', WHERE `password` = '" .. PasswordR .. "'" ) Можете поправить? Не боишься SQL-инъекций? Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 Ну тогда как защитить? Скрипт не готов. Ломаю голову, как в login и password врезать значения LoginR PasswordR Link to comment
Kenix Posted November 18, 2012 Share Posted November 18, 2012 Ну тогда как защитить? Скрипт не готов. Ломаю голову, как в login и password врезать значения LoginR PasswordR http://ru.wikipedia.org/wiki/Внедрение_SQL-кода Вам нужно контролировать всё что вводит игрок перед тем как отправлять данные на сервер. local sLogin = guiGetText( ГУИ_Элемент_Едит ) local sPassword = guiGetText( ГУИ_Элемент_Едит ) if sLogin:match '[a-zA-Z0-9_.-]+$' then -- Всё гуд else -- Есть запрещенные символы end if sPassword:match '[a-zA-Z0-9]+$' then -- Всё гуд else -- Есть запрещенные символы end Как вы видите это можно сделать через луа шаблоны. Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 Спасибо, а как еще в запрос врезать значения LoginR и PasswordR? Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 local sLogin = guiGetText( ГУИ_Элемент_Едит ) local sPassword = guiGetText( ГУИ_Элемент_Едит ) if sLogin:match '[a-zA-Z0-9_.-]+$' then if sPassword:match '[a-zA-Z0-9]+$' then --База данных(осталось запилить только ее) else outputChatBox("Логин содержит запрещенные символы") else outputChatBox("Пароль содержит запрещенные символы") end end Вот переделал, надеюсь будет работать. И вот последний вопрос: Как в insert засунуть логин и пароль игрока? если прямо дать LoginR и PasswordR то я думаю запишутся эти надписи а не их содержимое Link to comment
Flaker Posted November 18, 2012 Share Posted November 18, 2012 Эм. Мне в таблицу в поля нужно добавить значения. Как я знаю для этого нужен insert. У тебя тогда синтаксис не правильный... INSERT INTO `tableName` (`login`, `pass`) VALUES ('LOGIN', 'PASS') Вот примерный синтаксис Ну вместо LOGIN и PASS вставляешь свои значения, вот так: local query = "INSERT INTO `tableName` (`login`, `pass`) VALUES ('"..loginName.."', '"..passWord.."')" Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 function Register( LoginR, PasswordR ) local aQuery = dbPoll(pQuery, - 1) local addUser = dbExec( P_CONNECTION, "INSERT INTO `users` (`login`, `password`) VALUES('"..LoginR.."', '"..PasswordR.."')") local LoginR = guiGetText( edtUserR ) local PasswordR = guiGetText( edtPassR ) if type(aQuery) == 'table' and #aQuery > 0 then outputChatBox("Аккаунт уже зарегистрирован!") if type(aQuery) == 'table' and #aQuery < 1 then if sLogin:match '[a-zA-Z0-9_.-]+$' then if sPassword:match '[a-zA-Z0-9]+$' then addUser outputChatBox("Регистрация завершена! Можете залогиниться!") else outputChatBox("Пароль содержит запрещенные символы") end else outputChatBox("Логин содержит запрещенные символы") end end end end Выдает ошибку: [15:58:47] SCRIPT ERROR: mymod/spawn.lua:31: '=' expected near 'outputChatBox' [15:58:47] WARNING: Loading script failed: mymod/spawn.lua:31: '=' expected near 'outputChatBox' Link to comment
Flaker Posted November 18, 2012 Share Posted November 18, 2012 function Register( LoginR, PasswordR ) local aQuery = dbPoll(pQuery, - 1) local addUser = dbExec( P_CONNECTION, "INSERT INTO `users` (`login`, `password`) VALUES('"..LoginR.."', '"..PasswordR.."')") local LoginR = guiGetText( edtUserR ) local PasswordR = guiGetText( edtPassR ) if type(aQuery) == 'table' and #aQuery > 0 then outputChatBox("Аккаунт уже зарегистрирован!") if type(aQuery) == 'table' and #aQuery < 1 then if sLogin:match '[a-zA-Z0-9_.-]+$' then if sPassword:match '[a-zA-Z0-9]+$' then addUser outputChatBox("Регистрация завершена! Можете залогиниться!") else outputChatBox("Пароль содержит запрещенные символы") end else outputChatBox("Логин содержит запрещенные символы") end end end end Выдает ошибку: [15:58:47] SCRIPT ERROR: mymod/spawn.lua:31: '=' expected near 'outputChatBox' [15:58:47] WARNING: Loading script failed: mymod/spawn.lua:31: '=' expected near 'outputChatBox' Во первых: строчку 3 перенеси на 11 строку А во вторых, строчки не совпадают у тебя из дебага и в выложеном коде! Когда выкладываешь пиши на какой строчке в выложенном коде ошибка. Link to comment
Kenix Posted November 18, 2012 Share Posted November 18, 2012 function Register( LoginR, PasswordR ) local aQuery = dbPoll(pQuery, - 1) local addUser = dbExec( P_CONNECTION, "INSERT INTO `users` (`login`, `password`) VALUES('"..LoginR.."', '"..PasswordR.."')") local LoginR = guiGetText( edtUserR ) local PasswordR = guiGetText( edtPassR ) if type(aQuery) == 'table' and #aQuery > 0 then outputChatBox("Аккаунт уже зарегистрирован!") if type(aQuery) == 'table' and #aQuery < 1 then if sLogin:match '[a-zA-Z0-9_.-]+$' then if sPassword:match '[a-zA-Z0-9]+$' then addUser outputChatBox("Регистрация завершена! Можете залогиниться!") else outputChatBox("Пароль содержит запрещенные символы") end else outputChatBox("Логин содержит запрещенные символы") end end end end Выдает ошибку: [15:58:47] SCRIPT ERROR: mymod/spawn.lua:31: '=' expected near 'outputChatBox' [15:58:47] WARNING: Loading script failed: mymod/spawn.lua:31: '=' expected near 'outputChatBox' addUser Что это?( строка 11 ) У тебя вообще всё не верно, серверные функции вызываются только на сервере, а ты их на клиенте вызываешь Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 Пока убрал adduser. Пока другая проблема. [16:21:06] ERROR: Client triggered serverside event submitReg, but event is not added serverside Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 function Register( LoginR, PasswordR ) local aQuery = dbPoll(pQuery, - 1) local addUser = dbExec( P_CONNECTION, "INSERT INTO `users` (`login`, `password`) VALUES('"..LoginR.."', '"..PasswordR.."')") local LoginR = guiGetText( edtUserR ) local PasswordR = guiGetText( edtPassR ) if type(aQuery) == 'table' and #aQuery > 0 then outputChatBox("Аккаунт уже зарегистрирован!") if type(aQuery) == 'table' and #aQuery < 1 then if sLogin:match '[a-zA-Z0-9_.-]+$' then if sPassword:match '[a-zA-Z0-9]+$' then addUser outputChatBox("Регистрация завершена! Можете залогиниться!") else outputChatBox("Пароль содержит запрещенные символы") end else outputChatBox("Логин содержит запрещенные символы") end end end end Выдает ошибку: [15:58:47] SCRIPT ERROR: mymod/spawn.lua:31: '=' expected near 'outputChatBox' [15:58:47] WARNING: Loading script failed: mymod/spawn.lua:31: '=' expected near 'outputChatBox' addUser Что это?( строка 11 ) У тебя вообще всё не верно, серверные функции вызываются только на сервере, а ты их на клиенте вызываешь Эм, где тут клиентские функции? Link to comment
Kenix Posted November 18, 2012 Share Posted November 18, 2012 Из моего далекого поста: Вы можете невооруженным глазом увидеть, что цвета функций в BB коде определяет где она может выполняться ( красный - на клиенте, оранжевый - на сервере, синий - на клиенте и на сервере ) Link to comment
Flaker Posted November 18, 2012 Share Posted November 18, 2012 Из моего далекого поста:Вы можете невооруженным глазом увидеть, что цвета функций в BB коде определяет где она может выполняться ( красный - на клиенте, оранжевый - на сервере, синий - на клиенте и на сервере ) Не так уж и далекий) Да, кстати вся работа с базами данных проходит на серверной части! Link to comment
Xakep_SDK Posted November 18, 2012 Author Share Posted November 18, 2012 Еще ошибка: [16:51:23] ERROR: mymod/spawn.lua:27: attempt to index local 'PasswordR' (a nil value) function Register( sLoginR, usernameR, PasswordR ) local pQuery = dbQuery( P_CONNECTION, "SELECT * FROM `users` WHERE `login` = '" .. sLoginR .. "'" ) local aQuery = dbPoll( pQuery, - 1 ) if type(aQuery) == 'table' and #aQuery > 0 then outputChatBox("Аккаунт уже зарегистрирован!") end if usernameR:match '[a-zA-Z0-9_.-]+$' then if PasswordR:match '[a-zA-Z0-9]+$' then outputChatBox("Регистрация завершена! Можете залогиниться!") addUser = dbExec( P_CONNECTION, "INSERT INTO `users` (`login`, `password`) VALUES('"..usernameR.."', '"..PasswordR.."')") else outputChatBox("Пароль содержит запрещенные символы") end else outputChatBox("Логин содержит запрещенные символы") end end function clientSubmitReg(button,state) if button == "left" and state == "up" then local usernameR = guiGetText(edtUserR) local PasswordR = guiGetText(edtPassR) if usernameR and PasswordR then triggerServerEvent("submitReg", getRootElement(), usernameR, PasswordR) guiSetInputEnabled(false) guiSetVisible(wdwLogin, false) showCursor(false) else outputChatBox("Пожалуйста, заполните все поля!") end end end Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now