commit 8a05f63687bfb884987078ab037e606b50eed272 Author: Guillaume Tâche Date: Mon Apr 21 22:10:24 2025 +0200 Creates all (?) endpoints diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..94810d0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..91a800a --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +#Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties +.flattened-pom.xml + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env + +# Plugin directory +/.quarkus/cli/plugins/ +# TLS Certificates +.certs/ diff --git a/.mvn/wrapper/.gitignore b/.mvn/wrapper/.gitignore new file mode 100644 index 0000000..e72f5e8 --- /dev/null +++ b/.mvn/wrapper/.gitignore @@ -0,0 +1 @@ +maven-wrapper.jar diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..fe7d037 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.concurrent.ThreadLocalRandom; + +public final class MavenWrapperDownloader { + private static final String WRAPPER_VERSION = "3.3.2"; + + private static final boolean VERBOSE = Boolean.parseBoolean(System.getenv("MVNW_VERBOSE")); + + public static void main(String[] args) { + log("Apache Maven Wrapper Downloader " + WRAPPER_VERSION); + + if (args.length != 2) { + System.err.println(" - ERROR wrapperUrl or wrapperJarPath parameter missing"); + System.exit(1); + } + + try { + log(" - Downloader started"); + final URL wrapperUrl = URI.create(args[0]).toURL(); + final String jarPath = args[1].replace("..", ""); // Sanitize path + final Path wrapperJarPath = Paths.get(jarPath).toAbsolutePath().normalize(); + downloadFileFromURL(wrapperUrl, wrapperJarPath); + log("Done"); + } catch (IOException e) { + System.err.println("- Error downloading: " + e.getMessage()); + if (VERBOSE) { + e.printStackTrace(); + } + System.exit(1); + } + } + + private static void downloadFileFromURL(URL wrapperUrl, Path wrapperJarPath) + throws IOException { + log(" - Downloading to: " + wrapperJarPath); + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + final String username = System.getenv("MVNW_USERNAME"); + final char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + Path temp = wrapperJarPath + .getParent() + .resolve(wrapperJarPath.getFileName() + "." + + Long.toUnsignedString(ThreadLocalRandom.current().nextLong()) + ".tmp"); + try (InputStream inStream = wrapperUrl.openStream()) { + Files.copy(inStream, temp, StandardCopyOption.REPLACE_EXISTING); + Files.move(temp, wrapperJarPath, StandardCopyOption.REPLACE_EXISTING); + } finally { + Files.deleteIfExists(temp); + } + log(" - Downloader complete"); + } + + private static void log(String msg) { + if (VERBOSE) { + System.out.println(msg); + } + } + +} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..1a580be --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=source +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..12822de --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# elders-scrolls-legends-service + +This project uses Quarkus, the Supersonic Subatomic Java Framework. + +If you want to learn more about Quarkus, please visit its website: . + +## Running the application in dev mode + +You can run your application in dev mode that enables live coding using: + +```shell script +./mvnw quarkus:dev +``` + +> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at . + +## Packaging and running the application + +The application can be packaged using: + +```shell script +./mvnw package +``` + +It produces the `quarkus-run.jar` file in the `target/quarkus-app/` directory. +Be aware that it’s not an _über-jar_ as the dependencies are copied into the `target/quarkus-app/lib/` directory. + +The application is now runnable using `java -jar target/quarkus-app/quarkus-run.jar`. + +If you want to build an _über-jar_, execute the following command: + +```shell script +./mvnw package -Dquarkus.package.jar.type=uber-jar +``` + +The application, packaged as an _über-jar_, is now runnable using `java -jar target/*-runner.jar`. + +## Creating a native executable + +You can create a native executable using: + +```shell script +./mvnw package -Dnative +``` + +Or, if you don't have GraalVM installed, you can run the native executable build in a container using: + +```shell script +./mvnw package -Dnative -Dquarkus.native.container-build=true +``` + +You can then execute your native executable with: `./target/elders-scrolls-legends-service-1.0-SNAPSHOT-runner` + +If you want to learn more about building native executables, please consult . + +## Related Guides + +- REST ([guide](https://quarkus.io/guides/rest)): A Jakarta REST implementation utilizing build time processing and + Vert.x. This extension is not compatible with the quarkus-resteasy extension, or any of the extensions that depend on + it. +- Elytron Security OAuth 2.0 ([guide](https://quarkus.io/guides/security-oauth2)): Secure your applications with OAuth2 + opaque tokens +- WebSockets Next ([guide](https://quarkus.io/guides/websockets-next-reference)): Implementation of the WebSocket API + with enhanced efficiency and usability +- SmallRye OpenAPI ([guide](https://quarkus.io/guides/openapi-swaggerui)): Document your REST APIs with OpenAPI - comes + with Swagger UI +- REST Jackson ([guide](https://quarkus.io/guides/rest#json-serialisation)): Jackson serialization support for Quarkus + REST. This extension is not compatible with the quarkus-resteasy extension, or any of the extensions that depend on it +- Logging GELF ([guide](https://quarkus.io/guides/centralized-log-management)): Log using the Graylog Extended Log + Format and centralize your logs in ELK or EFK +- Elytron Security JDBC ([guide](https://quarkus.io/guides/security-jdbc)): Secure your applications with + username/password stored in a database +- Jacoco - Code Coverage ([guide](https://quarkus.io/guides/tests-with-coverage)): Jacoco test coverage support +- Mailer ([guide](https://quarkus.io/guides/mailer)): Send emails +- SmallRye Metrics ([guide](https://quarkus.io/guides/smallrye-metrics)): Expose metrics for your services +- JDBC Driver - PostgreSQL ([guide](https://quarkus.io/guides/datasource)): Connect to the PostgreSQL database via JDBC + +## Provided Code + +### REST + +Easily start your REST Web Services + +[Related guide section...](https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources) diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..5e9618c --- /dev/null +++ b/mvnw @@ -0,0 +1,332 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ]; then + + if [ -f /usr/local/etc/mavenrc ]; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ]; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ]; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +darwin=false +mingw=false +case "$(uname)" in +CYGWIN*) cygwin=true ;; +MINGW*) mingw=true ;; +Darwin*) + darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)" + export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home" + export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ]; then + if [ -r /etc/gentoo-release ]; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$JAVA_HOME" ] \ + && JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] \ + && CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] \ + && JAVA_HOME="$( + cd "$JAVA_HOME" || ( + echo "cannot cd into $JAVA_HOME." >&2 + exit 1 + ) + pwd + )" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "$javaExecutable" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin; then + javaHome="$(dirname "$javaExecutable")" + javaExecutable="$(cd "$javaHome" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "$javaExecutable")" + fi + javaHome="$(dirname "$javaExecutable")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$( + \unset -f command 2>/dev/null + \command -v java + )" + fi +fi + +if [ ! -x "$JAVACMD" ]; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ]; then + echo "Warning: JAVA_HOME environment variable is not set." >&2 +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ]; then + echo "Path not specified to find_maven_basedir" >&2 + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ]; do + if [ -d "$wdir"/.mvn ]; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$( + cd "$wdir/.." || exit 1 + pwd + ) + fi + # end of workaround + done + printf '%s' "$( + cd "$basedir" || exit 1 + pwd + )" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' <"$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1 +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in wrapperUrl) + wrapperUrl="$safeValue" + break + ;; + esac + done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget >/dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl >/dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in wrapperSha256Sum) + wrapperSha256Sum=$value + break + ;; + esac +done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum >/dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c >/dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c >/dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] \ + && JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] \ + && CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] \ + && MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..4136715 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,206 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. >&2 +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. >&2 +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. >&2 +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. >&2 +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash;"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Error 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Error 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Error 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..9adf1a9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,173 @@ + + + 4.0.0 + com.github.gtache + elders-scrolls-legends-service + 1.0-SNAPSHOT + + + 3.14.0 + 21 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.21.2 + true + 1.9.0 + 3.5.2 + + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + + + + + com.code-disaster.steamworks4j + steamworks4j + ${steamworks.version} + + + com.code-disaster.steamworks4j + steamworks4j-server + ${steamworks.version} + + + io.quarkus + quarkus-rest + + + io.quarkus + quarkus-websockets-next + + + io.quarkus + quarkus-smallrye-openapi + + + io.quarkus + quarkus-rest-jackson + + + io.quarkus + quarkus-logging-gelf + + + io.quarkus + quarkus-jacoco + + + io.quarkus + quarkus-jackson + + + io.quarkus + quarkus-mailer + + + io.quarkus + quarkus-smallrye-metrics + + + io.quarkus + quarkus-jdbc-postgresql + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + native-image-agent + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + true + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + + + ${project.build.directory}/${project.build.finalName}-runner + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + native + + + + false + true + + + + diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm new file mode 100644 index 0000000..f44d27d --- /dev/null +++ b/src/main/docker/Dockerfile.jvm @@ -0,0 +1,98 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/elders-scrolls-legends-service-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/elders-scrolls-legends-service-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/elders-scrolls-legends-service-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override +# the default JVM options, use `JAVA_OPTS_APPEND` to append options +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] + diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 0000000..d1bc1d0 --- /dev/null +++ b/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,94 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package -Dquarkus.package.jar.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/elders-scrolls-legends-service-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/elders-scrolls-legends-service-legacy-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/elders-scrolls-legends-service-legacy-jar +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override +# the default JVM options, use `JAVA_OPTS_APPEND` to append options +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 + +ENV LANGUAGE='en_US:en' + + +COPY target/lib/* /deployments/lib/ +COPY target/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/src/main/docker/Dockerfile.native b/src/main/docker/Dockerfile.native new file mode 100644 index 0000000..9257c29 --- /dev/null +++ b/src/main/docker/Dockerfile.native @@ -0,0 +1,29 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/elders-scrolls-legends-service . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/elders-scrolls-legends-service +# +# The ` registry.access.redhat.com/ubi9/ubi-minimal:9.5` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/ubi8/ubi-minimal:8.10`. +### +FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root --chmod=0755 target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/docker/Dockerfile.native-micro b/src/main/docker/Dockerfile.native-micro new file mode 100644 index 0000000..2841e2d --- /dev/null +++ b/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,32 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/elders-scrolls-legends-service . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/elders-scrolls-legends-service +# +# The `quay.io/quarkus/ubi9-quarkus-micro-image:2.0` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/quarkus/quarkus-micro-image:2.0`. +### +FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root --chmod=0755 target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/ApplicationLifecycle.java b/src/main/java/ch/gtache/elderscrollslegends/service/ApplicationLifecycle.java new file mode 100644 index 0000000..7565259 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/ApplicationLifecycle.java @@ -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(); + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/Main.java b/src/main/java/ch/gtache/elderscrollslegends/service/Main.java new file mode 100644 index 0000000..44a0934 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/Main.java @@ -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); + } + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/Producers.java b/src/main/java/ch/gtache/elderscrollslegends/service/Producers.java new file mode 100644 index 0000000..be4096e --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/Producers.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service; + +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class Producers { + +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/ServerCallback.java b/src/main/java/ch/gtache/elderscrollslegends/service/ServerCallback.java new file mode 100644 index 0000000..b8cfa24 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/ServerCallback.java @@ -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(); + } + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/SteamService.java b/src/main/java/ch/gtache/elderscrollslegends/service/SteamService.java new file mode 100644 index 0000000..1c7fa44 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/SteamService.java @@ -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("(?.+)"); + + 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() { + + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/Token.java b/src/main/java/ch/gtache/elderscrollslegends/service/Token.java new file mode 100644 index 0000000..62d519b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/Token.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service; + +import java.time.Instant; + +public record Token(String token, Instant expirationTimestamp) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/ABTestingSet.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/ABTestingSet.java new file mode 100644 index 0000000..c4ffdff --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/ABTestingSet.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account; + +public record ABTestingSet(String setKey, String groupKey) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/AcceptLegalDocumentRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/AcceptLegalDocumentRequest.java new file mode 100644 index 0000000..2fecf10 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/AcceptLegalDocumentRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account; + +public record AcceptLegalDocumentRequest(String legalDocumentId, String fingerprint, String bnetKeyPlatform) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/AccountEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/AccountEndpoints.java new file mode 100644 index 0000000..f03826e --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/AccountEndpoints.java @@ -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; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/AccountService.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/AccountService.java new file mode 100644 index 0000000..4357eda --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/AccountService.java @@ -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; + } + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/DeviceIdMapRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/DeviceIdMapRequest.java new file mode 100644 index 0000000..a9c7cb1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/DeviceIdMapRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account; + +public record DeviceIdMapRequest(String deviceId, String fingerprint) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/GetAllLegalDocumentsRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/GetAllLegalDocumentsRequest.java new file mode 100644 index 0000000..bf3a114 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/GetAllLegalDocumentsRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account; + +public record GetAllLegalDocumentsRequest(String platform, String country, String bnetKeyPlatform) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/GetLegalDocumentsForUserRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/GetLegalDocumentsForUserRequest.java new file mode 100644 index 0000000..927be89 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/GetLegalDocumentsForUserRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account; + +public record GetLegalDocumentsForUserRequest(String platform, String fingerprint, String bnetKeyPlatform) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/RefreshSessionRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/RefreshSessionRequest.java new file mode 100644 index 0000000..733c7f0 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/RefreshSessionRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account; + +public record RefreshSessionRequest(String bnetKeyPlatform) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/RefreshSessionResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/RefreshSessionResponse.java new file mode 100644 index 0000000..952c3f5 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/RefreshSessionResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account; + +public record RefreshSessionResponse(int timeToRefresh, String sessionToken) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/UpgradeAccountRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/UpgradeAccountRequest.java new file mode 100644 index 0000000..1c94cf7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/UpgradeAccountRequest.java @@ -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 legalDocumentIds) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETDeviceIdRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETDeviceIdRequest.java new file mode 100644 index 0000000..8bd3a68 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETDeviceIdRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETGamecodeRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETGamecodeRequest.java new file mode 100644 index 0000000..9f7b2dd --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETGamecodeRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETGoogleAndroidRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETGoogleAndroidRequest.java new file mode 100644 index 0000000..13993ab --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETGoogleAndroidRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETLoginTokenRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETLoginTokenRequest.java new file mode 100644 index 0000000..bbe9b81 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETLoginTokenRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETSteamRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETSteamRequest.java new file mode 100644 index 0000000..ec826ef --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETSteamRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETiOSGameCenterRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETiOSGameCenterRequest.java new file mode 100644 index 0000000..4211952 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthBNETiOSGameCenterRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthData.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthData.java new file mode 100644 index 0000000..ecee705 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthData.java @@ -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 abTestingSets, + boolean wasNativeSignOn) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthDevRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthDevRequest.java new file mode 100644 index 0000000..fd4b553 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthDevRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthRequest.java new file mode 100644 index 0000000..9118ad0 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthResult.java new file mode 100644 index 0000000..ef25fe6 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthResult.java @@ -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 validChangelists) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthType.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthType.java new file mode 100644 index 0000000..2e8e811 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthType.java @@ -0,0 +1,11 @@ +package ch.gtache.elderscrollslegends.service.account.auth; + +public enum AuthType { + Dev, + Dev_UsernamePassword, + Dev_DeviceId, + BNETSteam, + BNETGamecode, + BNETiOSGameCenter, + BNETGoogleAndroid, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthUsernameAndPasswordRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthUsernameAndPasswordRequest.java new file mode 100644 index 0000000..a683057 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/AuthUsernameAndPasswordRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/LogoutSteamRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/LogoutSteamRequest.java new file mode 100644 index 0000000..cc7024e --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/auth/LogoutSteamRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.auth; + +public record LogoutSteamRequest(String steamId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailRequest.java new file mode 100644 index 0000000..e4a01df --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.check; + +public record CheckEmailRequest(String fingerprint, String email, String bnetKeyPlatform) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailResponse.java new file mode 100644 index 0000000..b8b5084 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.check; + +public record CheckEmailResponse(CheckEmailResponseBody body) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailResponseBody.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailResponseBody.java new file mode 100644 index 0000000..d53a817 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckEmailResponseBody.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.check; + +public record CheckEmailResponseBody(boolean valid, int status_code) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameRequest.java new file mode 100644 index 0000000..21834bd --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.check; + +public record CheckUsernameRequest(String fingerprint, String username, String bnetKeyPlatform) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameResponse.java new file mode 100644 index 0000000..29c32cb --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.check; + +public record CheckUsernameResponse(CheckUsernameResponseBody body) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameResponseBody.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameResponseBody.java new file mode 100644 index 0000000..c8e63e6 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/check/CheckUsernameResponseBody.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.check; + +public record CheckUsernameResponseBody(boolean valid, boolean exists, int status_code) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/link/AndroidSessionLinkRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/AndroidSessionLinkRequest.java new file mode 100644 index 0000000..4b32497 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/AndroidSessionLinkRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/link/IOSSessionLinkRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/IOSSessionLinkRequest.java new file mode 100644 index 0000000..007587f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/IOSSessionLinkRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/link/SessionLinkBase.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/SessionLinkBase.java new file mode 100644 index 0000000..ad2c840 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/SessionLinkBase.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/link/SteamSessionLinkRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/SteamSessionLinkRequest.java new file mode 100644 index 0000000..fc52c22 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/link/SteamSessionLinkRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/LegalDocEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/LegalDocEntry.java new file mode 100644 index 0000000..10a1235 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/LegalDocEntry.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.account.transfer; + +public record LegalDocEntry(String doctype, String full_name, int id, String url) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/LegalDocumentsResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/LegalDocumentsResponse.java new file mode 100644 index 0000000..38ae30b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/LegalDocumentsResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.account.transfer; + +import java.util.List; + +public record LegalDocumentsResponse(List items) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferRequest_Phase0.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferRequest_Phase0.java new file mode 100644 index 0000000..5492fe1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferRequest_Phase0.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferRequest_Phase1.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferRequest_Phase1.java new file mode 100644 index 0000000..b9da996 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferRequest_Phase1.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferResponse_Phase0.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferResponse_Phase0.java new file mode 100644 index 0000000..a19c60d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferResponse_Phase0.java @@ -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 items, String buid, String sessionToken, boolean hasTeslUserData, + ProfileStruct profile, List categories) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferResponse_Phase1.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferResponse_Phase1.java new file mode 100644 index 0000000..5b213a7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/TransferResponse_Phase1.java @@ -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 validChangelists) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/Transfer_AcceptLegalDocumentRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/Transfer_AcceptLegalDocumentRequest.java new file mode 100644 index 0000000..5903159 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/account/transfer/Transfer_AcceptLegalDocumentRequest.java @@ -0,0 +1,5 @@ +package ch.gtache.elderscrollslegends.service.account.transfer; + +record Transfer_AcceptLegalDocumentRequest(String fingerprint, String sessionToken, String legalDocumentId, + String bnetKeyPlatform) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalysticsEventPayload.java b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalysticsEventPayload.java new file mode 100644 index 0000000..00e527b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalysticsEventPayload.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.analytics; + +public record AnalysticsEventPayload(AnalyticsEventType eventType, String data) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEndpoints.java new file mode 100644 index 0000000..da83206 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEndpoints.java @@ -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; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEvent.java b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEvent.java new file mode 100644 index 0000000..f24fada --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEvent.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.analytics; + +import java.util.List; + +public record AnalyticsEvent(int platformId, int clientVersion, String eventData, List events) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEventType.java b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEventType.java new file mode 100644 index 0000000..572fed8 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/AnalyticsEventType.java @@ -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, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/analytics/FetchResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/FetchResponse.java new file mode 100644 index 0000000..dceeb1d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/analytics/FetchResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.analytics; + +public record FetchResponse(boolean enableReporting) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientDataStruct.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientDataStruct.java new file mode 100644 index 0000000..429da32 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientDataStruct.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.arena; + +import java.util.List; + +public record ArenaClientDataStruct(int costGold, int costTickets, List instances) { + +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientInstance.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientInstance.java new file mode 100644 index 0000000..59473d7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientInstance.java @@ -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 potentialClassTypeHashes, + List cardSelectionTypeHashes, List cardTypeHashes, + List premiums, List matches) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientMatch.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientMatch.java new file mode 100644 index 0000000..d2fd96f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaClientMatch.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaEndpoints.java new file mode 100644 index 0000000..f26e9a9 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaEndpoints.java @@ -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; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaPhase.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaPhase.java new file mode 100644 index 0000000..d03dc1d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaPhase.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public enum ArenaPhase { + ClassSelection, + CardSelection, + MatchSelection, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaPurchaseCurrencyType.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaPurchaseCurrencyType.java new file mode 100644 index 0000000..f96517f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaPurchaseCurrencyType.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public enum ArenaPurchaseCurrencyType { + Gold, + Tickets, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaType.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaType.java new file mode 100644 index 0000000..e85b8a8 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ArenaType.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public enum ArenaType { + Unknown, + Solo, + Versus, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/FetchArenaInstancesResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/FetchArenaInstancesResult.java new file mode 100644 index 0000000..f8e42c6 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/FetchArenaInstancesResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record FetchArenaInstancesResult(ArenaClientDataStruct clientData) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/PurchaseArenaRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/PurchaseArenaRequest.java new file mode 100644 index 0000000..bfd0c3d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/PurchaseArenaRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record PurchaseArenaRequest(ArenaType arenaType, ArenaPurchaseCurrencyType currencyType) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/PurchaseArenaResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/PurchaseArenaResult.java new file mode 100644 index 0000000..2aea4ca --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/PurchaseArenaResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record PurchaseArenaResult(ArenaClientDataStruct clientData) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ResignArenaRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ResignArenaRequest.java new file mode 100644 index 0000000..84007ee --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ResignArenaRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record ResignArenaRequest(ArenaType arenaType) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/ResignArenaResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ResignArenaResult.java new file mode 100644 index 0000000..c2ba906 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/ResignArenaResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record ResignArenaResult() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectCardRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectCardRequest.java new file mode 100644 index 0000000..cc062c5 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectCardRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record SelectCardRequest(ArenaType arenaType, int cardTypeHash) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectCardResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectCardResult.java new file mode 100644 index 0000000..37559e2 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectCardResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record SelectCardResult(ArenaClientDataStruct clientData) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectClassRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectClassRequest.java new file mode 100644 index 0000000..8ace55f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectClassRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record SelectClassRequest(ArenaType arenaType, int classTypeHash) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectClassResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectClassResult.java new file mode 100644 index 0000000..aefb30c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/arena/SelectClassResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.arena; + +public record SelectClassResult(ArenaClientDataStruct clientData) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/CampaignEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/CampaignEndpoints.java new file mode 100644 index 0000000..d0c583f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/CampaignEndpoints.java @@ -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; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/CheckCampaignRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/CheckCampaignRequest.java new file mode 100644 index 0000000..eae339a --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/CheckCampaignRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public record CheckCampaignRequest(int campaignId, boolean isMastery) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DebugAddNextChapterRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DebugAddNextChapterRequest.java new file mode 100644 index 0000000..c327ccf --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DebugAddNextChapterRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public record DebugAddNextChapterRequest(int campaignId, int actId, boolean isMastery) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DebugAddNextEventRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DebugAddNextEventRequest.java new file mode 100644 index 0000000..0cb3a0f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DebugAddNextEventRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public record DebugAddNextEventRequest(int campaignId, int actId, int chapterId, boolean isMastery) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DialogModalType.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DialogModalType.java new file mode 100644 index 0000000..5a0c624 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/DialogModalType.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public enum DialogModalType { + None, + Intro, + Ending, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/ListCampaignsResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/ListCampaignsResponse.java new file mode 100644 index 0000000..2935d9c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/ListCampaignsResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public record ListCampaignsResponse(UserCampaignData campaignDatas) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterDialogResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterDialogResult.java new file mode 100644 index 0000000..ff15385 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterDialogResult.java @@ -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 rewards) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterDialogStatusRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterDialogStatusRequest.java new file mode 100644 index 0000000..4315a47 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterDialogStatusRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterEventChoiceRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterEventChoiceRequest.java new file mode 100644 index 0000000..1ab0159 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterEventChoiceRequest.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterEventResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterEventResult.java new file mode 100644 index 0000000..eaf717e --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/SetChapterEventResult.java @@ -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 rewards) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserActData.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserActData.java new file mode 100644 index 0000000..684e333 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserActData.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +import java.util.List; + +public record UserActData(int actId, boolean isMastery, List chapterData) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserCampaignChoice.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserCampaignChoice.java new file mode 100644 index 0000000..ff37760 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserCampaignChoice.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public enum UserCampaignChoice { + None, + First, + Second, + Third, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserCampaignData.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserCampaignData.java new file mode 100644 index 0000000..7da29e1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserCampaignData.java @@ -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 actData, List ownedActs) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserChapterData.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserChapterData.java new file mode 100644 index 0000000..dd0adec --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserChapterData.java @@ -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 chapterEventData, + UserCampaignChoice introChoice, UserCampaignChoice endingChoice, + List chapterSeenCinematicTypeHashes) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserChapterEventData.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserChapterEventData.java new file mode 100644 index 0000000..77cbd58 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserChapterEventData.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public record UserChapterEventData(int chapterEventId, int chapterId, boolean isComplete, + UserCampaignChoice introChoice, + UserCampaignChoice endingChoice) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserDialogModalData.java b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserDialogModalData.java new file mode 100644 index 0000000..e0a582a --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/campaign/UserDialogModalData.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.campaign; + +public record UserDialogModalData(DialogModalType modalType, int choiceIndex) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/chat/ChatEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/chat/ChatEndpoints.java new file mode 100644 index 0000000..a4cecbe --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/chat/ChatEndpoints.java @@ -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 + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/chat/OutgoingMessage.java b/src/main/java/ch/gtache/elderscrollslegends/service/chat/OutgoingMessage.java new file mode 100644 index 0000000..707c5b2 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/chat/OutgoingMessage.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.chat; + +public record OutgoingMessage(String toBuid, String message) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/config/ConfigResource.java b/src/main/java/ch/gtache/elderscrollslegends/service/config/ConfigResource.java new file mode 100644 index 0000000..97d00fa --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/config/ConfigResource.java @@ -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"); + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingEndpoints.java new file mode 100644 index 0000000..726f8bf --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingEndpoints.java @@ -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; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingRequest.java new file mode 100644 index 0000000..48b7596 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.crafting; + +public record CraftingRequest(int typeHash, int amount, boolean isPremium) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingResponse.java new file mode 100644 index 0000000..cc7e6c3 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/CraftingResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.crafting; + +public record CraftingResponse(int cardTypeHash, int gems, int numRegular, int numPremium, boolean ghostedChange) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/crafting/SoulTrapExtrasRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/SoulTrapExtrasRequest.java new file mode 100644 index 0000000..b924b96 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/SoulTrapExtrasRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.crafting; + +public record SoulTrapExtrasRequest(String priority) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/crafting/SoulTrapExtrasResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/SoulTrapExtrasResponse.java new file mode 100644 index 0000000..3adab3d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/crafting/SoulTrapExtrasResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.crafting; + +public record SoulTrapExtrasResponse(int numGems) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/AcceptRewardResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/AcceptRewardResponse.java new file mode 100644 index 0000000..8dab525 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/AcceptRewardResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.dailyrewards; + +public record AcceptRewardResponse(AcceptRewardResult result) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/AcceptRewardResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/AcceptRewardResult.java new file mode 100644 index 0000000..6fa2073 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/AcceptRewardResult.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.dailyrewards; + +import java.util.List; + +public record AcceptRewardResult(int xp, int gold, int gems, List items) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/DailyRewardsEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/DailyRewardsEndpoints.java new file mode 100644 index 0000000..492d008 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/DailyRewardsEndpoints.java @@ -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; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/ItemType.java b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/ItemType.java new file mode 100644 index 0000000..d48e8bb --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/ItemType.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.dailyrewards; + +public record ItemType(String type, int typeId, int count, boolean isPremium) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/ListRewardsResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/ListRewardsResponse.java new file mode 100644 index 0000000..e78712a --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/ListRewardsResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.dailyrewards; + +import java.util.List; + +public record ListRewardsResponse(List rewards) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/PreRewardedVisibilityType.java b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/PreRewardedVisibilityType.java new file mode 100644 index 0000000..85ae6b9 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/PreRewardedVisibilityType.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.dailyrewards; + +public enum PreRewardedVisibilityType { + Unknown, + Visible, + Mystery, + MysteryCard, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/RewardDescription.java b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/RewardDescription.java new file mode 100644 index 0000000..b390234 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/dailyrewards/RewardDescription.java @@ -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) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/error/ErrorEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/error/ErrorEndpoints.java new file mode 100644 index 0000000..8decd8f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/error/ErrorEndpoints.java @@ -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; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/error/ErrorReport.java b/src/main/java/ch/gtache/elderscrollslegends/service/error/ErrorReport.java new file mode 100644 index 0000000..4abf4f7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/error/ErrorReport.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.error; + +public record ErrorReport(String report) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/error/FetchResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/error/FetchResponse.java new file mode 100644 index 0000000..3ab284f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/error/FetchResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.error; + +public record FetchResponse(boolean enableReporting) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/ContentEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/ContentEntry.java new file mode 100644 index 0000000..a6b41d1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/ContentEntry.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record ContentEntry() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/EventDescriptionStruct.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/EventDescriptionStruct.java new file mode 100644 index 0000000..1b634d6 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/EventDescriptionStruct.java @@ -0,0 +1,63 @@ +package ch.gtache.elderscrollslegends.service.events; + +import java.util.List; +import java.util.Set; + +public record EventDescriptionStruct(long eventId, + String eventKey, + String imageKey, + String status, + boolean requiresQualification, + boolean isSolo, + boolean allowDeckChanges, + boolean allowUnownedCards, + boolean allegianceDeckMode, + String deckSelectionType, + int costPerEntryTickets, + int costPerRunTickets, + int costPerEntryGold, + int costPerRunGold, + int maxAllowedRuns, + int maxGames, + int maxWins, + int maxLosses, + int minRunsForRanking, + int minGamesForRanking, + int maxRunsForRanking, + int maxGamesForRanking, + int scenarioTypeHash, + int maxCardTypeCopiesAllowed, + int minDeckSizeOverride, + int minDeckSizeTriOverride, + int maxManaCost, + List explicitDecks, + List deckRulesCardTypeWhitelists, + List deckRulesCardTypeBlacklists, + List deckRulesDisallowedAttributes, + List deckRulesDisallowedCosts, + List deckRulesAllowedCollections, + List deckRulesAllowedRarities, + List languages, + List rewardTableWins, + List rewardTableRanks, + int secondsUntilRegistrationStartTime, + int secondsUntilRegistrationEndTime, + int secondsUntilStartTime, + int secondsUntilEndTime, + boolean isRegistered, + int totalWins, + int totalLosses, + int totalRuns, + int totalCompletedRuns, + long ranking, + boolean hasIncompleteRun, + boolean readyToFinalizeRun, + boolean readyToFinalize, + boolean canChangeDeckNow, + int explicitDeckTypeHashSelected, + long builtDeckId, + List allowedCardTypeHashes, + Set allowedCardTypeHashesLookup, + List runs, + float receiveTime) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/EventsEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/EventsEndpoints.java new file mode 100644 index 0000000..102fc9b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/EventsEndpoints.java @@ -0,0 +1,76 @@ +package ch.gtache.elderscrollslegends.service.events; + +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("events") +public class EventsEndpoints { + + @POST + @Path("finalizeEvent") + @Consumes("application/json") + public void finalizeEvent(@HeaderParam("Authorization") final String authentication, + final FinalizeEventRequest request) { + } + + @POST + @Path("finalizeEventRun") + @Consumes("application/json") + public void finalizeEventRun(@HeaderParam("Authorization") final String authentication, + final FinalizeEventRunRequest request) { + } + + @POST + @Path("getEventLeaderboard") + @Consumes("application/json") + @Produces("application/json") + public GetEventLeaderboardResponse getEventLeaderboard(@HeaderParam("Authorization") final String authentication, + final GetEventLeaderboardRequest request) { + return null; + } + + @POST + @Path("purchaseEvent") + @Consumes("application/json") + @Produces("application/json") + public PurchaseEventResult purchaseEvent(@HeaderParam("Authorization") final String authentication, + final PurchaseEventRequest request) { + return null; + } + + @POST + @Path("purchaseEventRun") + @Consumes("application/json") + @Produces("application/json") + public PurchaseEventRunResult purchaseEventRun(@HeaderParam("Authorization") final String authentication, + final PurchaseEventRunRequest request) { + return null; + } + + @POST + @Path("selectExplicitDeck") + @Consumes("application/json") + public void selectExplicitDeck(@HeaderParam("Authorization") final String authentication, + final SelectExplicitDeckRequest request) { + } + + @POST + @Path("getEventLeaderboardRank") + @Consumes("application/json") + @Produces("application/json") + public UpdateEventLeaderboardRankResponse getEventLeaderboardRank(@HeaderParam("Authorization") final String authentication, + final UpdateEventLeaderboardRankRequest request) { + return null; + } + + @GET + @Path("fetch") + @Produces("application/json") + public ListEventsResponse fetchEvents(@HeaderParam("Authorization") final String authentication) { + return null; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/FinalizeEventRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/FinalizeEventRequest.java new file mode 100644 index 0000000..a3f3d58 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/FinalizeEventRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record FinalizeEventRequest(long eventId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/FinalizeEventRunRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/FinalizeEventRunRequest.java new file mode 100644 index 0000000..edb3229 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/FinalizeEventRunRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record FinalizeEventRunRequest(long eventId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/GetEventLeaderboardRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/GetEventLeaderboardRequest.java new file mode 100644 index 0000000..b3111f6 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/GetEventLeaderboardRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record GetEventLeaderboardRequest(long eventId, long page, long pageSize) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/GetEventLeaderboardResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/GetEventLeaderboardResponse.java new file mode 100644 index 0000000..96d51c4 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/GetEventLeaderboardResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.events; + +import java.util.List; + +public record GetEventLeaderboardResponse(long eventId, long totalPages, long userPage, List list) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/LanguageText.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/LanguageText.java new file mode 100644 index 0000000..cfb80d4 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/LanguageText.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record LanguageText(String languageCode, String title, String shortDescription, String longDescription) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/LeaderboardEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/LeaderboardEntry.java new file mode 100644 index 0000000..3847f97 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/LeaderboardEntry.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record LeaderboardEntry(String nickname, long rank, int wins, int losses, int runs) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/ListEventsResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/ListEventsResponse.java new file mode 100644 index 0000000..10fb375 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/ListEventsResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record ListEventsResponse(EventDescriptionStruct eventDescription) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRequest.java new file mode 100644 index 0000000..a1ecb17 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record PurchaseEventRequest(long eventId, PurchaseType purchaseType) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventResult.java new file mode 100644 index 0000000..8b5e3b6 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record PurchaseEventResult() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRunRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRunRequest.java new file mode 100644 index 0000000..2ce64a0 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRunRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record PurchaseEventRunRequest(long eventId, PurchaseType purchaseType) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRunResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRunResult.java new file mode 100644 index 0000000..c88480d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseEventRunResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record PurchaseEventRunResult() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseType.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseType.java new file mode 100644 index 0000000..ab5d1dc --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/PurchaseType.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.events; + +public enum PurchaseType { + Tickets, + Gold +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/RewardTableEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/RewardTableEntry.java new file mode 100644 index 0000000..0018629 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/RewardTableEntry.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.events; + +import java.util.List; + +public record RewardTableEntry(int cutoff, int bundleTypeHash, int numGold, int numGems, int numTickets, + List rewardContents) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/SelectExplicitDeckRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/SelectExplicitDeckRequest.java new file mode 100644 index 0000000..fd45a50 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/SelectExplicitDeckRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record SelectExplicitDeckRequest(long eventId, int deckTypeHash) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/UpdateEventLeaderboardRankRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/UpdateEventLeaderboardRankRequest.java new file mode 100644 index 0000000..3b7f17a --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/UpdateEventLeaderboardRankRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record UpdateEventLeaderboardRankRequest(long eventId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/UpdateEventLeaderboardRankResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/UpdateEventLeaderboardRankResponse.java new file mode 100644 index 0000000..6150726 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/UpdateEventLeaderboardRankResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record UpdateEventLeaderboardRankResponse(long eventId, long ranking) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/events/UserRun.java b/src/main/java/ch/gtache/elderscrollslegends/service/events/UserRun.java new file mode 100644 index 0000000..062aed4 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/events/UserRun.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.events; + +public record UserRun(int runIndex, int wins, int losses, int createTime, int completedTime, boolean readyToFinalize) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionBody.java b/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionBody.java new file mode 100644 index 0000000..35e4664 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionBody.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.friends; + +import java.util.List; + +public record ActionBody(List buids) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionResponse.java new file mode 100644 index 0000000..ef7a83a --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.friends; + +import java.util.List; + +public record ActionResponse(List response_list) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionResponseItem.java b/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionResponseItem.java new file mode 100644 index 0000000..04eaec2 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/friends/ActionResponseItem.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.friends; + +public record ActionResponseItem(String message, int code) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/friends/FriendsEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/friends/FriendsEndpoints.java new file mode 100644 index 0000000..2569ffe --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/friends/FriendsEndpoints.java @@ -0,0 +1,98 @@ +package ch.gtache.elderscrollslegends.service.friends; + +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 jakarta.ws.rs.QueryParam; + +@Path("/beam/social/v3/friends") +public class FriendsEndpoints { + + @POST + @Path("/unfriend") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse unfriend(@HeaderParam("Authorization") final String authentication, + final ActionBody request) { + return null; + } + + @POST + @Path("/block") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse block(@HeaderParam("Authorization") final String authentication, + final ActionBody request) { + return null; + } + + @POST + @Path("/unblock") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse unblock(@HeaderParam("Authorization") final String authentication, + final ActionBody request) { + return null; + } + + @POST + @Path("/requests") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse getRequests(@HeaderParam("Authorization") final String authentication, + @QueryParam("size") final int size, + final ActionBody request) { + return null; + } + + @POST + @Path("/requests/cancel") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse cancelRequest(@HeaderParam("Authorization") final String authentication, + final ActionBody request) { + return null; + } + + @POST + @Path("/requests/accept") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse acceptRequest(@HeaderParam("Authorization") final String authentication, + final ActionBody request) { + return null; + } + + @POST + @Path("/requests/reject") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse rejectRequest(@HeaderParam("Authorization") final String authentication, + final ActionBody request) { + return null; + } + + @POST + @Path("/requests/sent") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse getSentRequests(@HeaderParam("Authorization") final String authentication, + @QueryParam("size") final int size, + final ActionBody request) { + return null; + } + + @POST + @Path("/search") + @Consumes("application/json") + @Produces("application/json") + public ActionResponse search(@HeaderParam("Authorization") final String authentication, + @QueryParam("search_term") final String searchTerm, + @QueryParam("size") final int size, + final ActionBody request) { + return null; + } + +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/CardTypeLoadable.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/CardTypeLoadable.java new file mode 100644 index 0000000..2f4ffcf --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/CardTypeLoadable.java @@ -0,0 +1,22 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +import java.util.List; + +public record CardTypeLoadable(int typeHash, + String typeName, + String exportCode, + int numRegular, + int numPremium, + boolean regularSeen, + boolean premiumSeen, + boolean canCraft, + int maxCopies, + String rarity, + int purchasePriceGems, + int sellPriceGems, + int premiumPurchasePriceGems, + int premiumSellPriceGems, + int alternateOfCardTypeHash, + List colorSubTypes, + int numUsedInDeck) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/CategoryData.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/CategoryData.java new file mode 100644 index 0000000..7df27c3 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/CategoryData.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +import java.util.List; + +public record CategoryData(String category, String selected, List available, + List locked, List descriptions) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/Deck.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/Deck.java new file mode 100644 index 0000000..55c2f7f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/Deck.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +import java.util.List; + +public record Deck(long id, String displayName, boolean hasBeenSeen, boolean isValid, boolean isLocked, + boolean renameFromuser, int artTypeHash, int deckTypeHash, List cards, long eventId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/DeckCard.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/DeckCard.java new file mode 100644 index 0000000..aad681b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/DeckCard.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record DeckCard(int typeHash, int numRegular, int numPremium) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/FetchResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/FetchResponse.java new file mode 100644 index 0000000..ec9ef59 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/FetchResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +import java.util.List; + +public record FetchResponse(List categories) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/GenericInventoryEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/GenericInventoryEndpoints.java new file mode 100644 index 0000000..41d8c4c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/GenericInventoryEndpoints.java @@ -0,0 +1,23 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; + +@Path("/genericinventory") +public class GenericInventoryEndpoints { + + @GET + @Path("fetch") + public FetchResponse fetch(@HeaderParam("Authorization") final String authentication) { + return null; + } + + @POST + @Path("setSelected") + public void setSelected(@HeaderParam("Authorization") final String authentication, + final SetSelectedRequest request) { + + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryCreateDeckRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryCreateDeckRequest.java new file mode 100644 index 0000000..bc7a64e --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryCreateDeckRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record InventoryCreateDeckRequest(String displayName) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryCreateDeckResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryCreateDeckResponse.java new file mode 100644 index 0000000..bca926c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryCreateDeckResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record InventoryCreateDeckResponse(long deckId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryDeleteDeckRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryDeleteDeckRequest.java new file mode 100644 index 0000000..e9481df --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryDeleteDeckRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record InventoryDeleteDeckRequest(long deckId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryDescLoadable.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryDescLoadable.java new file mode 100644 index 0000000..13bcaa2 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryDescLoadable.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +import java.util.List; + +public record InventoryDescLoadable(int deckLimit, List decks, List cardTypes) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryEndpoints.java new file mode 100644 index 0000000..fccdae4 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryEndpoints.java @@ -0,0 +1,56 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +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("inventory") +public class InventoryEndpoints { + + @GET + @Path("list_v2") + @Produces("application/json") + public InventoryListResponse list(@HeaderParam("Authorization") final String authentication) { + return null; + } + + @POST + @Path("createDeck") + @Consumes("application/json") + @Produces("application/json") + public InventoryCreateDeckResponse createDeck(@HeaderParam("Authorization") final String authentication, + final InventoryCreateDeckRequest request) { + return null; + } + + @POST + @Path("deleteDeck") + @Consumes("application/json") + @Produces("application/json") + public void deleteDeck(@HeaderParam("Authorization") final String authentication, + final InventoryDeleteDeckRequest request) { + } + + @POST + @Path("saveDeck_v2") + @Consumes("application/json") + @Produces("application/json") + public SaveResult saveDeck(@HeaderParam("Authorization") final String authentication, + final Deck request) { + return null; + } + + @POST + @Path("setSeens") + @Consumes("application/json") + @Produces("application/json") + public SaveResult setSeens(@HeaderParam("Authorization") final String authentication, + final SetSeens request) { + return null; + } + + +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryListResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryListResponse.java new file mode 100644 index 0000000..e0bed67 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/InventoryListResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record InventoryListResponse(InventoryDescLoadable inventory) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SaveResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SaveResult.java new file mode 100644 index 0000000..4f8e9e7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SaveResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record SaveResult(boolean success) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SeenEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SeenEntry.java new file mode 100644 index 0000000..0946eda --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SeenEntry.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record SeenEntry(int cardTypeHash, boolean isPremium, boolean isRegular) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SelectedItem.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SelectedItem.java new file mode 100644 index 0000000..b50dc65 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SelectedItem.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record SelectedItem(String category, String selected) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SetSeens.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SetSeens.java new file mode 100644 index 0000000..46afeb0 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SetSeens.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +import java.util.List; + +public record SetSeens(List entries) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SetSelectedRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SetSelectedRequest.java new file mode 100644 index 0000000..b45aa1b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/inventory/SetSelectedRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.inventory; + +public record SetSelectedRequest(String category, String itemKey) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/AIDifficulty.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/AIDifficulty.java new file mode 100644 index 0000000..596bc67 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/AIDifficulty.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public enum AIDifficulty { + None, + Novice, + Adept, + Expert, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/CampaignMatchDesc.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/CampaignMatchDesc.java new file mode 100644 index 0000000..8fef9d4 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/CampaignMatchDesc.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.matching; + +import ch.gtache.elderscrollslegends.service.campaign.UserCampaignChoice; + +public record CampaignMatchDesc(int chapterEventId, boolean isMastery, String scenarioName, + UserCampaignChoice introChoice) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientChallengeRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientChallengeRequest.java new file mode 100644 index 0000000..da95c56 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientChallengeRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientChallengeRequest(String friendBuid, String type) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchCancelRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchCancelRequest.java new file mode 100644 index 0000000..e59f3ba --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchCancelRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientMatchCancelRequest(String requestId, String friendBuid) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRejoinResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRejoinResult.java new file mode 100644 index 0000000..12957b8 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRejoinResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientMatchRejoinResult(MatchReady gameReadyPlayerClient) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRequest.java new file mode 100644 index 0000000..dd5a581 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRequest.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientMatchRequest(String requestId, long deckId, long eventId, MatchType matchType, + MatchMode matchMode, AIDifficulty aiDifficulty, CampaignMatchDesc campaignData, + String scenarioName, String region, int matchSeed, int arenaMatchOrderIndex, + String friendBuid, boolean useChallengeTurnTimers) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRequestResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRequestResult.java new file mode 100644 index 0000000..d4e4741 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchRequestResult.java @@ -0,0 +1,5 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientMatchRequestResult(String requestId, String poolName, int estimatedWaitSeconds, + int refreshPeriodSeconds) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchReserveRequestResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchReserveRequestResult.java new file mode 100644 index 0000000..e64eb26 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientMatchReserveRequestResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientMatchReserveRequestResult(String requestId, MatchErrorType errorType) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientOpponentBuidRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientOpponentBuidRequest.java new file mode 100644 index 0000000..2c70573 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientOpponentBuidRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientOpponentBuidRequest(String friendBuid) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientOpponentBuidResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientOpponentBuidResult.java new file mode 100644 index 0000000..4a9f20f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientOpponentBuidResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientOpponentBuidResult(String opponentBuid) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientSpectateRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientSpectateRequest.java new file mode 100644 index 0000000..248ab91 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientSpectateRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientSpectateRequest(String requestId, String friendBuid, String friendBuidA, String friendBuidB) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientSpectateRequestResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientSpectateRequestResult.java new file mode 100644 index 0000000..93a6299 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/ClientSpectateRequestResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record ClientSpectateRequestResult(String requestId, MatchReady gameReadyPlayerClient) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchErrorType.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchErrorType.java new file mode 100644 index 0000000..a79019b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchErrorType.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public enum MatchErrorType { + None, + InternalError, + DeckNotFound, + InvalidDeck, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchMode.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchMode.java new file mode 100644 index 0000000..2c88efd --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchMode.java @@ -0,0 +1,11 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public enum MatchMode { + None, + Campaign, + SoloArena, + VersusArena, + PracticeBattle, + VersusBattle, + EventBattle, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchReady.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchReady.java new file mode 100644 index 0000000..5186714 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchReady.java @@ -0,0 +1,5 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record MatchReady(String encryptionKeyBase64, String requestId, String spectatorId, String ip, + int port, String opponentAvatarName, String matchId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchType.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchType.java new file mode 100644 index 0000000..cdf9859 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchType.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public enum MatchType { + Solo, + Challenge, + Multi, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchingEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchingEndpoints.java new file mode 100644 index 0000000..b7bc8f3 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/MatchingEndpoints.java @@ -0,0 +1,93 @@ +package ch.gtache.elderscrollslegends.service.matching; + +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("matching") +public class MatchingEndpoints { + + @GET + @Path("reserve") + @Produces("application/json") + public ClientMatchReserveRequestResult reserve(@HeaderParam("Authorization") final String authentication) { + return null; + } + + @POST + @Path("add") + @Consumes("application/json") + @Produces("application/json") + public ClientMatchRequestResult add(@HeaderParam("Authorization") final String authentication, + final ClientMatchRequest request) { + return null; + } + + @POST + @Path("cancel") + @Consumes("application/json") + public void cancel(@HeaderParam("Authorization") final String authentication, + final ClientMatchCancelRequest request) { + } + + @POST + @Path("respondchallenge") + @Consumes("application/json") + public void respondChallenge(@HeaderParam("Authorization") final String authentication, + final ClientChallengeRequest request) { + } + + @POST + @Path("refresh") + @Consumes("application/json") + @Produces("application/json") + public RefreshResult refresh(@HeaderParam("Authorization") final String authentication, + final RefreshRequest request) { + return null; + } + + @GET + @Path("rejoin") + @Produces("application/json") + public ClientMatchRejoinResult rejoin(@HeaderParam("Authorization") final String authentication) { + return null; + } + + @GET + @Path("rejoindeny") + public void rejoinDeny(@HeaderParam("Authorization") final String authentication) { + + } + + @POST + @Path("requestOpponent") + @Consumes("application/json") + @Produces("application/json") + public ClientOpponentBuidResult requestOpponent(@HeaderParam("Authorization") final String authentication, + final ClientOpponentBuidRequest request) { + return null; + } + + @POST + @Path("spectate") + @Consumes("application/json") + @Produces("application/json") + public ClientSpectateRequestResult spectate(@HeaderParam("Authorization") final String authentication, + final ClientSpectateRequest request) { + return null; + } + + @POST + @Path("dualspectate") + @Consumes("application/json") + @Produces("application/json") + public ClientSpectateRequestResult dualSpectate(@HeaderParam("Authorization") final String authentication, + final ClientSpectateRequest request) { + return null; + } + + +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/RefreshRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/RefreshRequest.java new file mode 100644 index 0000000..c75e841 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/RefreshRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record RefreshRequest(String requestId, String poolName) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/matching/RefreshResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/matching/RefreshResult.java new file mode 100644 index 0000000..e8a7004 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/matching/RefreshResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.matching; + +public record RefreshResult(int estimatedWaitSeconds, MatchReady gameReadyPlayerClient) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliverRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliverRequest.java new file mode 100644 index 0000000..f610d6d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliverRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.packages; + +public record DeliverRequest(long packageId, String bundleTypeName) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliverResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliverResponse.java new file mode 100644 index 0000000..9013b0f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliverResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.packages; + +public record DeliverResponse(Delivered delivered) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/Delivered.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/Delivered.java new file mode 100644 index 0000000..ad4dd6d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/Delivered.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.packages; + +import java.util.List; + +public record Delivered(int xp, int softCurrency, List items) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliveredItem.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliveredItem.java new file mode 100644 index 0000000..fd0d128 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/DeliveredItem.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.packages; + +public record DeliveredItem(String type, int typeHash, boolean isPremium) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/ItemDesc.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/ItemDesc.java new file mode 100644 index 0000000..f564689 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/ItemDesc.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.packages; + +public record ItemDesc(int typeHash, int numRegular, int numPremium) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/ListPackagesResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/ListPackagesResponse.java new file mode 100644 index 0000000..0132818 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/ListPackagesResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.packages; + +import java.util.List; + +public record ListPackagesResponse(int massOpenMinCount, List packageInfos) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/MassPackOpeningRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/MassPackOpeningRequest.java new file mode 100644 index 0000000..844f980 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/MassPackOpeningRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.packages; + +public record MassPackOpeningRequest(int maxTimeInSeconds, String bundleKey) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/MassPackOpeningResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/MassPackOpeningResponse.java new file mode 100644 index 0000000..05b93ca --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/MassPackOpeningResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.packages; + +import java.util.List; + +public record MassPackOpeningResponse(int remaining, List delivered) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/PackageDescription.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/PackageDescription.java new file mode 100644 index 0000000..0b3bee7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/PackageDescription.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.packages; + +public record PackageDescription(long packageId, String bundleKey, int numRemaining, String deliveryMode) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/packages/PackagesEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/packages/PackagesEndpoints.java new file mode 100644 index 0000000..ab5aa4d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/packages/PackagesEndpoints.java @@ -0,0 +1,37 @@ +package ch.gtache.elderscrollslegends.service.packages; + +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("packages") +public class PackagesEndpoints { + + @GET + @Path("list") + @Produces("application/json") + public ListPackagesResponse list(@HeaderParam("Authorization") final String authentication) { + return null; + } + + @POST + @Path("deliver") + @Consumes("application/json") + @Produces("application/json") + public DeliverResponse deliver(@HeaderParam("Authorization") final String authentication, + final DeliverRequest deliverRequest) { + return null; + } + + @POST + @Path("massPackOpening") + @Consumes("application/json") + @Produces("application/json") + public MassPackOpeningResponse massPackOpening(@HeaderParam("Authorization") final String authentication, + final MassPackOpeningRequest massPackOpeningRequest) { + return null; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/presence/PlayerStatus.java b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PlayerStatus.java new file mode 100644 index 0000000..02e4835 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PlayerStatus.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.presence; + +public enum PlayerStatus { + online, + offline, + idle, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/presence/PostPresenceBody.java b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PostPresenceBody.java new file mode 100644 index 0000000..42dad7f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PostPresenceBody.java @@ -0,0 +1,5 @@ +package ch.gtache.elderscrollslegends.service.presence; + +public record PostPresenceBody(String product_id, PlayerStatus player_status, String main_game_status, + String custom_data) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/presence/PostPresenceResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PostPresenceResponse.java new file mode 100644 index 0000000..6733edf --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PostPresenceResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.presence; + +public record PostPresenceResponse(String message, int code, PresenceResponse response) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/presence/PresenceEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PresenceEndpoints.java new file mode 100644 index 0000000..3771801 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PresenceEndpoints.java @@ -0,0 +1,20 @@ +package ch.gtache.elderscrollslegends.service.presence; + +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("/beam/presence/v1") +public class PresenceEndpoints { + + @POST + @Path("presence") + @Consumes("application/json") + @Produces("application/json") + public PostPresenceResponse presence(@HeaderParam("Authorization") final String authentication, + final PostPresenceBody postPresenceBody) { + return null; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/presence/PresenceResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PresenceResponse.java new file mode 100644 index 0000000..7092a46 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/presence/PresenceResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.presence; + +public record PresenceResponse(int time_to_expire) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/CollectionStat.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/CollectionStat.java new file mode 100644 index 0000000..ed2195a --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/CollectionStat.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public record CollectionStat(String collectionTypeName, String rarity, int numTypesOwned, int numTypes) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/FetchProfileResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/FetchProfileResponse.java new file mode 100644 index 0000000..cb63ab3 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/FetchProfileResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public record FetchProfileResponse(ProfileStruct profile) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/GetProfileForBuidRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/GetProfileForBuidRequest.java new file mode 100644 index 0000000..70c83a7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/GetProfileForBuidRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public record GetProfileForBuidRequest(String buid) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/MatchStartLogData.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/MatchStartLogData.java new file mode 100644 index 0000000..c26b36f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/MatchStartLogData.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public record MatchStartLogData(String buid, String username, String matchId, + boolean allowSpectators, boolean disallowSpectators, + boolean doNotDisturb) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/OnboardingProgressType.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/OnboardingProgressType.java new file mode 100644 index 0000000..ace00c1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/OnboardingProgressType.java @@ -0,0 +1,46 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public enum OnboardingProgressType { + None, + HasSeenIntroVideo, + HasSelectedAvatar, + HasWonFirstMatch, + HasSeenWelcomePopup, + HasUnlockedMenu, + IsPackOpenTutorialComplete, + IsDeckBuilderNoviceTutorialComplete, + IsDeckBuilderAdvancedTutorialComplete, + HasUnlockedSoloArena, + HasSeenSoloArenaIntro, + HasSeenSoloArenaClassSelect, + HasSeenSoloArenaDraftScreen, + HasSeenSoloArenaDraftSecondPick, + HasSeenSoloArenaPlayScreen, + HasSeenSoloArenaDraftPrize, + HasSeenSoloArenaPlayScreenAfterWin, + HasSeenSoloArenaPlayScreenAfterLoss, + HasUnlockedVersusArena, + HasSeenMainMenu, + HasSeenPlayerProfile, + HasSeenRewardSoulGem, + HasSeenRewardTicket, + HasSeenSoulSummon, + HasSeenSoulTrapExtras, + HasSeenStoryPickerWin, + HasUnlockedDailyQuests, + HasSeenVersusArenaUnlockMsg, + HasSeenQuest_CompleteTFHAct2, + HasSeenQuest_CompleteTFHAct3, + HasSeenQuest_CompleteSoloArena, + HasSeenQuest_PlayMode, + IsShopTutorialComplete, + HasSeenRankedResult, + HasSeenRankedLossEnabledStar, + HasSeenRankedLegendary, + HasSeenRankedSerpent, + HasSeenRankedBonus, + IsDailyQuestTutorialComplete, + HasMadeTriColorDeck, + HasSeenEarlyVsWarning, + Count +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileEndpoints.java new file mode 100644 index 0000000..2eaf4e0 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileEndpoints.java @@ -0,0 +1,93 @@ +package ch.gtache.elderscrollslegends.service.profile; + +import jakarta.inject.Inject; +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; + +import java.util.List; +import java.util.Objects; + +@Path("/profile") +public class ProfileEndpoints { + + private static final Logger logger = Logger.getLogger(ProfileEndpoints.class); + + private final ProfileService profileService; + + @Inject + ProfileEndpoints(final ProfileService profileService) { + this.profileService = Objects.requireNonNull(profileService); + } + + @POST + @Path("/doE3Reset") + public void doE3Reset(@HeaderParam("Authorization") final String authentication) { + logger.info("doE3Reset called by " + authentication); + //Do nothing + } + + @POST + @Path("/requestOptOut") + public void requestOptOut(@HeaderParam("Authorization") final String authentication) { + logger.info("requestOptOut called by " + authentication); + //Do nothing + } + + @POST + @Path("/requestOptIn") + public void requestOptIn(@HeaderParam("Authorization") final String authentication) { + logger.info("requestOptIn called by " + authentication); + //Do nothing + } + + @POST + @Path("/setOnboardingProgress") + public void setOnboardingProgress(@HeaderParam("Authorization") final String authentication, + final SetOnboardingProgressRequest request) { + logger.info("setOnboardingProgress called by " + authentication + " : " + request); + //Do nothing + } + + @GET + @Path("/setSeen") + public String setSeen(@HeaderParam("Authorization") final String authentication) { + logger.info("setSeen called by " + authentication); + //Do nothing + return null; + } + + @GET + @Path("/doSeasonRollover") + public String doSeasonRollover(@HeaderParam("Authorization") final String authentication) { + logger.info("doSeasonRollover called by " + authentication); + //Do nothing + return null; + } + + @POST + @Path("getProfileForBuid") + public ProfileForBuidResponse getProfileForBuid(@HeaderParam("Authorization") final String authentication, + final GetProfileForBuidRequest request) { + logger.info("getProfileForBuid called by " + authentication + " : " + request); + final var profile = profileService.getProfile(request.buid()); + return new ProfileForBuidResponse(profile, List.of()); + } + + @POST + @Path("logMatchStart") + public void logMatchStart(@HeaderParam("Authorization") final String authentication, + final MatchStartLogData request) { + logger.info("logMatchStart called by " + authentication + " : " + request); + //Do nothing + } + + @GET + @Path("/fetch") + public FetchProfileResponse getFetch(@HeaderParam("Authorization") final String authentication) { + logger.info("fetch called by " + authentication); + return null; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileForBuidResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileForBuidResponse.java new file mode 100644 index 0000000..e2a28ef --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileForBuidResponse.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.profile; + +import ch.gtache.elderscrollslegends.service.inventory.SelectedItem; + +import java.util.List; + +public record ProfileForBuidResponse(ProfileStruct profile, List categories) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileRating.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileRating.java new file mode 100644 index 0000000..035d419 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileRating.java @@ -0,0 +1,10 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public record ProfileRating(String ratingMode, + int rank, + int rankStars, + int rankSeen, + int rankStarsSeen, + int wins, + int losses) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileService.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileService.java new file mode 100644 index 0000000..a3845a6 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileService.java @@ -0,0 +1,22 @@ +package ch.gtache.elderscrollslegends.service.profile; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import javax.sql.DataSource; +import java.util.Objects; + +@ApplicationScoped +public class ProfileService { + + private final DataSource dataSource; + + @Inject + ProfileService(final DataSource dataSource) { + this.dataSource = Objects.requireNonNull(dataSource); + } + + ProfileStruct getProfile(final String steamID) { + return null;//new ProfileStruct(name, level, gold, gems, xp, tickets, onboardingProgressFlags, dailyGold, dailyGems, ratins, maxRatings, collectionStats, seasonRollovers); + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileStruct.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileStruct.java new file mode 100644 index 0000000..346fd07 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/ProfileStruct.java @@ -0,0 +1,18 @@ +package ch.gtache.elderscrollslegends.service.profile; + +import java.util.List; + +public record ProfileStruct(String nickname, + int level, + int gold, + int gems, + int xp, + int tickets, + long onboardingProgressFlags, + int dailyGold, + int dailyGems, + List ratings, + List maxRatings, + List collectionStats, + List seasonRollovers) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/RolloverStatus.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/RolloverStatus.java new file mode 100644 index 0000000..e2f62af --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/RolloverStatus.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public enum RolloverStatus { + None, + Soon, + Ready +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/SeasonRollOverStruct.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/SeasonRollOverStruct.java new file mode 100644 index 0000000..34eda30 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/SeasonRollOverStruct.java @@ -0,0 +1,17 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public record SeasonRollOverStruct(float _timeCreated, + RolloverStatus status, + String ratingMode, + int pendingGold, + int pendingGems, + int pendingTickets, + int pendingCardTypeHash, + int pendingCardCount, + int pendingRank, + int pendingRankStars, + int seasonEndUnixTimeUTC, + int monthlyPreviewUnixTimeUTC, + int secondsUntilPreview, + int secondsUntilEnd) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/profile/SetOnboardingProgressRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/profile/SetOnboardingProgressRequest.java new file mode 100644 index 0000000..e531207 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/profile/SetOnboardingProgressRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.profile; + +public record SetOnboardingProgressRequest(long progressType) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/ChatRoom.java b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/ChatRoom.java new file mode 100644 index 0000000..8e90daa --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/ChatRoom.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.pubsub; + +public record ChatRoom(String key, String value) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/ChatRooms.java b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/ChatRooms.java new file mode 100644 index 0000000..72ec7df --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/ChatRooms.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.pubsub; + +import java.util.List; + +public record ChatRooms(List global) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/PubSubAuthEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/PubSubAuthEndpoints.java new file mode 100644 index 0000000..5a12098 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/PubSubAuthEndpoints.java @@ -0,0 +1,16 @@ +package ch.gtache.elderscrollslegends.service.pubsub; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; + +@Path("pubsubauth") +public class PubSubAuthEndpoints { + + @GET + @Produces("application/json") + public PubSubResponse get(@HeaderParam("Authorization") final String authentication) { + return null; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/PubSubResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/PubSubResponse.java new file mode 100644 index 0000000..26d00de --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/pubsub/PubSubResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.pubsub; + +public record PubSubResponse(String authToken, ChatRooms chatRooms) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/quests/QuestsEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/quests/QuestsEndpoints.java new file mode 100644 index 0000000..352a87d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/quests/QuestsEndpoints.java @@ -0,0 +1,43 @@ +package ch.gtache.elderscrollslegends.service.quests; + +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("quests") +public class QuestsEndpoints { + + @GET + @Path("fetch") + @Produces("application/json") + public QuestsFetchResponse fetch(@HeaderParam("Authorization") final String authentication) { + return null; + } + + @POST + @Path("setSeen") + @Consumes("application/json") + public void setSeen(@HeaderParam("Authorization") final String authentication, + final SetSeenRequest request) { + + } + + @POST + @Path("skip") + @Consumes("application/json") + public void skip(@HeaderParam("Authorization") final String authentication, + final SkipRequest request) { + + } + + @POST + @Path("select") + @Consumes("application/json") + public void select(@HeaderParam("Authorization") final String authentication, + final SelectRequest request) { + + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/quests/QuestsFetchResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/quests/QuestsFetchResponse.java new file mode 100644 index 0000000..6cd3dd8 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/quests/QuestsFetchResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.quests; + +public record QuestsFetchResponse() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/quests/SelectRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/quests/SelectRequest.java new file mode 100644 index 0000000..50cc4f1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/quests/SelectRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.quests; + +public record SelectRequest(int questTypeHash) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/quests/SetSeenRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/quests/SetSeenRequest.java new file mode 100644 index 0000000..93db766 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/quests/SetSeenRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.quests; + +public record SetSeenRequest() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/quests/SkipRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/quests/SkipRequest.java new file mode 100644 index 0000000..276ccd4 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/quests/SkipRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.quests; + +public record SkipRequest() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardRequest.java new file mode 100644 index 0000000..8861a3c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardRequest.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.reward; + +import java.util.List; + +public record AcceptRewardRequest(String lang, List rewards) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardResponse.java new file mode 100644 index 0000000..3de85b7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardResponse.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.reward; + + +import java.util.List; + +public record AcceptRewardResponse(List results) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardResult.java new file mode 100644 index 0000000..6047805 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/AcceptRewardResult.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.reward; + +import java.util.List; + +public record AcceptRewardResult(int bundleTypeHash, int bundleCount, int xp, int gold, int gems, int tickets, + List items) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/DbugTestRewardsType.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/DbugTestRewardsType.java new file mode 100644 index 0000000..fdd9142 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/DbugTestRewardsType.java @@ -0,0 +1,11 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public enum DbugTestRewardsType { + ALL, + CARDS, + DECKS, + ONBOARDING, + PACKS, + TITLES, + MISC, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/DebugGiveTestRewardsRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/DebugGiveTestRewardsRequest.java new file mode 100644 index 0000000..7ab9945 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/DebugGiveTestRewardsRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public record DebugGiveTestRewardsRequest(DbugTestRewardsType debugRewardType) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/ItemType.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/ItemType.java new file mode 100644 index 0000000..46dda2b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/ItemType.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public record ItemType(String type, String description, int typeId, int count, boolean isPremium) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/ListRewardsResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/ListRewardsResponse.java new file mode 100644 index 0000000..4b21d2d --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/ListRewardsResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.reward; + +import java.util.List; + +public record ListRewardsResponse(List rewards) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/MatchRewardStatus.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/MatchRewardStatus.java new file mode 100644 index 0000000..91ee401 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/MatchRewardStatus.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public enum MatchRewardStatus { + None, + WaitingForPush, + WaitingForRewards, + Completed, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardContainer.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardContainer.java new file mode 100644 index 0000000..148cdbc --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardContainer.java @@ -0,0 +1,20 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public enum RewardContainer { + None, + Bag, + Book, + UpgradeBook, + StrengthBook, + IntelligenceBook, + WillpowerBook, + AgilityBook, + EnduranceBook, + Box, + Scroll, + CWCBook, + DBBook, + IOMBook, + EventEntry, + StoryScroll, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardDescription.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardDescription.java new file mode 100644 index 0000000..9cb885c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardDescription.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.reward; + +import java.util.List; + +public record RewardDescription(long rewardId, RewardSource source, List rewardPasses) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardId.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardId.java new file mode 100644 index 0000000..1d43519 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardId.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public record RewardId(long rewardId, int passIndex) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardPassDescription.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardPassDescription.java new file mode 100644 index 0000000..663ec7e --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardPassDescription.java @@ -0,0 +1,5 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public record RewardPassDescription(int rewardPassIndex, boolean claimed, int xp, int gold, int gems, int tickets, + String bundleKey, int bundleCount, RewardRarity rarity, RewardContainer container) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardRarity.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardRarity.java new file mode 100644 index 0000000..58afc10 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardRarity.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public enum RewardRarity { + Common, + Rare, + Epic, + Legendary, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardSource.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardSource.java new file mode 100644 index 0000000..6a6e882 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardSource.java @@ -0,0 +1,16 @@ +package ch.gtache.elderscrollslegends.service.reward; + +public enum RewardSource { + Unknown, + Game, + LevelUp, + Campaign, + Quest, + VersusArena, + SoloArena, + TwitchDrop, + SeasonRollover, + Refund, + EventWins, + EventRank, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardsEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardsEndpoints.java new file mode 100644 index 0000000..b2338c8 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/reward/RewardsEndpoints.java @@ -0,0 +1,35 @@ +package ch.gtache.elderscrollslegends.service.reward; + +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("rewards") +public class RewardsEndpoints { + + @GET + @Path("fetch") + @Produces("application/json") + public ListRewardsResponse fetch(@HeaderParam("Authorization") final String authentication) { + return null; + } + + @POST + @Path("acceptReward") + @Consumes("application/json") + @Produces("application/json") + public AcceptRewardResponse acceptReward(@HeaderParam("Authorization") final String authentication, + final AcceptRewardRequest request) { + return null; + } + + @POST + @Path("debugGiveRewards") + @Consumes("application/json") + public void debugGiveTestRewards(@HeaderParam("Authorization") final String authentication, + final DebugGiveTestRewardsRequest request) { + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceChangeEntryRaw.java b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceChangeEntryRaw.java new file mode 100644 index 0000000..4820584 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceChangeEntryRaw.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.servermessages; + +import java.util.List; + +public record BalanceChangeEntryRaw(int cardTypeHash, BalanceType balanceType, List balanceAreas) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceChangeRaw.java b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceChangeRaw.java new file mode 100644 index 0000000..86d1a95 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceChangeRaw.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.servermessages; + +import java.util.List; + +public record BalanceChangeRaw(List changes) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceType.java b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceType.java new file mode 100644 index 0000000..9220626 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/BalanceType.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.servermessages; + +public enum BalanceType { + Nerf, + Buff +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/FetchResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/FetchResponse.java new file mode 100644 index 0000000..838b37a --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/FetchResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.servermessages; + +import java.util.List; + +public record FetchResponse(List messages) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/ServerMessageDataRaw.java b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/ServerMessageDataRaw.java new file mode 100644 index 0000000..7a8ecf1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/ServerMessageDataRaw.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.servermessages; + +public record ServerMessageDataRaw(long id, String messageUrgency, String messageType, String messageSubType, + String title, String message, String url, int createdTime, boolean isUserSpecific, + String subType, String imageKey, BalanceChangeRaw balanceChange) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/ServerMessagesEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/ServerMessagesEndpoints.java new file mode 100644 index 0000000..b10be6b --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/ServerMessagesEndpoints.java @@ -0,0 +1,28 @@ +package ch.gtache.elderscrollslegends.service.servermessages; + +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 jakarta.ws.rs.QueryParam; + +@Path("servermessages") +public class ServerMessagesEndpoints { + + @GET + @Path("fetch") + @Produces("application/json") + public FetchResponse fetch(@HeaderParam("Authorization") final String authentication, + @QueryParam("lang") final String lang) { + return null; + } + + @POST + @Path("setSeen") + @Consumes("application/json") + public void setSeen(@HeaderParam("Authorization") final String authentication, + final SetSeenRequest request) { + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/SetSeenRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/SetSeenRequest.java new file mode 100644 index 0000000..b7f2710 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/servermessages/SetSeenRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.servermessages; + +public record SetSeenRequest(long messageId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/BeginSteamTransactionRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/BeginSteamTransactionRequest.java new file mode 100644 index 0000000..a751ade --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/BeginSteamTransactionRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record BeginSteamTransactionRequest(String offerId, String language) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/BeginSteamTransactionResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/BeginSteamTransactionResponse.java new file mode 100644 index 0000000..8fbb6e1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/BeginSteamTransactionResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record BeginSteamTransactionResponse(String transactionId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/Catalog.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/Catalog.java new file mode 100644 index 0000000..43ce649 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/Catalog.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.shop; + +import java.util.List; + +public record Catalog(String platform, String currencyCode, List items, TargetedSale activeTargetedSale) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/CatalogItem.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/CatalogItem.java new file mode 100644 index 0000000..ae07549 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/CatalogItem.java @@ -0,0 +1,28 @@ +package ch.gtache.elderscrollslegends.service.shop; + +import java.util.List; + +public record CatalogItem(String itemKey, + ChannelCatalogItemState itemState, + String platformKey, + String imageUrl, + String frontPageImageUrl, + int priceGold, + String priceDisplay, + float priceDecimalCents, + int priceCents, + boolean KeepTextureResident, + Texture2D texture, + String summaryTitle, + String summaryDescription, + String detailsTitle, + String detailsDescription, + String frontPageText, + String lockedText, + int index, + List tags, + int startTimeUnixUTC, + int endTimeUnixUTC, + int secondsRemaining, + float receivedUnityTime) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/ChannelCatalogItemState.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ChannelCatalogItemState.java new file mode 100644 index 0000000..fda23c1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ChannelCatalogItemState.java @@ -0,0 +1,8 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public enum ChannelCatalogItemState { + Hidden, + Locked, + Owned, + Normal, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/CheckForEntitlementsResult.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/CheckForEntitlementsResult.java new file mode 100644 index 0000000..0b49ee8 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/CheckForEntitlementsResult.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record CheckForEntitlementsResult(int numHandled) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/ContentType.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ContentType.java new file mode 100644 index 0000000..6e56fee --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ContentType.java @@ -0,0 +1,77 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public enum ContentType { + deck_guildsworn_premade(-2130065822), + Story_clockwork_act_1(-2081695333), + cardpack_premium_legendary_skyrim(-2055625898), + Story_iom_act_3(-1930544045), + cardpack_premium_legendary_core(-1725187377), + Deck_paarthurnaxs_roar(-1559585206), + deck_warriorsofhammerfell(-1540481132), + deck_zumog_phooms_ambition(-1512805701), + deck_daggerfall_premade(-1482543116), + Collection_forgotten_hero(-1234927939), + CardPack_Oblivion(-1189332835), + CardPack_Alliance_War(-1134307988), + Deck_alduins_apocalypse(-1099276554), + cardpack_legendary_alliancewar(-1079248420), + CardPack_Dark_Brotherhood(-1060524721), + deck_aldmeri_premade(-1020546251), + deck_convenant_armaments(-895245686), + cardpack_legendary_core(-833271125), + CardPack_Core(-780195762), + Story_iom_act_2(-701526946), + CardPack_Elsweyr(-628554270), + Deck_redoran_onslaught(-459319658), + Deck_brynjolfs_heist(-441621356), + Deck_dagoths_might(-393841299), + Deck_hlaalu_schemes(-350943676), + Deck_telvanni_ambition(-260716247), + Collection_mad_prince(-214913246), + Story_clockwork_act_2(-195829567), + Collection_madhouse(-147102545), + cardpack_legendary_elsweyr(-66009394), + EventTicket(0), + SoulGem(1), + Gold(2), + Card(3), + GenericInventory(4), + Story_clockwork_act_3(9898450), + Deck_ancanos_cunning(78535902), + deck_dominion_dominance(80719945), + cardpack_premium_legendary_oblivion(123972390), + Deck_tribunal_glory(185858797), + deck_pact_assault(289889510), + Story_dark_brotherhood_act_1(570533001), + Story_dark_brotherhood_act_3(649298583), + deck_guildsworn_prowess(657290049), + deck_ebonheart_premade(722328902), + CardPack_Morrowind(771479791), + Puzzle_divayth_fyrs_trials(875057351), + deck_dunmeravengers(907250839), + CardPack_Skyrim(976836926), + deck_empire_conquest(1053545101), + cardpack_legendary_skyrim(1237593212), + cardpack_premium_legendary_morrowind(1272634621), + cardpack_premium_legendary_alliancewar(1333340848), + Collection_new_life_festival(1379264003), + deck_empire_premade(1389291549), + cardpack_legendary_oblivion(1414942565), + cardpack_premium_legendary_elsweyr(1428958207), + cardpack_legendary_morrowind(1463484932), + Story_dark_brotherhood_act_2(1591190481), + Deck_aelas_companions(1591262042), + Puzzle_naryus_challengesuzzle(1798920449), + Collection_frostfall_premium(1803478726), + CardPack_Clockwork_City(1942964363), + Collection_frostfall(1961349195), + deck_khamiras_rebellion(2038783878), + Story_iom_act_1(2039697399), + deck_imperialmight(2131899676); + + private final long id; + + ContentType(final long id) { + this.id = id; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/ContentTypeModifier.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ContentTypeModifier.java new file mode 100644 index 0000000..8f79c80 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ContentTypeModifier.java @@ -0,0 +1,7 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public enum ContentTypeModifier { + Regular, + Premium, + Legendary, +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchCatalogRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchCatalogRequest.java new file mode 100644 index 0000000..23eb7a7 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchCatalogRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record FetchCatalogRequest(String fingerprint) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchCatalogResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchCatalogResponse.java new file mode 100644 index 0000000..22c4c65 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchCatalogResponse.java @@ -0,0 +1,5 @@ +package ch.gtache.elderscrollslegends.service.shop; + + +public record FetchCatalogResponse(Catalog catalog) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchDRPurchaseUrlRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchDRPurchaseUrlRequest.java new file mode 100644 index 0000000..b6cc73c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchDRPurchaseUrlRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record FetchDRPurchaseUrlRequest(String offerId, String languageCode, String fingerprint) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchDRPurchaseUrlResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchDRPurchaseUrlResponse.java new file mode 100644 index 0000000..5622bc0 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FetchDRPurchaseUrlResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record FetchDRPurchaseUrlResponse(String url) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeIAPPurchaseRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeIAPPurchaseRequest.java new file mode 100644 index 0000000..4647294 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeIAPPurchaseRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record FinalizeIAPPurchaseRequest(String transactionId, String receipt, String currencyCode, int price) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeIAPPurchaseResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeIAPPurchaseResponse.java new file mode 100644 index 0000000..d1b9faf --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeIAPPurchaseResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record FinalizeIAPPurchaseResponse() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeSteamTransactionRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeSteamTransactionRequest.java new file mode 100644 index 0000000..2a66ad9 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeSteamTransactionRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record FinalizeSteamTransactionRequest(boolean authorized, int appId, long orderId) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeSteamTransactionResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeSteamTransactionResponse.java new file mode 100644 index 0000000..c809c6c --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/FinalizeSteamTransactionResponse.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record FinalizeSteamTransactionResponse() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/PurchaseWithGoldRequest.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/PurchaseWithGoldRequest.java new file mode 100644 index 0000000..20fad59 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/PurchaseWithGoldRequest.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record PurchaseWithGoldRequest(String offerId, int count) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/ShopEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ShopEndpoints.java new file mode 100644 index 0000000..a8674ed --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/ShopEndpoints.java @@ -0,0 +1,87 @@ +package ch.gtache.elderscrollslegends.service.shop; + +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 jakarta.ws.rs.QueryParam; + +@Path("shop") +public class ShopEndpoints { + + @GET + @Path("fetchCatalog") + public FetchCatalogResponse fetchCatalog(@HeaderParam("Authorization") final String authentication, + @QueryParam("lang") final String lang) { + return null; + } + + @POST + @Consumes("application/json") + @Produces("application/json") + public FetchCatalogResponse fetchCatalog(@HeaderParam("Authorization") final String authentication, + final FetchCatalogRequest request) { + return null; + } + + @GET + @Path("checkForEntitlements") + @Produces("application/json") + public CheckForEntitlementsResult checkForEntitlements(@HeaderParam("Authorization") final String authentication, + @QueryParam("currencyCode") final String currencyCode) { + return null; + } + + @POST + @Path("fetchDRPurchaseUrl") + @Consumes("application/json") + @Produces("application/json") + public FetchDRPurchaseUrlResponse fetchDRPurchaseURL(@HeaderParam("Authorization") final String authentication, + final FetchDRPurchaseUrlRequest request) { + return null; + } + + @POST + @Path("purchaseWithGold") + @Consumes("application/json") + @Produces("application/json") + public BeginSteamTransactionResponse purchaseWithGold(@HeaderParam("Authorization") final String authentication, + final PurchaseWithGoldRequest request) { + return null; + } + + @POST + @Path("finalizeIAPPurchase") + @Consumes("application/json") + @Produces("application/json") + public FinalizeIAPPurchaseResponse finalizeIAPPurchase(@HeaderParam("Authorization") final String authentication, + final FinalizeIAPPurchaseRequest request) { + return null; + } + + @POST + @Path("setTargetedSaleSeen") + public void setTargetedSaleSeen(@HeaderParam("Authorization") final String authentication) { + + } + + @POST + @Path("beginSteamTransaction") + @Consumes("application/json") + @Produces("application/json") + public BeginSteamTransactionResponse beginSteamTransaction(@HeaderParam("Authorization") final String authentication, + final BeginSteamTransactionRequest request) { + return null; + } + + @POST + @Path("finalizeSteamTransaction") + @Consumes("application/json") + @Produces("application/json") + public FinalizeSteamTransactionResponse finalizeSteamTransaction(@HeaderParam("Authorization") final String authentication, + final FinalizeSteamTransactionRequest request) { + return null; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/TargetedSale.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/TargetedSale.java new file mode 100644 index 0000000..674d299 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/TargetedSale.java @@ -0,0 +1,17 @@ +package ch.gtache.elderscrollslegends.service.shop; + +import java.util.List; + +public record TargetedSale(String itemKey, + String imageUrl, + String title, + String description, + String imageKey, + boolean isSeen, + boolean showPopupOnSeen, + int discountPercentDisplay, + int goldPriced, + int secondsRemaining, + List catalogContents, + float timeCreated) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/TargetedSaleEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/TargetedSaleEntry.java new file mode 100644 index 0000000..dc41706 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/TargetedSaleEntry.java @@ -0,0 +1,9 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record TargetedSaleEntry(ContentType ContentType, + ContentTypeModifier ContentTypeModifier, + int CardTypeHash, + String GenericInventoryCategory, + String GenericInventoryItemKey, + int Count) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/shop/Texture2D.java b/src/main/java/ch/gtache/elderscrollslegends/service/shop/Texture2D.java new file mode 100644 index 0000000..4ddaf1f --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/shop/Texture2D.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.shop; + +public record Texture2D() { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/stats/FetchStatsResponse.java b/src/main/java/ch/gtache/elderscrollslegends/service/stats/FetchStatsResponse.java new file mode 100644 index 0000000..720e7ff --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/stats/FetchStatsResponse.java @@ -0,0 +1,6 @@ +package ch.gtache.elderscrollslegends.service.stats; + +import java.util.List; + +public record FetchStatsResponse(List stats, List matchHistory) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/stats/MatchEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/stats/MatchEntry.java new file mode 100644 index 0000000..c8a2e14 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/stats/MatchEntry.java @@ -0,0 +1,5 @@ +package ch.gtache.elderscrollslegends.service.stats; + +public record MatchEntry(String matchType, String matchMode, String aiDifficulty, String opponentNickname, + String deckColors, String opponentDeckColors, String result) { +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/stats/StatsEndpoints.java b/src/main/java/ch/gtache/elderscrollslegends/service/stats/StatsEndpoints.java new file mode 100644 index 0000000..ea16568 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/stats/StatsEndpoints.java @@ -0,0 +1,15 @@ +package ch.gtache.elderscrollslegends.service.stats; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.Path; + +@Path("stats") +public class StatsEndpoints { + + @GET + @Path("fetch") + public FetchStatsResponse fetch(@HeaderParam("Authorization") final String authentication) { + return null; + } +} diff --git a/src/main/java/ch/gtache/elderscrollslegends/service/stats/StatsEntry.java b/src/main/java/ch/gtache/elderscrollslegends/service/stats/StatsEntry.java new file mode 100644 index 0000000..d365ed1 --- /dev/null +++ b/src/main/java/ch/gtache/elderscrollslegends/service/stats/StatsEntry.java @@ -0,0 +1,4 @@ +package ch.gtache.elderscrollslegends.service.stats; + +public record StatsEntry(String category, int value) { +} diff --git a/src/main/postgres/init.sql b/src/main/postgres/init.sql new file mode 100644 index 0000000..cd1b732 --- /dev/null +++ b/src/main/postgres/init.sql @@ -0,0 +1,84 @@ +--DROP DATABASE IF EXISTS elderscrollslegends; +--CREATE DATABASE elderscrollslegends WITH OWNER tesl ENCODING 'UTF8'; + +DROP TABLE IF EXISTS token CASCADE; +DROP TABLE IF EXISTS player CASCADE; + +CREATE TABLE player +( + id serial PRIMARY KEY NOT NULL, + steam_id bigint NOT NULL UNIQUE, + name text NOT NULL, + level int NOT NULL DEFAULT 0, + gold int NOT NULL DEFAULT 0, + gems int NOT NULL DEFAULT 0, + xp int NOT NULL DEFAULT 0, + tickets int NOT NULL DEFAULT 0, + onboarding_progress_flags bigint NOT NULL DEFAULT 0, + daily_gold int NOT NULL DEFAULT 0, + daily_gems int NOT NULL DEFAULT 0, + ratings int NOT NULL DEFAULT 0, + max_ratings int NOT NULL DEFAULT 0, + collection_stats int NOT NULL DEFAULT 0, + season_rollovers int NOT NULL DEFAULT 0 +); + +ALTER TABLE player + OWNER TO tesl; + +CREATE TABLE token +( + id serial PRIMARY KEY NOT NULL, + player_id int NOT NULL REFERENCES player (id) ON DELETE CASCADE, + token uuid NOT NULL UNIQUE, + expiration timestamptz NOT NULL +); + +ALTER TABLE token + OWNER TO tesl; + +CREATE OR REPLACE FUNCTION gen_random_uuid_trigger() RETURNS TRIGGER AS +$$ +BEGIN + NEW.token := gen_random_uuid(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +ALTER FUNCTION gen_random_uuid_trigger() + OWNER TO tesl; + +CREATE OR REPLACE TRIGGER gen_random_uuid_trigger + BEFORE INSERT + ON token + FOR EACH ROW +EXECUTE PROCEDURE gen_random_uuid_trigger(); + +CREATE OR REPLACE FUNCTION set_expiration_trigger() RETURNS TRIGGER AS +$$ +BEGIN + NEW.expiration := CURRENT_TIMESTAMP + INTERVAL '1 day'; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +ALTER FUNCTION set_expiration_trigger() + OWNER TO tesl; + +CREATE OR REPLACE TRIGGER set_expiration_trigger + BEFORE INSERT + ON token + FOR EACH ROW +EXECUTE PROCEDURE set_expiration_trigger(); + +CREATE TABLE message +( + id serial PRIMARY KEY NOT NULL, + sender_id int NOT NULL REFERENCES player (id) ON DELETE CASCADE, + recipient_id int NOT NULL REFERENCES player (id) ON DELETE CASCADE, + message text NOT NULL, + acknowledged boolean NOT NULL DEFAULT false +); + +ALTER TABLE message + OWNER TO tesl; diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties new file mode 100644 index 0000000..6680653 --- /dev/null +++ b/src/main/resources/application-dev.properties @@ -0,0 +1,2 @@ +quarkus.http.access-log.enabled=true +#quarkus.log.level=DEBUG \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..122c1bf --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,5 @@ +quarkus.http.port=3000 +quarkus.http.test-port=3001 +quarkus.jackson.fail-on-unknown-properties=true +quarkus.rest.jackson.optimization.enable-reflection-free-serializers=true +quarkus.swagger-ui.always-include=true \ No newline at end of file diff --git a/src/main/resources/ch/gtache/elderscrollslegends/service/config/config.json b/src/main/resources/ch/gtache/elderscrollslegends/service/config/config.json new file mode 100644 index 0000000..f1ab688 --- /dev/null +++ b/src/main/resources/ch/gtache/elderscrollslegends/service/config/config.json @@ -0,0 +1,24 @@ +{ + "AuthDev": "http://localhost:3000/auth", + "Account": "http://localhost:3000/account", + "PubsubAuth": "http://localhost:3000/pubsubauth", + "PubsubConnections": "http://localhost:3000/pubsubconnections", + "Shop": "http://localhost:3000/shop", + "Packages": "http://localhost:3000/packages", + "Inventory": "http://localhost:3000/inventory", + "Matching": "http://localhost:3000/matching", + "Campaigns": "http://localhost:3000/campaigns", + "Rewards": "http://localhost:3000/rewards", + "Profile": "http://localhost:3000/profile", + "Stats": "http://localhost:3000/stats", + "Quests": "http://localhost:3000/quests", + "Crafting": "http://localhost:3000/crafting", + "DailyRewards": "http://localhost:3000/dailyrewards", + "Events": "http://localhost:3000/events", + "Arena": "http://localhost:3000/arena", + "GenericInventory": "http://localhost:3000/genericinventory", + "ServerMessages": "http://localhost:3000/servermessages", + "Beam": "http://localhost:3000/beam", + "ErrorReporting": "http://localhost:3000/errorreporting", + "Analytics": "http://localhost:3000/analytics" +} \ No newline at end of file diff --git a/steam_appid.txt b/steam_appid.txt new file mode 100644 index 0000000..2c692bf --- /dev/null +++ b/steam_appid.txt @@ -0,0 +1 @@ +364470 \ No newline at end of file