2026-06-28 13:20:49 +08:00
|
|
|
local URL_ERROR = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/error.dfpwm"
|
|
|
|
|
local URL_PASS = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/pass.dfpwm"
|
|
|
|
|
local URL_GATE = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/gate.lua"
|
|
|
|
|
local URL_UPDATE_GATE = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/update_gate.lua"
|
2026-06-21 10:00:13 +08:00
|
|
|
|
|
|
|
|
local CONFIG_PATH = "gate_config.json"
|
|
|
|
|
|
|
|
|
|
local function trim(s)
|
|
|
|
|
return (tostring(s or ""):gsub("^%s+", ""):gsub("%s+$", ""))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function splitCsv(s)
|
|
|
|
|
local out = {}
|
|
|
|
|
s = trim(s)
|
|
|
|
|
if #s == 0 then return out end
|
|
|
|
|
for part in s:gmatch("[^,/%s]+") do
|
|
|
|
|
local v = trim(part)
|
|
|
|
|
if #v > 0 then table.insert(out, v) end
|
|
|
|
|
end
|
|
|
|
|
return out
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function writeFile(path, content, binary)
|
|
|
|
|
local mode = binary and "wb" or "w"
|
|
|
|
|
local f = fs.open(path, mode)
|
|
|
|
|
if not f then return false end
|
|
|
|
|
f.write(content)
|
|
|
|
|
f.close()
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function prompt(label)
|
|
|
|
|
term.write(label)
|
|
|
|
|
return trim(read() or "")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function httpGet(url)
|
|
|
|
|
if not http then return false, "HTTP API disabled" end
|
|
|
|
|
local okReq, err = pcall(function()
|
|
|
|
|
http.request({ url = url, method = "GET" })
|
|
|
|
|
end)
|
|
|
|
|
if not okReq then return false, tostring(err) end
|
|
|
|
|
|
|
|
|
|
while true do
|
|
|
|
|
local ev, p1, p2, p3 = os.pullEvent()
|
|
|
|
|
if ev == "http_success" and p1 == url then
|
|
|
|
|
local res = p2
|
|
|
|
|
if type(res) == "table" and type(res.readAll) == "function" then
|
|
|
|
|
local data = res.readAll()
|
|
|
|
|
res.close()
|
|
|
|
|
return true, data
|
|
|
|
|
end
|
|
|
|
|
return false, "invalid http response"
|
|
|
|
|
end
|
|
|
|
|
if ev == "http_failure" and p1 == url then
|
|
|
|
|
local err = p2
|
|
|
|
|
local res = p3
|
|
|
|
|
if type(p2) == "table" and type(p2.readAll) == "function" then
|
|
|
|
|
res = p2
|
|
|
|
|
err = p3
|
|
|
|
|
end
|
|
|
|
|
if type(res) == "table" and type(res.readAll) == "function" then
|
|
|
|
|
local data = res.readAll()
|
|
|
|
|
res.close()
|
|
|
|
|
return false, data
|
|
|
|
|
end
|
|
|
|
|
return false, tostring(err or "http_failure")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function download(url, path, binary)
|
|
|
|
|
print("Downloading: " .. path)
|
|
|
|
|
local ok, data = httpGet(url)
|
|
|
|
|
if not ok then
|
|
|
|
|
print("Download failed: " .. tostring(data or ""))
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
if not writeFile(path, data, binary) then
|
|
|
|
|
print("Write failed: " .. path)
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
term.clear()
|
|
|
|
|
term.setCursorPos(1, 1)
|
|
|
|
|
print("Ticket Gate Installer")
|
|
|
|
|
print("")
|
|
|
|
|
|
2026-06-28 16:30:17 +08:00
|
|
|
local stationCode = trim(prompt("Station code: "))
|
|
|
|
|
if #stationCode == 0 then
|
|
|
|
|
print("No station code provided.")
|
2026-06-21 10:00:13 +08:00
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local modeRaw = prompt("Gate mode (entry/exit): ")
|
|
|
|
|
local mode = (trim(modeRaw):lower() == "exit") and "exit" or "entry"
|
2026-06-28 16:30:17 +08:00
|
|
|
local cfg = { mode = mode, station_codes = { stationCode }, station_code = stationCode }
|
2026-06-21 10:00:13 +08:00
|
|
|
local okCfg, cfgJson = pcall(textutils.serializeJSON, cfg)
|
|
|
|
|
if not okCfg then
|
|
|
|
|
print("Config serialize failed.")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
if not writeFile(CONFIG_PATH, cfgJson, false) then
|
|
|
|
|
print("Failed to write config.")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not download(URL_PASS, "pass.dfpwm", true) then return end
|
|
|
|
|
if not download(URL_ERROR, "error.dfpwm", true) then return end
|
|
|
|
|
|
|
|
|
|
local okGate, gateCode = httpGet(URL_GATE)
|
|
|
|
|
if not okGate then
|
|
|
|
|
print("Download failed: startup")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
writeFile("startup.lua", gateCode, false)
|
|
|
|
|
writeFile("startup", gateCode, false)
|
2026-06-28 13:20:49 +08:00
|
|
|
if not download(URL_UPDATE_GATE, "update_gate.lua", false) then return end
|
2026-06-21 10:00:13 +08:00
|
|
|
|
|
|
|
|
print("")
|
|
|
|
|
print("Done.")
|
|
|
|
|
print("This gate now supports tickets and IC cards.")
|
|
|
|
|
print("Reboot the computer to start the gate.")
|