Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local appName = "db"
- local appVersion = "3.0a"
- local appLink = "https://www.dropbox.com/s/sik9hektcwy20jo/db.lua"
- args = {...}
- apps = {}
- apis = {}
- webApps = {}
- selection = 1
- page = 1
- displayCount = 10
- local function LoadData()
- apps = {}
- local handle = fs.open("db-data","r")
- if handle == nil then
- return
- end
- local data = handle.readAll()
- handle.close()
- for name,version,link in string.gmatch(data, "<app name=\"(.-)\" version=\"(.-)\">(.-)</app>") do
- apps[name] = {}
- apps[name].version = version
- apps[name].link = link
- end
- end
- local function SaveData()
- local handle = fs.open("db-data","w")
- for k,v in pairs(apps) do
- handle.writeLine("<app name=\""..k.."\" version=\""..v.version.."\">"..v.link.."</app>")
- end
- handle.close()
- end
- -- Download a program from Dropbox
- local function Download(link)
- -- Ensure direct download link
- link = string.gsub(link,"(//www.)","//dl.",1)
- -- Open the file
- local handle = http.get(link)
- assert(handle ~= nil, "Invalid link ("..link..")")
- local code = handle.readAll()
- handle.close()
- -- Try to get name from code, default to name from link
- local name = string.match(code, "appName[%s*]=[%s*]\"(.-)\"")
- if name == nil then
- for word in string.gmatch(link, "/(%w+)") do
- name = word
- end
- end
- -- Try to get version from code, default to N/A
- local version = string.match(code, "appVersion[%s*]=[%s*]\"(.-)\"")
- if version == nil then
- version = "N/A"
- end
- -- If no label on computer, set label to program name
- if not os.getComputerLabel() then
- os.setComputerLabel(name)
- end
- return code,name,version,link
- end
- local function Save(name, content)
- local handle = fs.open(name, "w")
- assert(handle ~= nil, "Save: could not open ("..name..") for write")
- handle.write(content)
- handle.close()
- end
- local function LoadWebData()
- webApps = {}
- code = Download("https://www.dropbox.com/s/v8ahxi3ilb6v637/index.xml")
- local index = 1
- for name,version,data in string.gmatch(code, "<app name=\"(.-)\" version=\"(.-)\">(.-)</app>") do
- local app = {}
- app.name = name
- app.version = version
- app.link = string.match(data, "<link>(.-)</link>")
- app.description = string.match(data, "<description>(.-)</description>")
- if app.link ~= nil then
- webApps[index] = app
- index = index + 1
- end
- end
- end
- local function UpdateApps()
- local newApps = {}
- for k,v in pairs(apps) do
- local code,name,version,link = Download(v.link)
- assert(name ~= nil, "Invalid link: "..v.link)
- newApps[name] = {}
- newApps[name].version = version
- newApps[name].link = link
- Save(name,code)
- print("App: "..name.." (v"..version..")")
- for name,link in code.gmatch(code,"os.loadAPI%(\"(%w+)\"%)%-%-<link>(.-)</link>") do
- apis[name] = {}
- apis[name].link = link
- print(" Uses: "..name)
- end
- end
- apps = newApps
- end
- local function UpdateApis()
- local newApis = {}
- for k,v in pairs(apis) do
- local code,name,version,link = Download(v.link)
- assert(name ~= nil, "Invalid link: "..v.link)
- newApis[k] = {}
- newApis[k].version = version
- newApis[k].link = link
- os.unloadAPI(k)
- Save(k,code)
- print("API: "..k.." (v"..version..")")
- end
- apis = newApis
- end
- local function drawScreen()
- local width, height = term.getSize()
- term.clear()
- term.setCursorPos(1,1)
- print("Dropbox Interface (v"..appVersion..")")
- print("--------------------")
- print("Name: "..webApps[getIndex()].name)
- if webApps[getIndex()].version ~= nil then
- print("Version: ", webApps[getIndex()].version)
- end
- if webApps[getIndex()].description ~= nil then
- print("Description:\n")
- print(" "..webApps[getIndex()].description)
- end
- term.setCursorPos(1,height - displayCount - 1)
- print("--------------------")
- for i = 1,displayCount do
- if getIndex(i) <= #webApps then
- if i == selection then
- write("--> ")
- else
- write(" ")
- end
- print(webApps[i].name)
- end
- end
- end
- local function add(link)
- LoadData()
- apps["added_file"] = {}
- apps["added_file"].version = "N/A"
- apps["added_file"].link = link
- UpdateApps()
- UpdateApis()
- SaveData()
- end
- function self()
- code = Download(appLink)
- handle = fs.open("db", "w")
- handle.write(code)
- handle.close()
- end
- function getIndex(index)
- if index == nil then
- index = selection
- end
- return (page - 1) * displayCount + index
- end
- local function pageCount()
- return math.ceil(#webApps / displayCount)
- end
- local function interface()
- print("Loading index from web...")
- LoadWebData()
- drawScreen()
- local running = true
- while running do
- event, p1 = os.pullEvent("key")
- if p1 == 200 then
- if getIndex() > 1 then
- if selection == 1 then
- page = page - 1
- else
- selection = selection - 1
- end
- end
- elseif p1 == 208 then
- if getIndex() < #webApps then
- if selection == displayCount then
- page = page + 1
- else
- selection = selection + 1
- end
- end
- elseif p1 == 201 then
- if page > 1 then
- page = page - 1
- end
- elseif p1 == 209 then
- if page < pageCount() then
- page = page + 1
- selection = math.min(selection, #webApps - ((pageCount() - 1) * displayCount))
- end
- elseif p1 == 28 then
- print()
- print("Adding "..webApps[getIndex()].name.." to applications and updating all...")
- add(webApps[getIndex()].link)
- running = false
- elseif p1 == 16 then
- running = false
- end
- if running then drawScreen() end
- end
- end
- if args[1] == "update" then
- if (not fs.exists("db-data")) then
- print("No existing db data. Run \"db get\" first.")
- else
- print("Updating:")
- LoadData()
- UpdateApps()
- UpdateApis()
- SaveData()
- end
- elseif (args[1] == "add") and (#args == 2) then
- add(args[2])
- elseif args[1] == "self" then
- self()
- else
- interface()
- end
Advertisement
Add Comment
Please, Sign In to add comment