Respect rate limit of jikan

This commit is contained in:
daru
2022-05-11 00:04:29 +02:00
parent 0c8cb9a55f
commit 3121143a41
4 changed files with 11 additions and 5 deletions

1
go.mod
View File

@@ -9,6 +9,7 @@ require (
github.com/valyala/fasthttp v1.36.0
github.com/valyala/quicktemplate v1.7.0
github.com/xujiajun/nutsdb v0.8.0
golang.org/x/time v0.0.0-20220411224347-583f2d630306
)
require (

2
go.sum
View File

@@ -65,6 +65,8 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/time v0.0.0-20220411224347-583f2d630306 h1:+gHMid33q6pen7kv9xvT+JRinntgeXO2AeZVd0AWD3w=
golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=

View File

@@ -12,6 +12,7 @@ import (
"github.com/allegro/bigcache/v3"
"github.com/gookit/color"
"github.com/xujiajun/nutsdb"
"golang.org/x/time/rate"
)
const (
@@ -44,6 +45,7 @@ var (
searchCache *bigcache.BigCache
animeListCache *bigcache.BigCache
db *nutsdb.DB
jikanLimiter *rate.Limiter
)
func main() {
@@ -55,6 +57,8 @@ func main() {
color.Notice.Printf("huso %s %s\n", husoVersion, runtime.Version())
jikanLimiter = rate.NewLimiter(rate.Every(time.Second), 3)
// cache init
var err error
animeCache, err = bigcache.NewBigCache(bigcache.DefaultConfig(7 * time.Hour))

View File

@@ -2,6 +2,7 @@ package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"strconv"
@@ -91,11 +92,7 @@ func GetUserData(username string) (*User, []byte, error) {
err = nil
dataJikan, err := GetDataJikan(userApiJikan + username)
if err != nil {
// retry bcs Jikan big baka
dataJikan, err = GetDataJikan(userApiJikan + username)
if err != nil {
return nil, nil, err
}
return nil, nil, err
}
if strings.Contains(string(dataJikan), "BadResponseException") {
return nil, nil, fmt.Errorf("user not found: %s", username)
@@ -194,6 +191,8 @@ func GetDataMal(apiAddr string) ([]byte, error) {
func GetDataJikan(apiAddr string) ([]byte, error) {
var body []byte
ctx := context.Background()
jikanLimiter.Wait(ctx)
statusCode, body, err := fasthttp.Get(body, *jikanApiBaseUri+apiAddr)
if statusCode != fasthttp.StatusOK {
return body, fmt.Errorf("unexpected response code: %s %d", *jikanApiBaseUri+apiAddr, statusCode)