diff options
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | strava/strava.go | 5 | ||||
| -rw-r--r-- | web/sync.go | 14 |
3 files changed, 7 insertions, 16 deletions
@@ -108,9 +108,8 @@ TypeScript checks can also be run directly with `npm run check`, covering format ## TODO -- http://localhost:8080/rides/6: Cat 4 inside Chemin des Lauriers (embrassé) - Compute estimated power, speed -- Categorised rides like to-dos +- Categorised rides like to-dos, also vtt - Compact binary or vectorized storage for root - For a ride, scatter, one point per 100m segment. Slope vs speed - Plot speed and slope per segment, colored by heart rate @@ -128,6 +127,7 @@ TypeScript checks can also be run directly with `npm run check`, covering format - progress bar cli - processing takes components as input, not entities - issue: many passes are pedestriant (cf Marseille Calanques, http://localhost:8080/rides/397) +- analytics: color split (by year, type, etc) ## Resources diff --git a/strava/strava.go b/strava/strava.go index 309d0ee..a619e0a 100644 --- a/strava/strava.go +++ b/strava/strava.go @@ -150,10 +150,7 @@ type RateLimitError struct { func (e *RateLimitError) Error() string { if !e.RetryAfter.IsZero() { - until := time.Until(e.RetryAfter).Truncate(time.Second) - if until < 0 { - until = 0 - } + until := max(time.Until(e.RetryAfter).Truncate(time.Second), 0) scope := "15-minute" if e.IsDaily { scope = "daily" diff --git a/web/sync.go b/web/sync.go index fdb3c4e..0b95b93 100644 --- a/web/sync.go +++ b/web/sync.go @@ -83,8 +83,7 @@ func (s *Server) handleSync(w http.ResponseWriter, r *http.Request) { return writeSyncEvent(w, flusher, "progress", progress) }) if err != nil { - var rateErr *strava.RateLimitError - if errors.As(err, &rateErr) { + if rateErr, ok := errors.AsType[*strava.RateLimitError](err); ok { slog.Warn("Strava sync rate limited", "total", progress.Total, "imported", progress.Imported, "retryAfter", rateErr.RetryAfter, "isDaily", rateErr.IsDaily, "readDaily", fmt.Sprintf("%d/%d", rateErr.State.Read.UsageDaily, rateErr.State.Read.LimitDaily), "overallDaily", fmt.Sprintf("%d/%d", rateErr.State.Overall.UsageDaily, rateErr.State.Overall.LimitDaily)) enrichProgressWithState(&progress, rateErr.State) _ = writeSyncEvent(w, flusher, "error", syncErrorEvent{ @@ -108,8 +107,7 @@ func (s *Server) handleSync(w http.ResponseWriter, r *http.Request) { func (s *Server) syncRides(client syncClient, gpxDir string, from, to time.Time, report func(SyncProgress) error) (SyncProgress, error) { activities, err := client.List(from, to) if err != nil { - var rateErr *strava.RateLimitError - if errors.As(err, &rateErr) { + if rateErr, ok := errors.AsType[*strava.RateLimitError](err); ok { slog.Warn("Strava sync rate limited while listing activities", "retryAfter", rateErr.RetryAfter, "isDaily", rateErr.IsDaily, "error", err) } return SyncProgress{}, err @@ -138,8 +136,7 @@ func (s *Server) syncRides(client syncClient, gpxDir string, from, to time.Time, } activity, gpxData, err := client.Get(summary.ID) if err != nil { - var rateErr *strava.RateLimitError - if errors.As(err, &rateErr) { + if rateErr, ok := errors.AsType[*strava.RateLimitError](err); ok { slog.Warn("Strava sync rate limited", "activity", summary.ID, "name", summary.Name, "retryAfter", rateErr.RetryAfter, "isDaily", rateErr.IsDaily, "completed", progress.Completed, "total", progress.Total) return progress, err } @@ -287,10 +284,7 @@ func rateLimitMessage(rateErr *strava.RateLimitError, progress SyncProgress) str } retryText := "" if !rateErr.RetryAfter.IsZero() { - until := time.Until(rateErr.RetryAfter).Truncate(time.Second) - if until < 0 { - until = 0 - } + until := max(time.Until(rateErr.RetryAfter).Truncate(time.Second), 0) retryText = fmt.Sprintf(" Retry after %s (in %s).", rateErr.RetryAfter.UTC().Format(time.RFC3339), until) if rateErr.IsDaily { retryText = fmt.Sprintf(" Daily limit resets at %s (in %s).", rateErr.RetryAfter.UTC().Format(time.RFC3339), until) |
