Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Configuration
- local owner = "Zonk1987"
- local repo = "CC-Tweaked-Programs"
- local branch = "main"
- local apiUrl = "https://api.github.com/repos/" .. owner .. "/" .. repo .. "/contents/"
- local rawUrl = "https://raw.githubusercontent.com/" .. owner .. "/" .. repo .. "/" .. branch .. "/"
- local function clear()
- term.clear()
- term.setCursorPos(1, 1)
- end
- -- Hardcoded fallback list with file manifests
- local fallbackProjects = {
- {
- name = "Powah Energizing Orb Automation",
- path = "Powah%20Energizing%20Orb%20Automation",
- files = { "startup.lua", "PowahSystem.lua", "RecipeManager.lua", "Dashboard.lua", "InventoryComponent.lua", "Orb.lua", "Chest.lua", "README.md" }
- },
- {
- name = "Mekanism Portal Dialer Hub",
- path = "Mekanism%20Portal%20Dialer%20Hub",
- files = { "startup.lua", "PortalSystem.lua", "README.md" }
- },
- {
- name = "Mekanism Portal Dialer Recall Sender",
- path = "Mekanism%20Portal%20Dialer%20Recall%20Sender",
- files = { "startup.lua", "README.md" }
- },
- {
- name = "CC Developer Suite",
- path = "CC%20Developer%20Suite",
- files = { "startup.lua", "README.md" }
- },
- {
- name = "Create Mechanical Crafter Automation",
- path = "Create%20Mechanical%20Crafter%20Automation",
- files = { "startup.lua", "README.md" }
- }
- }
- clear()
- if term.isColor() then term.setTextColor(colors.cyan) end
- print("=======================================")
- print(" Zonk's CC-Tweaked Installer ")
- print("=======================================")
- if term.isColor() then term.setTextColor(colors.white) end
- print("Connecting to GitHub...\n")
- -- Attempt to fetch root contents via API
- local projects = {}
- local isApiDown = false
- local response = http.get(apiUrl)
- if response then
- local responseData = response.readAll()
- response.close()
- local data = textutils.unserializeJSON(responseData)
- if data and not data.message then
- for _, item in ipairs(data) do
- if item.type == "dir" and not item.name:find("^%.") and item.name ~= "installer" then
- table.insert(projects, {
- name = item.name:gsub("%%20", " "),
- path = item.name
- })
- end
- end
- else
- isApiDown = true
- end
- else
- isApiDown = true
- end
- -- If API failed or returned empty, use fallback list
- if #projects == 0 or isApiDown then
- if term.isColor() then term.setTextColor(colors.yellow) end
- print("Warning: GitHub API unreachable.")
- print("Using built-in project list...\n")
- projects = fallbackProjects
- isApiDown = true
- os.sleep(1)
- end
- -- User Selection Menu
- clear()
- if term.isColor() then term.setTextColor(colors.cyan) end
- print("=======================================")
- print(" Zonk's CC-Tweaked Installer ")
- print("=======================================")
- if term.isColor() then term.setTextColor(colors.white) end
- print("Select a project to install:\n")
- for i, project in ipairs(projects) do
- print(string.format("[%d] %s", i, project.name))
- end
- print("\n[Q] Quit")
- local selectedProject
- while true do
- write("\nChoice: ")
- local input = read()
- if input:lower() == "q" then return end
- local num = tonumber(input)
- if num and projects[num] then
- selectedProject = projects[num]
- break
- else
- print("Invalid choice!")
- end
- end
- -- Setup installation
- local targetDir = "" -- Install directly to root
- clear()
- print("Installing: " .. selectedProject.name)
- print("Target: Root Directory (/)")
- print("---------------------------------------\n")
- --- Helper: Ensure URL is safe for CC (encode spaces)
- local function safeUrl(url)
- return (url:gsub(" ", "%%20"))
- end
- --- Smart download function (Handles API or Fallback)
- local function executeDownload()
- local success = true
- -- If API works, use recursive discovery
- if not isApiDown then
- local function downloadViaApi(path, currentTarget)
- local resp = http.get(safeUrl(apiUrl .. path))
- if not resp then return false end
- local items = textutils.unserializeJSON(resp.readAll())
- resp.close()
- if currentTarget ~= "" and not fs.exists(currentTarget) then
- fs.makeDir(currentTarget)
- end
- for _, item in ipairs(items) do
- local localPath = (currentTarget == "" and item.name or currentTarget .. "/" .. item.name)
- if item.type == "dir" then
- if not downloadViaApi(item.path, localPath) then return false end
- else
- print("Downloading: " .. item.name .. "...")
- local fResp = http.get(item.download_url)
- if fResp then
- local f = fs.open(localPath, "w")
- f.write(fResp.readAll())
- f.close()
- fResp.close()
- else
- return false
- end
- end
- end
- return true
- end
- success = downloadViaApi(selectedProject.path, targetDir)
- else
- -- FALLBACK: Use raw URLs with known file list
- for _, fileName in ipairs(selectedProject.files) do
- local branches_to_try = { branch, "master", "main" }
- local success_file = false
- for _, b in ipairs(branches_to_try) do
- local currentRawUrl = string.format("https://raw.githubusercontent.com/%s/%s/%s/", owner, repo, b)
- local url = safeUrl(currentRawUrl .. selectedProject.path .. "/" .. fileName)
- local resp = http.get(url)
- if resp then
- print("Downloading: " .. fileName .. "...")
- local localPath = (targetDir == "" and fileName or targetDir .. "/" .. fileName)
- local f = fs.open(localPath, "w")
- f.write(resp.readAll())
- f.close()
- resp.close()
- success_file = true
- break
- end
- end
- if not success_file then
- print("Failed: " .. fileName)
- success = false
- end
- end
- end
- return success
- end
- -- Execute
- if executeDownload() then
- if term.isColor() then term.setTextColor(colors.lime) end
- print("\nInstallation successful!")
- local selfPath = shell.getRunningProgram()
- if fs.exists(selfPath) and not selfPath:find("^rom/") and selfPath ~= "pastebin" then
- pcall(fs.delete, selfPath)
- end
- print("Rebooting in 3 seconds...")
- os.sleep(3)
- os.reboot()
- else
- if term.isColor() then term.setTextColor(colors.red) end
- print("\nInstallation failed!")
- print("Check your connection to raw.githubusercontent.com")
- end
Advertisement