From 6671f34a2503cd29aa3bf15216f3a0e2c7af73cf Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Tue, 24 Mar 2026 21:01:38 +0100 Subject: Enhance NextStopsProcessor to include stop names in marquee and improve stop description parsing --- .../Services/Processors/NextStopsProcessor.cs | 31 +++++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'src/Enmarcha.Backend/Services/Processors') diff --git a/src/Enmarcha.Backend/Services/Processors/NextStopsProcessor.cs b/src/Enmarcha.Backend/Services/Processors/NextStopsProcessor.cs index 517faae..1db215b 100644 --- a/src/Enmarcha.Backend/Services/Processors/NextStopsProcessor.cs +++ b/src/Enmarcha.Backend/Services/Processors/NextStopsProcessor.cs @@ -31,7 +31,7 @@ public class NextStopsProcessor : IArrivalsProcessor arrival.NextStops = otpArrival.Trip.Stoptimes .Where(s => s.ScheduledDeparture > currentStopDeparture) .OrderBy(s => s.ScheduledDeparture) - .Select(s => s.Stop.Description) + .Select(s => $"{s.Stop.Name} -- {s.Stop.Description}") .Distinct() .ToList(); } @@ -71,11 +71,22 @@ public class NextStopsProcessor : IArrivalsProcessor .Select(SplitXuntaStopDescription) .ToList(); - List seenConcellos = new(); - List seenParroquias = new(); + List seenConcellos = []; + List seenParroquias = []; List items = []; - foreach (var (parroquia, concello) in points) + var maxPointsPerCouncil = points.GroupBy(p => p.concello) + .Select(g => g.Count()) + .DefaultIfEmpty(0) + .Max(); + + if (maxPointsPerCouncil == 1) + { + // If there's only one stop per council, we can simplify the marquee to just show the council names + return string.Join(" - ", points.Select(p => p.nombre).Distinct()); + } + + foreach (var (nombre, parroquia, concello) in points) { // Santiago de Compostela -- Santiago de Compostela > Conxo -- Santiago de Compostela > BiduĂ­do -- Ames > Calo -- Teo > Bugallido -- Ames // Santiago de Compostela -> Conxo -> Bidueiro (Ames) -> Calo (Teo) -> Bugallido @@ -94,7 +105,7 @@ public class NextStopsProcessor : IArrivalsProcessor if (!seenConcellos.Contains(concello)) { seenConcellos.Add(concello); - item = $"({concello}) {item}"; + item = $"{item} ({concello})"; } items.Add(item); @@ -112,14 +123,14 @@ public class NextStopsProcessor : IArrivalsProcessor }; } - private static (string parroquia, string concello) SplitXuntaStopDescription(string stopName) + private static (string nombre, string parroquia, string concello) SplitXuntaStopDescription(string stopName) { - var parts = stopName.Split(" -- ", 2); - if (parts.Length != 2) + var parts = stopName.Split(" -- ", 3); + if (parts.Length != 3) { - return ("", ""); // TODO: Throw + return ("", "", ""); // TODO: Throw } - return (parts[0], parts[1]); + return (parts[0], parts[1], parts[2]); } } -- cgit v1.3