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) }