all repos — kokyo @ 1513f141d0c31ef944771e03ce8cc54e7b19bd56

Chatbot and CLI tool for Swiss public transports

api/stopEvent.ts (view raw)

 1import { difference } from "@std/datetime/difference";
 2import { format } from "@std/datetime/format";
 3import { getStopEventService } from "./api.ts";
 4import { get } from "../lib/func.ts";
 5
 6export const getNextDepartures = async (
 7  stopRef: string,
 8  depArrTime: Date = new Date()
 9): Promise<StopEvent[]> => {
10  const { result } = await getStopEventService(stopRef, depArrTime);
11  const stopEventResult =
12    result.OJP.OJPResponse["siri:ServiceDelivery"]["OJPStopEventDelivery"][
13      "StopEventResult"
14    ];
15
16  return stopEventResult
17    .map((stopEvent: any) => {
18      const rawDatetime =
19        get(
20          stopEvent,
21          "StopEvent.ThisCall.CallAtStop.ServiceDeparture.EstimatedTime"
22        ) ||
23        get(
24          stopEvent,
25          "StopEvent.ThisCall.CallAtStop.ServiceDeparture.TimetabledTime"
26        );
27      let datetime = null;
28      let departureIn = null;
29      if (rawDatetime) {
30        datetime = new Date(rawDatetime);
31        departureIn = difference(datetime, new Date(), { units: ["minutes"] });
32      }
33      return {
34        from: get(stopEvent, "StopEvent.Service.OriginText.Text.#text"),
35        to: get(stopEvent, "StopEvent.Service.DestinationText.Text.#text"),
36        departure: datetime && format(datetime, "HH:mm"),
37        departureIn: departureIn?.minutes,
38        stopName: get(
39          stopEvent,
40          "StopEvent.ThisCall.CallAtStop.StopPointName.Text.#text"
41        ),
42        quay: get(
43          stopEvent,
44          "StopEvent.ThisCall.CallAtStop.PlannedQuay.Text.#text"
45        ),
46      } as StopEvent;
47    })
48    .sort(
49      (eventA: StopEvent, eventB: StopEvent) =>
50        eventA.departureIn - eventB.departureIn
51    );
52};