196 lines
4.2 KiB
Lua
196 lines
4.2 KiB
Lua
local basalt = require("/lib/basalt")
|
|
local main = basalt.getMainFrame()
|
|
|
|
local latest_apps_json = {}
|
|
|
|
function http_get(url)
|
|
local req = http.get(url)
|
|
local resp = req.readAll()
|
|
req.close()
|
|
return resp
|
|
end
|
|
|
|
local app_views = {}
|
|
|
|
local y = 1
|
|
|
|
function add_app(name, colour, url, file, installed, upgradeable, app_remote_version, app_remote_path)
|
|
|
|
local frame = main:addFrame()
|
|
:setBackground(colours.lightGrey)
|
|
:setSize(26, 3)
|
|
:setPosition(1, y)
|
|
|
|
frame:addFrame()
|
|
:setPosition(1, 1)
|
|
:setSize(1, 3)
|
|
:setBackground(colours[colour])
|
|
|
|
frame:addLabel()
|
|
:setPosition(3, 2)
|
|
:setText(name)
|
|
|
|
local install_btn = frame:addButton()
|
|
:setPosition(15, 2)
|
|
:setSize(10, 1)
|
|
:setBackground(colours.grey)
|
|
:setForeground(colours.black)
|
|
|
|
:onClick(function(install_btn)
|
|
local current_manifest = {}
|
|
local manifest_file_content = ""
|
|
local mf_handle = fs.open("/app_manifest.json", "r")
|
|
if mf_handle then
|
|
manifest_file_content = mf_handle.readAll()
|
|
mf_handle.close()
|
|
end
|
|
|
|
if manifest_file_content ~= "" then
|
|
|
|
local unserialised_data = textutils.unserialiseJSON(manifest_file_content)
|
|
if type(unserialised_data) == "table" then
|
|
current_manifest = unserialised_data
|
|
else
|
|
|
|
end
|
|
else
|
|
|
|
end
|
|
|
|
if installed then
|
|
if upgradeable then
|
|
|
|
local app_content = http_get(url)
|
|
local app_file_handle = fs.open(file, "w")
|
|
if app_file_handle then
|
|
app_file_handle.write(app_content)
|
|
app_file_handle.close()
|
|
|
|
current_manifest[name] = { version = app_remote_version, path = app_remote_path }
|
|
|
|
else
|
|
|
|
end
|
|
else
|
|
|
|
local delete_success = fs.delete(file)
|
|
if delete_success then
|
|
|
|
current_manifest[name] = nil
|
|
|
|
else
|
|
|
|
current_manifest[name] = nil
|
|
|
|
end
|
|
end
|
|
else
|
|
|
|
local app_content = http_get(url)
|
|
local app_file_handle = fs.open(file, "w")
|
|
if app_file_handle then
|
|
app_file_handle.write(app_content)
|
|
app_file_handle.close()
|
|
|
|
current_manifest[name] = { version = app_remote_version, path = app_remote_path }
|
|
|
|
else
|
|
|
|
end
|
|
end
|
|
|
|
local serialized_manifest_to_write = textutils.serialiseJSON(current_manifest)
|
|
|
|
local mf_handle_write = fs.open("/app_manifest.json", "w")
|
|
if mf_handle_write then
|
|
mf_handle_write.write(serialized_manifest_to_write)
|
|
mf_handle_write.close()
|
|
|
|
else
|
|
|
|
end
|
|
|
|
refresh()
|
|
|
|
end)
|
|
table.insert(app_views, frame)
|
|
|
|
if installed then
|
|
install_btn:setText("Remove")
|
|
install_btn:setBackground(colours.red)
|
|
else
|
|
install_btn:setText("Install")
|
|
end
|
|
|
|
if upgradeable then
|
|
install_btn:setText("Update")
|
|
install_btn:setBackground(colours.yellow)
|
|
end
|
|
|
|
y = y + 4
|
|
end
|
|
|
|
function refresh()
|
|
|
|
local apps_json_content = http_get("https://git.mcorangehq.xyz/xomf/slabOS/raw/branch/main/apps.json")
|
|
local unserialise_apps_success, unserialised_apps_json = pcall(textutils.unserialiseJSON, apps_json_content)
|
|
|
|
if not unserialise_apps_success or type(unserialised_apps_json) ~= "table" then
|
|
|
|
return
|
|
end
|
|
latest_apps_json = unserialised_apps_json
|
|
|
|
local local_manifest = {}
|
|
local manifest_file_content = ""
|
|
local mf_handle = fs.open("/app_manifest.json", "r")
|
|
if mf_handle then
|
|
manifest_file_content = mf_handle.readAll()
|
|
mf_handle.close()
|
|
|
|
else
|
|
|
|
end
|
|
|
|
if manifest_file_content ~= "" then
|
|
local unserialised_data = textutils.unserialiseJSON(manifest_file_content)
|
|
if type(unserialised_data) == "table" then
|
|
local_manifest = unserialised_data
|
|
|
|
else
|
|
|
|
end
|
|
end
|
|
|
|
for _, view_frame in pairs(app_views) do
|
|
view_frame:destroy()
|
|
end
|
|
app_views = {}
|
|
y = 1
|
|
|
|
for app_name, app_data in pairs(latest_apps_json) do
|
|
local installed = false
|
|
local upgradeable = false
|
|
|
|
if local_manifest[app_name] then
|
|
installed = true
|
|
|
|
if app_data.version ~= local_manifest[app_name].version then
|
|
upgradeable = true
|
|
|
|
else
|
|
|
|
end
|
|
else
|
|
|
|
end
|
|
|
|
add_app(app_name, app_data.colour, app_data.url, app_data.path, installed, upgradeable, app_data.version, app_data.path)
|
|
end
|
|
|
|
end
|
|
|
|
refresh()
|
|
|
|
|
|
basalt.run() |