Import Installer
This commit is contained in:
parent
56fea56418
commit
bf53a03859
BIN
Installer.sgui
Normal file
BIN
Installer.sgui
Normal file
Binary file not shown.
BIN
LevelOS/startup/lUtils.lua
Normal file
BIN
LevelOS/startup/lUtils.lua
Normal file
Binary file not shown.
226
installer.lua
Normal file
226
installer.lua
Normal file
@ -0,0 +1,226 @@
|
||||
local chunkSize = 32768
|
||||
if jit then
|
||||
chunkSize = 4092
|
||||
end
|
||||
|
||||
print("Using chunk size "..chunkSize)
|
||||
|
||||
local function encodeUTF8(asciiText)
|
||||
local utf8Text = ""
|
||||
|
||||
for i=1, #asciiText, chunkSize do
|
||||
utf8Text = utf8Text..utf8.char(string.byte(asciiText, i, math.min(i + (chunkSize-1), #asciiText)))
|
||||
end
|
||||
|
||||
return utf8Text
|
||||
end
|
||||
|
||||
local function decodeUTF8(utf8Text)
|
||||
local asciiText = ""
|
||||
|
||||
local ok, t = pcall(function()
|
||||
return string.char(utf8.codepoint(utf8Text, 1, #utf8Text))
|
||||
end)
|
||||
|
||||
if ok then
|
||||
asciiText = t
|
||||
else
|
||||
local ok2, err = pcall(function()
|
||||
for _, codepoint in utf8.codes(utf8Text) do
|
||||
if codepoint < 256 then
|
||||
asciiText = asciiText .. string.char(codepoint)
|
||||
else
|
||||
asciiText = asciiText .. "?"
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
if not ok2 then
|
||||
_G.debugCurrentText = asciiText
|
||||
_G.debugTextInput = utf8Text
|
||||
|
||||
error(err, 2)
|
||||
end
|
||||
end
|
||||
|
||||
return asciiText
|
||||
end
|
||||
|
||||
|
||||
local function encodeAll(...)
|
||||
local tbl = table.pack(...)
|
||||
for k,v in pairs(tbl) do
|
||||
if type(v) == "string" and not utf8.len(v) then
|
||||
tbl[k] = encodeUTF8(v)
|
||||
end
|
||||
end
|
||||
|
||||
return table.unpack(tbl, 1, tbl.n)
|
||||
end
|
||||
|
||||
local function decodeAll(...)
|
||||
local tbl = table.pack(...)
|
||||
for k,v in pairs(tbl) do
|
||||
if type(v) == "string" then
|
||||
tbl[k] = decodeUTF8(v)
|
||||
end
|
||||
end
|
||||
|
||||
return table.unpack(tbl, 1, tbl.n)
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function extractVersion(str)
|
||||
local version = str:match("ComputerCraft (%d+%.%d+%.%d+)")
|
||||
return version
|
||||
end
|
||||
|
||||
local function isVersionAbove(version1, version2)
|
||||
local function splitVersion(version)
|
||||
local parts = {}
|
||||
for part in version:gmatch("(%d+)") do
|
||||
table.insert(parts, tonumber(part))
|
||||
end
|
||||
return parts
|
||||
end
|
||||
|
||||
local v1Parts = splitVersion(version1)
|
||||
local v2Parts = splitVersion(version2)
|
||||
|
||||
for i = 1, math.max(#v1Parts, #v2Parts) do
|
||||
local v1 = v1Parts[i] or 0
|
||||
local v2 = v2Parts[i] or 0
|
||||
if v1 > v2 then
|
||||
return true
|
||||
elseif v1 < v2 then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
return true -- They are equal if all parts are equal
|
||||
end
|
||||
|
||||
if isVersionAbove(extractVersion(_HOST), "1.109") then
|
||||
print("NOTE: Enabling text-mode conversion")
|
||||
local fopen = fs.open
|
||||
|
||||
function fs.open(path, mode)
|
||||
local f = fopen(path, mode)
|
||||
if not f then return nil end
|
||||
|
||||
local customHandle = {}
|
||||
|
||||
for k,v in pairs(f) do
|
||||
if mode:find("b") then
|
||||
customHandle[k] = function(...) return v(...) end
|
||||
else
|
||||
customHandle[k] = function(...) return decodeAll(v(encodeAll(...))) end
|
||||
end
|
||||
end
|
||||
|
||||
return customHandle
|
||||
end
|
||||
else
|
||||
print("NOTE: Disabling text-mode conversion")
|
||||
end
|
||||
|
||||
local lStore = {}
|
||||
|
||||
local hpost = function(...)
|
||||
while true do
|
||||
local ret = table.pack(http.post(...))
|
||||
if not ret[1] then
|
||||
os.sleep(0.5)
|
||||
else
|
||||
badConn = false
|
||||
return table.unpack(ret, 1, ret.n)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function lStore.run(path)
|
||||
print("Downloading " .. path .. "...")
|
||||
local f = http.get("https://git.befatorinc.de/Befator-Computing-Systems/ClientOS/raw/branch/main/" .. path).readAll()
|
||||
local func,err = loadstring(f,nil,_ENV)
|
||||
if not func then
|
||||
print(err)
|
||||
return false,err
|
||||
else
|
||||
_G.debugfunc = func
|
||||
_G.debugpath = path
|
||||
return func()
|
||||
end
|
||||
end
|
||||
|
||||
print("Running lUtils...")
|
||||
lStore.run("LevelOS/startup/lUtils.lua")
|
||||
|
||||
local oTerm = term.current()
|
||||
local nTerm = window.create(term.current(),1,1,term.getSize())
|
||||
|
||||
term.redirect(nTerm)
|
||||
local function render()
|
||||
local w,h = nTerm.getSize()
|
||||
local oW,oH = oTerm.getSize()
|
||||
if oW ~= w or oH ~= h then
|
||||
nTerm.reposition(1,1,oW,oH)
|
||||
end
|
||||
w,h = nTerm.getSize()
|
||||
for t=0,15,1 do
|
||||
oTerm.setPaletteColor(2^t,table.unpack({nTerm.getPaletteColor(2^t)}))
|
||||
end
|
||||
local ocursor = {nTerm.getCursorPos()}
|
||||
local otext = nTerm.getCursorBlink()
|
||||
oTerm.setCursorBlink(false)
|
||||
for t=1,h do
|
||||
oTerm.setCursorPos(1,t)
|
||||
oTerm.blit(nTerm.getLine(t))
|
||||
end
|
||||
oTerm.setTextColor(nTerm.getTextColor())
|
||||
oTerm.setCursorBlink(otext)
|
||||
oTerm.setCursorPos(table.unpack(ocursor))
|
||||
end
|
||||
|
||||
print("Grabbing bigfont...")
|
||||
local bigfont = fs.open("bigfont", "w")
|
||||
bigfont.write(http.get("https://git.befatorinc.de/Befator-Computing-Systems/ClientOS/raw/branch/main/bigfont").readAll())
|
||||
bigfont.close()
|
||||
_G.bigfont = loadfile("bigfont",_ENV)()
|
||||
|
||||
local cor = coroutine.create(
|
||||
function()
|
||||
print("Running installer...")
|
||||
os.sleep(0.5)
|
||||
local ok, err = pcall(function() lStore.run("Installer.sgui") end)
|
||||
if not ok then
|
||||
printError(err)
|
||||
print("Press a key to continue...")
|
||||
os.sleep(1)
|
||||
os.pullEvent("key")
|
||||
else
|
||||
print("Done")
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
coroutine.resume(cor)
|
||||
render()
|
||||
|
||||
while coroutine.status(cor) ~= "dead" do
|
||||
local e = table.pack(os.pullEventRaw())
|
||||
if isVersionAbove(extractVersion(_HOST), "1.109") and e[1] == "http_success" then
|
||||
local h = e[3]
|
||||
|
||||
e[3] = {}
|
||||
|
||||
for k,v in pairs(h) do
|
||||
e[3][k] = function(...) return decodeAll(v(encodeAll(...))) end
|
||||
end
|
||||
end
|
||||
|
||||
coroutine.resume(cor, table.unpack(e, 1, e.n))
|
||||
render()
|
||||
coroutine.resume(cor, "extra_update")
|
||||
render()
|
||||
end
|
||||
Loading…
x
Reference in New Issue
Block a user