Add `.gitignore` Update `go.mod` Add `go.sum` Add `drawing.go` Add `JetBrainsMono-Bold.ttf` Add `JetBrainsMono-Italic.ttf` Add `JetBrainsMono-Regular.ttf` Add `weathericons-regular-webfont.ttf` Add `imagegen.go` Add `kindle-dashboard.test.png` Add `rttclient.go` Add `wxclient.go` Add `rootpasswordtool.txt`
110 lines
3.5 KiB
Go
110 lines
3.5 KiB
Go
package imagegen
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/carlmjohnson/requests"
|
|
"time"
|
|
)
|
|
|
|
type rawTrainsResp struct {
|
|
Location struct {
|
|
Name string `json:"name"`
|
|
Crs string `json:"crs"`
|
|
Tiploc string `json:"tiploc"`
|
|
Country string `json:"country"`
|
|
System string `json:"system"`
|
|
} `json:"location"`
|
|
Filter interface{} `json:"filter"`
|
|
Services []struct {
|
|
LocationDetail struct {
|
|
RealtimeActivated bool `json:"realtimeActivated"`
|
|
Tiploc string `json:"tiploc"`
|
|
Crs string `json:"crs"`
|
|
Description string `json:"description"`
|
|
GbttBookedArrival string `json:"gbttBookedArrival"`
|
|
GbttBookedDeparture string `json:"gbttBookedDeparture"`
|
|
Origin []struct {
|
|
Tiploc string `json:"tiploc"`
|
|
Description string `json:"description"`
|
|
WorkingTime string `json:"workingTime"`
|
|
PublicTime string `json:"publicTime"`
|
|
} `json:"origin"`
|
|
Destination []struct {
|
|
Tiploc string `json:"tiploc"`
|
|
Description string `json:"description"`
|
|
WorkingTime string `json:"workingTime"`
|
|
PublicTime string `json:"publicTime"`
|
|
} `json:"destination"`
|
|
IsCall bool `json:"isCall"`
|
|
IsPublicCall bool `json:"isPublicCall"`
|
|
RealtimeArrival string `json:"realtimeArrival"`
|
|
RealtimeArrivalActual bool `json:"realtimeArrivalActual"`
|
|
RealtimeDeparture string `json:"realtimeDeparture"`
|
|
RealtimeDepartureActual bool `json:"realtimeDepartureActual"`
|
|
DisplayAs string `json:"displayAs"`
|
|
} `json:"locationDetail"`
|
|
ServiceUid string `json:"serviceUid"`
|
|
RunDate string `json:"runDate"`
|
|
TrainIdentity string `json:"trainIdentity"`
|
|
RunningIdentity string `json:"runningIdentity"`
|
|
AtocCode string `json:"atocCode"`
|
|
AtocName string `json:"atocName"`
|
|
ServiceType string `json:"serviceType"`
|
|
IsPassenger bool `json:"isPassenger"`
|
|
} `json:"services"`
|
|
}
|
|
|
|
func getNextTrains(username, password, location string) ([]string, error) {
|
|
resp := new(rawTrainsResp)
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*15)
|
|
err := requests.
|
|
URL("https://api.rtt.io").
|
|
Pathf("/api/v1/json/search/%s", location).
|
|
BasicAuth(username, password).
|
|
ToJSON(&resp).
|
|
Fetch(ctx)
|
|
cancel()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get trains: %w", err)
|
|
}
|
|
|
|
var res []string
|
|
for _, service := range resp.Services {
|
|
depTime, err := time.ParseInLocation("1504 2006-01-02", service.LocationDetail.GbttBookedDeparture+" "+service.RunDate, time.UTC)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("parse trains: %w", err)
|
|
}
|
|
now := time.Now().UTC()
|
|
if depTime.Sub(now) < time.Minute*60 {
|
|
str := fmt.Sprintf("%s % -25s", service.LocationDetail.GbttBookedDeparture, service.LocationDetail.Destination[0].Description)
|
|
var time string
|
|
if service.LocationDetail.DisplayAs == "CANCELLED_CALL" {
|
|
time = "Cancelled"
|
|
} else if service.LocationDetail.RealtimeDeparture != service.LocationDetail.GbttBookedDeparture {
|
|
time = "Expt " + service.LocationDetail.RealtimeDeparture
|
|
} else if service.LocationDetail.RealtimeArrivalActual {
|
|
time = "Arrived"
|
|
} else {
|
|
time = "On time"
|
|
}
|
|
|
|
str += " " + time
|
|
res = append(res, str)
|
|
}
|
|
}
|
|
|
|
for i, str := range res {
|
|
suffix := "th"
|
|
if i+1 == 1 {
|
|
suffix = "st"
|
|
} else if i+1 == 2 {
|
|
suffix = "nd"
|
|
} else if i+1 == 3 {
|
|
suffix = "rd"
|
|
}
|
|
res[i] = fmt.Sprintf("%d%s %s", i+1, suffix, str)
|
|
}
|
|
|
|
return res, nil
|
|
}
|