mirror of
https://github.com/cwinfo/matterbridge.git
synced 2025-09-10 23:32:30 +00:00
Update vendor bwmarrin/discordgo
This commit is contained in:
49
vendor/github.com/bwmarrin/discordgo/ratelimit.go
generated
vendored
49
vendor/github.com/bwmarrin/discordgo/ratelimit.go
generated
vendored
@@ -41,8 +41,8 @@ func NewRatelimiter() *RateLimiter {
|
||||
}
|
||||
}
|
||||
|
||||
// getBucket retrieves or creates a bucket
|
||||
func (r *RateLimiter) getBucket(key string) *Bucket {
|
||||
// GetBucket retrieves or creates a bucket
|
||||
func (r *RateLimiter) GetBucket(key string) *Bucket {
|
||||
r.Lock()
|
||||
defer r.Unlock()
|
||||
|
||||
@@ -51,7 +51,7 @@ func (r *RateLimiter) getBucket(key string) *Bucket {
|
||||
}
|
||||
|
||||
b := &Bucket{
|
||||
remaining: 1,
|
||||
Remaining: 1,
|
||||
Key: key,
|
||||
global: r.global,
|
||||
}
|
||||
@@ -68,27 +68,37 @@ func (r *RateLimiter) getBucket(key string) *Bucket {
|
||||
return b
|
||||
}
|
||||
|
||||
// LockBucket Locks until a request can be made
|
||||
func (r *RateLimiter) LockBucket(bucketID string) *Bucket {
|
||||
|
||||
b := r.getBucket(bucketID)
|
||||
|
||||
b.Lock()
|
||||
|
||||
// GetWaitTime returns the duration you should wait for a Bucket
|
||||
func (r *RateLimiter) GetWaitTime(b *Bucket, minRemaining int) time.Duration {
|
||||
// If we ran out of calls and the reset time is still ahead of us
|
||||
// then we need to take it easy and relax a little
|
||||
if b.remaining < 1 && b.reset.After(time.Now()) {
|
||||
time.Sleep(b.reset.Sub(time.Now()))
|
||||
|
||||
if b.Remaining < minRemaining && b.reset.After(time.Now()) {
|
||||
return b.reset.Sub(time.Now())
|
||||
}
|
||||
|
||||
// Check for global ratelimits
|
||||
sleepTo := time.Unix(0, atomic.LoadInt64(r.global))
|
||||
if now := time.Now(); now.Before(sleepTo) {
|
||||
time.Sleep(sleepTo.Sub(now))
|
||||
return sleepTo.Sub(now)
|
||||
}
|
||||
|
||||
b.remaining--
|
||||
return 0
|
||||
}
|
||||
|
||||
// LockBucket Locks until a request can be made
|
||||
func (r *RateLimiter) LockBucket(bucketID string) *Bucket {
|
||||
return r.LockBucketObject(r.GetBucket(bucketID))
|
||||
}
|
||||
|
||||
// LockBucketObject Locks an already resolved bucket until a request can be made
|
||||
func (r *RateLimiter) LockBucketObject(b *Bucket) *Bucket {
|
||||
b.Lock()
|
||||
|
||||
if wait := r.GetWaitTime(b, 1); wait > 0 {
|
||||
time.Sleep(wait)
|
||||
}
|
||||
|
||||
b.Remaining--
|
||||
return b
|
||||
}
|
||||
|
||||
@@ -96,13 +106,14 @@ func (r *RateLimiter) LockBucket(bucketID string) *Bucket {
|
||||
type Bucket struct {
|
||||
sync.Mutex
|
||||
Key string
|
||||
remaining int
|
||||
Remaining int
|
||||
limit int
|
||||
reset time.Time
|
||||
global *int64
|
||||
|
||||
lastReset time.Time
|
||||
customRateLimit *customRateLimit
|
||||
Userdata interface{}
|
||||
}
|
||||
|
||||
// Release unlocks the bucket and reads the headers to update the buckets ratelimit info
|
||||
@@ -113,10 +124,10 @@ func (b *Bucket) Release(headers http.Header) error {
|
||||
// Check if the bucket uses a custom ratelimiter
|
||||
if rl := b.customRateLimit; rl != nil {
|
||||
if time.Now().Sub(b.lastReset) >= rl.reset {
|
||||
b.remaining = rl.requests - 1
|
||||
b.Remaining = rl.requests - 1
|
||||
b.lastReset = time.Now()
|
||||
}
|
||||
if b.remaining < 1 {
|
||||
if b.Remaining < 1 {
|
||||
b.reset = time.Now().Add(rl.reset)
|
||||
}
|
||||
return nil
|
||||
@@ -176,7 +187,7 @@ func (b *Bucket) Release(headers http.Header) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.remaining = int(parsedRemaining)
|
||||
b.Remaining = int(parsedRemaining)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
Reference in New Issue
Block a user