Author: Adam <git@apiote.xyz>
fixes to new realtime
file/file.go | 5 +++-- traffic/brussels_stib_mivb.go | 6 +++--- traffic/realtime.go | 35 ++++++++++++++++++++++------------- traffic/realtime_gtfs.go | 2 +- traffic/realtime_lua.go | 22 ++++++++++++++--------
diff --git a/file/file.go b/file/file.go index e95e6cdec4e13daa9d6201da817f93f1b020ff14..e5865ba71e0e91762fbc42890a779cc8b4f4db53 100644 --- a/file/file.go +++ b/file/file.go @@ -65,7 +65,7 @@ if err != nil { return err } for _, txtFile := range txtFiles { - if strings.Contains(txtFile.Name(), ".bare") { + if strings.Contains(txtFile.Name(), ".bare") || strings.Contains(txtFile.Name(), ".lua") { err = os.Remove(filepath.Join(path, txtFile.Name())) if err != nil { log.Printf("while removing bare file %s: %v\n", txtFile.Name(), err) @@ -89,10 +89,11 @@ defer xzWriter.Close() tarWriter := tar.NewWriter(xzWriter) defer tarWriter.Close() - files := []string{"calendar.bare", "ix_stop_codes.bare", "ix_stop_names.bare", "lines.bare", "stops.bare", "trips.bare", "vehicles.bare", "ix_lines.bare", "feed_info.bare", "agencies.bare", "ix_trips.bare"} + files := []string{"calendar.bare", "ix_stop_codes.bare", "ix_stop_names.bare", "lines.bare", "stops.bare", "trips.bare", "vehicles.bare", "ix_lines.bare", "feed_info.bare", "agencies.bare", "ix_trips.bare", "updates.lua"} for _, file := range files { stat, err := os.Stat(filepath.Join(path, file)) if err != nil { + // TODO if updates.lua does not exist, ignore return err } bareFile, err := os.Open(filepath.Join(path, file)) diff --git a/traffic/brussels_stib_mivb.go b/traffic/brussels_stib_mivb.go index 911592502210bd32d3408dd9a5192eb6270569d8..5807f0bbd93a5a4b2cf6e56b828167dc722324f9 100644 --- a/traffic/brussels_stib_mivb.go +++ b/traffic/brussels_stib_mivb.go @@ -74,7 +74,7 @@ if response == nil then return "", "while getting updates: " .. error_message end - if response.status_code != 200 then + if response.status_code ~= 200 then return "", "api returned code " .. response.status_code .. "; " .. response.body end @@ -96,14 +96,14 @@ return "", "while decoding times for stop " .. entry.pointid .. ", line " .. entry.lineid .. ": " .. error_message end for i, time_entry in ipairs(times) do - updates[time_entry.expectedArrivalTime] = { + updates.updates[time_entry.expectedArrivalTime] = { time=string.sub(time_entry.expectedArrivalTime, 12, 13) .. string.sub(time_entry.expectedArrivalTime, 15, 16) .. string.sub(time_entry.expectedArrivalTime, 18, 19), stopID=stopID, delay=0, timetableRelationship=1, vehicleStatus={ lineName=entry.lineid, - headsign=time_entry.destination.fr, // TODO translations + headsign=time_entry.destination.fr, -- TODO translations } } end diff --git a/traffic/realtime.go b/traffic/realtime.go index 7ab01c3152090cf710b5c8ff2582bbe211fae4ed..8d40d8d639bfa7c016476befb297cde782aa64d7 100644 --- a/traffic/realtime.go +++ b/traffic/realtime.go @@ -163,8 +163,12 @@ var enrichMethod func(string, int, string, Context) (map[string]Update, bool, error) if feedInfo.Name != "" { if _, ok := feedInfo.RealtimeFeeds[TRIP_UPDATES]; ok { enrichMethod = getGtfsRealtimeUpdates + // log.Println("GTFS") } else if isLuaUpdatesScript(ctx) { enrichMethod = getLuaRealtimeUpdates + // log.Println("Lua") + } else { + // log.Println("none") } } midnight := time.Date(datetime.Year(), datetime.Month(), @@ -191,26 +195,31 @@ ) if enrichMethod != nil { updates, areTripsInTimetable, err = enrichMethod(trips[departure.Order.TripOffset].Id, departure.Order.Sequence, stopID, ctx) if err != nil { - if isTimeout(err) { // TODO or any other connection problem + if isTimeout(err) { // TODO or any other connection problem, or BreakingError log.Printf("connection error while enriching departure %s -> %s (%v): %v", departure.LineName, departure.Headsign, departure.Time, err) enrichMethod = nil + continue } else { log.Printf("while enriching departure %s -> %s (%v): %v\n", departure.LineName, departure.Headsign, departure.Time, err) + enrichedDepartures[i] = departure + continue } } - } - if areTripsInTimetable { - update := updates[trips[departure.Order.TripOffset].Id] - update.VehicleStatus.LineName = trips[departure.Order.TripOffset].LineName - update.VehicleStatus.Headsign = trips[departure.Order.TripOffset].Headsign - enrichedDepartures[i] = departure.WithUpdate(update) + if areTripsInTimetable { + update := updates[trips[departure.Order.TripOffset].Id] + update.VehicleStatus.LineName = trips[departure.Order.TripOffset].LineName + update.VehicleStatus.Headsign = trips[departure.Order.TripOffset].Headsign + enrichedDepartures[i] = departure.WithUpdate(update) + } else { + var err error + enrichedDepartures, err = departuresFromNoTripUpdates(updates, pickups, dropoffs, timezone) + if err != nil { + return departures, fmt.Errorf("while creating departures without trip: %w", err) + } + break + } } else { - var err error - enrichedDepartures, err = departuresFromNoTripUpdates(updates, pickups, dropoffs, timezone) - if err != nil { - return departures, fmt.Errorf("while creating departures without trip: %w", err) - } - break + enrichedDepartures = departures } } } diff --git a/traffic/realtime_gtfs.go b/traffic/realtime_gtfs.go index 07192defcaf295b2500be0583f9fdc590a7c2719..cfe6f1144871979ddc3e81e055b87866ff662fde 100644 --- a/traffic/realtime_gtfs.go +++ b/traffic/realtime_gtfs.go @@ -197,7 +197,7 @@ func getGtfsRealtimeUpdates(_ string, _ int, _ string, ctx Context) (map[string]Update, bool, error) { feedInfo, err := getFeedInfo(ctx.DataHome, ctx.FeedID, ctx.Version) if err != nil { - return map[string]Update{}, false, fmt.Errorf("while getting feedInfo: %w\n", err) + return map[string]Update{}, true, fmt.Errorf("while getting feedInfo: %w\n", err) } getGtfsRealtimeMessages(TRIP_UPDATES, ctx.FeedID, feedInfo.RealtimeFeeds) diff --git a/traffic/realtime_lua.go b/traffic/realtime_lua.go index 53b936cf1abb09735c845fb29a9910b52d30e764..ce517e63a4d7ac8a9174e5358129daee46a3cbaa 100644 --- a/traffic/realtime_lua.go +++ b/traffic/realtime_lua.go @@ -59,28 +59,31 @@ defer l.Close() l.PreloadModule("json", luajson.Loader) l.PreloadModule("http", gluahttp.NewHttpModule(&http.Client{}).Loader) if err := l.DoFile(filePath); err != nil { - return map[string]Update{}, false, fmt.Errorf("while executing lua script: %w", err) + return map[string]Update{}, true, fmt.Errorf("while executing lua script: %w", err) } if err := l.CallByParam(lua.P{ Fn: l.GetGlobal("getUpdates"), NRet: 2, Protect: true, - }, lua.LString(stopID)); err != nil { - return map[string]Update{}, false, fmt.Errorf("while executing updates function: %w", err) + }, lua.LString(""), lua.LNumber(0), lua.LString(stopID)); err != nil { + return map[string]Update{}, true, fmt.Errorf("while executing updates function: %w", err) } + luaErr := l.Get(-1) // TODO make err json, and prepare for 429 + l.Pop(1) result := l.Get(-1) l.Pop(1) - luaErr := l.Get(-1) - l.Pop(1) if luaErr.(lua.LString) != "" { - return map[string]Update{}, false, fmt.Errorf("while executing updates function: %s", luaErr.(lua.LString)) + return map[string]Update{}, true, fmt.Errorf("while executing updates function: %s", luaErr.(lua.LString)) } - json.Unmarshal([]byte(result.(lua.LString)), &luaUpdates) + err := json.Unmarshal([]byte(result.(lua.LString)), &luaUpdates) + if err != nil { + return luaUpdates.Updates, true, fmt.Errorf("while unmarshalling updates : %w", err) + } vehicleStatuses, err := getLuaRealtimeVehiclesMap(ctx) if err != nil { - return luaUpdates.Updates, false, fmt.Errorf("while getting vehicle statuses : %w", err) + return luaUpdates.Updates, true, fmt.Errorf("while getting vehicle statuses : %w", err) } for tripID, status := range vehicleStatuses { u := luaUpdates.Updates[tripID] @@ -88,6 +91,9 @@ u.VehicleStatus = status luaUpdates.Updates[tripID] = u } for tripID, update := range luaUpdates.Updates { + if updates == nil { + updates = map[string]Update{} + } updates[tripID] = update } return luaUpdates.Updates, luaUpdates.AreTripsInTimetable, nil