local __BUNDLER_FILES = {} local __DEFAULT_IMPORT = require local require = function(path) if __BUNDLER_FILES[path] then return __BUNDLER_FILES[path]() else return __DEFAULT_IMPORT(path) end end local __UPDATE_HASH = "979bd5bfa86b0404731e7575235126b2db006eb5" rawset(__BUNDLER_FILES, "updater.lua", function () local utils = require("utils.lua") local config = require("config.lua") local LAST_USED = os.time() local mod = {} if not __UPDATE_HASH then __UPDATE_HASH = "WHATTHEFUCK"; end local function checkForUpdate() local current_time = os.time() local difference = math.abs(current_time - LAST_USED) if difference > .5 then print("INFO: Updating! (diff: " .. tostring(difference) .. ")") local update_code_request = http.get(config.release_url .. "?x=" .. tostring(math.random(11111111, 99999999))) -- I HATE CACHE REEEEEEEEEEEEEEEEE if update_code_request then local update_code_text = update_code_request.readAll() if update_code_text then if string.find(update_code_text, "^local __BUNDLER_FILES = {}") then if fs.exists("backup.lua") then fs.delete("backup.lua") end fs.copy("startup.lua", "backup.lua") if not string.find(update_code_text, __UPDATE_HASH) then http.post(config.ntfy_url, "Computer #" .. tostring( os.getComputerID() ) .. " updating") local file = fs.open("startup.lua", "w") file.write(update_code_text) file.close() os.reboot() else print("Nothing changed, not updating.") LAST_USED = os.time() return end else print("Bad file download (core)") end else print("Bad mem read (core)") end else print("Bad download (core)") end end end function mod.UpdateChecker() while true do local status, err = pcall(checkForUpdate) if not status and err ~= "Terminated" then http.post(config.ntfy_url, err, {Priority = "urgent"}) end sleep(1) end end function mod.GetBasalt() if fs.exists("basalt.lua") then utils.MonPrint("Basalt found!") else utils.MonPrint("Downloading basalt...") local basalt_code = http.get(config.release_url).readAll() utils.MonPrint("Installing basalt...") local file = fs.open("basalt.lua", "w") if not file then utils.MonPrint("failed to get basalt") sleep(60) os.reboot() end file.write(utils.Cast(basalt_code)) file.close() utils.MonPrint("Rebooting...") os.reboot() end end return mod end) rawset(__BUNDLER_FILES, "config.lua", function () local config = { correctPin = "42069", release_url = "https://git.mcorangehq.xyz/xomf/keypadOS/raw/branch/main/keypadOS.lua", basalt_url = "https://raw.githubusercontent.com/Pyroxenium/Basalt/master/docs/versions/latest.lua", ntfy_url = "https://ntfy.sh/keypadOS_alerts", config_path = "keypadOS.config.lua" } local DEFAULT_CONFIG = "return {\n" .. " group=\"default\",\n" .. "}\n" function config.ReadConfig() if not fs.exists(config.config_path) then local f = fs.open(config.config_path, "w") f.write(DEFAULT_CONFIG) f.close(); end local cfg = require(config.config_path) return cfg end return config end) rawset(__BUNDLER_FILES, "ui.lua", function () local utils = require("utils.lua") local basalt = require("basalt") local config = require("config.lua") local updater = require("updater.lua") local monitor = utils.Cast(peripheral.find("monitor")) local drive = utils.Cast(peripheral.find("drive")) local mod = {} local function resetEverything(ui) sleep(2) ui.pin = "" ui.pinLabel:setText("") redstone.setOutput("front", false) ui.enterButton:setBackground(colors.blue) end local function unlockDoor(ui) if drive.isDiskPresent() then if drive.getDiskLabel() == config.correctPin then ui.pin = config.correctPin drive:ejectDisk() end end basalt.debug("test") if ui.pin == config.correctPin then ui.enterButton:setBackground(colors.green) ui.pinLabel:setText("Welcome") redstone.setOutput("front", true) if drive.isDiskPresent() then if drive.getDiskLabel() == nil then drive.setDiskLabel(config.correctPin) ui.pinLabel:setText("Crd set") drive:ejectDisk() end end else ui.pinLabel:setText("Wrong") ui.enterButton:setBackground(colors.red) end ui.main:addThread():start(function() resetEverything(ui) end) end local function addToPin(ui, i) if #ui.pin >= 5 then return end ui.pin = ui.pin .. tostring(i) ui.pinLabel:setText(ui.pin) end function mod.InitUi() local ui = { pin = "", main = basalt.addMonitor(), } ui.main:setMonitor(monitor) ui.pinLabel = ui.main:addLabel() :setText("") :setFontSize(1) ui.enterButton = ui.main:addButton() :setText(">>>>") :setBackground(colors.blue) :setPosition(6,2) :setSize(1.5,3.2) :onClick(function() unlockDoor(ui) end) local btnX = 1 local btnY = 2 ui.main:addButton() :setPosition(1, 5) :setBackground(colors.purple) :setText("0") :setSize(6,1) :onClick(function() addToPin(ui, 0) end) for i = 1, 9 do ui.main:addButton() :setPosition(btnX, btnY) :setText(tostring(i)) :setSize(2,1) :onClick(function() addToPin(ui, i) end) btnX = btnX + 2 if btnX >= 6 then btnY = btnY + 1 btnX = 1 end end local status, err = pcall(function () parallel.waitForAll(basalt.autoUpdate, updater.UpdateChecker) end) if not status and err ~= "Terminated" then print("Error detected: " .. err) http.post(config.ntfy_url, err, {Priority = "urgent"}) --exposed ntfy url no spam me pls sleep(5) utils.MonReset(0.5) fs.delete("basalt.lua") fs.delete("startup.lua") fs.copy("backup.lua", "startup.lua") os.reboot() end end return mod end) rawset(__BUNDLER_FILES, "utils.lua", function () local utils = {} function utils.Cast(object) return object end local MONITOR = utils.Cast(peripheral.find("monitor")) local MONITOR_Y = 1 function utils.MonPrint(text) MONITOR.setCursorPos(1,MONITOR_Y) MONITOR.write(text) MONITOR_Y = MONITOR_Y + 1 end function utils.MonReset(scale) MONITOR.clear() MONITOR.setTextScale(scale) end return utils; end) rawset(__BUNDLER_FILES, "main.lua", function () local utils = require("utils.lua") local updater = require("updater.lua") local main = {} KEYPADOS_VERSION = "4.0" function main.Main() utils.MonReset(0.5) updater.GetBasalt() utils.MonPrint("keypadOS v" .. KEYPADOS_VERSION) utils.MonReset(1) require("ui.lua").InitUi() end return main end) require("main.lua").Main()