local args = {...} local url = "http://lua.gaywine.org" local path = "bin/" if not fs.exists(path) then fs.makeDir(path) end local temp = "temp/" if not fs.exists(temp) then fs.makeDir(temp) end if #args > 0 then programToInstall = args[1] else print("usage:") print("install.lua ") print("install.lua ") end if #args > 1 then print("WARNING: custom paths are currently not supported.") customPath = shell.resolve(args[2]) end local function downloadFile(filename) print("downloading " .. filename .. "...") local fileUrl = url .. "/files/" .. programToInstall .. "/" .. filename local result = http.get(fileUrl) local resultText = result.readAll() local file = fs.open(temp .. filename, "w") file.write(resultText) file.close() end local function split(pString, pPattern) local Table = {} -- NOTE: use {n = 0} in Lua-5.0 local fpat = "(.-)" .. pPattern local last_end = 1 local s, e, cap = pString:find(fpat, 1) while s do if s ~= 1 or cap ~= "" then table.insert(Table, cap) end last_end = e + 1 s, e, cap = pString:find(fpat, last_end) end if last_end <= #pString then cap = pString:sub(last_end) table.insert(Table, cap) end return Table end local function getAllFiles() local indexesUrl = url .. "/indexes/" .. programToInstall local result = http.get(indexesUrl) if result == nil then print("error! getting indexes for " .. programToInstall) error() end local resultText = result.readAll() local resultTable = split(resultText, "\n") local indexesFile = fs.open("bin/indexes.dat", "w") indexesFile.write(resultText) indexesFile.close() local programsFile = fs.open(path .. "programs.dat", "a") programsFile.write(programToInstall) programsFile.close() local finalResult = {} for key, value in ipairs(resultTable) do finalResult[key] = split(value, " ")[1] end return finalResult end local function finishInstall(files) for key, file in ipairs(files) do if customPath ~= nil then print("moving " .. file .. " to " .. customPath .. "...") fs.move(temp .. file, customPath .. "/" .. file) else print("moving " .. file .. " to " .. path .. programToInstall .. "...") fs.move(temp .. file, path .. programToInstall .. "/" .. file) end end if customPath ~= nil then local program = "shell.run(" .. customPath .. "/run.lua)" file = fs.open(path .. programToInstall .. "/run.lua") file.write(program) file.close() end fs.delete(temp) end if not fs.exists(path .. "programs.dat") then local file = fs.open(path .. "programs.dat", "w") file.write("") file.close() end local programsFile = fs.open(path .. "programs.dat", "r") local programsText = programsFile.readAll() local programsTable = split(programsText, "\n") local shouldInstall = true for _, value in ipairs(programsTable) do if value == programToInstall then print(programToInstall .. " is already installed. checking for updates instead...") shouldInstall = false end end if shouldInstall then local files = getAllFiles() for _, value in ipairs(files) do downloadFile(value) end finishInstall(files) elseif fs.exists(path .. "updater/update.lua") then shell.run(path .. "updater/update.lua " .. programToInstall) end