diff --git a/gate.lua b/gate.lua index ac8b5a7..89f7e5b 100644 --- a/gate.lua +++ b/gate.lua @@ -922,6 +922,36 @@ local function updateDeviceField(dev, key, value) pcall(dev.updateTicket, key, value) end +local function callTicketStateMethod(dev, methodName) + if type(dev) ~= "table" then return false end + local fn = dev[methodName] + if type(fn) ~= "function" then return false end + local okCall, okRes = pcall(fn) + if not okCall then return false end + return okRes ~= false +end + +local function applyTicketDeviceState(dev, action, rides) + if type(dev) ~= "table" then return end + if action == "entry" then + if not callTicketStateMethod(dev, "markEntered") then + updateDeviceField(dev, "entered", true) + updateDeviceField(dev, "exited", false) + end + elseif action == "exit" then + if not callTicketStateMethod(dev, "markExited") then + updateDeviceField(dev, "exited", true) + updateDeviceField(dev, "entered", false) + end + elseif action == "reset" then + if not callTicketStateMethod(dev, "resetTicketState") then + updateDeviceField(dev, "entered", false) + updateDeviceField(dev, "exited", false) + end + end + if rides ~= nil then updateDeviceField(dev, "rides", rides) end +end + local function updateICCardField(dev, key, value) if type(dev) ~= "table" or type(dev.updateICCard) ~= "function" then return false end local okCall, okRes, detail = pcall(dev.updateICCard, key, value) @@ -1267,23 +1297,14 @@ local function handleScan(scan, side, scanDev) or tonumber(scan.trips_remaining or scan.rides_remaining) or tonumber(scan.rides) for _, dev in ipairs(inspectionDevs) do - if type(dev) == "table" and type(dev.updateTicket) == "function" then - if usedAction == "entry" then - dev.updateTicket("entered", true) - dev.updateTicket("exited", false) - if newRides ~= nil then dev.updateTicket("rides", newRides) end - else - dev.updateTicket("exited", true) - dev.updateTicket("entered", false) - if newRides ~= nil then dev.updateTicket("rides", newRides) end - end - end + applyTicketDeviceState(dev, usedAction, newRides) end end) local remaining = tonumber(resp.trips_remaining) if usedAction == "exit" and isTruthy(resp.destroy_ticket) and remaining ~= nil and remaining <= 0 then for _, dev in ipairs(inspectionDevs) do + applyTicketDeviceState(dev, "reset", remaining) if type(dev) == "table" and type(dev.destroyTicket) == "function" then pcall(dev.destroyTicket) end