102 lines
2.1 KiB
Go

package logic
import (
"context"
"encoding/base64"
"fmt"
"git.anthrove.art/Anthrove/gorse-playground/internal/config"
"github.com/anthrove/openapi-e621-go"
"github.com/caarlos0/env/v11"
"golang.org/x/time/rate"
"log"
"net/http"
_ "github.com/joho/godotenv/autoload"
)
var e621Config config.E621
var rateLimit *rate.Limiter
var apiClient *openapi.APIClient
func init() {
err := env.Parse(&e621Config)
if err != nil {
log.Panic(err)
}
rateLimit = rate.NewLimiter(1, 2)
apiClient, err = newE621Client(e621Config)
if err != nil {
log.Panic(err)
}
}
func newE621Client(cfg config.E621) (*openapi.APIClient, error) {
e621Config := openapi.NewConfiguration()
e621Config.DefaultHeader["Authorization"] = "Basic " + base64.StdEncoding.EncodeToString([]byte(cfg.Username+":"+cfg.ApiKey))
e621Config.UserAgent = fmt.Sprintf("gorse-playground-scraper used by %s | (made by the Anthrove Team)", cfg.Username)
e621Config.Debug = false
client := http.DefaultClient
client.Transport = newRateMiddleware(&http.Transport{})
e621Config.HTTPClient = client
return openapi.NewAPIClient(e621Config), nil
}
func GetAllFavorites(ctx context.Context, userID int) ([]openapi.Post, error) {
posts := make([]openapi.Post, 0)
page := 1
for {
currentFavs, err := GetFavoritePage(ctx, userID, page)
if err != nil {
return nil, err
}
if len(currentFavs) == 0 {
break
}
posts = append(posts, currentFavs...)
page++
}
return posts, nil
}
func GetFavoritePage(ctx context.Context, userId int, pageIdentifier int) ([]openapi.Post, error) {
favorites, _, err := apiClient.FavoritesAPI.ListFavorites(ctx).Page(int32(pageIdentifier)).UserId(int32(userId)).Execute()
if err != nil {
return make([]openapi.Post, 0), err
}
return favorites.Posts, nil
}
func newRateMiddleware(transport *http.Transport) http.RoundTripper {
return &rateMiddleware{
transport: transport,
}
}
type rateMiddleware struct {
transport *http.Transport
}
func (r rateMiddleware) RoundTrip(request *http.Request) (*http.Response, error) {
err := rateLimit.Wait(request.Context())
if err != nil {
return nil, err
}
return r.transport.RoundTrip(request)
}