timetable-mgr/cif/helpers.go

104 lines
2.9 KiB
Go
Raw Normal View History

package cif
import (
"errors"
"time"
"git.fjla.uk/owlboard/timetable-mgr/log"
"go.uber.org/zap"
)
2024-03-30 01:09:12 +00:00
// Fetches the day string for the provided date.
func getDayString(t time.Time) string {
london, err := time.LoadLocation("Europe/London")
if err != nil {
log.Msg.Error("Unable to load time zone info", zap.Error(err))
}
2024-03-30 01:09:12 +00:00
timeNow := t.In(london)
day := timeNow.Weekday()
dayStrings := [...]string{"sun", "mon", "tue", "wed", "thu", "fri", "sat"}
return dayStrings[day]
}
// Simply returns the correct URL for either a 'daily' or 'full' update.
func getUpdateUrl(updateType string) (string, error) {
if updateType == "daily" {
2024-03-30 01:09:12 +00:00
return dailyUpdateUrl, nil
} else if updateType == "full" {
return fullUpdateUrl, nil
}
2024-03-28 22:47:08 +00:00
err := errors.New("invalid update type provided, must be one of 'daily' or 'full'")
return "", err
}
2024-03-30 01:09:12 +00:00
// Takes a time.Time as input and returns True if it is
// the same day as now, or false if it is not the same day as now
func isSameToday(t time.Time) bool {
2024-04-04 13:58:18 +01:00
test := t.In(time.UTC)
2024-03-30 01:09:12 +00:00
today := time.Now().In(time.UTC)
2024-04-04 13:58:18 +01:00
return test.Year() == today.Year() && test.Month() == today.Month() && test.Day() == today.Day()
2024-03-30 01:09:12 +00:00
}
// Returns how many days ago `t` was compared to today
func howManyDaysAgo(t time.Time) int {
today := time.Now().In(time.UTC).Truncate(24 * time.Hour)
input := t.In(time.UTC).Truncate(24 * time.Hour)
diff := today.Sub(input)
days := int(diff.Hours() / 24)
return days
}
2024-04-04 22:39:09 +01:00
// Generates a slice of time.Time values representing which days files need downloading
func generateUpdateDays(days int) []time.Time {
var updateDays []time.Time
for i := 0; i < days; i++ {
day := time.Now().Add(-time.Duration(i) * 24 * time.Hour)
updateDays = append(updateDays, day)
}
// Reverse slice to ensure chronological order
for i, j := 0, len(updateDays)-1; i < j; i, j = i+1, j-1 {
updateDays[i], updateDays[j] = updateDays[j], updateDays[i]
}
return updateDays
}
// Parses CIF Schedule Start/End Dates (YYYY-MM-DD) into time.Time types (00:00:00 for start, 23:59:59 for end)
func ParseCifDate(input, startOrEnd string) time.Time {
layout := "2006-01-02" // Layout of input
t, err := time.ParseInLocation(layout, input, londonTimezone)
if err != nil {
log.Msg.Error("Error parsing date string", zap.String("date string", input), zap.Error(err))
return time.Time{}
}
if startOrEnd == "start" {
t = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, londonTimezone)
} else if startOrEnd == "end" {
t = time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 0, londonTimezone)
} else {
log.Msg.Error("Error parsing date string", zap.String("date string", input), zap.Error(err))
return time.Time{}
}
return t
}
// Parses CIF days_run field and converts to array of day strings
func parseDaysRun(daysBinary string) []string {
shortDays := []string{"m", "t", "w", "th", "f", "s", "su"}
var result []string
for i, digit := range daysBinary {
if digit == '1' {
result = append(result, shortDays[i])
}
}
return result
}