Skip to content

Commit c728ce6

Browse files
committed
Update to v4
- Move deprecated endpoints to /legacy/ - Update endpoints to accept an API key, currently only the player & shop endpoints use it - Add QuickShop integratoin to allow players to lookup their own shops - Allow players to use their API keys to query their resident status, even if they have opted out - Add permissions for api command & key management
1 parent c5cbd72 commit c728ce6

22 files changed

Lines changed: 386 additions & 95 deletions

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
group = net.earthmc.emcapi
2-
version = 3.1.0-SNAPSHOT
2+
version = 4.0.0-SNAPSHOT
33
description = EMCAPI
44

55
org.gradle.configuration-cache=true

src/main/java/net/earthmc/emcapi/EMCAPI.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import jakarta.servlet.http.HttpServletResponse;
77
import net.earthmc.emcapi.integration.Integrations;
88
import net.earthmc.emcapi.manager.EndpointManager;
9+
import net.earthmc.emcapi.manager.LegacyEndpointManager;
910
import net.earthmc.emcapi.sse.SSEManager;
1011
import net.earthmc.emcapi.sse.listeners.ShopSSEListener;
1112
import net.earthmc.emcapi.sse.listeners.TownySSEListener;
@@ -47,8 +48,10 @@ public void onEnable() {
4748
this.pluginIntegrations = new Integrations(this);
4849
getServer().getPluginManager().registerEvents(this.pluginIntegrations, this);
4950

50-
EndpointManager endpointManager = new EndpointManager(this);
51-
endpointManager.loadEndpoints();
51+
if (getConfig().getBoolean("behavior.load_legacy")) {
52+
new LegacyEndpointManager(this).loadEndpoints(); // Load retired endpoints and still serve current endpoints at /v3/aurora/
53+
}
54+
new EndpointManager(this).loadEndpoints();
5255

5356
PluginCommand apiCommand = getCommand("api");
5457
if (apiCommand == null) {

src/main/java/net/earthmc/emcapi/endpoint/DiscordEndpoint.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.earthmc.emcapi.util.HttpExceptions;
1212
import net.earthmc.emcapi.util.JSONUtil;
1313

14+
import javax.annotation.Nullable;
1415
import java.util.UUID;
1516
import java.util.regex.Matcher;
1617
import java.util.regex.Pattern;
@@ -21,7 +22,7 @@ public class DiscordEndpoint extends PostEndpoint<DiscordContext> {
2122
private static final BadRequestResponse INVALID_TYPE_TARGET = new BadRequestResponse("Your JSON query has an invalid type or target");
2223

2324
@Override
24-
public DiscordContext getObjectOrNull(JsonElement element) {
25+
public DiscordContext getObjectOrNull(JsonElement element, @Nullable UUID key) {
2526
JsonObject jsonObject = JSONUtil.getJsonElementAsJsonObjectOrNull(element);
2627
if (jsonObject == null) {
2728
throw HttpExceptions.NOT_A_JSON_OBJECT;
@@ -60,7 +61,7 @@ public DiscordContext getObjectOrNull(JsonElement element) {
6061
}
6162

6263
@Override
63-
public JsonElement getJsonElement(DiscordContext context) {
64+
public JsonElement getJsonElement(DiscordContext context, @Nullable UUID key) {
6465
DiscordType type = context.getType();
6566
String target = context.getTarget();
6667

src/main/java/net/earthmc/emcapi/endpoint/LocationEndpoint.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@
1313
import org.bukkit.Bukkit;
1414
import org.bukkit.Location;
1515

16+
import javax.annotation.Nullable;
17+
import java.util.UUID;
18+
1619
public class LocationEndpoint extends PostEndpoint<Pair<Integer, Integer>> {
1720

1821
@Override
19-
public Pair<Integer, Integer> getObjectOrNull(JsonElement element) {
22+
public Pair<Integer, Integer> getObjectOrNull(JsonElement element, @Nullable UUID key) {
2023
JsonArray jsonArray = JSONUtil.getJsonElementAsJsonArrayOrNull(element);
2124
if (jsonArray == null) throw new BadRequestResponse("Your query contains a value that is not a JSON array");
2225

@@ -40,7 +43,7 @@ public Pair<Integer, Integer> getObjectOrNull(JsonElement element) {
4043
}
4144

4245
@Override
43-
public JsonElement getJsonElement(Pair<Integer, Integer> pair) {
46+
public JsonElement getJsonElement(Pair<Integer, Integer> pair, @Nullable UUID key) {
4447
int x = pair.getFirst();
4548
int z = pair.getSecond();
4649

src/main/java/net/earthmc/emcapi/endpoint/NearbyEndpoint.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
import org.bukkit.Bukkit;
2020
import org.bukkit.Location;
2121

22+
import javax.annotation.Nullable;
2223
import java.util.ArrayList;
2324
import java.util.List;
25+
import java.util.UUID;
2426

2527
public class NearbyEndpoint extends PostEndpoint<NearbyContext> {
2628

2729
@Override
28-
public NearbyContext getObjectOrNull(JsonElement element) {
30+
public NearbyContext getObjectOrNull(JsonElement element, @Nullable UUID key) {
2931
JsonObject jsonObject = JSONUtil.getJsonElementAsJsonObjectOrNull(element);
3032
if (jsonObject == null) throw new BadRequestResponse("Your query contains a value that is not a JSON object");
3133

@@ -64,7 +66,7 @@ public NearbyContext getObjectOrNull(JsonElement element) {
6466
}
6567

6668
@Override
67-
public JsonElement getJsonElement(NearbyContext context) {
69+
public JsonElement getJsonElement(NearbyContext context, @Nullable UUID key) {
6870
NearbyType targetType = context.getTargetType();
6971
int radius = context.getRadius();
7072
switch (targetType) {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package net.earthmc.emcapi.endpoint;
2+
3+
import com.google.gson.JsonElement;
4+
import com.google.gson.JsonObject;
5+
import io.javalin.http.BadRequestResponse;
6+
import net.earthmc.emcapi.EMCAPI;
7+
import net.earthmc.emcapi.integration.QuickShopIntegration;
8+
import net.earthmc.emcapi.object.endpoint.PostEndpoint;
9+
import net.earthmc.emcapi.util.EndpointUtils;
10+
import net.earthmc.emcapi.util.JSONUtil;
11+
import org.jspecify.annotations.Nullable;
12+
import org.maxgamer.quickshop.api.shop.Shop;
13+
14+
import java.util.List;
15+
import java.util.UUID;
16+
17+
public class ShopEndpoint extends PostEndpoint<List<Shop>> {
18+
private final QuickShopIntegration integration;
19+
20+
public ShopEndpoint(EMCAPI plugin) {
21+
this.integration = plugin.integrations().quickShopIntegration();
22+
}
23+
24+
@Override
25+
public List<Shop> getObjectOrNull(JsonElement element, @Nullable UUID key) {
26+
String string = JSONUtil.getJsonElementAsStringOrNull(element);
27+
if (string == null) throw new BadRequestResponse("Your query contains a value that is not a string");
28+
29+
UUID player;
30+
try {
31+
player = UUID.fromString(string);
32+
} catch (IllegalArgumentException ignored) {
33+
return null;
34+
}
35+
36+
integration.throwIfDisabled();
37+
return integration.getPlayerShops(player, key);
38+
}
39+
40+
@Override
41+
public JsonElement getJsonElement(List<Shop> object, @Nullable UUID key) {
42+
JsonObject shopsObject = new JsonObject();
43+
int counter = 1;
44+
UUID keyOwner = EndpointUtils.getKeyOwner(key);
45+
for (Shop shop : object) {
46+
if (!shop.getOwner().equals(keyOwner)) continue;
47+
shopsObject.add(String.valueOf(counter++), EndpointUtils.getShopObject(shop));
48+
}
49+
50+
return shopsObject;
51+
}
52+
}

src/main/java/net/earthmc/emcapi/endpoint/DocumentationEndpoint.java renamed to src/main/java/net/earthmc/emcapi/endpoint/legacy/DocumentationEndpoint.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.earthmc.emcapi.endpoint;
1+
package net.earthmc.emcapi.endpoint.legacy;
22

33
import com.google.gson.JsonObject;
44
import net.earthmc.emcapi.object.endpoint.GetEndpoint;

src/main/java/net/earthmc/emcapi/endpoint/MudkipEndpoint.java renamed to src/main/java/net/earthmc/emcapi/endpoint/legacy/MudkipEndpoint.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.earthmc.emcapi.endpoint;
1+
package net.earthmc.emcapi.endpoint.legacy;
22

33
public class MudkipEndpoint {
44

src/main/java/net/earthmc/emcapi/endpoint/PlayerStatsEndpoint.java renamed to src/main/java/net/earthmc/emcapi/endpoint/legacy/PlayerStatsEndpoint.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.earthmc.emcapi.endpoint;
1+
package net.earthmc.emcapi.endpoint.legacy;
22

33
import com.google.gson.JsonObject;
44
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
@@ -16,7 +16,6 @@
1616
import java.nio.file.StandardOpenOption;
1717
import java.util.HashMap;
1818
import java.util.Map;
19-
import java.util.concurrent.TimeUnit;
2019

2120
public class PlayerStatsEndpoint {
2221
private final EMCAPI plugin;

src/main/java/net/earthmc/emcapi/endpoint/towny/NationsEndpoint.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313
import net.earthmc.emcapi.util.EndpointUtils;
1414
import net.earthmc.emcapi.util.JSONUtil;
1515

16+
import javax.annotation.Nullable;
1617
import java.util.List;
1718
import java.util.UUID;
1819

1920
public class NationsEndpoint extends PostEndpoint<Nation> {
2021

2122
@Override
22-
public Nation getObjectOrNull(JsonElement element) {
23+
public Nation getObjectOrNull(JsonElement element, @Nullable UUID key) {
2324
String string = JSONUtil.getJsonElementAsStringOrNull(element);
2425
if (string == null) throw new BadRequestResponse("Your query contains a value that is not a string");
2526

@@ -34,7 +35,7 @@ public Nation getObjectOrNull(JsonElement element) {
3435
}
3536

3637
@Override
37-
public JsonElement getJsonElement(Nation nation) {
38+
public JsonElement getJsonElement(Nation nation, @Nullable UUID key) {
3839
JsonObject nationObject = new JsonObject();
3940

4041
nationObject.addProperty("name", nation.getName());

0 commit comments

Comments
 (0)