From 558e6f84f141286b9fc236779a832d288bafd4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 30 May 2025 18:34:49 +0200 Subject: [PATCH] api header support, team api integration --- common/build.gradle | 1 + .../spawn/common/api/CraftAttackApi.java | 4 +- .../api}/repositories/ReportRepository.java | 6 +-- .../metaGameplay/report/Report.java | 2 +- .../spawn/core/{util => }/api/HttpStatus.java | 2 +- .../spawn/core/api/client/HttpRepository.java | 36 ++++++++++++---- .../spawn/core/api/client/ReqResp.java | 12 ++++++ core/src/main/resources/config.yml | 4 ++ .../spawn/craftattack/api/EventServerApi.java | 4 +- .../api}/repositories/EventRepository.java | 6 +-- .../api}/repositories/FeedbackRepository.java | 7 ++-- .../repositories/WhitelistRepository.java | 6 +-- .../appliances/metaGameplay/event/Event.java | 4 +- .../metaGameplay/feedback/Feedback.java | 4 +- .../tooling/whitelist/Whitelist.java | 4 +- .../craftattack/spawn/varo/api/VaroApi.java | 28 +++++++++++++ .../varo/api/repositories/TeamRepository.java | 36 ++++++++++++++++ .../appliances/metaGameplay/teams/Teams.java | 41 +++++++++---------- .../metaGameplay/teams/VaroTeam.java | 8 ++-- 19 files changed, 157 insertions(+), 58 deletions(-) rename core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/WebsiteApiUtil.java => common/src/main/java/eu/mhsl/craftattack/spawn/common/api/CraftAttackApi.java (91%) rename {core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client => common/src/main/java/eu/mhsl/craftattack/spawn/common/api}/repositories/ReportRepository.java (85%) rename core/src/main/java/eu/mhsl/craftattack/spawn/core/{util => }/api/HttpStatus.java (90%) rename core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/EventApiUtil.java => craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/EventServerApi.java (88%) rename {core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client => craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api}/repositories/EventRepository.java (79%) rename {core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client => craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api}/repositories/FeedbackRepository.java (73%) rename {core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client => craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api}/repositories/WhitelistRepository.java (73%) create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/VaroApi.java create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/TeamRepository.java diff --git a/common/build.gradle b/common/build.gradle index c38438d..578064a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -3,4 +3,5 @@ dependencies { compileOnly 'io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT' compileOnly 'org.geysermc.floodgate:api:2.2.2-SNAPSHOT' + implementation 'org.apache.httpcomponents:httpclient:4.5.14' } diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/WebsiteApiUtil.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/CraftAttackApi.java similarity index 91% rename from core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/WebsiteApiUtil.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/api/CraftAttackApi.java index a242549..ce54750 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/WebsiteApiUtil.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/CraftAttackApi.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.core.util.api; +package eu.mhsl.craftattack.spawn.common.api; import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.apache.http.client.utils.URIBuilder; @@ -8,7 +8,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Objects; -public class WebsiteApiUtil { +public class CraftAttackApi { private final static ConfigurationSection apiConfig = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")); public final static String basePath = apiConfig.getString("baseurl"); public final static String apiSecret = apiConfig.getString("secret"); diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/ReportRepository.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/ReportRepository.java similarity index 85% rename from core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/ReportRepository.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/ReportRepository.java index ee24487..f885df0 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/ReportRepository.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/ReportRepository.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.core.api.client.repositories; +package eu.mhsl.craftattack.spawn.common.api.repositories; import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.util.api.WebsiteApiUtil; +import eu.mhsl.craftattack.spawn.common.api.CraftAttackApi; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -11,7 +11,7 @@ import java.util.UUID; public class ReportRepository extends HttpRepository { public ReportRepository() { - super(WebsiteApiUtil.getBaseUri(), WebsiteApiUtil::withAuthorizationSecret); + super(CraftAttackApi.getBaseUri(), new RequestModifier(CraftAttackApi::withAuthorizationSecret, null)); } public record ReportCreationInfo(@NotNull UUID reporter, @Nullable UUID reported, String reason) { diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/Report.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/Report.java index bf67c41..3329d70 100644 --- a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/Report.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/Report.java @@ -2,7 +2,7 @@ package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.report; import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.api.client.repositories.ReportRepository; +import eu.mhsl.craftattack.spawn.common.api.repositories.ReportRepository; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/HttpStatus.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/HttpStatus.java similarity index 90% rename from core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/HttpStatus.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/api/HttpStatus.java index 7c0ae69..861b267 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/HttpStatus.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/HttpStatus.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.core.util.api; +package eu.mhsl.craftattack.spawn.core.api; public class HttpStatus { public static final int OK = 200; diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/HttpRepository.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/HttpRepository.java index 8d8b7dd..9d3e1d1 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/HttpRepository.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/HttpRepository.java @@ -10,23 +10,29 @@ import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.List; +import java.util.Objects; import java.util.function.Consumer; @RepositoryLoader.Abstraction public abstract class HttpRepository extends Repository { - private final Consumer baseUriBuilder; + public record RequestModifier( + @Nullable Consumer uri, + @Nullable Consumer header + ) {} + + private final List baseRequestModifier; public HttpRepository(URI basePath) { - this(basePath, null); + this(basePath, new RequestModifier(null, null)); } - public HttpRepository(URI basePath, @Nullable Consumer baseUriBuilder) { + public HttpRepository(URI basePath, RequestModifier... baseRequestModifier) { super(basePath); - this.baseUriBuilder = baseUriBuilder == null - ? uriBuilder -> { - } - : baseUriBuilder; + this.baseRequestModifier = baseRequestModifier == null + ? List.of() + : List.of(baseRequestModifier); } protected ReqResp post(String command, TInput data, Class outputType) { @@ -58,7 +64,11 @@ public abstract class HttpRepository extends Repository { private URI getUri(String command, Consumer parameters) { try { URIBuilder builder = new URIBuilder(this.basePath + "/" + command); - this.baseUriBuilder.accept(builder); + this.baseRequestModifier.stream() + .map(requestModifier -> requestModifier.uri) + .filter(Objects::nonNull) + .forEach(modifier -> modifier.accept(builder)); + parameters.accept(builder); return builder.build(); } catch(URISyntaxException e) { @@ -67,14 +77,22 @@ public abstract class HttpRepository extends Repository { } private HttpRequest.Builder getRequestBuilder(URI endpoint) { - return HttpRequest.newBuilder() + HttpRequest.Builder builder = HttpRequest.newBuilder() .uri(endpoint) .header("User-Agent", Main.instance().getServer().getBukkitVersion()) .header("Content-Type", "application/json"); + + this.baseRequestModifier.stream() + .map(requestModifier -> requestModifier.header) + .filter(Objects::nonNull) + .forEach(modifier -> modifier.accept(builder)); + + return builder; } private ReqResp execute(HttpRequest request, Class clazz) { ReqResp rawResponse = this.sendHttp(request); + Main.logger().info(String.format("HTTP-Repository fired %s, response: %s", request, rawResponse)); return new ReqResp<>(rawResponse.status(), this.gson.fromJson(rawResponse.data(), clazz)); } diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/ReqResp.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/ReqResp.java index 71aa0b3..d8f91cb 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/ReqResp.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/ReqResp.java @@ -1,4 +1,16 @@ package eu.mhsl.craftattack.spawn.core.api.client; +import com.google.gson.Gson; +import java.lang.reflect.Type; + public record ReqResp(int status, TData data) { + public ReqResp convertToTypeToken(Type type) { + var gson = new Gson(); + return new ReqResp<>(this.status, gson.fromJson(gson.toJson(this.data), type)); + } + + @SuppressWarnings("unchecked") + public T cast() { + return (T) this; + } } \ No newline at end of file diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml index ad100ed..9253978 100644 --- a/core/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -77,3 +77,7 @@ shrinkingBorder: minimumSize: 10 shrinkPerDay: 10 shrinkTime: 03:00 + +varoApi: + endpoint: "https://mhsl.eu/varo/api" + auth: "Basic xxx" \ No newline at end of file diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/EventApiUtil.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/EventServerApi.java similarity index 88% rename from core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/EventApiUtil.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/EventServerApi.java index ffd8932..2be4c9b 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/api/EventApiUtil.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/EventServerApi.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.core.util.api; +package eu.mhsl.craftattack.spawn.craftattack.api; import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.bukkit.configuration.ConfigurationSection; @@ -7,7 +7,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Objects; -public class EventApiUtil { +public class EventServerApi { private final static ConfigurationSection apiConfig = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("event")); public final static String basePath = apiConfig.getString("api"); diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/EventRepository.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/EventRepository.java similarity index 79% rename from core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/EventRepository.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/EventRepository.java index 2c586f2..9ddba9f 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/EventRepository.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/EventRepository.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.core.api.client.repositories; +package eu.mhsl.craftattack.spawn.craftattack.api.repositories; import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.util.api.EventApiUtil; +import eu.mhsl.craftattack.spawn.craftattack.api.EventServerApi; import java.util.UUID; public class EventRepository extends HttpRepository { public EventRepository() { - super(EventApiUtil.getBaseUri()); + super(EventServerApi.getBaseUri()); } public record CreatedRoom(UUID uuid) { diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/FeedbackRepository.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/FeedbackRepository.java similarity index 73% rename from core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/FeedbackRepository.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/FeedbackRepository.java index fc9b05c..c1c4da5 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/FeedbackRepository.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/FeedbackRepository.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.core.api.client.repositories; +package eu.mhsl.craftattack.spawn.craftattack.api.repositories; import com.google.common.reflect.TypeToken; import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.util.api.WebsiteApiUtil; +import eu.mhsl.craftattack.spawn.common.api.CraftAttackApi; import java.lang.reflect.Type; import java.util.List; @@ -12,7 +12,7 @@ import java.util.UUID; public class FeedbackRepository extends HttpRepository { public FeedbackRepository() { - super(WebsiteApiUtil.getBaseUri(), WebsiteApiUtil::withAuthorizationSecret); + super(CraftAttackApi.getBaseUri(), new RequestModifier(CraftAttackApi::withAuthorizationSecret, null)); } public record Request(String event, List users) { @@ -22,6 +22,7 @@ public class FeedbackRepository extends HttpRepository { final Type responseType = new TypeToken>() { }.getType(); ReqResp rawData = this.post("feedback", data, Object.class); + // TODO: use convertToTypeToken from ReqResp return new ReqResp<>(rawData.status(), this.gson.fromJson(this.gson.toJson(rawData.data()), responseType)); } } diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/WhitelistRepository.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/WhitelistRepository.java similarity index 73% rename from core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/WhitelistRepository.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/WhitelistRepository.java index bc3e207..1dd100e 100644 --- a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/repositories/WhitelistRepository.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/WhitelistRepository.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.core.api.client.repositories; +package eu.mhsl.craftattack.spawn.craftattack.api.repositories; import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.util.api.WebsiteApiUtil; +import eu.mhsl.craftattack.spawn.common.api.CraftAttackApi; import java.util.UUID; public class WhitelistRepository extends HttpRepository { public WhitelistRepository() { - super(WebsiteApiUtil.getBaseUri(), WebsiteApiUtil::withAuthorizationSecret); + super(CraftAttackApi.getBaseUri(), new RequestModifier(CraftAttackApi::withAuthorizationSecret, null)); } public record UserData( diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/Event.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/Event.java index 1837895..4c37244 100644 --- a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/Event.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/Event.java @@ -2,14 +2,14 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event; import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.api.client.repositories.EventRepository; +import eu.mhsl.craftattack.spawn.craftattack.api.repositories.EventRepository; import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.Advancements; import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.CustomAdvancements; import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; -import eu.mhsl.craftattack.spawn.core.util.api.HttpStatus; +import eu.mhsl.craftattack.spawn.core.api.HttpStatus; import eu.mhsl.craftattack.spawn.core.util.entity.DisplayVillager; import eu.mhsl.craftattack.spawn.core.util.listener.DismissInventoryOpenFromHolder; import eu.mhsl.craftattack.spawn.core.util.listener.PlayerInteractAtEntityEventListener; diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/Feedback.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/Feedback.java index dd52b62..b588c96 100644 --- a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/Feedback.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/Feedback.java @@ -2,10 +2,10 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.feedback; import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.api.client.repositories.FeedbackRepository; +import eu.mhsl.craftattack.spawn.craftattack.api.repositories.FeedbackRepository; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.core.util.api.HttpStatus; +import eu.mhsl.craftattack.spawn.core.api.HttpStatus; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/Whitelist.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/Whitelist.java index 56092b5..ee82c86 100644 --- a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/Whitelist.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/Whitelist.java @@ -2,10 +2,10 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.whitelist; import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.core.api.client.repositories.WhitelistRepository; +import eu.mhsl.craftattack.spawn.craftattack.api.repositories.WhitelistRepository; import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; -import eu.mhsl.craftattack.spawn.core.util.api.HttpStatus; +import eu.mhsl.craftattack.spawn.core.api.HttpStatus; import eu.mhsl.craftattack.spawn.core.util.server.Floodgate; import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed.Outlawed; diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/VaroApi.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/VaroApi.java new file mode 100644 index 0000000..7a445db --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/VaroApi.java @@ -0,0 +1,28 @@ +package eu.mhsl.craftattack.spawn.varo.api; + +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import org.bukkit.configuration.ConfigurationSection; + +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpRequest; +import java.util.Objects; + +public class VaroApi { + private final static ConfigurationSection apiConfig = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("varoApi")); + public final static String basePath = apiConfig.getString("endpoint"); + public final static String apiSecret = apiConfig.getString("auth"); + + public static URI getBaseUri() { + Objects.requireNonNull(basePath); + try { + return new URI(basePath); + } catch(URISyntaxException e) { + throw new RuntimeException(e); + } + } + + public static void authorizationHeader(HttpRequest.Builder builder) { + builder.header("Authorization", apiSecret); + } +} \ No newline at end of file diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/TeamRepository.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/TeamRepository.java new file mode 100644 index 0000000..b98d8a7 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/TeamRepository.java @@ -0,0 +1,36 @@ +package eu.mhsl.craftattack.spawn.varo.api.repositories; + +import com.google.common.reflect.TypeToken; +import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.varo.api.VaroApi; + +import java.util.List; +import java.util.UUID; + +public class TeamRepository extends HttpRepository { + public TeamRepository() { + super(VaroApi.getBaseUri(), new RequestModifier(null, VaroApi::authorizationHeader)); + } + + public record Team( + String name, + String color, + Object lastJoined, + Object strikeWeight, + List users + ) { + public record User( + UUID uuid, + boolean dead + ) {} + } + + public ReqResp> getTeams() { + var resp = this.get("team", Object.class); + System.out.println(resp.toString()); + return resp + .convertToTypeToken(new TypeToken>() {}.getType()) + .cast(); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java index 88c5d6e..7602278 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java @@ -4,6 +4,7 @@ import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.varo.api.repositories.TeamRepository; import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.joinProtection.JoinProtection; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -18,19 +19,19 @@ import org.jetbrains.annotations.Nullable; import java.util.*; public class Teams extends Appliance implements DisplayName.Prefixed, DisplayName.Colored { - private Set teams = new HashSet<>() {{ - this.add(new VaroTeam( - new HashSet<>() {{ - this.add(new VaroTeam.Member(UUID.fromString("3a0a699c-7f0c-319b-839c-ccc8cac8ae63"), false)); - this.add(new VaroTeam.Member(UUID.fromString("959ed433-14ea-38fe-918b-75b7d09466af"), true)); - }}, - "Die Admins", - "#0E0E0E" - )); - }}; + private List teams = List.of(); + + public Teams() { + this.refreshTeamList(); + } public void refreshTeamList() { - + this.teams = this.queryRepository(TeamRepository.class).getTeams().data().stream() + .map(team -> new VaroTeam( + team.users().stream().map(user -> new VaroTeam.Member(user.uuid(), user.dead())).toList(), + team.name(), + team.color() + )).toList(); } public boolean canLogin(UUID playerId) { @@ -58,16 +59,14 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam VaroTeam team = this.getTeamFromPlayer(joinedPlayer.getUniqueId()); Bukkit.getScheduler().scheduleSyncDelayedTask( Main.instance(), - () -> { - team.members.stream() - .filter(member -> !member.isDead) - .filter(member -> { - Player p = Bukkit.getPlayer(member.player.getUniqueId()); - return p == null || !p.isOnline(); - }) - .findAny() - .ifPresent(member -> team.kickTeam(disconnectInfo)); - }, + () -> team.members.stream() + .filter(member -> !member.isDead) + .filter(member -> { + Player p = Bukkit.getPlayer(member.player.getUniqueId()); + return p == null || !p.isOnline(); + }) + .findAny() + .ifPresent(member -> team.kickTeam(disconnectInfo)), Ticks.TICKS_PER_SECOND * (JoinProtection.resistanceDuration / 2) ); } diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java index 6891235..e0dafe5 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java @@ -5,8 +5,8 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.UUID; class VaroTeam { @@ -26,18 +26,18 @@ class VaroTeam { } public boolean isFree(int countdownSeconds) { - return this.timestampSince < System.currentTimeMillis() - (countdownSeconds * 1000); + return this.timestampSince < System.currentTimeMillis() - (countdownSeconds * 1000L); } } - public final Set members; + public final List members; public final UUID teamUuid; public final String name; public final String color; public JoinCountdown joinCountdown; - public VaroTeam(Set members, String name, String color) { + public VaroTeam(List members, String name, String color) { this.teamUuid = UUID.randomUUID(); this.members = members; this.name = name;