fix: trigger delay alerts from displayed CRN delay

This commit is contained in:
2026-08-02 19:04:10 +08:00
parent 278de7de6b
commit 126aaaf02f
+14 -7
View File
@@ -2,7 +2,7 @@
-- ============================================================================ -- ============================================================================
-- 1. Configuration & Constants -- 1. Configuration & Constants
-- ============================================================================ -- ============================================================================
local APP_VERSION_TEXT = "v1.0.38" local APP_VERSION_TEXT = "v1.0.39"
local CONFIG = { local CONFIG = {
CLOUD_URL = "ws://stabadmin.fse-media.group", CLOUD_URL = "ws://stabadmin.fse-media.group",
@@ -2415,6 +2415,7 @@ function Main.loop()
local now = os.epoch("utc") local now = os.epoch("utc")
local newUpcoming = {} local newUpcoming = {}
local etaTextByKey = {} local etaTextByKey = {}
local delayTextByKey = {}
-- Read CRN text ETA only for display wording. -- Read CRN text ETA only for display wording.
-- Timing decisions and numeric ETA still come from NBT. -- Timing decisions and numeric ETA still come from NBT.
@@ -2423,6 +2424,8 @@ function Main.loop()
if okLines and type(lines) == "table" then if okLines and type(lines) == "table" then
for _, lineText in pairs(lines) do for _, lineText in pairs(lines) do
if lineText and lineText ~= "" and lineText:match("[%w%?%[]") then if lineText and lineText ~= "" and lineText:match("[%w%?%[]") then
local delayMatch = string.match(lineText, "%+%s*(%d+)")
local textDelay = tonumber(delayMatch) or 0
local cleanLine = string.gsub(lineText, "%s*%(?%+%s*%d+.-%)?", "") local cleanLine = string.gsub(lineText, "%s*%(?%+%s*%d+.-%)?", "")
local etaValue, etaUnit, tName, dest local etaValue, etaUnit, tName, dest
etaValue, etaUnit, tName, dest = string.match(cleanLine, "^(%S+)%s+(.-)%s+(%[.-%][^%s]*)%s+(.*)$") etaValue, etaUnit, tName, dest = string.match(cleanLine, "^(%S+)%s+(.-)%s+(%[.-%][^%s]*)%s+(.*)$")
@@ -2437,6 +2440,9 @@ function Main.loop()
unit = etaUnit, unit = etaUnit,
raw = tostring(etaValue or "") .. ((etaUnit and etaUnit ~= "") and (" " .. tostring(etaUnit)) or "") raw = tostring(etaValue or "") .. ((etaUnit and etaUnit ~= "") and (" " .. tostring(etaUnit)) or "")
} }
if textDelay > 0 then
delayTextByKey[textKey] = textDelay
end
end end
end end
end end
@@ -2518,6 +2524,7 @@ function Main.loop()
local delayTicks = realArrival - scheduledArrival local delayTicks = realArrival - scheduledArrival
local delayMinutes = math.floor(delayTicks / ((State.tickRate or 20) * 60)) local delayMinutes = math.floor(delayTicks / ((State.tickRate or 20) * 60))
if delayMinutes < 0 then delayMinutes = 0 end if delayMinutes < 0 then delayMinutes = 0 end
local displayDelayMinutes = math.max(delayMinutes, tonumber(delayTextByKey[announceKey]) or 0)
table.insert(newUpcoming, { table.insert(newUpcoming, {
trainName = trainName, trainName = trainName,
@@ -2525,16 +2532,16 @@ function Main.loop()
platform = platform, platform = platform,
eta = etaSeconds, eta = etaSeconds,
etaLabel = etaLabel, etaLabel = etaLabel,
delay = delayMinutes, delay = displayDelayMinutes,
cancelled = cancelled, cancelled = cancelled,
reason = reason reason = reason
}) })
local alertKey = announceKey .. "::delay=" .. tostring(delayMinutes) .. "::reason=" .. tostring(reason or "") .. "::cancel=" .. tostring(cancelled) local alertKey = announceKey .. "::delay=" .. tostring(displayDelayMinutes) .. "::reason=" .. tostring(reason or "") .. "::cancel=" .. tostring(cancelled)
if cancelled or delayMinutes > 0 then if cancelled or displayDelayMinutes > 0 then
if not State.announcedAlerts[alertKey] then if not State.announcedAlerts[alertKey] then
State.announcedAlerts[alertKey] = now State.announcedAlerts[alertKey] = now
Utils.log("INFO", string.format("Train Alert: %s (ETA: %ds, Delay: %dm, Cancelled: %s, Reason: %s)", trainName, etaSeconds, delayMinutes, tostring(cancelled), tostring(reason or ""))) Utils.log("INFO", string.format("Train Alert: %s (ETA: %ds, Delay: %dm, Cancelled: %s, Reason: %s)", trainName, etaSeconds, displayDelayMinutes, tostring(cancelled), tostring(reason or "")))
Network.send({ Network.send({
type = "train_approaching", type = "train_approaching",
stationName = State.stationName, stationName = State.stationName,
@@ -2544,7 +2551,7 @@ function Main.loop()
destination = destination, destination = destination,
eta = tostring(etaSeconds) .. "s", eta = tostring(etaSeconds) .. "s",
etaSeconds = etaSeconds, etaSeconds = etaSeconds,
delay = delayMinutes, delay = displayDelayMinutes,
cancelled = cancelled, cancelled = cancelled,
reason = reason reason = reason
}) })
@@ -2564,7 +2571,7 @@ function Main.loop()
destination = destination, destination = destination,
eta = tostring(etaSeconds) .. "s", eta = tostring(etaSeconds) .. "s",
etaSeconds = etaSeconds, etaSeconds = etaSeconds,
delay = delayMinutes, delay = displayDelayMinutes,
cancelled = cancelled, cancelled = cancelled,
reason = reason reason = reason
}) })