diff --git a/kristify.lua b/kristify.lua index e4c1b36..000888a 100644 --- a/kristify.lua +++ b/kristify.lua @@ -1,20 +1,200 @@ --- Kristify shop manager +local installation = "kristify" +local owner,repo = "kristify","themes" +local tArgs = {...} -local w, h = term.getSize() - -if not (#arg >= 1) then - print("Not enogth arguments") - return +-- Check update +local verPath = fs.combine(installation,"src","version.txt") +local version = "0.0.0" +if fs.exists(verPath) then + local file = fs.open(verPath, 'r') + version = file.readAll() + file.close() end -if arg[1] == "theme" then - if #arg == 1 then - print("The current theme is: ") - return +local authenticate = _G._GIT_API_KEY and {Authorization = "Bearer ".._G._GIT_API_KEY} +local gitAPI = http.get("https://raw.githubusercontent.com/Kristify/Kristify/main/src/version.txt", authenticate) +if gitAPI then + local newV = gitAPI.readAll() + if newV ~= version then + term.setTextColor(colors.orange) + term.write("Update available for Kristify! ") + term.setTextColor(colors.lightGray) + print(newV.."->"..version) + term.setTextColor(colors.white) + print("Run \'kristify.lua -u\' or --update") + sleep(0.8) + end + gitAPI.close() +end + +-- Run Kristify normally +if #tArgs == 0 then + local path = fs.combine(installation,"src","init.lua") + if not fs.exists(path) then + error("Kristify is not installed correctly!") end - print("Installing theme: " .. arg[2]) - return + if term.isColor() then + local id = shell.openTab(path) + multishell.setTitle(id, "Kristify") + shell.switchTab(id) + else + shell.run(path) + end end -print("Action `" .. arg[1] .. "` is not available.") +-- Install theme +if tArgs[1] == "--theme" or tArgs[1] == "-t" then + -- Show current theme + if not tArgs[2] or tArgs[2] == "" then + local name,author = "Unknown","Herobrine" + local path = fs.combine(installation,"data","credits.json") + if fs.exists(path) then + local file = fs.open(verPath, 'r') + local data = file.readAll() + data = textutils.unserialiseJSON(data) or {} + name = data.name or "Unknown" + author = data.author or "Herobrine" + file.close() + end + + term.setTextColor(colors.lightGray) + term.write("Theme: ") + term.setTextColor(colors.white) + print(name.." by "..author) + else + -- Change theme + local file = http.get("https://raw.githubusercontent.com/"..owner..'/'..repo.."/main/"..tArgs[2].."/credits.json") + if not file then printError("The given theme doesn't exist!") return end + + local data = file.readAll() + data = textutils.unserialiseJSON(data) + if not data then printError("The given theme doesn't exist!") return end + local name = data.name + local author = data.author + file.close() + + print("Installing "..name.." by "..author) + + local function httpError(response,err,errResponse) + if not response then + errors = true + justinWeHaveAProblem("Request to GitHub denied; Reason: \'.."..err.."..\' (code "..errResponse.getResponseCode()..").") + return false + end + return true + end + + local function getJSON(response) + if not response then return {} end + local tData = response.readAll() + response.close() + return textutils.unserialiseJSON(tData) + end + + local function generateTree(name) + sURL = "https://api.github.com/repos/"..owner..'/'..repo.."/contents/"..name.."?ref=main" + local function convertItem(item) + if item.type == "file" then + return item.name, item.download_url + elseif item.type == "dir" then + return item.name, generateTree(item.url) + end + end + local response,sErr,errResponse = http.get(sURL, authenticate) + httpError(response,sErr,errResponse) + local tData = getJSON(response) + local tTree = { } + for _,v in pairs(tData) do + local sName,tItem = convertItem(v) + -- Filter stuff that is not needed + if not (sName:sub(1,1) == '.' or sName:find(".md")) then + tTree[sName] = tItem + end + end + return tTree + end + + local function downloadBlob(sURL, sPath) + local response,sErr,errResponse = http.get(sURL, authenticate) + if not httpError(response,sErr,errResponse) then + return false + end + + local sData = response.readAll() + response.close() + + local file = fs.open(sPath, 'w') + file.write(sData) + file.close() + + return true + end + + local theme = generateTree(name) + local function downloadItems(tree,sPath) + sleep(0.3) + for name,item in pairs(tree) do + local nextPath = fs.combine(sPath,name) + if type(item) == "table" then + downloadItems(item,nextPath) + else + downloadBlob(item,nextPath) + end + end + end + + local path = fs.combine(installation,"data","pages") + fs.delete(path) + downloadItems(theme, path) + end + +elseif tArgs[1] == "--version" or tArgs[1] == "-v" then + print("Kristify v"..version) + term.write("GitHub: Kristify/Kristify made with ") + term.setTextColor(colors.red) + print("\003") + term.setTextColor(colors.white) + +elseif tArgs[1] == "--update" or tArgs[1] == "-u" then + local path = fs.combine(installation,"data") + if fs.exists(path) then + fs.copy(path, ".kristify_data_backup") + end + + -- Run installer + if not http then + error("Holdup. How- eh whatever. You need the http API!") + end + + local authenticate = _G._GIT_API_KEY and {Authorization = "Bearer ".._G._GIT_API_KEY} + local response,err,errResp = http.get("https://raw.githubusercontent.com/Kristify/kristify/main/installer.lua",authenticate) + + if not response then + error("Couldn't get the install script! Reason: \'"..err.."\' (code "..errResp.getResponseCode()..')') + end + + local content = response.readAll() + response.close() + + local path = load(content, "install",'t',_ENV)() + + if fs.exists(".kristify_data_backup") then + fs.delete(fs.combine(path,"data")) + fs.copy(".kristify_data_backup",fs.combine(path,"data")) + end + +elseif tArgs[1] == "--storage" or tArgs[1] == "-s" then + os.queueEvent("kstUpdateProducts") + +elseif tArgs[1] == "--exit" or tArgs[1] == "-e" then + os.queueEvent("kristify:exit") + +elseif tArgs[1] == "--help" or tArgs[1] == "-h" then + print("Usage: "..(tArgs[0] or "kristify.lua").." [flag:]") + print("-u","--update","Updates Kristify.") + print("-v","--version","Shoes the current version.") + print("-t [name]","--theme","Shows or installs a given theme.") + print("-s", "--storage", "Updates the storage.") + print("-e", "--exit", "Stops the shop") +end