Skip to content
This repository was archived by the owner on Mar 5, 2023. It is now read-only.

Commit 93c67aa

Browse files
author
jonas747
committed
fix ratelimit parsing
1 parent ce1b695 commit 93c67aa

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

ratelimit.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,12 +231,12 @@ func (b *Bucket) Release(headers http.Header, lockCounter int64) error {
231231
retryAfter := headers.Get("Retry-After")
232232
if retryAfter != "" {
233233

234-
parsedAfter, err := strconv.ParseInt(retryAfter, 10, 64)
234+
dur, err := parseResetAfterDur(retryAfter)
235235
if err != nil {
236236
return err
237237
}
238238

239-
resetAt := time.Now().Add(time.Duration(parsedAfter) * time.Second)
239+
resetAt := time.Now().Add(dur)
240240

241241
// Lock either this single bucket or all buckets
242242
global := headers.Get("X-RateLimit-Global")
@@ -246,12 +246,12 @@ func (b *Bucket) Release(headers http.Header, lockCounter int64) error {
246246
b.reset = resetAt
247247
}
248248
} else if resetAfter != "" {
249-
resetAfterParsed, err := strconv.ParseFloat(resetAfter, 64)
249+
dur, err := parseResetAfterDur(resetAfter)
250250
if err != nil {
251251
return err
252252
}
253253

254-
b.reset = time.Now().Add(time.Millisecond * time.Duration(resetAfterParsed*1000))
254+
b.reset = time.Now().Add(dur)
255255
}
256256

257257
// Udpate remaining if header is present
@@ -266,3 +266,12 @@ func (b *Bucket) Release(headers http.Header, lockCounter int64) error {
266266

267267
return nil
268268
}
269+
270+
func parseResetAfterDur(in string) (time.Duration, error) {
271+
resetAfterParsed, err := strconv.ParseFloat(in, 64)
272+
if err != nil {
273+
return 0, err
274+
}
275+
276+
return time.Millisecond * time.Duration(resetAfterParsed*1000), nil
277+
}

restapi.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,10 @@ func (s *Session) doRequest(method, urlStr, contentType string, b []byte, bucket
168168

169169
rl.Bucket = bucket.Key
170170

171-
s.log(LogInformational, "Rate Limiting %s, retry in %d", urlStr, rl.RetryAfter)
171+
s.log(LogInformational, "Rate Limiting %s, retry in %s", urlStr, rl.RetryAfterDur())
172172
s.handleEvent(rateLimitEventType, &RateLimit{TooManyRequests: &rl, URL: urlStr})
173173

174-
time.Sleep(rl.RetryAfter * time.Second)
174+
time.Sleep(rl.RetryAfterDur())
175175
// we can make the above smarter
176176
// this method can cause longer delays than required
177177
return nil, true, true, nil

structs.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -810,10 +810,14 @@ type Relationship struct {
810810
// A TooManyRequests struct holds information received from Discord
811811
// when receiving a HTTP 429 response.
812812
type TooManyRequests struct {
813-
Bucket string `json:"bucket"`
814-
Message string `json:"message"`
815-
RetryAfter time.Duration `json:"retry_after"`
816-
Global bool `json:"global"`
813+
Bucket string `json:"bucket"`
814+
Message string `json:"message"`
815+
RetryAfter float64 `json:"retry_after"`
816+
Global bool `json:"global"`
817+
}
818+
819+
func (t *TooManyRequests) RetryAfterDur() time.Duration {
820+
return time.Duration(t.RetryAfter*1000) * time.Millisecond
817821
}
818822

819823
// A ReadState stores data on the read state of channels.

0 commit comments

Comments
 (0)