This repository has been archived on 2025-07-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
kindle-dashboard/imagegen/rttclient.go
AKP 2e9b8cdfb0
Alter 13 files
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`
2023-11-19 19:14:28 +00:00

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
}