Creates all (?) endpoints
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
package ch.gtache.elderscrollslegends.service;
|
||||
|
||||
import com.codedisaster.steamworks.SteamException;
|
||||
import com.codedisaster.steamworks.SteamGameServerAPI;
|
||||
import io.quarkus.runtime.Quarkus;
|
||||
import io.quarkus.runtime.ShutdownEvent;
|
||||
import io.quarkus.runtime.StartupEvent;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.enterprise.event.Observes;
|
||||
import jakarta.inject.Inject;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
@ApplicationScoped
|
||||
public class ApplicationLifecycle {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(ApplicationLifecycle.class);
|
||||
private final SteamService steamService;
|
||||
|
||||
@Inject
|
||||
ApplicationLifecycle(final SteamService steamService) {
|
||||
this.steamService = requireNonNull(steamService);
|
||||
}
|
||||
|
||||
void onStart(@Observes final StartupEvent event) {
|
||||
logger.info("Starting up");
|
||||
try {
|
||||
SteamGameServerAPI.loadLibraries();
|
||||
if (!SteamGameServerAPI.init(0, (short) 8080, (short) 8081,
|
||||
SteamGameServerAPI.ServerMode.AuthenticationAndSecure, "1.0.0")) {
|
||||
logger.error("SteamAPI failed to initialize");
|
||||
Quarkus.asyncExit();
|
||||
}
|
||||
} catch (final SteamException e) {
|
||||
logger.error("SteamAPI failed to initialize", e);
|
||||
Quarkus.asyncExit();
|
||||
}
|
||||
}
|
||||
|
||||
void onShutdown(@Observes final ShutdownEvent event) {
|
||||
logger.info("Shutting down");
|
||||
steamService.endAllAuthSessions();
|
||||
SteamGameServerAPI.shutdown();
|
||||
}
|
||||
}
|
||||
150
src/main/java/ch/gtache/elderscrollslegends/service/Main.java
Normal file
150
src/main/java/ch/gtache/elderscrollslegends/service/Main.java
Normal file
@@ -0,0 +1,150 @@
|
||||
package ch.gtache.elderscrollslegends.service;
|
||||
|
||||
import com.codedisaster.steamworks.*;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
import java.util.HexFormat;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) throws SteamException, InterruptedException {
|
||||
SteamGameServerAPI.loadLibraries();
|
||||
if (SteamGameServerAPI.init(0, (short) 8080, (short) 8081, SteamGameServerAPI.ServerMode.AuthenticationAndSecure, "1.0.0")) {
|
||||
final var server = new SteamGameServer(new GameServerCallback());
|
||||
server.setDedicatedServer(true);
|
||||
server.setGameDescription("The Elder Scrolls Legends");
|
||||
server.setProduct("364470");
|
||||
server.setServerName("TESL");
|
||||
server.logOnAnonymous();
|
||||
Thread.sleep(5000L);
|
||||
SteamAPI.loadLibraries();
|
||||
if (SteamAPI.init()) {
|
||||
final var steamUser = new SteamUser(new SteamUserCallback());
|
||||
final var buffer = ByteBuffer.allocateDirect(1024);
|
||||
final var ticket = steamUser.getAuthSessionTicket(buffer, new int[]{1024});
|
||||
if (ticket != null && ticket.isValid()) {
|
||||
final var baos = new java.io.ByteArrayOutputStream();
|
||||
var i = 0;
|
||||
while (i < buffer.limit()) {
|
||||
baos.write(buffer.get(i));
|
||||
i++;
|
||||
}
|
||||
final var bytes = baos.toByteArray();
|
||||
buffer.position(0);
|
||||
final var hex = HexFormat.of().formatHex(bytes);
|
||||
System.out.println(hex + " <=> " + Arrays.toString(bytes));
|
||||
final var result = server.beginAuthSession(buffer, steamUser.getSteamID());
|
||||
final var result2 = steamUser.beginAuthSession(buffer, steamUser.getSteamID());
|
||||
System.out.println(result + " - " + result2);
|
||||
Thread.sleep(5000L);
|
||||
SteamAPI.runCallbacks();
|
||||
SteamGameServerAPI.runCallbacks();
|
||||
server.endAuthSession(steamUser.getSteamID());
|
||||
steamUser.cancelAuthTicket(ticket);
|
||||
server.logOff();
|
||||
Thread.sleep(5000L);
|
||||
SteamAPI.runCallbacks();
|
||||
SteamGameServerAPI.runCallbacks();
|
||||
System.out.println("Closed ticket");
|
||||
} else {
|
||||
System.out.println("Couldn't get auth session ticket");
|
||||
}
|
||||
} else {
|
||||
System.out.println("Couldn't init SteamAPI");
|
||||
}
|
||||
} else {
|
||||
System.out.println("Couldn't init SteamGameServerAPI");
|
||||
}
|
||||
SteamGameServerAPI.shutdown();
|
||||
SteamAPI.shutdown();
|
||||
}
|
||||
|
||||
private static class GameServerCallback implements SteamGameServerCallback {
|
||||
@Override
|
||||
public void onValidateAuthTicketResponse(final SteamID steamID,
|
||||
final SteamAuth.AuthSessionResponse authSessionResponse,
|
||||
final SteamID ownerSteamID) {
|
||||
System.out.println("Validate auth ticket response : " + steamID +
|
||||
" (" + authSessionResponse + " : " + ownerSteamID + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteamServersConnected() {
|
||||
System.out.println("Steam servers connected");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteamServerConnectFailure(final SteamResult result, final boolean stillRetrying) {
|
||||
System.out.println("Steam server connect failure : " + result + " (" + stillRetrying + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteamServersDisconnected(final SteamResult result) {
|
||||
System.out.println("Steam server disconnected : " + result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientApprove(final SteamID steamID, final SteamID ownerSteamID) {
|
||||
System.out.println("Client approved : " + steamID + " (" + ownerSteamID + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientDeny(final SteamID steamID, final SteamGameServer.DenyReason denyReason,
|
||||
final String optionalText) {
|
||||
System.out.println("Client denied : " + steamID + " (" + denyReason + " : " + optionalText + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientKick(final SteamID steamID, final SteamGameServer.DenyReason denyReason) {
|
||||
System.out.println("Client kicked : " + steamID + " (" + denyReason + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientGroupStatus(final SteamID steamID, final SteamID steamIDGroup,
|
||||
final boolean isMember, final boolean isOfficer) {
|
||||
System.out.println("Client group status : " + steamID +
|
||||
" (" + steamIDGroup + " : " + isMember + " : " + isOfficer + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAssociateWithClanResult(final SteamResult result) {
|
||||
System.out.println("Associate with clan result : " + result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComputeNewPlayerCompatibilityResult(final SteamResult result,
|
||||
final int playersThatDontLikeCandidate,
|
||||
final int playersThatCandidateDoesntLike,
|
||||
final int clanPlayersThatDontLikeCandidate,
|
||||
final SteamID steamIDCandidate) {
|
||||
System.out.println("onComputeNewPlayerCompatibilityResult : " + result + " (" + playersThatDontLikeCandidate +
|
||||
" : " + playersThatCandidateDoesntLike + " : " + clanPlayersThatDontLikeCandidate +
|
||||
" : " + steamIDCandidate + ")");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static class SteamUserCallback implements com.codedisaster.steamworks.SteamUserCallback {
|
||||
@Override
|
||||
public void onAuthSessionTicket(final SteamAuthTicket authTicket, final SteamResult result) {
|
||||
System.out.println("Auth session ticket : " + authTicket + " (" + result + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onValidateAuthTicket(final SteamID steamID, final SteamAuth.AuthSessionResponse authSessionResponse, final SteamID ownerSteamID) {
|
||||
System.out.println("Validate auth ticket : " + steamID +
|
||||
" (" + authSessionResponse + " : " + ownerSteamID + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMicroTxnAuthorization(final int appID, final long orderID, final boolean authorized) {
|
||||
System.out.println("Micro txn authorization : " + appID + " (" + orderID + " : " + authorized + ")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEncryptedAppTicket(final SteamResult result) {
|
||||
System.out.println("Encrypted app ticket : " + result);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package ch.gtache.elderscrollslegends.service;
|
||||
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
|
||||
@ApplicationScoped
|
||||
public class Producers {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
package ch.gtache.elderscrollslegends.service;
|
||||
|
||||
import com.codedisaster.steamworks.SteamAuth;
|
||||
import com.codedisaster.steamworks.SteamGameServer;
|
||||
import com.codedisaster.steamworks.SteamGameServerAPI;
|
||||
import com.codedisaster.steamworks.SteamGameServerCallback;
|
||||
import com.codedisaster.steamworks.SteamID;
|
||||
import com.codedisaster.steamworks.SteamNativeHandle;
|
||||
import com.codedisaster.steamworks.SteamResult;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
class ServerCallback implements SteamGameServerCallback {
|
||||
private static final Logger logger = Logger.getLogger(ServerCallback.class);
|
||||
|
||||
private SteamGameServer steamServer;
|
||||
private final String token;
|
||||
private final AtomicBoolean running;
|
||||
private final AtomicLong validating;
|
||||
private final AtomicBoolean valid;
|
||||
private final Thread callbacksThread;
|
||||
|
||||
ServerCallback(final String token) {
|
||||
this.token = requireNonNull(token);
|
||||
this.running = new AtomicBoolean(false);
|
||||
this.validating = new AtomicLong(0L);
|
||||
this.valid = new AtomicBoolean(false);
|
||||
this.callbacksThread = new Thread(() -> {
|
||||
while (!Thread.currentThread().isInterrupted()) {
|
||||
trySleep();
|
||||
SteamGameServerAPI.runCallbacks();
|
||||
}
|
||||
});
|
||||
callbacksThread.setDaemon(true);
|
||||
}
|
||||
|
||||
void setSteamServer(final SteamGameServer steamServer) {
|
||||
this.steamServer = requireNonNull(steamServer);
|
||||
callbacksThread.start();
|
||||
}
|
||||
|
||||
void setRunning() {
|
||||
while (setRunFailed()) {
|
||||
trySleep();
|
||||
}
|
||||
}
|
||||
|
||||
void waitForCallback() {
|
||||
while (isRunningOrNotInterrupted()) {
|
||||
trySleep();
|
||||
}
|
||||
}
|
||||
|
||||
void setValidating(final long steamIDHandle) {
|
||||
setRunning();
|
||||
while (setValidatingFailed(steamIDHandle)) {
|
||||
trySleep();
|
||||
}
|
||||
}
|
||||
|
||||
boolean checkValid(final long steamIDHandle) {
|
||||
if (validating.get() == steamIDHandle) {
|
||||
while (isRunningOrNotInterrupted()) {
|
||||
trySleep();
|
||||
}
|
||||
final var isValid = valid.get();
|
||||
validating.compareAndSet(steamIDHandle, 0L);
|
||||
valid.set(false);
|
||||
return isValid;
|
||||
} else {
|
||||
throw new IllegalStateException("SteamID " + steamIDHandle + " is not validating");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onValidateAuthTicketResponse(final SteamID steamID,
|
||||
final SteamAuth.AuthSessionResponse authSessionResponse,
|
||||
final SteamID ownerSteamID) {
|
||||
logger.info("Validate auth ticket response : " + steamID +
|
||||
" (" + authSessionResponse + " : " + ownerSteamID + ")");
|
||||
final var steamIDHandle = SteamNativeHandle.getNativeHandle(steamID);
|
||||
final var isValid = authSessionResponse == SteamAuth.AuthSessionResponse.OK;
|
||||
if (steamIDHandle == validating.get()) {
|
||||
valid.compareAndSet(false, isValid);
|
||||
running.compareAndSet(true, false);
|
||||
} else {
|
||||
throw new IllegalStateException("SteamID " + steamIDHandle + " is not validating");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteamServersConnected() {
|
||||
logger.info("Steam servers connected");
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteamServerConnectFailure(final SteamResult result, final boolean stillRetrying) {
|
||||
logger.warn("Steam server connect failure : " + result + " (" + stillRetrying + ")");
|
||||
if (result == SteamResult.TryAnotherCM) {
|
||||
logger.info("Trying another CM");
|
||||
steamServer.logOn(token);
|
||||
} else {
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSteamServersDisconnected(final SteamResult result) {
|
||||
logger.info("Steam server disconnected : " + result);
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientApprove(final SteamID steamID, final SteamID ownerSteamID) {
|
||||
logger.info("Client approved : " + steamID + " (" + ownerSteamID + ")");
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientDeny(final SteamID steamID, final SteamGameServer.DenyReason denyReason,
|
||||
final String optionalText) {
|
||||
logger.warn("Client denied : " + steamID + " (" + denyReason + " : " + optionalText + ")");
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientKick(final SteamID steamID, final SteamGameServer.DenyReason denyReason) {
|
||||
logger.info("Client kicked : " + steamID + " (" + denyReason + ")");
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientGroupStatus(final SteamID steamID, final SteamID steamIDGroup,
|
||||
final boolean isMember, final boolean isOfficer) {
|
||||
logger.info("Client group status : " + steamID +
|
||||
" (" + steamIDGroup + " : " + isMember + " : " + isOfficer + ")");
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAssociateWithClanResult(final SteamResult result) {
|
||||
logger.info("Associate with clan result : " + result);
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComputeNewPlayerCompatibilityResult(final SteamResult result,
|
||||
final int playersThatDontLikeCandidate,
|
||||
final int playersThatCandidateDoesntLike,
|
||||
final int clanPlayersThatDontLikeCandidate,
|
||||
final SteamID steamIDCandidate) {
|
||||
logger.info("onComputeNewPlayerCompatilibityResult : " + result + " (" + playersThatDontLikeCandidate +
|
||||
" : " + playersThatCandidateDoesntLike + " : " + clanPlayersThatDontLikeCandidate +
|
||||
" : " + steamIDCandidate + ")");
|
||||
running.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
private boolean setRunFailed() {
|
||||
return !Thread.currentThread().isInterrupted() && !running.compareAndSet(false, true);
|
||||
}
|
||||
|
||||
private boolean setValidatingFailed(final long steamIDHandle) {
|
||||
return !Thread.currentThread().isInterrupted() && !validating.compareAndSet(0L, steamIDHandle);
|
||||
}
|
||||
|
||||
private boolean isRunningOrNotInterrupted() {
|
||||
return !Thread.currentThread().isInterrupted() && running.get();
|
||||
}
|
||||
|
||||
private static void trySleep() {
|
||||
try {
|
||||
Thread.sleep(500L);
|
||||
} catch (final InterruptedException ignored) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package ch.gtache.elderscrollslegends.service;
|
||||
|
||||
import com.codedisaster.steamworks.SteamAuth;
|
||||
import com.codedisaster.steamworks.SteamException;
|
||||
import com.codedisaster.steamworks.SteamGameServer;
|
||||
import com.codedisaster.steamworks.SteamID;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.HexFormat;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@ApplicationScoped
|
||||
public class SteamService {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(SteamService.class);
|
||||
|
||||
private static final Pattern NAME_PATTERN = Pattern.compile("<span class=\"actual_persona_name\">(?<name>.+)</span>");
|
||||
|
||||
private final SteamGameServer steamServer;
|
||||
private final ServerCallback serverCallback;
|
||||
private final HttpClient client;
|
||||
|
||||
@Inject
|
||||
SteamService(@ConfigProperty(name = "steam.server.token") final String token) {
|
||||
this.serverCallback = new ServerCallback(token);
|
||||
this.steamServer = new SteamGameServer(serverCallback);
|
||||
serverCallback.setSteamServer(steamServer);
|
||||
this.client = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build();
|
||||
|
||||
steamServer.setDedicatedServer(true);
|
||||
steamServer.setGameDescription("The Elder Scrolls Legends");
|
||||
steamServer.setProduct("364470");
|
||||
steamServer.setServerName("TESL");
|
||||
serverCallback.setRunning();
|
||||
steamServer.logOn(token);
|
||||
serverCallback.waitForCallback();
|
||||
}
|
||||
|
||||
public boolean authenticate(final String sessionTicket, final String steamID) throws SteamException {
|
||||
final var steamIDHandle = Long.parseLong(steamID);
|
||||
final var id = SteamID.createFromNativeHandle(steamIDHandle);
|
||||
final var bytes = HexFormat.of().parseHex(sessionTicket);
|
||||
final var buffer = ByteBuffer.allocateDirect(bytes.length);
|
||||
buffer.put(bytes);
|
||||
buffer.position(0);
|
||||
final var result = steamServer.beginAuthSession(buffer, id);
|
||||
if (result == SteamAuth.BeginAuthSessionResult.OK) {
|
||||
serverCallback.setValidating(steamIDHandle);
|
||||
return serverCallback.checkValid(steamIDHandle);
|
||||
} else {
|
||||
logger.warn("Couldn't authenticate " + steamIDHandle + " with " + sessionTicket + " : " + result);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public String getName(final String steamID) {
|
||||
final var request = HttpRequest.newBuilder().uri(URI.create("https://steamcommunity.com/profiles/" + steamID)).build();
|
||||
try {
|
||||
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
if (response.statusCode() == 200) {
|
||||
final var matcher = NAME_PATTERN.matcher(response.body());
|
||||
if (matcher.find()) {
|
||||
return matcher.group("name");
|
||||
} else {
|
||||
logger.warn("Couldn't get name for " + steamID + "in " + response.body() + ")");
|
||||
}
|
||||
} else {
|
||||
logger.warn("Couldn't get name for " + steamID + " (" + response.statusCode() + ")");
|
||||
}
|
||||
} catch (final IOException e) {
|
||||
logger.error("Error getting name for " + steamID, e);
|
||||
} catch (final InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
logger.error("Error getting name for " + steamID, e);
|
||||
}
|
||||
return steamID;
|
||||
}
|
||||
|
||||
public void endAuthSession(final String steamID) {
|
||||
final var id = SteamID.createFromNativeHandle(Long.parseLong(steamID));
|
||||
steamServer.endAuthSession(id);
|
||||
}
|
||||
|
||||
public void endAllAuthSessions() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service;
|
||||
|
||||
import java.time.Instant;
|
||||
|
||||
public record Token(String token, Instant expirationTimestamp) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
public record ABTestingSet(String setKey, String groupKey) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
public record AcceptLegalDocumentRequest(String legalDocumentId, String fingerprint, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
import ch.gtache.elderscrollslegends.service.SteamService;
|
||||
import ch.gtache.elderscrollslegends.service.account.auth.AuthBNETGamecodeRequest;
|
||||
import ch.gtache.elderscrollslegends.service.account.auth.AuthBNETSteamRequest;
|
||||
import ch.gtache.elderscrollslegends.service.account.auth.AuthResult;
|
||||
import ch.gtache.elderscrollslegends.service.account.auth.LogoutSteamRequest;
|
||||
import ch.gtache.elderscrollslegends.service.account.check.CheckEmailRequest;
|
||||
import ch.gtache.elderscrollslegends.service.account.check.CheckEmailResponse;
|
||||
import ch.gtache.elderscrollslegends.service.account.check.CheckEmailResponseBody;
|
||||
import ch.gtache.elderscrollslegends.service.account.check.CheckUsernameRequest;
|
||||
import ch.gtache.elderscrollslegends.service.account.check.CheckUsernameResponse;
|
||||
import ch.gtache.elderscrollslegends.service.account.check.CheckUsernameResponseBody;
|
||||
import ch.gtache.elderscrollslegends.service.account.transfer.LegalDocumentsResponse;
|
||||
import com.codedisaster.steamworks.SteamException;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.List;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
@Path("/account")
|
||||
public class AccountEndpoints {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AccountEndpoints.class);
|
||||
|
||||
private final SteamService steamService;
|
||||
private final AccountService accountService;
|
||||
|
||||
@Inject
|
||||
AccountEndpoints(final SteamService steamService, final AccountService accountService) {
|
||||
this.steamService = requireNonNull(steamService);
|
||||
this.accountService = requireNonNull(accountService);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetSteamLogin")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public AuthResult steamLogin(final AuthBNETSteamRequest request) {
|
||||
logger.info("SteamLogin called : " + request);
|
||||
try {
|
||||
if (steamService.authenticate(request.sessionTicket(), request.steamId())) {
|
||||
logger.info("SteamLogin succeeded for " + request);
|
||||
final var data = accountService.authenticate(request.steamId());
|
||||
return new AuthResult(data, 0, null, List.of());
|
||||
} else {
|
||||
return new AuthResult(null, 2, "SteamLogin failed", List.of());
|
||||
}
|
||||
} catch (final SteamException e) {
|
||||
logger.error("SteamLogin failed for " + request, e);
|
||||
return new AuthResult(null, 1, "SteamLogin failed", List.of());
|
||||
}
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetSteamLogout")
|
||||
@Consumes("application/json")
|
||||
public void steamLogout(final LogoutSteamRequest request) {
|
||||
logger.info("SteamLogout called : " + request);
|
||||
steamService.endAuthSession(request.steamId());
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetGamecodeLogin")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public AuthResult gamecodeLogin(final AuthBNETGamecodeRequest request) {
|
||||
logger.info("GamecodeLogin called : " + request);
|
||||
return null;
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetCheckUsername")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public CheckUsernameResponse checkUsername(final CheckUsernameRequest request) {
|
||||
logger.info("CheckUsername called : " + request);
|
||||
if (accountService.exists(request.username())) {
|
||||
return new CheckUsernameResponse(new CheckUsernameResponseBody(true, true, 0));
|
||||
} else {
|
||||
return new CheckUsernameResponse(new CheckUsernameResponseBody(false, false, 1));
|
||||
}
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetCheckEmail")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public CheckEmailResponse checkEmail(final CheckEmailRequest request) {
|
||||
logger.info("CheckEmail called : " + request);
|
||||
if (accountService.exists(request.email())) {
|
||||
return new CheckEmailResponse(new CheckEmailResponseBody(true, 0));
|
||||
} else {
|
||||
return new CheckEmailResponse(new CheckEmailResponseBody(false, 1));
|
||||
}
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetRefreshSession")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public RefreshSessionResponse refreshSession(final RefreshSessionRequest request) {
|
||||
logger.info("RefreshSession called : " + request);
|
||||
final var token = accountService.refresh(request.bnetKeyPlatform());
|
||||
final var timeToRefresh = Duration.between(java.time.Instant.now(), token.expirationTimestamp()).getSeconds();
|
||||
return new RefreshSessionResponse((int) timeToRefresh, token.token());
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetGetLegalDocumentsForUser")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public LegalDocumentsResponse getLegalDocumentsForUser(@HeaderParam("Authorization") final String authentication,
|
||||
final GetLegalDocumentsForUserRequest request) {
|
||||
logger.info("GetLegalDocumentsForUser called : " + request);
|
||||
return null;
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetAcceptLegalDocument")
|
||||
@Consumes("application/json")
|
||||
public void acceptLegalDocument(@HeaderParam("Authorization") final String authentication,
|
||||
final AcceptLegalDocumentRequest request) {
|
||||
logger.info("acceptLegalDocument called : " + request);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("bnetGetAllLegalDocuments")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public LegalDocumentsResponse getAllLegalDocuments(final GetAllLegalDocumentsRequest request) {
|
||||
logger.info("GetAllLegalDocuments called : " + request);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
import ch.gtache.elderscrollslegends.service.SteamService;
|
||||
import ch.gtache.elderscrollslegends.service.Token;
|
||||
import ch.gtache.elderscrollslegends.service.account.auth.AuthData;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.SQLException;
|
||||
import java.time.Duration;
|
||||
import java.util.List;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
@ApplicationScoped
|
||||
public class AccountService {
|
||||
private static final Logger logger = Logger.getLogger(AccountService.class);
|
||||
|
||||
private final SteamService steamService;
|
||||
private final DataSource dataSource;
|
||||
|
||||
@Inject
|
||||
AccountService(final SteamService steamService, final DataSource dataSource) {
|
||||
this.steamService = requireNonNull(steamService);
|
||||
this.dataSource = requireNonNull(dataSource);
|
||||
}
|
||||
|
||||
|
||||
public AuthData authenticate(final String steamID) {
|
||||
if (!exists(steamID)) {
|
||||
final var longId = Long.parseLong(steamID);
|
||||
final var name = steamService.getName(steamID);
|
||||
try (final var connection = dataSource.getConnection();
|
||||
final var statement = connection.prepareStatement("INSERT INTO player (steam_id, name) VALUES (?, ?)")) {
|
||||
statement.setLong(1, longId);
|
||||
statement.setString(2, name);
|
||||
statement.executeUpdate();
|
||||
} catch (final SQLException e) {
|
||||
logger.error("Error inserting player " + steamID, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
updateNameIfNeeded(steamID);
|
||||
final var token = getOrCreateToken(steamID);
|
||||
return getAuthData(steamID, token);
|
||||
}
|
||||
|
||||
private void updateNameIfNeeded(final String steamID) {
|
||||
final var longId = Long.parseLong(steamID);
|
||||
final var name = steamService.getName(steamID);
|
||||
try (final var connection = dataSource.getConnection();
|
||||
final var statement = connection.prepareStatement("UPDATE player SET name=? WHERE steam_id=?")) {
|
||||
statement.setString(1, name);
|
||||
statement.setLong(2, longId);
|
||||
statement.executeUpdate();
|
||||
} catch (final SQLException e) {
|
||||
logger.error("Error updating player " + steamID, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Token getOrCreateToken(final String steamID) {
|
||||
final var longId = Long.parseLong(steamID);
|
||||
try (final var connection = dataSource.getConnection();
|
||||
final var statement = connection.prepareStatement("SELECT token, expiration FROM token WHERE player_id=(SELECT id FROM player WHERE steam_id=?)")) {
|
||||
statement.setLong(1, longId);
|
||||
try (final var rs = statement.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
final var token = rs.getString(1);
|
||||
final var expiration = rs.getTimestamp(2).toInstant();
|
||||
if (expiration.isAfter(java.time.Instant.now())) {
|
||||
return new Token(token, expiration);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (final SQLException e) {
|
||||
logger.error("Error checking for player " + steamID, e);
|
||||
}
|
||||
try (final var connection = dataSource.getConnection();
|
||||
final var statement = connection.prepareStatement("INSERT INTO token (player_id) VALUES ((SELECT id FROM player WHERE steam_id=?)) RETURNING token, expiration")) {
|
||||
statement.setLong(1, longId);
|
||||
try (final var rs = statement.executeQuery()) {
|
||||
return rs.next() ? new Token(rs.getString(1), rs.getTimestamp(2).toInstant()) : null;
|
||||
}
|
||||
} catch (final SQLException e) {
|
||||
logger.error("Error inserting player " + steamID, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private AuthData getAuthData(final String steamID, final Token token) {
|
||||
if (token != null) {
|
||||
final var longId = Long.parseLong(steamID);
|
||||
try (final var connection = dataSource.getConnection();
|
||||
final var statement = connection.prepareStatement("SELECT 1 FROM player WHERE steam_id=?")) {
|
||||
statement.setLong(1, longId);
|
||||
try (final var rs = statement.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
final var uuid = token.token();
|
||||
final var timeToRefresh = Duration.between(java.time.Instant.now(), token.expirationTimestamp()).getSeconds();
|
||||
return new AuthData(uuid, "", "", "", "", steamID, steamID, steamID,
|
||||
"", steamID, "CH", false, false, (int) timeToRefresh,
|
||||
5, 5, false, "", "",
|
||||
0, List.of(), false);
|
||||
}
|
||||
}
|
||||
} catch (final SQLException e) {
|
||||
logger.error("Error checking for player " + steamID, e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean exists(final String steamID) {
|
||||
final var longId = Long.parseLong(steamID);
|
||||
try (final var connection = dataSource.getConnection();
|
||||
final var statement = connection.prepareStatement("SELECT 1 FROM player WHERE steam_id=?")) {
|
||||
statement.setLong(1, longId);
|
||||
try (final var rs = statement.executeQuery()) {
|
||||
return rs.next();
|
||||
}
|
||||
} catch (final SQLException e) {
|
||||
logger.error("Error checking for player " + steamID, e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Token refresh(final String steamID) {
|
||||
if (exists(steamID)) {
|
||||
final var longId = Long.parseLong(steamID);
|
||||
try (final var connection = dataSource.getConnection();
|
||||
final var statement = connection.prepareStatement("DELETE FROM token WHERE player_id=(SELECT id FROM player WHERE steam_id=?)")) {
|
||||
statement.setLong(1, longId);
|
||||
statement.executeUpdate();
|
||||
} catch (final SQLException e) {
|
||||
logger.error("Error checking for player " + steamID, e);
|
||||
}
|
||||
return getOrCreateToken(steamID);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
public record DeviceIdMapRequest(String deviceId, String fingerprint) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
public record GetAllLegalDocumentsRequest(String platform, String country, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
public record GetLegalDocumentsForUserRequest(String platform, String fingerprint, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
public record RefreshSessionRequest(String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
public record RefreshSessionResponse(int timeToRefresh, String sessionToken) {
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package ch.gtache.elderscrollslegends.service.account;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
record UpgradeAccountRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String platformName,
|
||||
String loginPlatform,
|
||||
String bnetKeyPlatform,
|
||||
String username,
|
||||
String emailAddress,
|
||||
String password,
|
||||
String passwordConfirmation,
|
||||
boolean newsOffersOptIn,
|
||||
String country,
|
||||
String language,
|
||||
int secret1Question,
|
||||
String secret1Answer,
|
||||
List<Integer> legalDocumentIds) {
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public record AuthBNETDeviceIdRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
boolean createAccount, String language, String loginPlatform,
|
||||
String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public record AuthBNETGamecodeRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String gamecode, String loginPlatform,
|
||||
String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
record AuthBNETGoogleAndroidRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String loginPlatform,
|
||||
String bnetKeyPlatform,
|
||||
boolean createAccount,
|
||||
String language,
|
||||
String serverAuthCode) {
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public record AuthBNETLoginTokenRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String build, String loginPlatform, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public record AuthBNETSteamRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String steamId, String sessionTicket, boolean createAccount, String language,
|
||||
String loginPlatform, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
record AuthBNETiOSGameCenterRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String loginPlatform,
|
||||
String bnetKeyPlatform,
|
||||
boolean createAccount,
|
||||
String language,
|
||||
String bundleId,
|
||||
String playerId,
|
||||
String KeyUrl,
|
||||
String signature,
|
||||
String salt,
|
||||
String teamPlayerId,
|
||||
String gamePlayerId,
|
||||
long timestamp) {
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
import ch.gtache.elderscrollslegends.service.account.ABTestingSet;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record AuthData(String token,
|
||||
String channel,
|
||||
String sessionId,
|
||||
String sessionType,
|
||||
String sessionToken,
|
||||
String buid,
|
||||
String steamId,
|
||||
String kpiId,
|
||||
String deviceGrade,
|
||||
String nickname,
|
||||
String bnetCountry,
|
||||
boolean isLimitedAccount,
|
||||
boolean isAnonymousAccount,
|
||||
int timeToRefresh,
|
||||
int maxRefreshFailures,
|
||||
float secondsBetweenRefreshFailures,
|
||||
boolean allowTP,
|
||||
String unityBundleUrl,
|
||||
String unityBundleHash,
|
||||
int buildSetId,
|
||||
List<ABTestingSet> abTestingSets,
|
||||
boolean wasNativeSignOn) {
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
record AuthDevRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String secretDevKey, String nickname, String accountId, String group) {
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public record AuthRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform) {
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record AuthResult(AuthData data, int errorCode, String errorMessage, List<String> validChangelists) {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public enum AuthType {
|
||||
Dev,
|
||||
Dev_UsernamePassword,
|
||||
Dev_DeviceId,
|
||||
BNETSteam,
|
||||
BNETGamecode,
|
||||
BNETiOSGameCenter,
|
||||
BNETGoogleAndroid,
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public record AuthUsernameAndPasswordRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String username, String password,
|
||||
String loginPlatform, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.auth;
|
||||
|
||||
public record LogoutSteamRequest(String steamId) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.check;
|
||||
|
||||
public record CheckEmailRequest(String fingerprint, String email, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.check;
|
||||
|
||||
public record CheckEmailResponse(CheckEmailResponseBody body) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.check;
|
||||
|
||||
public record CheckEmailResponseBody(boolean valid, int status_code) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.check;
|
||||
|
||||
public record CheckUsernameRequest(String fingerprint, String username, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.check;
|
||||
|
||||
public record CheckUsernameResponse(CheckUsernameResponseBody body) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.check;
|
||||
|
||||
public record CheckUsernameResponseBody(boolean valid, boolean exists, int status_code) {
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.link;
|
||||
|
||||
public record AndroidSessionLinkRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String loginPlatform, String language, String bnetKeyPlatform,
|
||||
String serverAuthCode) {
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.link;
|
||||
|
||||
public record IOSSessionLinkRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String loginPlatform, String language, String bnetKeyPlatform,
|
||||
String bundleId, String playerId, String publicKeyUrl,
|
||||
String signature, String salt, String teamPlayerId,
|
||||
String gamePlayerId, long timestamp) {
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.link;
|
||||
|
||||
public record SessionLinkBase(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String loginPlatform, String language, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.link;
|
||||
|
||||
public record SteamSessionLinkRequest(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String loginPlatform, String language, String bnetKeyPlatform,
|
||||
String steamId, String encryptedAppTicket) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.transfer;
|
||||
|
||||
public record LegalDocEntry(String doctype, String full_name, int id, String url) {
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.transfer;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record LegalDocumentsResponse(List<LegalDocEntry> items) {
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.transfer;
|
||||
|
||||
record TransferRequest_Phase0(String legalDocsPlatform, String username, String password, String fingerprint,
|
||||
String loginPlatform, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.transfer;
|
||||
|
||||
record TransferRequest_Phase1(String channel,
|
||||
String componentType,
|
||||
String majorVersion,
|
||||
String changelist,
|
||||
String fingerprint,
|
||||
String deviceId,
|
||||
String os,
|
||||
int dpi,
|
||||
int resolutionX,
|
||||
int resolutionY,
|
||||
String deltaDNAId,
|
||||
String appsFlyerId,
|
||||
String osVersion,
|
||||
String deviceName,
|
||||
String platform,
|
||||
String selectedUser, String username, String password,
|
||||
String loginPlatform, String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.transfer;
|
||||
|
||||
import ch.gtache.elderscrollslegends.service.inventory.SelectedItem;
|
||||
import ch.gtache.elderscrollslegends.service.profile.ProfileStruct;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
record TransferResponse_Phase0(List<LegalDocEntry> items, String buid, String sessionToken, boolean hasTeslUserData,
|
||||
ProfileStruct profile, List<SelectedItem> categories) {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.transfer;
|
||||
|
||||
import ch.gtache.elderscrollslegends.service.account.auth.AuthData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
record TransferResponse_Phase1(AuthData data, int errorCode, String errorMessage, List<String> validChangelists) {
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package ch.gtache.elderscrollslegends.service.account.transfer;
|
||||
|
||||
record Transfer_AcceptLegalDocumentRequest(String fingerprint, String sessionToken, String legalDocumentId,
|
||||
String bnetKeyPlatform) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.analytics;
|
||||
|
||||
public record AnalysticsEventPayload(AnalyticsEventType eventType, String data) {
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package ch.gtache.elderscrollslegends.service.analytics;
|
||||
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
@Path("/analytics")
|
||||
public class AnalyticsEndpoints {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AnalyticsEndpoints.class);
|
||||
|
||||
@POST
|
||||
@Path("/clientEvent")
|
||||
public void newAnalytics(@HeaderParam("Authorization") final String authentication,
|
||||
final AnalyticsEvent analyticsEvent) {
|
||||
logger.info("Report analytics called by " + authentication + " : " + analyticsEvent);
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/clientEventPA")
|
||||
public void newAnalyticsPA(@HeaderParam("Authorization") final String authentication,
|
||||
final AnalyticsEvent analyticsEvent) {
|
||||
logger.info("Report analyticsPA called by " + authentication + " : " + analyticsEvent);
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("/reportingConfig")
|
||||
@Produces("application/json")
|
||||
public FetchResponse getReportingConfig(@HeaderParam("Authorization") final String authentication) {
|
||||
logger.info("ReportingConfig called by " + authentication);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.analytics;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record AnalyticsEvent(int platformId, int clientVersion, String eventData, List<AnalysticsEventPayload> events) {
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package ch.gtache.elderscrollslegends.service.analytics;
|
||||
|
||||
public enum AnalyticsEventType {
|
||||
None,
|
||||
ConfigDownloaded,
|
||||
AuthCompleted,
|
||||
FirstTimeSignOnChoiceShown,
|
||||
FirstTimeSignOnChoiceOption1,
|
||||
FirstTimeSignOnChoiceOption2,
|
||||
InitializeAssetCatalog,
|
||||
AssetCatalogPreloadChoice,
|
||||
AssetDownloadWarning,
|
||||
AssetStartDownload,
|
||||
AssetFinishDownload,
|
||||
GameManagerSetup,
|
||||
CheckForMatchRejoin,
|
||||
InitializationStateComplete,
|
||||
EulaShow,
|
||||
EulaAgree,
|
||||
EulaCancel,
|
||||
AvatarPrompt,
|
||||
AvatarChosen,
|
||||
TutorialTextBoxShow,
|
||||
TutorialTextBoxHide,
|
||||
WindowEnable,
|
||||
WindowDisable,
|
||||
VideoStart,
|
||||
VideoPause,
|
||||
VideoUnpause,
|
||||
VideoSkip,
|
||||
VideoReplay,
|
||||
VideoStop,
|
||||
VideoPrepareTimeout,
|
||||
Count,
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.analytics;
|
||||
|
||||
public record FetchResponse(boolean enableReporting) {
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record ArenaClientDataStruct(int costGold, int costTickets, List<ArenaClientInstance> instances) {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record ArenaClientInstance(ArenaPhase phase, ArenaType arenaType, ArenaType arenaTypeEnum, boolean isCompleted,
|
||||
boolean hasRewards, int selectedClassTypeHash, List<Integer> potentialClassTypeHashes,
|
||||
List<Integer> cardSelectionTypeHashes, List<Integer> cardTypeHashes,
|
||||
List<Boolean> premiums, List<ArenaClientMatch> matches) {
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record ArenaClientMatch(int orderIndex, int avatarTypeHash, int scenarioModifierTypeHash, int scenarioTypeHash,
|
||||
int laneTypeHash1, int laneTypeHash2, int featuredMatchTypeHash, int deckTypeHash,
|
||||
int losses, int wins, boolean completed, boolean canSelect) {
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
|
||||
@Path("/arena")
|
||||
public class ArenaEndpoints {
|
||||
|
||||
|
||||
@Path("purchaseArena")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public FetchArenaInstancesResult purchaseArena(@HeaderParam("Authorization") final String authentication,
|
||||
final PurchaseArenaRequest request) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Path("resignArena")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public ResignArenaResult resignArena(@HeaderParam("Authorization") final String authentication,
|
||||
final ResignArenaRequest request) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Path("selectCard")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public SelectCardResult selectCard(@HeaderParam("Authorization") final String authentication,
|
||||
final SelectCardRequest request) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Path("selectClassType")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public SelectClassResult selectClassType(@HeaderParam("Authorization") final String authentication,
|
||||
final SelectClassRequest request) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Path("fetchActiveArenaInstances")
|
||||
@GET
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public FetchArenaInstancesResult fetchActiveArenaInstances() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public enum ArenaPhase {
|
||||
ClassSelection,
|
||||
CardSelection,
|
||||
MatchSelection,
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public enum ArenaPurchaseCurrencyType {
|
||||
Gold,
|
||||
Tickets,
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public enum ArenaType {
|
||||
Unknown,
|
||||
Solo,
|
||||
Versus,
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record FetchArenaInstancesResult(ArenaClientDataStruct clientData) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record PurchaseArenaRequest(ArenaType arenaType, ArenaPurchaseCurrencyType currencyType) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record PurchaseArenaResult(ArenaClientDataStruct clientData) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record ResignArenaRequest(ArenaType arenaType) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record ResignArenaResult() {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record SelectCardRequest(ArenaType arenaType, int cardTypeHash) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record SelectCardResult(ArenaClientDataStruct clientData) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record SelectClassRequest(ArenaType arenaType, int classTypeHash) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.arena;
|
||||
|
||||
public record SelectClassResult(ArenaClientDataStruct clientData) {
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
@Path("/campaign")
|
||||
public class CampaignEndpoints {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(CampaignEndpoints.class);
|
||||
|
||||
@POST
|
||||
@Path("checkCampaignProgress")
|
||||
@Consumes("application/json")
|
||||
public void checkCampaignProgress(@HeaderParam("Authorization") final String authentication,
|
||||
final CheckCampaignRequest request) {
|
||||
logger.info("CheckCampaignProgress called by " + authentication + " : " + request);
|
||||
//TODO
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("debugAddNextChapter")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public void debugAddNextChapter(@HeaderParam("Authorization") final String authentication,
|
||||
final DebugAddNextChapterRequest request) {
|
||||
logger.info("DebugAddNextChapter called by " + authentication + " : " + request);
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("debugAddNextEvent")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public void debugAddNextEvent(@HeaderParam("Authorization") final String authentication,
|
||||
final DebugAddNextEventRequest request) {
|
||||
|
||||
logger.info("DebugAddNextEvent called by " + authentication + " : " + request);
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("setChapterDialogStatus")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public SetChapterDialogResult setChapterDialogStatus(@HeaderParam("Authorization") final String authentication,
|
||||
final SetChapterDialogStatusRequest request) {
|
||||
logger.info("SetChapterDialogStatus called by " + authentication + " : " + request);
|
||||
//TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("setChapterEventChoice")
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public SetChapterEventResult setChapterEventChoice(@HeaderParam("Authorization") final String authentication,
|
||||
final SetChapterEventChoiceRequest request) {
|
||||
logger.info("SetChapterEventChoice called by " + authentication + " : " + request);
|
||||
//TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("list")
|
||||
@Produces("application/json")
|
||||
public ListCampaignsResponse getList(@HeaderParam("Authorization") final String authentication) {
|
||||
logger.info("List called by " + authentication);
|
||||
//TODO
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record CheckCampaignRequest(int campaignId, boolean isMastery) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record DebugAddNextChapterRequest(int campaignId, int actId, boolean isMastery) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record DebugAddNextEventRequest(int campaignId, int actId, int chapterId, boolean isMastery) {
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public enum DialogModalType {
|
||||
None,
|
||||
Intro,
|
||||
Ending,
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record ListCampaignsResponse(UserCampaignData campaignDatas) {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
import ch.gtache.elderscrollslegends.service.reward.RewardDescription;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record SetChapterDialogResult(List<RewardDescription> rewards) {
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record SetChapterDialogStatusRequest(int campaignId, int actId, int chapterId, int cinematicId,
|
||||
boolean isMastery, DialogModalType modalType, boolean seen) {
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record SetChapterEventChoiceRequest(int campaignId, int actId, int chapterId, int cinematicId,
|
||||
boolean isMastery, DialogModalType modalType, UserCampaignChoice choiceType) {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
import ch.gtache.elderscrollslegends.service.reward.RewardDescription;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record SetChapterEventResult(List<RewardDescription> rewards) {
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record UserActData(int actId, boolean isMastery, List<UserChapterData> chapterData) {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public enum UserCampaignChoice {
|
||||
None,
|
||||
First,
|
||||
Second,
|
||||
Third,
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record UserCampaignData(int campaignId, boolean isActive, int lastPlayedActIndex, int lastPlayedChapterIndex,
|
||||
int lastPlayedChapterEventINdex, List<UserActData> actData, List<Integer> ownedActs) {
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record UserChapterData(int chapterId, boolean isComplete, boolean hasIntroBeenShown,
|
||||
boolean hasEndingBeenShown, List<UserChapterEventData> chapterEventData,
|
||||
UserCampaignChoice introChoice, UserCampaignChoice endingChoice,
|
||||
List<Integer> chapterSeenCinematicTypeHashes) {
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record UserChapterEventData(int chapterEventId, int chapterId, boolean isComplete,
|
||||
UserCampaignChoice introChoice,
|
||||
UserCampaignChoice endingChoice) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.campaign;
|
||||
|
||||
public record UserDialogModalData(DialogModalType modalType, int choiceIndex) {
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package ch.gtache.elderscrollslegends.service.chat;
|
||||
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
|
||||
@Path("/chat")
|
||||
public class ChatEndpoints {
|
||||
|
||||
@Path("sendChatMessage")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
public void sendChatMessage(@HeaderParam("Authorization") final String authentication,
|
||||
final OutgoingMessage message) {
|
||||
//Do nothing
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.chat;
|
||||
|
||||
public record OutgoingMessage(String toBuid, String message) {
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package ch.gtache.elderscrollslegends.service.config;
|
||||
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import org.jboss.logging.Logger;
|
||||
import org.jboss.resteasy.reactive.Cache;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
@Path("config.json")
|
||||
public class ConfigResource {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(ConfigResource.class);
|
||||
|
||||
@GET
|
||||
@Produces("application/json")
|
||||
|
||||
@Cache
|
||||
public InputStream getConfiguration() {
|
||||
logger.info("Config called");
|
||||
return ConfigResource.class.getResourceAsStream("config.json");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package ch.gtache.elderscrollslegends.service.crafting;
|
||||
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
|
||||
@Path("/crafting")
|
||||
public class CraftingEndpoints {
|
||||
|
||||
@Path("soulTrapExtras")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public SoulTrapExtrasResponse soulTrapExtras(@HeaderParam("Authorization") final String authentication,
|
||||
final SoulTrapExtrasRequest request) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Path("sell")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public CraftingResponse sell(@HeaderParam("Authorization") final String authentication,
|
||||
final CraftingRequest request) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Path("purchase")
|
||||
@POST
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
public CraftingResponse purchase(@HeaderParam("Authorization") final String authentication,
|
||||
final CraftingRequest request) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.crafting;
|
||||
|
||||
public record CraftingRequest(int typeHash, int amount, boolean isPremium) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.crafting;
|
||||
|
||||
public record CraftingResponse(int cardTypeHash, int gems, int numRegular, int numPremium, boolean ghostedChange) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.crafting;
|
||||
|
||||
public record SoulTrapExtrasRequest(String priority) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.crafting;
|
||||
|
||||
public record SoulTrapExtrasResponse(int numGems) {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.dailyrewards;
|
||||
|
||||
public record AcceptRewardResponse(AcceptRewardResult result) {
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.dailyrewards;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record AcceptRewardResult(int xp, int gold, int gems, List<ItemType> items) {
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package ch.gtache.elderscrollslegends.service.dailyrewards;
|
||||
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
|
||||
@Path("/dailyrewards")
|
||||
public class DailyRewardsEndpoints {
|
||||
|
||||
@Path("list")
|
||||
@GET
|
||||
@Produces("application/json")
|
||||
public ListRewardsResponse list(@HeaderParam("Authorization") final String authentication) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Path("acceptReward")
|
||||
@POST
|
||||
@Produces("application/json")
|
||||
public AcceptRewardResponse acceptReward(@HeaderParam("Authorization") final String authentication) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.dailyrewards;
|
||||
|
||||
public record ItemType(String type, int typeId, int count, boolean isPremium) {
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package ch.gtache.elderscrollslegends.service.dailyrewards;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record ListRewardsResponse(List<RewardDescription> rewards) {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package ch.gtache.elderscrollslegends.service.dailyrewards;
|
||||
|
||||
public enum PreRewardedVisibilityType {
|
||||
Unknown,
|
||||
Visible,
|
||||
Mystery,
|
||||
MysteryCard,
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package ch.gtache.elderscrollslegends.service.dailyrewards;
|
||||
|
||||
public record RewardDescription(String scheduleKey, PreRewardedVisibilityType preRewardedVisibility,
|
||||
String displayKey, int amount, boolean delivered, boolean deliveredToday) {
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package ch.gtache.elderscrollslegends.service.error;
|
||||
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.HeaderParam;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
|
||||
@Path("/errorreporting")
|
||||
public class ErrorEndpoints {
|
||||
private static final Logger logger = Logger.getLogger(ErrorEndpoints.class);
|
||||
|
||||
@POST
|
||||
@Path("reportError")
|
||||
public void reportError(@HeaderParam("Authorization") final String authentication,
|
||||
final ErrorReport errorReport) {
|
||||
logger.info("Report error called by " + authentication + " : " + errorReport);
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("reportingConfig")
|
||||
public FetchResponse getReportingConfig(@HeaderParam("Authorization") final String authentication) {
|
||||
logger.info("ReportingConfig called by " + authentication);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package ch.gtache.elderscrollslegends.service.error;
|
||||
|
||||
public record ErrorReport(String report) {
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user