penguin/golifehk

@golifehk bot in Telegram

datasources/kmb/schedules.go

raw ยท 1490 bytes

package kmb

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "path/filepath"
    "time"

    "github.com/tgckpg/golifehk/utils"
)

type Schedule struct {
    ETA time.Time `json:"eta,string"`
    Index int `json:"eta_seq"`
    DateCreated time.Time `json:"data_timestamp,string"`
    Remarks_en string `json:"rmk_en"`
    Remarks_sc string `json:"rmk_sc"`
    Remarks_tc string `json:"rmk_tc"`
}

type Schedules struct {
    Type string `json:"type"`
    Version string `json:"version"`
    DateCreated time.Time `json:"generated_timestamp,string"`
    Schedules [] *Schedule `json:"data"`
}

func getSchedule( r *RouteStop ) ( *[] *Schedule, error ) {

    CACHE_PATH := filepath.Join(
        utils.WORKDIR,
        "kmb-" + r.BusStop.BusStopId + "-" + r.RouteId + "-" + r.ServiceType + ".json",
    )

    QUERY_FUNC := func() ( io.ReadCloser, error ) {
        resp, err := http.Get( fmt.Sprintf(
                "https://data.etabus.gov.hk/v1/transport/kmb/eta/%s/%s/%s",
                r.BusStop.BusStopId,
                r.RouteId,
                r.ServiceType,
        ) )
        if err != nil {
            return nil, err
        }
        return resp.Body, nil
    }

    buff, err := utils.CacheStream( CACHE_PATH, QUERY_FUNC, 60 )
    if err != nil {
        return nil, err
    }

    schedules := Schedules{}
    err = json.Unmarshal( buff.Bytes(), &schedules )
    if err != nil {
        return nil, err
    }

    return &schedules.Schedules, nil
}