mirror of
https://github.com/bestnite/go-igdb.git
synced 2025-04-19 23:35:54 +08:00
add limiter
This commit is contained in:
parent
e01d9805c6
commit
4be44c4eb2
5
igdb.go
5
igdb.go
@ -11,11 +11,13 @@ type igdb struct {
|
|||||||
clientID string
|
clientID string
|
||||||
token *twitchToken
|
token *twitchToken
|
||||||
flaresolverr *flaresolverr.Flaresolverr
|
flaresolverr *flaresolverr.Flaresolverr
|
||||||
|
limiter *rateLimiter
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(clientID, clientSecret string) *igdb {
|
func New(clientID, clientSecret string) *igdb {
|
||||||
return &igdb{
|
return &igdb{
|
||||||
clientID: clientID,
|
clientID: clientID,
|
||||||
|
limiter: newRateLimiter(4),
|
||||||
token: NewTwitchToken(clientID, clientSecret),
|
token: NewTwitchToken(clientID, clientSecret),
|
||||||
flaresolverr: nil,
|
flaresolverr: nil,
|
||||||
}
|
}
|
||||||
@ -24,12 +26,15 @@ func New(clientID, clientSecret string) *igdb {
|
|||||||
func NewWithFlaresolverr(clientID, clientSecret string, f *flaresolverr.Flaresolverr) *igdb {
|
func NewWithFlaresolverr(clientID, clientSecret string, f *flaresolverr.Flaresolverr) *igdb {
|
||||||
return &igdb{
|
return &igdb{
|
||||||
clientID: clientID,
|
clientID: clientID,
|
||||||
|
limiter: newRateLimiter(4),
|
||||||
token: NewTwitchToken(clientID, clientSecret),
|
token: NewTwitchToken(clientID, clientSecret),
|
||||||
flaresolverr: f,
|
flaresolverr: f,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *igdb) Request(URL string, dataBody any) (*resty.Response, error) {
|
func (g *igdb) Request(URL string, dataBody any) (*resty.Response, error) {
|
||||||
|
g.limiter.wait()
|
||||||
|
|
||||||
t, err := g.token.getToken()
|
t, err := g.token.getToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to get twitch token: %w", err)
|
return nil, fmt.Errorf("failed to get twitch token: %w", err)
|
||||||
|
48
rate_limiter.go
Normal file
48
rate_limiter.go
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package igdb
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type rateLimiter struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
rate int
|
||||||
|
interval time.Duration
|
||||||
|
tokens int
|
||||||
|
lastRefill time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func newRateLimiter(rate int) *rateLimiter {
|
||||||
|
return &rateLimiter{
|
||||||
|
rate: rate,
|
||||||
|
interval: time.Second,
|
||||||
|
tokens: rate,
|
||||||
|
lastRefill: time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rateLimiter) wait() {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
elapsed := now.Sub(r.lastRefill)
|
||||||
|
|
||||||
|
if elapsed >= r.interval {
|
||||||
|
r.tokens = r.rate
|
||||||
|
r.lastRefill = now
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.tokens <= 0 {
|
||||||
|
waitTime := r.interval - elapsed
|
||||||
|
r.mu.Unlock()
|
||||||
|
time.Sleep(waitTime)
|
||||||
|
r.mu.Lock()
|
||||||
|
r.tokens = r.rate - 1
|
||||||
|
r.lastRefill = time.Now()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
r.tokens--
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user