2025-10-21 00:40:14 +02:00

1538 lines
38 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local assets = {
[ "background.lua" ] = {
id = 8,
name = "background.lua",
content = "-- render bg\
\
os.sleep(0.5)\
ogP = {}\
local s = shapescape.getSlide()\
for a=2,4 do\
ogP[a] = s.objs[a].oy1\
end\
\
while true do\
-- render bg if app changes\
local e = {os.pullEvent()}\
if e[1] == \"mouse_scroll\" then\
for a=2,4 do\
if s.objs[a].oy1+e[2] >= ogP[a] then\
s.objs[a].oy1 = s.objs[a].oy1+e[2]\
if a ~= 2 then\
s.objs[a].oy2 = s.objs[a].oy2+e[2]\
end\
end\
end\
end\
end\
",
},
[ "updatething.lua" ] = {
id = 10,
name = "updatething.lua",
content = "local s = shapescape.getSlide()\
if s.updateFunc then\
\9s.updateFunc()\
\9s.updateFunc = nil\
end",
},
[ "mainscreen.lua" ] = {
id = 2,
name = "mainscreen.lua",
content = "function doYourThing()\
local sl = shapescape.getSlides()\
local s = shapescape.getSlide()\
local hpost = http.post\
local function download(name,pth,saveto,run)\
\9local f = hpost(\"https://old.leveloper.cc/sGet.php\",\"path=\"..textutils.urlEncode(pth)..\"&\"..rType..\"=\"..textutils.urlEncode(name),{Cookie=lOS.userID}).readAll()\
\9if f and f ~= \"409\" and f ~= \"403\" and f ~= \"401\" then\
\9\9if run then\
\9\9\9return f\
\9\9else\
\9\9\9lUtils.fwrite(saveto,f)\
\9\9\9return true\
\9\9end\
\9else\
\9\9return false\
\9end\
end\
local function get(name)\
\
\9--write(\"Connecting to LevelStore... \")\
\
\9rType = \"code\"\
\9local response, err = http.post(\"https://old.leveloper.cc/sGet.php\",\"path=\"..textutils.urlEncode(\"\")..\"&code=\"..textutils.urlEncode(name),{Cookie=lOS.userID})\
\
\9if not response then\
\9\9rType = \"name\"\
\9\9response, err = http.post(\"https://old.leveloper.cc/sGet.php\",\"path=\"..textutils.urlEncode(\"\")..\"&name=\"..textutils.urlEncode(name),{Cookie=lOS.userID})\
\9end\
\
\9if response then\
\9\9local tree = {}\
\9\9local folders = {}\
\9\9local function searchFolder(folder)\
\9\9\9--print(\"Searching folder root/\"..folder)\
\9\9\9local f = hpost(\"https://old.leveloper.cc/sGet.php\",\"path=\"..textutils.urlEncode(folder)..\"&\"..rType..\"=\"..textutils.urlEncode(name),{Cookie=lOS.userID}).readAll()\
\9\9\9--print(f)\
\9\9\9local f2 = f\
\9\9\9while true do\
\9\9\9\9local file = nil\
\9\9\9\9file,f = lUtils.getField(f,\"file\")\
\9\9\9\9if not file then\
\9\9\9\9\9break\
\9\9\9\9else\
\9\9\9\9\9local name = lUtils.getField(file,\"name\")\
\9\9\9\9\9tree[#tree+1] = fs.combine(folder,name)\
\9\9\9\9\9--print(\"Found \"..fs.combine(folder,name))\
\9\9\9\9end\
\9\9\9end\
\9\9\9f = f2\
\9\9\9while true do\
\9\9\9\9local file = nil\
\9\9\9\9file,f = lUtils.getField(f,\"folder\")\
\9\9\9\9if not file then\
\9\9\9\9\9break\
\9\9\9\9else\
\9\9\9\9\9local name = lUtils.getField(file,\"name\")\
\9\9\9\9\9--if not fs.exists(fs.combine(folder,name)) then\
\9\9\9\9\9\9--fs.makeDir(fs.combine(folder,name))\
\9\9\9\9\9--end\
\9\9\9\9\9folders[#folders+1] = fs.combine(folder,name)\
\9\9\9\9\9searchFolder(fs.combine(folder,name))\
\9\9\9\9end\
\9\9\9end\
\9\9\9return true\
\9\9end\
\9\9searchFolder(\"\")\
\9\9--print(\"Success.\")\
\
\9\9return tree,folders\
\9else\
\9\9printError(\"Failed.\")\
\9\9print(err)\
\9end\
end\
\
local circ = lUtils.asset.load(\"LevelOS/assets/circProgress.limg\")\
\
bigfont.writeOn(term.current(),1,\"Loading...\")\
local pth = \"Program_Files\"\
local appdata = \"AppData/lStore\"\
if not fs.exists(appdata) then\
\9fs.makeDir(appdata)\
end\
local apps = {} -- retrieve from servers\
_G.debugApps = apps\
local response,err = http.get(\"https://old.leveloper.cc/sList.php\",{Cookie=lOS.userID})\
if not response then\
\9term.setBackgroundColor(colors.black)\
\9term.clear()\
\9bigfont.writeOn(term.current(),1,err)\
\9return\
end\
local res = response.readAll()\
--local gf = lUtils.getField\
local cols = {}\
for k,v in pairs(colors) do\
\9if type(v) == \"number\" and v ~= colors.gray and v ~= colors.white and v ~= colors.black then\
\9\9table.insert(cols,v)\
\9end\
end\
local selected = {}\
while true do\
\9local p\
\9p,res = lUtils.getField(res,\"project\")\
\9if p ~= nil then\
\9\9local function gf(field)\
\9\9\9return (lUtils.getField(p,field))\
\9\9end\
\9\9local app = {code=gf(\"code\"),name=string.gsub(gf(\"title\"),\"_\",\" \"),creator=gf(\"creator\"),timestamp=gf(\"version\"),listing=gf(\"listing\")}\
\9\9if gf(\"icon\") then\
\9\9\9local icon = gf(\"icon\")\
\9\9\9if icon and textutils.unserialize(icon) then\
\9\9\9\9app.icon = textutils.unserialize(icon)[1]\
\9\9\9end\
\9\9end\
\9\9if gf(\"iconBig\") then\
\9\9\9local ico = gf(\"iconBig\")\
\9\9\9if ico and textutils.unserialize(ico) then\
\9\9\9\9app.ico = textutils.unserialize(ico)[1]\
\9\9\9end\
\9\9end\
\9\9if gf(\"background\") then\
\9\9\9app.background = gf(\"background\")\
\9\9end\
\9\9if gf(\"description\") then\
\9\9\9app.description = gf(\"description\")\
\9\9else\
\9\9\9app.description = \"<text>No description.</text>\"\
\9\9end\
\9\9app.creatorName = gf(\"creator_name\")\
\9\9if gf(\"rating\") and gf(\"ratings\") then\
\9\9\9app.rating = tonumber(gf(\"rating\"))\
\9\9\9app.ratings = tonumber(gf(\"ratings\"))\
\9\9else\
\9\9\9app.rating = 0\
\9\9\9app.ratings = 0\
\9\9end\
\9\9if gf(\"fname\") then\
\9\9\9app.fname = gf(\"fname\")\
\9\9else\
\9\9\9app.fname = string.gsub(app.name,\"%W\",\"_\")\
\9\9end\
\9\9app.verified = gf(\"verified\")\
\9\9if app.verified == \"true\" then\
\9\9\9app.verified = true\
\9\9else\
\9\9\9app.verified = false\
\9\9end\
\9\9if app.creator == \"2\" then\
\9\9\9app.verified = true\
\9\9end\
\9\9app.bg = cols[math.random(1,#cols)]\
\9\9table.insert(apps,app)\
\9else\
\9\9break\
\9end\
end\
if not fs.exists(pth) then\
\9fs.makeDir(pth)\
end\
local tCol = {bg=colors.black,txt=colors.white,txt2=colors.white,app=colors.gray,topbar=colors.black,sel=colors.blue,heart=colors.red}\
local aW,aH = 14,11\
local function path(app)\
\9return fs.combine(pth,app.fname)\
end\
sl.api = {get=get,download=download,path=path,circ=circ,tCol=tCol}\
local function textbox(txt,x1,y1,x2,y2)\
\9local x,y = x1,y1\
\9local w,h = x2-(x-1),y2-(y-1)\
\9local bg,fg = term.getBackgroundColor(),term.getTextColor()\
\9local win = window.create(term.current(),x,y,w,h,false)\
\9win.setBackgroundColor(bg)\
\9win.setTextColor(fg)\
\9win.clear()\
\9win.setCursorPos(1,1)\
\9local oterm = term.current()\
\9term.redirect(win)\
\9write(txt)\
\9term.redirect(oterm)\
\9for y=y1,y2 do\
\9\9term.setCursorPos(x1,y)\
\9\9term.blit(win.getLine(y-(y1-1)))\
\9end\
end\
local function bigWrite(txt)\
\9local x,y = term.getCursorPos()\
\9bigfont.writeOn(term.current(),1,txt,x,y)\
end\
local function rApp(app,x,y)\
\9app.x1,app.y1 = x,y\
\9app.x2,app.y2 = x+(aW-1),y+(aH-1)\
\9if app.ico then\
\9\9lUtils.renderImg(app.ico,x,y)\
\9elseif app.icon then\
\9\9term.setBackgroundColor(app.bg)\
\9\9--local w,h = term.getSize()\
\9\9for q=0,4 do\
\9\9\9term.setCursorPos(x,y+q)\
\9\9\9term.write(string.rep(\" \",aW))\
\9\9end\
\9\9lUtils.renderImg(app.icon,x+math.floor(aW/2 - 3/2),y+1)\
\9else\
\9\9term.setBackgroundColor(app.bg)\
\9\9--local w,h = term.getSize()\
\9\9for q=0,4 do\
\9\9\9term.setCursorPos(x,y+q)\
\9\9\9term.write(string.rep(\" \",aW))\
\9\9end\
\9\9term.setTextColor(colors.white)\
\9\9term.setCursorPos(x+math.ceil(aW/2)-3,y+1)\
\9\9bigWrite(string.upper(string.sub(app.name,1,2)))\
\9end\
\9if app.listing == \"unlisted\" then\
\9\9term.setTextColor(colors.lightGray)\
\9elseif app.listing == \"premium\" then\
\9\9term.setTextColor(colors.orange)\
\9else\
\9\9term.setTextColor(tCol.txt)\
\9end\
\9if selected == app then\
\9\9term.setBackgroundColor(colors.lightGray)\
\9else\
\9\9term.setBackgroundColor(tCol.app)\
\9end\
\9for q=5,aH-1 do\
\9\9term.setCursorPos(x,y+q)\
\9\9term.write(string.rep(\" \",aW))\
\9end\
\9--textbox(app.name,x+1,y+6,x+aW-2,y+7)\
\9local txt = lUtils.wordwrap(app.name, aW-2)\
\9term.setCursorPos(x+1, y+6)\
\9term.write(txt[1])\
\9term.setCursorPos(x+1, y+7)\
\9if txt[2] then\
\9\9term.write(txt[2])\
\9\9term.setCursorPos(x+1, y+8)\
\9end\
\9local creatorName = app.creatorName\
\9\
\9if creatorName == \"Noodle\" then\
\9\9creatorName = \"Leveloper\"\
\9\9term.setTextColor(colors.cyan)\
\9else\
\9\9term.setTextColor(colors.lightGray)\
\9end\
\9local creatorName = creatorName:sub(1, aW-2)\
\9term.write(creatorName)\
\9\
\9term.setCursorPos(x+1,y+aH-2)\
\9for q=1,5 do\
\9\9if math.floor(app.rating+0.5) >= q then\
\9\9\9term.setTextColor(tCol.heart)\
\9\9else\
\9\9\9term.setTextColor(colors.lightGray)\
\9\9end\
\9\9term.write(\"\\3\")\
\9end\
\9term.setTextColor(colors.lightGray)\
\9term.write(\" \"..app.ratings)\
\9term.setCursorPos(x+aW-3,y+aH-2)\
\9if fs.exists(path(app)) then\
\9\9term.setTextColor(colors.red)\
\9\9term.write(\"×\")\
\9\9term.setCursorPos(x+1,y+aH-1)\
\9\9term.setTextColor(colors.lightGray)\
\9\9term.write(\"Installed\")\
\9else\
\9\9term.setTextColor(colors.blue)\
\9\9term.write(\"\\25\")\
\9end\
end\
local scroll = 0\
\
local function matchSearch(app)\
\9if not s.var.search or s.var.search == \"\" then\
\9\9return true\
\9elseif app.name:lower():find(s.var.search:lower(), nil, true) then\
\9\9return true\
\9else\
\9\9return false\
\9end\
end\
\
local function render()\
\9term.setBackgroundColor(colors.black)\
\9term.clear()\
\9local w,h = term.getSize()\
\9local cX = 3\
\9local cY = 2\
\9for a=1,#apps do\
\9\9if (s.var.menu.id == \"home\" or (s.var.menu.id == \"verified\" and apps[a].verified) or (s.var.menu.id == \"installed\" and fs.exists(path(apps[a])))) and matchSearch(apps[a]) then\
\9\9\9--rApp(apps[a],cX,cY)\
\9\9\9if cX + (aW) >= w then\
\9\9\9\9cX = 3\
\9\9\9\9cY = cY+aH+1\
\9\9\9end\
\9\9\9rApp(apps[a],cX,cY-scroll)\
\9\9\9cX = cX+aW+2\
\9\9end\
\9end\
end\
\
function s.var.resetRender()\
\9scroll = 0\
\9os.queueEvent(\"store_render\")\
end\
\
render()\
while true do\
\9local e = {os.pullEvent()}\
\9if e[1] == \"store_render\" then\
\9\9render()\
\9elseif (e[1] == \"mouse_click\" or e[1] == \"mouse_up\") and s.var.sb and e[3] >= s.var.sidebar.x1 then\
\9\9-- nothing\
\9elseif e[1] == \"term_resize\" then\
\9\9render()\
\9elseif e[1] == \"mouse_click\" then\
\9\9local x,y = e[3],e[4]\
\9\9for k,a in ipairs(apps) do\
\9\9\9if x >= a.x1 and y >= a.y1 and x <= a.x2 and y <= a.y2 then\
\9\9\9\9selected = a\
\9\9\9\9render()\
\9\9\9end\
\9\9end\
\9elseif e[1] == \"mouse_up\" then\
\9\9local x,y = e[3],e[4]\
\9\9if selected.x2 and selected.y2 then\
\9\9\9local app = selected\
\9\9\9if x == selected.x2-2 and y == selected.y2-1 then\
\9\9\9\9local o = {lUtils.popup(\"LevelStore\",\"Do you want to install \"..selected.name..\"?\",25,9,{\"Install\",\"Cancel\"})}\
\9\9\9\9--local app = selected\
\9\9\9\9selected = {}\
\9\9\9\9render()\
\9\9\9\9if o[1] and o[3] == \"Install\" then\
\9\9\9\9\9lUtils.renderImg(circ[1],x-1,y-1)\
\9\9\9\9\9local tree,folders = get(app.code)\
\9\9\9\9\9--if not tree then return end\
\9\9\9\9\9--term.write(\"Downloading... \")\
\9\9\9\9\9--term.write(\"0%\")\
\9\9\9\9\9local sPath = path(app)\
\9\9\9\9\9if #tree > 0 or #folders > 0 then\
\9\9\9\9\9\9fs.makeDir(sPath)\
\9\9\9\9\9\9for f=1,#folders do\
\9\9\9\9\9\9\9fs.makeDir(fs.combine(sPath,folders[f]))\
\9\9\9\9\9\9end\
\9\9\9\9\9\9for f=1,#tree do\
\9\9\9\9\9\9\9download(app.code,tree[f],fs.combine(sPath,tree[f]))\
\9\9\9\9\9\9\9term.setBackgroundColor(tCol.app)\
\9\9\9\9\9\9\9term.setTextColor(tCol.txt)\
\9\9\9\9\9\9\9lUtils.renderImg(circ[math.floor(8*(f/#tree)+1.5)],x-1,y-1)\
\9\9\9\9\9\9\9--term.setCursorPos(x,y)\
\9\9\9\9\9\9\9--term.write(math.floor(99*(f/#tree)))\
\9\9\9\9\9\9end\
\9\9\9\9\9\9local b = {lUtils.popup(\"LevelStore\",\"Do you want to create a shortcut to \"..app.name..\"?\",25,9,{\"Yes\",\"No\"})}\
\9\9\9\9\9\9if b[1] and b[3] == \"Yes\" then\
\9\9\9\9\9\9\9lOS.genIco(sPath)\
\9\9\9\9\9\9end\
\9\9\9\9\9end\
\9\9\9\9\9lUtils.renderImg(circ[9],x-1,y-1)\
\9\9\9\9\9render()\
\9\9\9\9end\
\9\9\9elseif x >= app.x1 and y >= app.y1 and x <= app.x2 and y <= app.y2 then\
\9\9\9\9local slides = shapescape.getSlides()\
\9\9\9\9slides.app = app\
\9\9\9\9shapescape.setSlide(2)\
\9\9\9\9--lUtils.popup(\"LevelStore\",\"Click: \"..x..\",\"..y..\" vs \"..(selected.x2-2)..\",\"..(selected.y2-2),27,9,{\"OK\"})\
\9\9\9end\
\9\9end\
\9\9selected = {}\
\9\9render()\
\9elseif e[1] == \"mouse_scroll\" then\
\9\9if scroll+e[2] >= 0 then\
\9\9\9scroll = scroll+e[2]\
\9\9\9render()\
\9\9end\
\9end\
end\
end\
local ok,err = pcall(doYourThing)\
if not ok then\
\9printError(err)\
end\
--os.sleep(10)",
},
[ "Top_menu.lua" ] = {
id = 0,
name = "Top_menu.lua",
content = "local s = shapescape.getSlide()\
if not s.var then\
s.var = {}\
end\
if not s.var.theme then\
s.var.theme = {txt=colors.white,txt2=colors.lightGray,bg=colors.gray,app=colors.gray,bb=colors.blue}\
end\
local th = s.var.theme\
local acc = {{\"\\159\\131\\139 \",\"----\",\"bbb-\"},{\" \\144\\133\\149\",\"-b0b\",\"b0b-\"},{\"\\130\\143\\135 \",\"000-\",\"----\"}}\
local src = {{\" \\159\\140\\144\",\"--00\",\"-0--\"},{\" \\154 \\154\",\"---0\",\"-0--\"},{\"\\136\\129\\131 \",\"000-\",\"----\"}}\
local function g(str)\
return (str:gsub(\"-\",lUtils.toBlit(th.bg)))\
end\
local function blit(p)\
term.blit(p[1],g(p[2]),g(p[3]))\
end\
s.var.menus = {{name=\"Home\", id=\"home\"},{name=\"Verified\", id=\"verified\"},{name=\"Installed\", id=\"installed\"}}\
s.var.menu = s.var.menus[1]\
local bline = {x1=2,x2=3}\
local function render()\
term.setBackgroundColor(th.bg)\
term.clear()\
term.setCursorPos(1,2)\
for t=1,#s.var.menus do\
local m = s.var.menus[t]\
if s.var.menu == m then\
term.setTextColor(th.txt)\
else\
term.setTextColor(th.txt2)\
end\
term.write(\" \")\
m.x1 = ({term.getCursorPos()})[1]\
term.write(m.name)\
m.x2 = ({term.getCursorPos()})[1]-1\
term.write(\" \")\
end\
local m = s.var.menu\
local function b()\
term.setCursorPos(1,3)\
term.setBackgroundColor(th.bg)\
term.clearLine()\
term.setCursorPos(bline.x1,3)\
term.setTextColor(th.bb)\
term.write(string.rep(\"\\131\",bline.x2-(bline.x1-1)))\
local w,h = term.getSize()\
for a=1,#acc do\
--w,h = term.getSize()\
term.setCursorPos(w-4,a)\
blit(acc[a])\
end\
if not src.x then src.x = 10 end\
for a=1,#src do\
term.setCursorPos(w-src.x,a)\
blit(src[a])\
end\
if src.x > 11 then\
if th.bg == colors.black then\
term.setBackgroundColor(colors.gray)\
else\
term.setBackgroundColor(colors.black)\
end\
term.setTextColor(th.bg)\
lUtils.border((w-src.x)+4,1,w-7,3)\
term.setCursorPos((w-src.x)+5,2)\
term.write(string.rep(\" \",src.x-12))\
if s.var.search then\
term.setCursorPos((w-src.x)+5,2)\
term.setTextColor(th.txt2)\
term.write(string.sub(s.var.search,1,src.x-12))\
end\
end\
term.setBackgroundColor(th.bg)\
end\
local v = 5\
while bline.x2 < m.x2 do\
bline.x2 = bline.x2+math.ceil((m.x2-bline.x2)/v)\
b()\
os.sleep(0.05)\
end\
while bline.x1 < m.x1 do\
bline.x1 = bline.x1+math.ceil((m.x1-bline.x1)/v)\
b()\
os.sleep(0.05)\
end\
while bline.x1 > m.x1 do\
bline.x1 = bline.x1-math.ceil((bline.x1-m.x1)/v)\
b()\
os.sleep(0.05)\
end\
while bline.x2 > m.x2 do\
bline.x2 = bline.x2-math.ceil((bline.x2-m.x2)/v)\
b()\
os.sleep(0.05)\
end\
b()\
end\
render()\
local ow,oh = term.getSize()\
while true do\
local e = {os.pullEvent()}\
local w,h = term.getSize()\
if e[1] == \"mouse_up\" and e[2] == 1 and e[4] == 2 then\
for t=1,#s.var.menus do\
local m = s.var.menus[t]\
if e[3] >= m.x1 and e[3] <= m.x2 then\
\9s.var.menu = {}\
\9--s.var.resetRender()\
s.var.menu = m\
render()\
--s.var.resetRender()\
end\
end\
if e[3] >= w-4 and e[3] <= w-1 then\
if s.var.sidebar and not s.var.sb then\
table.insert(s.objs,s.var.sidebar)\
s.var.sb = true\
elseif s.var.sidebar and s.var.sb then\
for o=1,#s.objs do\
if s.objs[o] == s.var.sidebar then\
table.remove(s.objs,o)\
s.var.sb = false\
break\
end\
end\
end\
elseif e[3] >= w-src.x and e[3] <= w-7 then\
if not src.search then\
if w > 80 then\
max = 24\
else\
max = 12\
end\
for t=1,max,2 do\
src.x = src.x+2\
render()\
os.sleep(0.05)\
end\
src.search = true\
term.setBackgroundColor(colors.black)\
term.setTextColor(colors.white)\
src.box = lUtils.input((w-src.x)+5,2,w-8,2,{overflowX=\"scroll\",overflowY=\"none\"})\
end\
--[[local txtbox = window.create(term.current(),(w-src.x)+5,2,src.x-12,1)\
if th.bg == colors.black then\
txtbox.setBackgroundColor(colors.gray)\
else\
txtbox.setBackgroundColor(colors.black)\
end\
txtbox.setTextColor(colors.white)\
txtbox.clear()\
txtbox.setCursorPos(1,1)\
local txtcor = coroutine.create(function() s.var.search = lUtils.read() term.setCursorBlink(false) end)\
local oterm = term.current()\
while coroutine.status(txtcor) ~= \"dead\" do\
e = {os.pullEvent()}\
render()\
txtbox.redraw()\
term.redirect(txtbox)\
coroutine.resume(txtcor,unpack(e))\
term.redirect(oterm)\
term.setTextColor(colors.red)\
term.setCursorBlink(true)\
end]]\
\
local box = src.box\
box.state = true\
if #box.txt > 0 then\
\9box.select = {1, #box.txt}\
\9box.cursor.a = #box.txt+1\
end\
box.update(\"term_resize\")\
box.render()\
while box.state do\
\9local e = {os.pullEvent()}\
\9if e[1] == \"key\" and e[2] == keys.enter then\
\9\9box.state = false\
\9else\
\9\9box.update(unpack(e))\
\9\9box.render()\
\9\9if s.var.search ~= box.txt then\
\9\9\9s.var.search = box.txt\
\9\9\9s.var.resetRender()\
\9\9end\
\9end\
end\
term.setCursorBlink(false)\
render()\
s.var.resetRender()\
--[[else\
while src.x > 10 do\
src.x = src.x-1\
render()\
os.sleep(0.05)\
end\
src.search = false\
end]]\
end\
elseif e[1] == \"term_resize\" or w ~= ow or h ~= oh then\
render()\
end\
ow,oh = w,h\
end",
},
[ "appPage_topbar.lua" ] = {
id = 5,
name = "appPage_topbar.lua",
content = "local sl = shapescape.getSlides()\
local get = sl.api.get\
local download = sl.api.download\
local path = sl.api.path\
local s = shapescape.getSlide()\
local circSymbol = lUtils.asset.load(\"LevelOS/assets/Circle_Symbols.limg\")\
if not s.var then s.var = {} end\
while true do\
term.setBackgroundColor(colors.lightGray)\
term.clear()\
--[[term.setCursorPos(4,3)\
term.setTextColor(colors.gray)\
term.write(sl.app.code)]]\
if fs.exists(sl.api.path(sl.app)) then\
lUtils.renderImg(circSymbol[2],2,2)\
term.setBackgroundColor(colors.lightGray)\
term.setTextColor(colors.white)\
term.setCursorPos(8,3)\
term.write(\"Installed\")\
end\
local e = {os.pullEvent()}\
if s.var.download then\
lUtils.renderImg(circSymbol[1],2,2)\
term.setCursorPos(8,3)\
term.write(\"0%\")\
term.setCursorPos(12,3)\
term.setTextColor(colors.white)\
term.setBackgroundColor(colors.lightGray)\
local w,h = term.getSize()\
for t=12,w-14 do\
term.write(\"\\140\")\
end\
term.write(\" ×\")\
--os.sleep(5)\
local app = sl.app\
local tree,folders = get(app.code)\
--if not tree then return end\
--term.write(\"Downloading... \")\
--term.write(\"0%\")\
local sPath = path(app)\
if #tree > 0 or #folders > 0 then\
fs.makeDir(sPath)\
for f=1,#folders do\
fs.makeDir(fs.combine(sPath,folders[f]))\
end\
for f=1,#tree do\
download(app.code,tree[f],fs.combine(sPath,tree[f]))\
term.setBackgroundColor(colors.lightGray)\
term.setCursorPos(8,3)\
term.write(math.floor((f/#tree)*100+0.5)..\"%\")\
term.setCursorPos(12,3)\
for t=12,w-14 do\
if (t-11)/(w-14-11) <= f/#tree then\
term.setTextColor(colors.blue)\
else\
term.setTextColor(colors.white)\
end\
term.write(\"\\140\")\
end\
end\
\9\9\9s.updateFunc = function()\
\9\9\9\9local b = {lUtils.popup(\"LevelStore\",\"Do you want to create a shortcut to \"..app.name..\"?\",25,9,{\"Yes\",\"No\"})}\
\9\9\9\9if b[1] and b[3] == \"Yes\" then\
\9\9\9\9\9lOS.genIco(sPath)\
\9\9\9\9end\
\9\9\9end\
\9\9\9os.pullEvent()\
end\
s.var.download = false\
end\
end",
},
[ "toMain.lua" ] = {
id = 3,
name = "toMain.lua",
content = "local s = shapescape.getSlide()\
if not s.var.download then\
os.queueEvent(\"term_resize\")\
shapescape.setSlide(1)\
end",
},
[ "sidebar.lua" ] = {
id = 1,
name = "sidebar.lua",
content = "term.setBackgroundColor(colors.gray)\
term.clear()\
local s = shapescape.getSlide()\
for t=1,#s.objs do\
if s.objs[t] == self then\
s.var.sidebar = self\
s.var.sb = false\
table.remove(s.objs,t)\
coroutine.yield()\
end\
end\
lUtils.shapescape.run({shapescape.getSlides()[3]})",
},
[ "getbuttonclick.lua" ] = {
id = 7,
name = "getbuttonclick.lua",
content = "local s = shapescape.getSlide()\
local sl = shapescape.getSlides()\
if self.txt == \" Get \" then\
s.var.download = true\
elseif self.txt == \" Run \" then\
local get,path = sl.api.get,sl.api.path\
local app = sl.app\
if fs.isDir(path(app)) == false then\
lOS.execute(path(app))\
else\
local file\
local files = fs.list(path(app))\
for f=1,#files do\
local fP = fs.combine(path(app),files[f])\
if not fs.isDir(fP) then\
if files[f] == \"main.lua\" then\
file = fP\
elseif not file and lUtils.getFileType(files[f]) == \".lua\" then\
file = fP\
end\
end\
end\
if not file then\
lUtils.popup(\"LevelStore\",\"No lua file found in this project. Please contact the developer.\",27,9,{\"Cancel\"})\
else\
lOS.execute(file)\
end\
end\
end",
},
[ "username.lua" ] = {
id = 9,
name = "username.lua",
content = "self.txt = lOS.username or \"Guest\"",
},
[ "Get_Button.lua" ] = {
id = 6,
name = "Get_Button.lua",
content = "local sl = shapescape.getSlides()\
local s = shapescape.getSlide()\
while true do\
if s.var and s.var.download then\
self.txt = \" Get \"\
self.txtcolor = colors.lightGray\
elseif fs.exists(sl.api.path(sl.app)) then\
self.txt = \" Run \"\
self.txtcolor = colors.white\
else\
self.txt = \" Get \"\
self.txtcolor = colors.white\
end\
local e = {os.pullEvent()}\
end",
},
[ "appPage.lua" ] = {
id = 4,
name = "appPage.lua",
content = "local function find(a,b)\
return string.find(a,b,nil,true)\
end\
local function tag(txt)\
if not find(txt,\"<\") then return nil end\
local txt2 = string.sub(txt,({find(txt,\"<\")})[2]+1,#txt)\
return txt2:match(\"(.-)[^%w_]\")\
end\
local function renderdesc(txt)\
local d = txt\
while true do\
local t = tag(d)\
if not t then\
return\
else\
local content\
content,d = lUtils.getField(d,t)\
if t == \"text\" then\
print(content)\
end\
end\
end\
end\
\
local function wordwrap(str)\
local x,y = term.getCursorPos()\
local tW,tH = term.getSize()\
local words = 0\
for w in str:gmatch(\"%S+\") do\
local x1,y1 = term.getCursorPos()\
if x1+(#w*3) >= tW then\
if words == 0 then\
return false,0\
else\
bigfont.bigPrint(\" \")\
end\
end\
bigfont.bigWrite(w..\" \")\
words = words+1\
end\
bigfont.bigPrint(\" \")\
return true,words\
end\
\
while true do\
term.setBackgroundColor(colors.gray)\
term.setTextColor(colors.white)\
term.clear()\
local w,h = term.getSize()\
local oterm = term.current()\
local win = window.create(term.current(),2,2,w-2,h)\
term.redirect(win)\
term.setBackgroundColor(colors.gray)\
term.setTextColor(colors.white)\
term.clear()\
term.setCursorPos(1,1)\
local slides = shapescape.getSlides()\
local app = slides.app\
if app.icon then\
lUtils.renderImg(app.icon,1,1)\
term.setCursorPos(6,1)\
end\
if not wordwrap(app.name) then\
local x,y = term.getCursorPos()\
term.setCursorPos(x,2)\
print(app.name)\
print(\"\")\
end\
print(\"\")\
renderdesc(app.description)\
local e = {os.pullEvent()}\
end",
},
}
local nAssets = {}
for key,value in pairs(assets) do nAssets[key] = value nAssets[assets[key].id] = assets[key] end
assets = nAssets
nAssets = nil
local slides = {
{
h = 19,
x = 65,
y = 22,
objs = {
{
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap top",
},
border = {
color = 0,
type = 1,
},
x1 = 1,
y1 = 1,
x2 = 51,
y2 = 3,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 0,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
type = "window",
ox2 = 0,
color = 128,
},
{
oy2 = 0,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
type = "window",
x1 = 1,
y1 = 4,
x2 = 51,
y2 = 19,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 2,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 0,
color = 32768,
border = {
color = 256,
type = 1,
},
},
{
oy2 = 0,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap bottom",
},
type = "window",
x1 = 22,
y1 = 4,
x2 = 51,
y2 = 19,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 1,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox1 = 29,
ox2 = 0,
color = 128,
border = {
color = 1,
type = 1,
},
},
},
c = 1,
w = 51,
},
{
h = 19,
x = 65,
y = 22,
objs = {
{
oy2 = 0,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
border = {
color = 128,
type = 1,
},
x1 = 1,
y1 = 4,
x2 = 51,
y2 = 19,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 8,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 10,
},
},
ox2 = 0,
color = 32768,
type = "window",
},
{
oy2 = -15,
snap = {
Top = "Snap center",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
type = "window",
x1 = 9,
y1 = 12,
x2 = 43,
y2 = 34,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 4,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 8,
color = 128,
oy1 = -2,
border = {
color = 1,
type = 1,
},
},
{
oy2 = -1,
snap = {
Top = "Snap center",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap center",
},
type = "window",
x1 = 9,
y1 = 7,
x2 = 43,
y2 = 11,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 5,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 8,
color = 128,
oy1 = 3,
border = {
color = 256,
type = 1,
},
},
{
oy2 = 0,
border = {
color = 256,
type = 1,
},
txtcolor = 1,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 6,
},
mouse_up = {
[ 2 ] = 7,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
color = 512,
snap = {
Top = "Snap center",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap center",
},
x1 = 33,
y1 = 8,
x2 = 41,
y2 = 10,
ox1 = 18,
txt = " Get",
ox2 = 10,
type = "text",
input = false,
oy1 = 2,
},
{
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap top",
},
border = {
color = 0,
type = 1,
},
x1 = 1,
y1 = 1,
x2 = 51,
y2 = 3,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 0,
color = 128,
input = false,
type = "rect",
},
{
type = "text",
txtcolor = 1,
y1 = 1,
x2 = 5,
y2 = 3,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = 3,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
txt = " \
\27",
x1 = 1,
color = 0,
input = false,
border = {
color = 0,
type = 1,
},
},
},
c = 2,
w = 51,
},
{
h = 19,
x = 65,
y = 22,
objs = {
{
oy2 = 0,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
type = "rect",
x1 = 1,
y1 = 1,
x2 = 51,
y2 = 19,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 0,
color = 128,
border = {
color = 0,
type = 1,
},
},
{
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap top",
},
type = "text",
border = {
color = 0,
type = 1,
},
x1 = 3,
y1 = 2,
x2 = 15,
y2 = 2,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
txt = "Logged in as",
txtcolor = 1,
color = 128,
input = false,
},
{
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap top",
},
txtcolor = 2048,
border = {
color = 0,
type = 1,
},
x1 = 16,
y1 = 2,
x2 = 25,
y2 = 2,
event = {
selected = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 9,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
Initialize = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
txt = "loading...",
type = "text",
color = 0,
input = false,
},
{
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap top",
},
x1 = 3,
type = "text",
txtcolor = 1,
y1 = 8,
x2 = 20,
y2 = 10,
event = {
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
},
txt = " App Settings",
border = {
color = 128,
type = 1,
},
color = 32768,
input = false,
},
{
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap top",
},
border = {
color = 128,
type = 1,
},
type = "text",
x1 = 3,
y1 = 4,
x2 = 22,
y2 = 6,
event = {
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
},
txt = " Manage Account",
txtcolor = 1,
color = 32768,
input = false,
},
{
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap top",
},
border = {
color = 128,
type = 1,
},
type = "text",
x1 = 3,
y1 = 12,
x2 = 19,
y2 = 14,
event = {
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
},
txt = " Manage Apps",
txtcolor = 1,
color = 32768,
input = false,
},
},
c = 3,
w = 51,
},
{
h = 19,
x = 61,
y = 22,
objs = {},
c = 4,
w = 51,
},
}
for s=1,#slides do
local slide = slides[s]
for o=1,#slide.objs do
local obj = slide.objs[o]
for key,value in pairs(obj.event) do
if assets[ value[2] ] then
lUtils.shapescape.addScript(obj,value[2],key,assets,LevelOS,slides)
else
obj.event[key] = {function() end,-1}
end
end
end
end
local tArgs = {...}
if tArgs[1] and tArgs[1] == "load" then
return {assets=assets,slides=slides}
end
return lUtils.shapescape.run(slides,...)