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

io.github.robertograham.fortnite2.xmpp.implementation.DefaultSession Maven / Gradle / Ivy

package io.github.robertograham.fortnite2.xmpp.implementation;

import io.github.robertograham.fortnite2.xmpp.domain.Session;
import io.github.robertograham.fortnite2.xmpp.domain.enumeration.Application;
import io.github.robertograham.fortnite2.xmpp.domain.enumeration.Platform;

import javax.json.JsonObject;
import javax.json.bind.adapter.JsonbAdapter;
import java.util.Objects;
import java.util.Optional;
import java.util.function.BiFunction;

final class DefaultSession implements Session {

    private final String id;
    private final String status;
    private final boolean playing;
    private final boolean joinable;
    private final boolean voiceSupport;
    private final Optional partyMemberCount;
    private final Optional maxPartyMemberCount;
    private final Optional partyId;
    private final Optional partyKey;
    private final Optional platform;
    private final Optional application;
    private final Optional remainingPlayerCount;

    private DefaultSession(final String id,
                           final String status,
                           final boolean playing,
                           final boolean joinable,
                           final boolean voiceSupport,
                           final Optional partyMemberCount,
                           final Optional maxPartyMemberCount,
                           final Optional partyId,
                           final Optional partyKey,
                           final Optional platform,
                           final Optional application,
                           final Optional remainingPlayerCount) {
        this.id = id;
        this.status = status;
        this.playing = playing;
        this.joinable = joinable;
        this.voiceSupport = voiceSupport;
        this.partyMemberCount = partyMemberCount;
        this.maxPartyMemberCount = maxPartyMemberCount;
        this.partyId = partyId;
        this.partyKey = partyKey;
        this.platform = platform;
        this.application = application;
        this.remainingPlayerCount = remainingPlayerCount;
    }

    @Override
    public String id() {
        return id;
    }

    @Override
    public String status() {
        return status;
    }

    @Override
    public boolean isPlaying() {
        return playing;
    }

    @Override
    public boolean isJoinable() {
        return joinable;
    }

    @Override
    public boolean hasVoiceSupport() {
        return voiceSupport;
    }

    @Override
    public Optional partyMemberCount() {
        return partyMemberCount;
    }

    @Override
    public Optional maxPartyMemberCount() {
        return maxPartyMemberCount;
    }

    @Override
    public Optional partyId() {
        return partyId;
    }

    @Override
    public Optional partyKey() {
        return partyKey;
    }

    @Override
    public Optional platform() {
        return platform;
    }

    @Override
    public Optional application() {
        return application;
    }

    @Override
    public Optional remainingPlayerCount() {
        return remainingPlayerCount;
    }

    @Override
    public String toString() {
        return "DefaultSession{" +
            "id='" + id + '\'' +
            ", status='" + status + '\'' +
            ", playing=" + playing +
            ", joinable=" + joinable +
            ", voiceSupport=" + voiceSupport +
            ", partyMemberCount=" + partyMemberCount +
            ", maxPartyMemberCount=" + maxPartyMemberCount +
            ", partyId=" + partyId +
            ", partyKey=" + partyKey +
            ", platform=" + platform +
            ", application=" + application +
            ", remainingPlayerCount=" + remainingPlayerCount +
            '}';
    }

    @Override
    public boolean equals(final Object object) {
        if (this == object)
            return true;
        if (!(object instanceof DefaultSession))
            return false;
        final var defaultSession = (DefaultSession) object;
        return playing == defaultSession.playing &&
            joinable == defaultSession.joinable &&
            voiceSupport == defaultSession.voiceSupport &&
            id.equals(defaultSession.id) &&
            status.equals(defaultSession.status) &&
            partyMemberCount.equals(defaultSession.partyMemberCount) &&
            maxPartyMemberCount.equals(defaultSession.maxPartyMemberCount) &&
            partyId.equals(defaultSession.partyId) &&
            partyKey.equals(defaultSession.partyKey) &&
            platform.equals(defaultSession.platform) &&
            application.equals(defaultSession.application) &&
            remainingPlayerCount.equals(defaultSession.remainingPlayerCount);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, status, playing, joinable, voiceSupport, partyMemberCount, maxPartyMemberCount, partyId, partyKey, platform, application, remainingPlayerCount);
    }

    enum Adapter implements JsonbAdapter {

        INSTANCE;

        @Override
        public JsonObject adaptToJson(final DefaultSession defaultSession) {
            throw new UnsupportedOperationException();
        }

        @Override
        public DefaultSession adaptFromJson(final JsonObject jsonObject) {
            final var propertiesJsonObjectOptional = Optional.ofNullable(jsonObject.getJsonObject("Properties"));
            final var partyInfoJsonObjectOptional = propertiesJsonObjectOptional.map((final var propertiesJsonObject) -> propertiesJsonObject.getJsonObject("party.joininfodata.286331153_j"));
            return new DefaultSession(
                jsonObject.getString("SessionId"),
                jsonObject.getString("Status"),
                jsonObject.getBoolean("bIsPlaying"),
                jsonObject.getBoolean("bIsJoinable"),
                jsonObject.getBoolean("bHasVoiceSupport"),
                getOptionalValueFromJsonObject(propertiesJsonObjectOptional, "Event_PartySize_s", JsonObject::getString)
                    .map(Integer::parseInt),
                getOptionalValueFromJsonObject(propertiesJsonObjectOptional, "Event_PartyMaxSize_s", JsonObject::getString)
                    .map(Integer::parseInt),
                getOptionalValueFromJsonObject(partyInfoJsonObjectOptional, "partyId", JsonObject::getString),
                getOptionalValueFromJsonObject(partyInfoJsonObjectOptional, "key", JsonObject::getString),
                getOptionalValueFromJsonObject(partyInfoJsonObjectOptional, "sourcePlatform", JsonObject::getString)
                    .flatMap(Platform::fromCode),
                getOptionalValueFromJsonObject(partyInfoJsonObjectOptional, "appId", JsonObject::getString)
                    .flatMap(Application::fromCode),
                getOptionalValueFromJsonObject(propertiesJsonObjectOptional, "Event_PlayersAlive_s", JsonObject::getString)
                    .map(Integer::parseInt)
            );
        }

        private  Optional getOptionalValueFromJsonObject(final Optional jsonObjectOptional,
                                                               final String valueKey,
                                                               final BiFunction jsonObjectValueAccessor) {
            return jsonObjectOptional.filter((final var propertiesJsonObject) -> propertiesJsonObject.containsKey(valueKey))
                .map((final var propertiesJsonObject) -> jsonObjectValueAccessor.apply(propertiesJsonObject, valueKey));
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy