From a304c24b32c0327436bbd8c2853e60668e161b42 Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Mon, 29 Dec 2025 00:41:52 +0100 Subject: Rename a lot of stuff, add Santiago real time --- .../Enmarcha.Sources.Tussa.csproj | 10 ++++++ src/Enmarcha.Sources.Tussa/Response.cs | 34 ++++++++++++++++++ .../SantiagoRealtimeEstimatesProvider.cs | 40 ++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 src/Enmarcha.Sources.Tussa/Enmarcha.Sources.Tussa.csproj create mode 100644 src/Enmarcha.Sources.Tussa/Response.cs create mode 100644 src/Enmarcha.Sources.Tussa/SantiagoRealtimeEstimatesProvider.cs (limited to 'src/Enmarcha.Sources.Tussa') diff --git a/src/Enmarcha.Sources.Tussa/Enmarcha.Sources.Tussa.csproj b/src/Enmarcha.Sources.Tussa/Enmarcha.Sources.Tussa.csproj new file mode 100644 index 0000000..0db72ca --- /dev/null +++ b/src/Enmarcha.Sources.Tussa/Enmarcha.Sources.Tussa.csproj @@ -0,0 +1,10 @@ + + + + net10.0 + enable + enable + Enmarcha.Sources.Tussa + + + diff --git a/src/Enmarcha.Sources.Tussa/Response.cs b/src/Enmarcha.Sources.Tussa/Response.cs new file mode 100644 index 0000000..df941b9 --- /dev/null +++ b/src/Enmarcha.Sources.Tussa/Response.cs @@ -0,0 +1,34 @@ +using System.Text.Json.Serialization; + +namespace Enmarcha.Sources.Tussa; + +public class MaisbusResponse +{ + [JsonPropertyName("id")] public string Id { get; set; } + [JsonPropertyName("codigo")] public string Code { get; set; } + [JsonPropertyName("nombre")] public string Name { get; set; } + [JsonPropertyName("coordenadas")] public Coordinates Coordinates { get; set; } + [JsonPropertyName("lineas")] public Route[] Routes { get; set; } +} + +public class Coordinates +{ + [JsonPropertyName("latitud")] + public double Latitude { get; set; } + [JsonPropertyName("longitud")] + public double Longitude { get; set; } +} + +public class Route +{ + [JsonPropertyName("id")] public string Id { get; set; } + [JsonPropertyName("sinoptico")] public string Sinoptico { get; set; } + [JsonPropertyName("nombre")] public string Name { get; set; } + [JsonPropertyName("estilo")] public string Colour { get; set; } + /// + /// 2025-12-28 23:57 + /// + [JsonPropertyName("proximoPaso")] public string NextArrival { get; set; } + [JsonPropertyName("minutosProximoPaso")] public int MinutesToArrive { get; set; } +} + diff --git a/src/Enmarcha.Sources.Tussa/SantiagoRealtimeEstimatesProvider.cs b/src/Enmarcha.Sources.Tussa/SantiagoRealtimeEstimatesProvider.cs new file mode 100644 index 0000000..7437a05 --- /dev/null +++ b/src/Enmarcha.Sources.Tussa/SantiagoRealtimeEstimatesProvider.cs @@ -0,0 +1,40 @@ +using System.Net.Http.Json; + +namespace Enmarcha.Sources.Tussa; + +public class SantiagoRealtimeEstimatesProvider +{ + private HttpClient _http; + + public SantiagoRealtimeEstimatesProvider(HttpClient http) + { + _http = http; + } + + public async Task> GetEstimatesForStop(int stopId) + { + var url = GetRequestUrl(stopId.ToString()); + + var response = await _http.GetAsync(url); + var maisbusResponse = await response.Content.ReadFromJsonAsync(); + + if (maisbusResponse is null) + { + var responseString = await response.Content.ReadAsStringAsync(); + throw new Exception("Error parsing maisbus response: " + responseString); + } + + return maisbusResponse.Routes.Select(r => new SantiagoEstimate + ( + r.Id.ToString(), + r.MinutesToArrive + )).OrderBy(a => a.Minutes).ToList(); + } + + private static string GetRequestUrl(string stopId) + { + return $"https://tussa.gal/maisbus/api/stop/{stopId}"; + } +} + +public record SantiagoEstimate(string RouteId, int Minutes); -- cgit v1.3