Add App Store.lua
This commit is contained in:
		
							parent
							
								
									5f858ceeee
								
							
						
					
					
						commit
						d2556de331
					
				
							
								
								
									
										196
									
								
								App Store.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								App Store.lua
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,196 @@
 | 
			
		|||
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()
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user