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 KEYPADOS_UPDATE_HASH = "bKkYwsVcXKtXDBdkQPQTxFYR" rawset(__BUNDLER_FILES, "updater.lua", function () local utils = require("utils.lua") local LAST_USED = os.time() local mod = {} local function checkForUpdate() local current_time = os.time() local difference = math.abs(current_time - LAST_USED) print("Checking for update... difference: " .. tostring(difference)) --its been considerable time since the keypad was interacted with --therefore it's time to force an update down the users throat (microsoft moment) if difference > .5 then local update_code_request = http.get("https://git.mcorangehq.xyz/xomf/keypadOS/raw/branch/main/keypadOS.lua?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 -- Make backup fs.copy("startup.lua", "backup.lua") if not string.find(update_code_text, KEYPADOS_UPDATE_HASH) then local file = fs.open("startup.lua", "w") file.write(update_code_text) file.close() os.reboot() else print("Nothing changed, not updating.") sleep(50) -- delete this later 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 checkForUpdate() 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("https://raw.githubusercontent.com/Pyroxenium/Basalt/master/docs/versions/latest.lua").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) -- FILE END: updater.lua -- rawset(__BUNDLER_FILES, "config.lua", function () return { correctPin = "42169" } end) -- FILE END: config.lua -- 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") --- @type Monitor local monitor = utils.Cast(peripheral.find("monitor")) --- @type drive local drive = utils.Cast(peripheral.find("drive")) local mod = {} --- @class Ui --- @field pin string --- @field main any --- @field pinLabel any --- @field enterButton any --- @field resetEverything function --- @field unlockDoor function --- @field addToPin function --- @param ui Ui local function resetEverything(ui) sleep(2) ui.pin = "" ui.pinLabel:setText("") redstone.setOutput("front", false) ui.enterButton:setBackground(colors.blue) end --- @param ui Ui 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 --- @param ui Ui 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) :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) 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) -- FILE END: ui.lua -- rawset(__BUNDLER_FILES, "utils.lua", function () local utils = {} -- Type coersion for lsp ---@generic T ---@param object any ---@return T function utils.Cast(object) return object end --- @type Monitor 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) -- FILE END: utils.lua -- rawset(__BUNDLER_FILES, "main.lua", function () -- keycardOS "bootloader", has no access to basalt -- intended for checking for updates, and automatically updating basalt if it is missing local utils = require("utils.lua") local updater = require("updater.lua") local main = {} KEYPADOS_VERSION = "3.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) -- FILE END: main.lua -- require("main.lua").Main()