ClientOS/LevelOS/login.lua
2025-10-21 00:40:14 +02:00

396 lines
13 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local bg = term.getBackgroundColor()
local fg = term.getTextColor()
if fs.exists("bigfont") then
os.loadAPI("bigfont")
end
local register = false
local rememberme = false
local w,h = term.getSize()
local userbox = lUtils.makeEditBox("username",w,1)
local pwbox = lUtils.makeEditBox("password",w,1)
local pwconfirm = lUtils.makeEditBox("pwconfirm",w,1)
if fs.exists("LevelOS/data/account.txt") then
userbox.lines[1] = lUtils.fread("LevelOS/data/account.txt")
end
if fs.exists("LevelOS/data/account2.txt") then
--pwbox.lines[1] = lUtils.fread("LevelOS/data/account2.txt")
token = lUtils.fread("LevelOS/data/account2.txt")
--rememberme = true
local res = http.post("https://www.old.leveloper.cc/auth.php","username="..userbox.lines[1].."&token="..token)
local str = res.readAll()
if str:find("Welcome") then
local userID = res.getResponseHeaders()["Set-Cookie"]
return userID,userbox.lines[1]
end
end
local trysub = false
local continue = true
local boxes = {}
local e = {}
local webresponse
local userID = ""
local pause = false
local function submit()
trysub = true
continue = true
os.sleep(0.5)
if continue == true then
saveuser = fs.open("LevelOS/data/account.txt","w")
saveuser.write(userbox.lines[1])
saveuser.close()
if rememberme then
--lUtils.fwrite("LevelOS/data/account2.txt",pwbox.lines[1])
else
fs.delete("LevelOS/data/account2.txt")
end
if register then
response = {http.post("https://www.old.leveloper.cc/register.php","username="..userbox.lines[1].."&password="..pwbox.lines[1])}
local webres = response[1].readAll()
if webres == "200" then
local xtra = ""
if rememberme then
xtra = "&rememberme=true"
end
response2 = {http.post("https://www.old.leveloper.cc/auth.php","username="..userbox.lines[1].."&password="..pwbox.lines[1]..xtra)}
userID = response2[1].getResponseHeaders()["Set-Cookie"]
webresponse = webres
if rememberme then
token = lUtils.getField(response2[1].readAll(),"token")
lUtils.fwrite("LevelOS/data/account2.txt",token)
end
end
else
local xtra = ""
if rememberme then
xtra = "&rememberme=true"
end
response = {http.post("https://www.old.leveloper.cc/auth.php","username="..userbox.lines[1].."&password="..pwbox.lines[1]..xtra)}
webresponse = response[1].readAll()
userID = response[1].getResponseHeaders()["Set-Cookie"]
if rememberme then
token = lUtils.getField(webresponse,"token")
lUtils.fwrite("LevelOS/data/account2.txt",token)
end
end
--print("username="..userbox.lines[1].."&password="..pwbox.lines[1])
-- check if things are present communicate with PHP
end
end
local regsel = false
local function draw()
boxes = {}
local cY = 1
local w,h = term.getSize()
term.setBackgroundColor(colors.white)
term.clear()
term.setBackgroundColor(colors.white)
if h < 19 then
-- absolutely fkin nothin
elseif h < 25 or w < 26 or not bigfont then
for t=0,2 do
term.setCursorPos(1,cY+t)
term.clearLine()
end
term.setCursorPos(2,cY+2)
term.setTextColor(colors.white)
term.setBackgroundColor(colors.lightGray)
term.write(string.rep("\143",w-2))
term.setTextColor(colors.blue)
term.setBackgroundColor(colors.white)
cY = cY+1
term.setCursorPos(1,cY)
if register then
lUtils.centerText("Register")
else
lUtils.centerText("Log in")
end
cY = cY+2
else
if h < 50 or w < 90 then
for t=0,4 do
term.setCursorPos(1,cY+t)
term.clearLine()
end
term.setCursorPos(2,cY+4)
else
for t=0,10 do
term.setCursorPos(1,cY+t)
term.clearLine()
end
term.setCursorPos(2,cY+10)
end
term.setTextColor(colors.white)
term.setBackgroundColor(colors.lightGray)
term.write(string.rep("\143",w-2))
term.setTextColor(colors.blue)
term.setBackgroundColor(colors.white)
cY = cY+1
local size = 1
--cY = cY+4
if h >= 50 and w >= 90 then
size = 2
cY = cY+10
else
cY = cY+4
end
if register then
bigfont.writeOn(term.current(),size,"Register",nil,2)
else
bigfont.writeOn(term.current(),size,"Log in",nil,2)
end
end
term.setBackgroundColor(colors.white)
for y=cY,h do
term.setCursorPos(1,y)
term.clearLine()
end
cY = cY+1
term.setTextColor(colors.lightGray)
local offset = math.ceil(w/30)
local spacing = 0
if h > 50 then
spacing = 5
elseif h > 45 then
spacing = 4
elseif h > 40 then
spacing = 3
elseif h > 35 then
spacing = 2
elseif h > 30 then
spacing = 1
end
cY = cY+spacing
if (register and trysub and userbox.lines[1] and userbox.lines[1] ~= "" and string.len(userbox.lines[1]) >= 3 and #userbox.lines[1] <= 15 and not string.find(userbox.lines[1],"[^a-zA-Z0-9]")) then -- also check for special characters
term.setTextColor(colors.lime)
elseif register and trysub then
term.setTextColor(colors.red)
term.setCursorPos(1,cY+3)
if #userbox.lines[1] < 3 or #userbox.lines[1] > 15 then
lUtils.centerText("Username must be between 3-15 characters.")
else
lUtils.centerText("Username can not contain special characters.")
end
continue = false
else
term.setTextColor(colors.lightGray)
end
lUtils.border(1+offset,cY,w-offset,cY+2)
userbox.x = 2+offset
userbox.y = cY+1
userbox.width = ((w-offset)-1)-(1+offset)
boxes[#boxes+1] = {x1=1+offset,y1=cY,x2=w-offset,y2=cY+2,func=function() lUtils.drawEditBox(userbox,nil,nil,nil,nil,nil,nil,true,false) end}
cY = cY+1
term.setCursorPos(2+offset,cY)
if userbox.lines[1] and userbox.lines[1] ~= "" then
term.setTextColor(colors.gray)
term.write(string.sub(userbox.lines[1],1,userbox.width))
else
term.write("Username")
end
cY = cY+3+spacing
if (register and trysub and pwbox.lines[1] and pwbox.lines[1] ~= "" and string.len(pwbox.lines[1]) >= 5) then
term.setTextColor(colors.lime)
elseif register and trysub then
term.setTextColor(colors.red)
continue = false
else
term.setTextColor(colors.lightGray)
end
lUtils.border(1+offset,cY,w-offset,cY+2)
pwbox.x = 2+offset
pwbox.y = cY+1
pwbox.width = ((w-offset)-1)-(1+offset)
boxes[#boxes+1] = {x1=1+offset,y1=cY,x2=w-offset,y2=cY+2,func=function() lUtils.drawEditBox(pwbox,nil,nil,nil,nil,nil,nil,true,false,"*") end}
cY = cY+1
term.setCursorPos(2+offset,cY)
if pwbox.lines[1] and pwbox.lines[1] ~= "" then
term.setTextColor(colors.gray)
term.write(string.rep("*",string.len(string.sub(pwbox.lines[1],1,pwbox.width))))
else
term.write("Password")
end
if register then
cY = cY+3+spacing
if (register and trysub and pwconfirm.lines[1] and pwconfirm.lines[1] ~= "" and string.len(pwconfirm.lines[1]) > 3 and pwconfirm.lines[1] == pwbox.lines[1]) then
term.setTextColor(colors.lime)
elseif register and trysub then
term.setTextColor(colors.red)
if spacing > 0 then
term.setCursorPos(1,cY+3)
lUtils.centerText("Passwords don't match.")
end
continue = false
else
term.setTextColor(colors.lightGray)
end
lUtils.border(1+offset,cY,w-offset,cY+2)
pwconfirm.x = 2+offset
pwconfirm.y = cY+1
pwconfirm.width = ((w-offset)-1)-(1+offset)
boxes[#boxes+1] = {x1=1+offset,y1=cY,x2=w-offset,y2=cY+2,func=function() lUtils.drawEditBox(pwconfirm,nil,nil,nil,nil,nil,nil,true,false,"*") end}
cY = cY+1
term.setCursorPos(2+offset,cY)
if pwconfirm.lines[1] and pwconfirm.lines[1] ~= "" then
term.setTextColor(colors.gray)
term.write(string.rep("*",string.len(string.sub(pwconfirm.lines[1],1,pwconfirm.width))))
else
term.write("Confirm Password")
end
end
cY = cY+3+spacing
term.setTextColor(colors.white)
if e[1] == "mouse_click" and e[3] >= 1+(offset+2) and e[4] >= cY and e[3] <= w-(offset+2) and e[4] <= cY+2 then
regsel = true
elseif e[1] == "mouse_up" then
regsel = false
end
if regsel or trysub then
term.setBackgroundColor(colors.lightBlue)
else
term.setBackgroundColor(colors.blue)
end
lUtils.border(1+(offset+2),cY,w-(offset+2),cY+2,"fill")
boxes[#boxes+1] = {x1=1+(offset+2),y1=cY,x2=w-(offset+2),y2=cY+2,func=submit}
cY = cY+1
term.setCursorPos(1,cY)
if register then
lUtils.centerText("Register")
term.setBackgroundColor(colors.white)
term.setTextColor(colors.lightBlue)
term.setCursorPos(1,cY-2)
local w,h = term.getSize()
if w < string.len("Already have an account? Log in.") then
lUtils.centerText("Log in")
else
lUtils.centerText("Already have an account? Log in.")
end
boxes[#boxes+1] = {x1=math.ceil(w/2)-16,x2=math.ceil(w/2)+16,y1=cY-2,y2=cY-2,func=function() register = false end}
else
lUtils.centerText("Log in")
term.setBackgroundColor(colors.white)
term.setTextColor(colors.lightBlue)
term.setCursorPos(1,cY+2)
local w,h = term.getSize()
if w < string.len("Don't have an account yet? Register.") then
lUtils.centerText("Register")
else
lUtils.centerText("Don't have an account yet? Register.")
end
boxes[#boxes+1] = {x1=math.ceil(w/2)-18,x2=math.ceil(w/2)+18,y1=cY+2,y2=cY+2,func=function() register = true end}
end
cY = cY+4
local bl = {
{
"Ÿ",
"00f",
"ff0",
},
{
"• •",
"0ff",
"f00",
},
{
"‚ƒ",
"fff",
"000",
},
}
if rememberme then
bl[2][1] = "•x•"
end
local txt = " Auto-login" -- 4 spaces for the box
local rX = math.ceil(w/2)-math.floor(#txt/2)
term.setCursorPos(rX,cY)
term.setBackgroundColor(colors.white)
term.setTextColor(colors.gray)
term.write(txt)
for b=1,#bl do
term.setCursorPos(rX,(cY-2)+b)
term.blit(unpack(bl[b]))
end
table.insert(boxes,{x1=rX,y1=cY,x2=rX+2,y2=cY,func=function() local f = function() rememberme = not rememberme end pause = true f() pause = false end})
end
local function textboxes()
while true do
local e = {os.pullEvent()}
term.setCursorPos(1,1)
term.setBackgroundColor(colors.white)
term.setTextColor(colors.black)
--term.write(table.concat(e,", "))
if e[1] == "mouse_up" and e[2] == 1 then
for b=1,#boxes do
local box = boxes[b]
if e[3] >= box.x1 and e[4] >= box.y1 and e[3] <= box.x2 and e[4] <= box.y2 then
trysub = false
box.func()
os.startTimer(0.1)
end
end
end
end
end
local txtbox = coroutine.create(textboxes)
if rememberme then submit() end
draw()
while true do
e = {os.pullEvent()}
local w,h = term.getSize()
local pW,pH
if w < 29 then
pW = 19
pH = 15
else
pW = 29
pH = 9
end
if not webresponse then
if not pause then
draw()
end
coroutine.resume(txtbox,table.unpack(e))
while pause do
local e = {os.pullEvent()}
coroutine.resume(txtbox,table.unpack(e))
end
else
if (register and webresponse ~= "200") or (not register and not string.find(webresponse,"Welcome")) then
lUtils.popup("LevelOS",lUtils.getField(webresponse,"msg"),pW,pH,{"OK"})
term.setTextColor(fg)
term.setBackgroundColor(bg)
if rememberme then
rememberme = false
fs.delete("LevelOS/data/account2.txt")
end
return false
elseif register then
lUtils.popup("LevelOS","You have successfully registered! You are now logged in.",pW,pH,{"OK"})
term.setTextColor(fg)
term.setBackgroundColor(bg)
return userID,userbox.lines[1]
else
term.setTextColor(fg)
term.setBackgroundColor(bg)
return userID,userbox.lines[1]
end
end
end