From 918e0c68e5871dd564aef4f515534e8daf518219 Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sat, 1 Aug 2026 07:54:56 +0800 Subject: [PATCH] feat(station): add first-run slave identity setup Remove station_name from the slave identity config and prompt for station code and platform on startup when no train station peripheral and no usable identity file are present, so slave nodes can be configured interactively on first boot. --- station_broadcast.lua | 119 +++++++++++++++++++++++++++++++++--------- 1 file changed, 93 insertions(+), 26 deletions(-) diff --git a/station_broadcast.lua b/station_broadcast.lua index 466c66d..ad11199 100644 --- a/station_broadcast.lua +++ b/station_broadcast.lua @@ -2,7 +2,7 @@ -- ============================================================================ -- 1. Configuration & Constants -- ============================================================================ -local APP_VERSION_TEXT = "v1.0.7" +local APP_VERSION_TEXT = "v1.0.8" local CONFIG = { CLOUD_URL = "ws://stabadmin.fse-media.group", @@ -97,23 +97,7 @@ function Utils.trim(value) return tostring(value or ""):match("^%s*(.-)%s*$") end -function Utils.writeStationIdentityTemplate() - if fs.exists(CONFIG.STATION_IDENTITY_FILE) then return end - local handle = fs.open(CONFIG.STATION_IDENTITY_FILE, "w") - if not handle then return end - handle.write(table.concat({ - "# Manual station identity override for slave nodes", - "# Leave a value empty to keep auto detection when available", - "station_name=", - "station_code=", - "station_platform=", - "" - }, "\n")) - handle.close() -end - function Utils.loadStationIdentity() - Utils.writeStationIdentityTemplate() if not fs.exists(CONFIG.STATION_IDENTITY_FILE) then return {} end @@ -139,6 +123,94 @@ function Utils.loadStationIdentity() return data end +function Utils.saveStationIdentity(stationCode, stationPlatform) + local handle = fs.open(CONFIG.STATION_IDENTITY_FILE, "w") + if not handle then + return false + end + handle.write(table.concat({ + "# Manual station identity override for slave nodes", + "station_code=" .. Utils.trim(stationCode or ""), + "station_platform=" .. Utils.trim(stationPlatform or ""), + "" + }, "\n")) + handle.close() + return true +end + +function Utils.hasUsableManualIdentity(data) + return data + and type(data) == "table" + and data.station_code and data.station_code ~= "" + and data.station_platform and data.station_platform ~= "" +end + +function Utils.promptSlaveIdentity() + while true do + term.setBackgroundColor(colors.black) + term.setTextColor(colors.white) + term.clear() + term.setCursorPos(1, 1) + term.setTextColor(colors.yellow) + term.write("Station Broadcast " .. APP_VERSION_TEXT) + term.setCursorPos(1, 3) + term.setTextColor(colors.white) + term.write("No train station peripheral found.") + term.setCursorPos(1, 4) + term.write("Configure this computer as a slave node.") + term.setCursorPos(1, 6) + term.write("Station code (e.g. cb-03): ") + term.setCursorPos(1, 8) + term.write("Platform number (e.g. 6): ") + + term.setCursorPos(30, 6) + term.setTextColor(colors.cyan) + local stationCode = Utils.trim(read() or ""):lower() + + term.setCursorPos(31, 8) + local stationPlatform = Utils.trim(read() or "") + + if stationCode == "" or stationPlatform == "" then + term.setCursorPos(1, 10) + term.setTextColor(colors.red) + term.write("Both station code and platform are required.") + term.setCursorPos(1, 12) + term.setTextColor(colors.lightGray) + term.write("Press any key to retry...") + os.pullEvent("key") + else + local ok = Utils.saveStationIdentity(stationCode, stationPlatform) + if ok then + term.setCursorPos(1, 10) + term.setTextColor(colors.green) + term.write("Saved to " .. CONFIG.STATION_IDENTITY_FILE) + term.setCursorPos(1, 12) + term.setTextColor(colors.lightGray) + term.write("Press any key to continue...") + os.pullEvent("key") + term.setBackgroundColor(colors.black) + term.setTextColor(colors.white) + term.clear() + return true + end + term.setCursorPos(1, 10) + term.setTextColor(colors.red) + term.write("Failed to save " .. CONFIG.STATION_IDENTITY_FILE) + term.setCursorPos(1, 12) + term.setTextColor(colors.lightGray) + term.write("Press any key to retry...") + os.pullEvent("key") + end + end +end + +function Utils.ensureSlaveIdentityConfigured() + if Peripherals.station then return end + local manual = Utils.loadStationIdentity() + if Utils.hasUsableManualIdentity(manual) then return end + Utils.promptSlaveIdentity() +end + function Utils.resolveStationIdentity() local manual = Utils.loadStationIdentity() local physicalName = nil @@ -149,11 +221,8 @@ function Utils.resolveStationIdentity() local stationCode = manual.station_code local stationPlatform = manual.station_platform - local stationName = manual.station_name + local stationName = physicalName - if not stationName or stationName == "" then - stationName = physicalName - end if (not stationCode or stationCode == "") and stationName and stationName ~= "" then stationCode = Utils.getStationCode(stationName) or Utils.getBroadcastStationCode(stationName) end @@ -171,10 +240,7 @@ function Utils.resolveStationIdentity() stationCode = Utils.getStationCode(stationName) or Utils.getBroadcastStationCode(stationName) end - local hasManualIdentity = - (manual.station_name and manual.station_name ~= "") or - (manual.station_code and manual.station_code ~= "") or - (manual.station_platform and manual.station_platform ~= "") + local hasManualIdentity = Utils.hasUsableManualIdentity(manual) local identityMode = "auto" if hasManualIdentity then @@ -1876,6 +1942,7 @@ end -- 9. Bootstrap -- ============================================================================ Peripherals.init() +Utils.ensureSlaveIdentityConfigured() Audio.loadStationList() Utils.refreshStationIdentity() Utils.log("INFO", "StationBroadcast version " .. APP_VERSION_TEXT) @@ -1883,7 +1950,7 @@ if Peripherals.station then Utils.log("INFO", "Train station peripheral detected on back") else Utils.log("WARN", "No train station peripheral on back; using manual slave mode") - Utils.log("INFO", "Edit " .. CONFIG.STATION_IDENTITY_FILE .. " to set station_name/station_code/station_platform") + Utils.log("INFO", "Edit " .. CONFIG.STATION_IDENTITY_FILE .. " to set station_code/station_platform") end parallel.waitForAny(