All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.robertograham.fortnite2.implementation.DefaultLeaderBoardResource Maven / Gradle / Ivy

There is a newer version: 3.1.0
Show newest version
package io.github.robertograham.fortnite2.implementation;

import io.github.robertograham.fortnite2.domain.LeaderBoardEntry;
import io.github.robertograham.fortnite2.domain.enumeration.PartyType;
import io.github.robertograham.fortnite2.domain.enumeration.Platform;
import io.github.robertograham.fortnite2.resource.LeaderBoardResource;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;

import javax.json.Json;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;

import static org.apache.http.HttpHeaders.AUTHORIZATION;
import static org.apache.http.entity.ContentType.APPLICATION_JSON;

final class DefaultLeaderBoardResource implements LeaderBoardResource {

    private static final NameValuePair OWNER_TYPE_PARAMETER = new BasicNameValuePair("ownertype", "1");
    private static final NameValuePair PAGE_NUMBER_PARAMETER = new BasicNameValuePair("pageNumber", "0");
    private final CloseableHttpClient httpClient;
    private final OptionalResponseHandlerProvider optionalResponseHandlerProvider;
    private final Supplier accessTokenSupplier;
    private final Supplier inAppIdSupplier;

    private DefaultLeaderBoardResource(CloseableHttpClient httpClient,
                                       OptionalResponseHandlerProvider optionalResponseHandlerProvider,
                                       Supplier accessTokenSupplier,
                                       Supplier inAppIdSupplier) {
        this.httpClient = httpClient;
        this.optionalResponseHandlerProvider = optionalResponseHandlerProvider;
        this.accessTokenSupplier = accessTokenSupplier;
        this.inAppIdSupplier = inAppIdSupplier;
    }

    static DefaultLeaderBoardResource newInstance(CloseableHttpClient httpClient,
                                                  OptionalResponseHandlerProvider optionalResponseHandlerProvider,
                                                  Supplier sessionTokenSupplier,
                                                  Supplier inAppIdSupplier) {
        return new DefaultLeaderBoardResource(
                httpClient,
                optionalResponseHandlerProvider,
                sessionTokenSupplier,
                inAppIdSupplier
        );
    }

    private Optional> cohortAccounts(Platform platform, PartyType partyType) throws IOException {
        return httpClient.execute(
                RequestBuilder.get("https://fortnite-public-service-prod11.ol.epicgames.com/fortnite/api/game/v2/leaderboards/cohort/" + inAppIdSupplier.get())
                        .addParameter("playlist", String.format("%s_m0_%s", platform.code(), partyType.code()))
                        .setHeader(AUTHORIZATION, "bearer " + accessTokenSupplier.get())
                        .build(),
                optionalResponseHandlerProvider.forClass(Cohort.class)
        )
                .map(Cohort::cohortAccounts);
    }

    @Override
    public Optional> findHighestWinnersByPlatformAndByPartyTypeForCurrentSeason(Platform platform, PartyType partyType, int maxEntries) throws IOException {
        Objects.requireNonNull(platform, "platform cannot be null");
        Objects.requireNonNull(partyType, "partyType cannot be null");
        if (maxEntries < 0 || maxEntries > 1000)
            throw new IllegalArgumentException("maxEntries cannot be less than 0 or greater than 1000");
        return httpClient.execute(
                RequestBuilder.post(String.format(
                        "https://fortnite-public-service-prod11.ol.epicgames.com/fortnite/api/leaderboards/type/global/stat/br_placetop1_%s_m0_%s/window/weekly",
                        platform.code(),
                        partyType.code()
                ))
                        .addParameter(OWNER_TYPE_PARAMETER)
                        .addParameter(PAGE_NUMBER_PARAMETER)
                        .addParameter("itemsPerPage", String.valueOf(maxEntries))
                        .setHeader(AUTHORIZATION, "bearer " + accessTokenSupplier.get())
                        .setEntity(
                                EntityBuilder.create()
                                        .setContentType(APPLICATION_JSON)
                                        .setText(
                                                Json.createArrayBuilder(
                                                        cohortAccounts(platform, partyType)
                                                                .orElseGet(ArrayList::new)
                                                )
                                                        .build()
                                                        .toString()
                                        )
                                        .build()
                        )
                        .build(),
                optionalResponseHandlerProvider.forClass(RawLeaderBoard.class)
        )
                .map(RawLeaderBoard::leaderBoardEntries);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy