os.forceShutdown = os.shutdown local function crash(err) if not sPhone then sPhone = { devMode = false, } end term.setCursorBlink(false) term.setBackgroundColor(colors.blue) term.clear() term.setCursorPos(1,1) term.setTextColor(colors.white) if not err then err = "Unknown" end print("sPhone Crash:\n") term.setBackgroundColor(colors.black) printError(err) term.setBackgroundColor(colors.blue) print("\nContact sPhone devs: GitHub: Sertex-Team/sPhone") print("Press any key") repeat sleep(0) until os.pullEvent("key") if not sPhone.devMode then os.forceShutdown() end term.setBackgroundColor(colors.black) term.clear() term.setCursorPos(1,1) sleep(0.1) shell.run("/rom/programs/shell") end if not pocket or not term.isColor() then crash("Computer not supported: use an Advanced Pocket Computer or an Advanced Wireless Pocket Computer") end local function kernel() _G.sPhone = { version = "Alpha 2", user = "Run sID", devMode = false, } if fs.exists("/.sPhone/config/username") then local u = fs.open("/.sPhone/config/username","r") sPhone.user = u.readLine() u.close() end if not fs.exists("/.sPhone/apis") then fs.makeDir("/.sPhone/apis") end for k, v in pairs(fs.list("/.sPhone/apis")) do os.loadAPI("/.sPhone/apis/"..v) end function os.version() return "sPhone "..sPhone.version end local function clear() term.setBackgroundColor(colors.white) term.clear() term.setCursorPos(1,1) term.setTextColor(colors.black) end sPhone.forceShutdown = os.shutdown sPhone.forceReboot = os.reboot function os.shutdown() os.pullEvent = os.pullEventRaw if sPhone.doneShutdown then clear() w, h = term.getSize() term.setCursorPos( (w/2)- 7, h/2) write("Press CTRL + S") while true do sleep(3600) end end sPhone.doneShutdown = true clear() w, h = term.getSize() term.setCursorPos( (w / 2) - 1, h / 2) for i = 1,3 do sleep(0.3) write(".") end sleep(0.2) sPhone.forceShutdown() end function os.reboot() os.pullEvent = os.pullEventRaw if sPhone.doneShutdown then clear() w, h = term.getSize() term.setCursorPos( (w/2)- 7, h/2) write("Press CTRL + R") while true do sleep(3600) end end sPhone.doneShutdown = true clear() w, h = term.getSize() term.setCursorPos( (w / 2) - 1, h / 2) for i = 1,3 do sleep(0.3) write(".") end sleep(0.2) sPhone.forceReboot() end function sPhone.yesNo(title, desc, hideUser) term.setBackgroundColor(colors.white) term.clear() term.setCursorPos(1,1) term.setTextColor(colors.black) local w, h = term.getSize() paintutils.drawLine(1,1,w,1, colors.gray) term.setTextColor(colors.white) term.setCursorPos(1,1) if not hideUser if not sPhone.user then write(" sPhone") else write(" "..sPhone.user) end end term.setCursorPos(1,3) term.setBackgroundColor(colors.white) term.setTextColor(colors.black) sertextext.center(3, " "..title) if desc then sertextext.center(6, " "..desc) end paintutils.drawFilledBox(3, 16, 9, 18, colors.green) paintutils.drawFilledBox(18, 16, 24, 18, colors.red) term.setTextColor(colors.white) term.setCursorPos(5,17) term.setBackgroundColor(colors.green) write("Yes") term.setCursorPos(20,17) term.setBackgroundColor(colors.red) write("No") while true do local _,_,x,y = os.pullEvent("mouse_click") if (x > 2 and y > 15) and (x < 10 and y < 19) then return true elseif (x > 17 and y > 15) and (x < 25 and y < 19) then return false end end end function sPhone.winOk(fmessage, smessage, bg, side, text, button) if not fmessage then fmessage = "" end if not bg then bg = colors.gray end if not text then text = colors.white end if not button then button = colors.lightGray end if not side then side = colors.lightGray end local w, h = term.getSize term.setBackgroundColor(side) paintutils.drawBox(11 - math.ceil(#fmessage / 2), 5, 16 + math.ceil(#fmessage / 2), 10, side) term.setBackgroundColor(bg) paintutils.drawFilledBox(12 - math.ceil(#fmessage / 2), 6, 15 + math.ceil(#fmessage / 2), 9, bg) term.setCursorPos(14 - math.ceil(#fmessage / 2), 7) term.setTextColor(text) write(fmessage) if smessage then term.setCursorPos(14 - math.ceil(#smessage / 2), 8) write(smessage) end term.setCursorPos(13,10) term.setBackgroundColor(button) write("Ok") while true do local e, k, x,y = os.pullEvent() if e == "mouse_click" then if y == 10 then if x == 13 or x == 14 then return end end elseif e == "key" then if k == 28 then return end end end end local function lChat() clear() local w, h = term.getSize() paintutils.drawLine(1,1,w,1,colors.gray) term.setTextColor(colors.white) sertextext.center(1," Chat") term.setBackgroundColor(colors.white) term.setTextColor(colors.black) term.setCursorPos(2, 5) if not peripheral.isPresent("back") or not peripheral.getType("back") == "modem" then print("Modem not found") print(" Press any key") os.pullEvent("key") return end write("Host: ") local h = read() term.setCursorPos(2,6) shell.run("/rom/programs/rednet/chat", "join", h, sPhone.user) sleep(1) end local function home() local function drawHome() local function box(x,y,text,bg,colorText,page) graphics.box(x,y,x+1+#text,y+2,bg) term.setCursorPos(x+1,y+1) term.setTextColor(colorText) write(text) end clear() local w, h = term.getSize() paintutils.drawLine(1,1,w,1, colors.gray) term.setTextColor(colors.white) sertextext.right(1,"vvv") term.setCursorPos(1,1) if not sPhone.newUpdate then write(" "..sPhone.user) else write(" New Update!") end box(2,3,"Shell",colors.black,colors.yellow) box(19,3,"Lock",colors.lightGray,colors.black) box(11,3,"sID",colors.red,colors.white) box(2,7,"Games",colors.pink,colors.blue) box(10,7,"Chat", colors.black,colors.white) box(19,7,"SMS",colors.green,colors.white) box(3, 11, "CST", colors.lightBlue, colors.blue) box(10, 11, "GPS", colors.red, colors.black) box(18, 11, "Info", colors.lightGray, colors.black) end local function footerMenu() sPhone.isFooterMenuOpen = true function redraw() local w, h = term.getSize() graphics.box(1,2,w,4,colors.gray) term.setTextColor(colors.white) term.setBackgroundColor(colors.gray) sertextext.right(1,"^^^") sertextext.right(3, "Reboot") term.setCursorPos(11,3) write("Settings") term.setCursorPos(2,3) write("Shutdown") end while true do redraw() local _,_,x,y = os.pullEvent("mouse_click") if y == 3 then if x > 1 and x < 10 then os.shutdown() elseif x > 19 and x < 26 then os.reboot() elseif x > 10 and x < 19 then shell.run("/.sPhone/apps/system/settings") drawHome() end elseif y == 1 then if x < 26 and x > 22 then sPhone.isFooterMenuOpen = false return end end end end while true do drawHome() term.setCursorBlink(false) local _,m,x,y = os.pullEvent("mouse_click") if y == 1 then if x < 26 and x > 22 then footerMenu() end else if (y > 2 and x > 1) and (y < 6 and x < 9) then term.setBackgroundColor(colors.black) term.clear() term.setCursorPos(1,1) term.setTextColor(colors.white) print("Type \"exit\" to close the shell") shell.run("/rom/programs/shell") elseif (y > 2 and x > 10) and (y < 7 and x < 16) then shell.run("/.sPhone/apps/system/sID") elseif (y > 2 and x > 18) and (y < 6 and x < 25) then login() elseif (y > 6 and x > 1) and (y < 10 and x < 9) then sPhone.winOk("Work In", "Progress") elseif (y > 6 and x > 9) and (y < 10 and x < 16) then lChat() elseif (y > 6 and x > 18) and (y < 10 and x < 24) then shell.run("/.sPhone/apps/sms") elseif (y > 10 and x > 2) and (y < 14 and x < 8) then shell.run("/.sPhone/apps/cstwallet") elseif (y > 10 and x > 9) and (y < 14 and x < 15) then shell.run("/.sPhone/apps/gps") elseif (y > 10 and x > 17) and (y < 14 and x < 24) then shell.run("/.sPhone/apps/system/info") end end end end function login() if fs.exists("/.sPhone/.password") then while true do term.clear() term.setCursorPos(1,1) paintutils.drawImage(paintutils.loadImage("/.sPhone/interfaces/login"),1,1) term.setTextColor(colors.white) term.setBackgroundColor(colors.gray) term.setCursorPos(1,1) write(" "..sPhone.user) if sPhone.wrongPassword then term.setTextColor(colors.red) term.setBackgroundColor(colors.white) sertextext.center(13," Wrong Password") end term.setTextColor(colors.black) term.setBackgroundColor(colors.white) sertextext.center(7," Insert Password") term.setTextColor(colors.black) term.setCursorBlink(true) term.setCursorPos(9,10) local _, k1 = os.pullEvent("char") write("*") term.setCursorPos(12,10) local _, k2 = os.pullEvent("char") write("*") term.setCursorPos(15,10) local _, k3 = os.pullEvent("char") write("*") term.setCursorPos(18,10) local _, k4 = os.pullEvent("char") write("*") term.setCursorBlink(false) local passwordLogin = k1..k2..k3..k4 local fpw = fs.open("/.sPhone/.password","r") if sha256.sha256(passwordLogin) == fpw.readLine() then sPhone.wrongPassword = false home() else sPhone.wrongPassword = true end end else local name local pw local pwr local rServer while true do term.clear() term.setCursorPos(1,1) paintutils.drawImage(paintutils.loadImage("/.sPhone/interfaces/login"),1,1) if sPhone.wrongPassword then term.setTextColor(colors.red) sertextext.center(13," Wrong Password") end term.setTextColor(colors.black) term.setBackgroundColor(colors.white) sertextext.center(3," Setup") sertextext.center(7," Insert Password") term.setTextColor(colors.black) term.setCursorBlink(true) term.setCursorPos(9,10) local _, k1 = os.pullEvent("char") write("*") term.setCursorPos(12,10) local _, k2 = os.pullEvent("char") write("*") term.setCursorPos(15,10) local _, k3 = os.pullEvent("char") write("*") term.setCursorPos(18,10) local _, k4 = os.pullEvent("char") write("*") term.setCursorBlink(false) local password1 = k1..k2..k3..k4 term.clear() term.setCursorPos(1,1) paintutils.drawImage(paintutils.loadImage("/.sPhone/interfaces/login"),1,1) term.setTextColor(colors.black) term.setBackgroundColor(colors.white) sertextext.center(3," Setup") sertextext.center(7," Repeat") term.setTextColor(colors.black) term.setCursorBlink(true) term.setCursorPos(9,10) local _, v1 = os.pullEvent("char") write("*") term.setCursorPos(12,10) local _, v2 = os.pullEvent("char") write("*") term.setCursorPos(15,10) local _, v3 = os.pullEvent("char") write("*") term.setCursorPos(18,10) local _, v4 = os.pullEvent("char") write("*") term.setCursorBlink(false) local password2 = v1..v2..v3..v4 if password1 == password2 then local f = fs.open("/.sPhone/.password", "w") f.write(sha256.sha256(password1)) f.close() term.setTextColor(colors.lime) sertextext.center(13," Password set!") sleep(2) break else sPhone.wrongPassword = true end end term.setBackgroundColor(colors.white) term.clear() term.setCursorPos(1,1) local w, h = term.getSize() paintutils.drawLine(1,1,w,1,colors.gray) term.setTextColor(colors.black) term.setBackgroundColor(colors.white) sertextext.center(3," Setup Sertex ID") local isDown = http.get("http://sertex.esy.es/status.php").readAll() if isDown ~= "true" then sertextext.center(5, " The server is down") sertextext.center(6, " Run sID on the home") name = "Run sID" sleep(2) else local choose = sPhone.yesNo("Setup Sertex ID", "Do you have a Sertex ID?", true) if not choose then term.setBackgroundColor(colors.white) term.clear() term.setCursorPos(1,1) local w, h = term.getSize() paintutils.drawLine(1,1,w,1,colors.gray) term.setTextColor(colors.black) term.setBackgroundColor(colors.white) sertextext.center(3," Setup Sertex ID") sertextext.center(7," Your Username") term.setCursorPos(3,8) name = read() while true do sertextext.center(9, " Your Password") term.setCursorPos(3,10) term.clearLine() pw = read("*") sertextext.center(11, " Repeat") term.setCursorPos(3,12) term.clearLine() pwr = read("*") if pw == pwr then break else print(" Wrong Password") sleep(1) end end local rServer = http.post("http://sertex.esy.es/register.php", "user="..name.."&password="..pw).readAll() if rServer ~= "Success!" then print("Username already exists") print("Retry later in the app sID") sleep(2) else local f = fs.open("/.sPhone/config/username","w") f.write(name) f.close() local pwf = fs.open("/.sPhone/config/.sIDPw", "w") pwf.write(base64.encode(pw)) pwf.close() end else term.setBackgroundColor(colors.white) term.clear() term.setCursorPos(1,1) local w, h = term.getSize() paintutils.drawLine(1,1,w,1,colors.gray) term.setTextColor(colors.black) term.setBackgroundColor(colors.white) sertextext.center(3," Setup Sertex ID") sertextext.center(7," Your Username") term.setCursorPos(3,8) name = read() sertextext.center(9, " Your Password") term.setCursorPos(3,10) term.clearLine() pw = read("*") sertextext.center(11, " Checking...") rServer = http.post("http://sertex.esy.es/login.php", "user="..name.."&password="..pw).readAll() if rServer ~= "true" then print(" Wrong Username/Password") print(" Run sID") sleep(2) else f = fs.open("/.sPhone/config/username", "w") f.write(name) f.close() f = fs.open("/.sPhone/config/.sIDpw", "w") f.write(base64.encode(pw)) f.close() end end end term.setCursorPos(1,13) term.clearLine() sertextext.center(13," All Set!") term.setCursorPos(1,14) term.clearLine() sertextext.center(14," Have fun with sPhone") sPhone.user = name sleep(2) home() end end local newVersion = http.get("https://raw.githubusercontent.com/Sertex-Team/sPhone/master/src/version").readAll() if newVersion ~= sPhone.version then sPhone.newUpdate = true else sPhone.newUpdate = false end login() end if sPhone then printError("sPhone already started") return end os.oldPullEvent = os.pullEvent os.pullEvent = os.pullEventRaw local ok, error = pcall(kernel) if not ok then crash(error) end os.forceShutdown()