Skip to content

Commit 1dc83ba

Browse files
committed
Use softdepend for all non essential dependencies
Closes #37
1 parent ee5bdae commit 1dc83ba

16 files changed

Lines changed: 294 additions & 58 deletions

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.javalin.util.JavalinLogger;
55
import jakarta.servlet.http.HttpServletRequest;
66
import jakarta.servlet.http.HttpServletResponse;
7+
import net.earthmc.emcapi.integration.Integrations;
78
import net.earthmc.emcapi.manager.EndpointManager;
89
import net.earthmc.emcapi.util.EndpointUtils;
910
import net.earthmc.emcapi.command.OptOutCommand;
@@ -23,6 +24,7 @@ public final class EMCAPI extends JavaPlugin {
2324

2425
public static EMCAPI instance;
2526
private Javalin javalin;
27+
private Integrations pluginIntegrations;
2628

2729
@Override
2830
public void onLoad() {
@@ -37,6 +39,9 @@ public void onEnable() {
3739
loadConfig();
3840
initialiseJavalin();
3941

42+
this.pluginIntegrations = new Integrations(this);
43+
getServer().getPluginManager().registerEvents(this.pluginIntegrations, this);
44+
4045
EndpointManager endpointManager = new EndpointManager(this);
4146
endpointManager.loadEndpoints();
4247

@@ -64,7 +69,7 @@ public void onDisable() {
6469
getLogger().warning("IOException while saving opted-out players: " + e);
6570
}
6671
}
67-
72+
6873
private void initialiseJavalin() {
6974
javalin = Javalin.create(config -> {
7075
config.jetty.modifyServer(server -> {
@@ -111,4 +116,8 @@ public void handle(String target, Request baseRequest, HttpServletRequest reques
111116
public Javalin getJavalin() {
112117
return javalin;
113118
}
119+
120+
public Integrations integrations() {
121+
return this.pluginIntegrations;
122+
}
114123
}

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,42 @@
33
import com.google.gson.JsonElement;
44
import com.google.gson.JsonObject;
55
import github.scarsz.discordsrv.DiscordSRV;
6-
import github.scarsz.discordsrv.objects.managers.AccountLinkManager;
76
import io.javalin.http.BadRequestResponse;
87
import net.earthmc.emcapi.object.endpoint.PostEndpoint;
98
import net.earthmc.emcapi.object.nearby.DiscordContext;
109
import net.earthmc.emcapi.object.nearby.DiscordType;
1110
import net.earthmc.emcapi.util.EndpointUtils;
11+
import net.earthmc.emcapi.util.HttpExceptions;
1212
import net.earthmc.emcapi.util.JSONUtil;
1313

1414
import java.util.UUID;
1515
import java.util.regex.Matcher;
1616
import java.util.regex.Pattern;
1717

1818
public class DiscordEndpoint extends PostEndpoint<DiscordContext> {
19-
private static final Pattern pattern = Pattern.compile("^\\d{17,19}$");
20-
private final AccountLinkManager alm = DiscordSRV.getPlugin().getAccountLinkManager();
19+
private static final Pattern ID_PATTERN = Pattern.compile("^\\d{17,19}$");
20+
private static final BadRequestResponse MISSING_TYPE_TARGET = new BadRequestResponse("Your JSON query is missing a type or target");
21+
private static final BadRequestResponse INVALID_TYPE_TARGET = new BadRequestResponse("Your JSON query has an invalid type or target");
2122

2223
@Override
2324
public DiscordContext getObjectOrNull(JsonElement element) {
2425
JsonObject jsonObject = JSONUtil.getJsonElementAsJsonObjectOrNull(element);
25-
if (jsonObject == null) throw new BadRequestResponse("Your query contains a value that is not a JSON object");
26+
if (jsonObject == null) {
27+
throw HttpExceptions.NOT_A_JSON_OBJECT;
28+
}
2629

2730
JsonElement typeElement = jsonObject.get("type");
2831
JsonElement targetElement = jsonObject.get("target");
29-
if (typeElement == null || targetElement == null) throw new BadRequestResponse("Your JSON query is missing a type or target");
32+
if (typeElement == null || targetElement == null) {
33+
throw MISSING_TYPE_TARGET;
34+
}
3035

3136
String typeString = JSONUtil.getJsonElementAsStringOrNull(typeElement);
3237
String target = JSONUtil.getJsonElementAsStringOrNull(targetElement);
33-
if (typeString == null || target == null) throw new BadRequestResponse("Your JSON query has an invalid type or target");
38+
if (typeString == null || target == null) {
39+
throw INVALID_TYPE_TARGET;
40+
}
41+
3442
UUID uuid = null;
3543
try {
3644
uuid = getUUIDFromStr(target);
@@ -63,8 +71,11 @@ public JsonElement getJsonElement(DiscordContext context) {
6371
discordObject.addProperty("uuid", uuid == null ? null : uuid.toString());
6472
} else if (type == DiscordType.MINECRAFT) {
6573
UUID uuid = getUUIDFromStr(target);
66-
if (uuid == null) throw new BadRequestResponse(target + " is not a valid Minecraft UUID");
67-
discordObject.addProperty("id", alm.getDiscordId(uuid));
74+
if (uuid == null) {
75+
throw new BadRequestResponse(target + " is not a valid Minecraft UUID");
76+
}
77+
78+
discordObject.addProperty("id", DiscordSRV.getPlugin().getAccountLinkManager().getDiscordId(uuid));
6879
discordObject.addProperty("uuid", uuid.toString());
6980
}
7081

@@ -82,10 +93,10 @@ private UUID getUUIDFromStr(String uuidStr) {
8293
}
8394

8495
private UUID getUUIDFromDiscordId(String discordId) {
85-
Matcher matcher = pattern.matcher(discordId);
96+
Matcher matcher = ID_PATTERN.matcher(discordId);
8697

8798
if (!matcher.find()) return null;
8899

89-
return alm.getUuid(discordId);
100+
return DiscordSRV.getPlugin().getAccountLinkManager().getUuid(discordId);
90101
}
91102
}

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.google.gson.JsonArray;
44
import com.google.gson.JsonElement;
55
import com.google.gson.JsonObject;
6-
import io.javalin.http.ServiceUnavailableResponse;
76
import net.earthmc.emcapi.EMCAPI;
87
import net.earthmc.emcapi.object.endpoint.GetEndpoint;
98
import net.earthmc.mysterymaster.api.MysteryMasterAPI;
@@ -15,7 +14,6 @@
1514
public class MysteryMasterEndpoint extends GetEndpoint {
1615

1716
private MysteryMasterAPI api = null;
18-
private final ServiceUnavailableResponse UNAVAILABLE = new ServiceUnavailableResponse("Mystery Master details are not available currently");
1917

2018
public MysteryMasterEndpoint(final EMCAPI plugin) {
2119
try {
@@ -27,7 +25,6 @@ public MysteryMasterEndpoint(final EMCAPI plugin) {
2725

2826
@Override
2927
public String lookup() {
30-
if (api == null) throw UNAVAILABLE;
3128
return getJsonElement().toString();
3229
}
3330

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

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
package net.earthmc.emcapi.endpoint;
22

3-
import au.lupine.quarters.api.manager.QuarterManager;
43
import com.google.gson.JsonObject;
54
import com.palmergames.bukkit.towny.TownyAPI;
65
import com.palmergames.bukkit.towny.TownySettings;
7-
import io.minimum.minecraft.superbvote.SuperbVote;
8-
import io.minimum.minecraft.superbvote.votes.VoteParty;
96
import net.earthmc.emcapi.EMCAPI;
7+
import net.earthmc.emcapi.integration.QuartersIntegration;
8+
import net.earthmc.emcapi.integration.SuperbVoteIntegration;
109
import net.earthmc.emcapi.object.endpoint.GetEndpoint;
1110
import net.earthmc.emcapi.util.EndpointUtils;
12-
import au.lupine.quarters.object.entity.Quarter;
1311
import org.bukkit.Bukkit;
1412
import org.bukkit.World;
1513

1614
import java.time.LocalTime;
17-
import java.util.List;
1815
import java.util.concurrent.TimeUnit;
1916

2017
public class ServerEndpoint extends GetEndpoint {
@@ -27,11 +24,13 @@ public class ServerEndpoint extends GetEndpoint {
2724
public ServerEndpoint(final EMCAPI plugin) {
2825
this.plugin = plugin;
2926

27+
final QuartersIntegration quartersIntegration = plugin.integrations().quartersIntegration();
28+
3029
plugin.getServer().getAsyncScheduler().runAtFixedRate(plugin, task -> {
31-
List<Quarter> quarters = QuarterManager.getInstance().getAllQuarters();
30+
final QuartersIntegration.QuarterStatistics statistics = quartersIntegration.retrieveQuarterStatistics();
3231

33-
this.quartersCount = quarters.size();
34-
this.cuboidsCount = quarters.stream().mapToInt(quarter -> quarter.getCuboids().size()).sum();
32+
this.quartersCount = statistics.totalQuarters();
33+
this.cuboidsCount = statistics.totalCuboids();
3534
}, 0L, 1L, TimeUnit.HOURS);
3635
}
3736

@@ -77,9 +76,17 @@ public JsonObject getJsonElement() {
7776

7877
serverObject.add("stats", statsObject);
7978

80-
VoteParty voteParty = SuperbVote.getPlugin().getVoteParty();
81-
int target = voteParty.votesNeeded();
82-
int currentVotes = voteParty.getCurrentVotes();
79+
int target;
80+
int currentVotes;
81+
82+
final SuperbVoteIntegration superbVote = plugin.integrations().superbVoteIntegration();
83+
if (superbVote.isEnabled()) {
84+
target = superbVote.votesNeeded();
85+
currentVotes = superbVote.currentVotes();
86+
} else {
87+
target = 0;
88+
currentVotes = 0;
89+
}
8390

8491
JsonObject votePartyObject = new JsonObject();
8592
votePartyObject.addProperty("target", target);
@@ -88,4 +95,4 @@ public JsonObject getJsonElement() {
8895

8996
return serverObject;
9097
}
91-
}
98+
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.earthmc.emcapi.endpoint.towny;
22

3-
import au.lupine.quarters.api.manager.QuarterManager;
43
import com.google.gson.JsonArray;
54
import com.google.gson.JsonElement;
65
import com.google.gson.JsonObject;
@@ -10,6 +9,8 @@
109
import com.palmergames.bukkit.towny.object.TownBlock;
1110
import com.palmergames.bukkit.towny.permissions.TownyPerms;
1211
import io.javalin.http.BadRequestResponse;
12+
import net.earthmc.emcapi.EMCAPI;
13+
import net.earthmc.emcapi.integration.QuartersIntegration;
1314
import net.earthmc.emcapi.manager.TownMetadataManager;
1415
import net.earthmc.emcapi.object.endpoint.PostEndpoint;
1516
import net.earthmc.emcapi.util.EndpointUtils;
@@ -18,6 +19,11 @@
1819
import java.util.UUID;
1920

2021
public class TownsEndpoint extends PostEndpoint<Town> {
22+
private final EMCAPI plugin;
23+
24+
public TownsEndpoint(EMCAPI plugin) {
25+
this.plugin = plugin;
26+
}
2127

2228
@Override
2329
public Town getObjectOrNull(JsonElement element) {
@@ -102,7 +108,8 @@ public JsonElement getJsonElement(Town town) {
102108
townObject.add("trusted", EndpointUtils.getResidentArray(town.getTrustedResidents().stream().toList()));
103109
townObject.add("outlaws", EndpointUtils.getResidentArray(town.getOutlaws().stream().toList()));
104110

105-
JsonArray quartersArray = EndpointUtils.getQuarterArray(QuarterManager.getInstance().getQuarters(town));
111+
final QuartersIntegration quartersIntegration = plugin.integrations().quartersIntegration();
112+
JsonArray quartersArray = quartersIntegration.isEnabled() ? quartersIntegration.getQuartersArrayForTown(town) : new JsonArray();
106113
townObject.add("quarters", quartersArray);
107114

108115
JsonObject ranksObject = new JsonObject();
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package net.earthmc.emcapi.endpoint.towny.list;
22

3-
import au.lupine.quarters.api.manager.QuarterManager;
43
import com.google.gson.JsonArray;
4+
import net.earthmc.emcapi.integration.QuartersIntegration;
55
import net.earthmc.emcapi.object.endpoint.GetEndpoint;
6-
import net.earthmc.emcapi.util.EndpointUtils;
76

87
public class QuartersListEndpoint extends GetEndpoint {
8+
private final QuartersIntegration quartersIntegration;
9+
10+
public QuartersListEndpoint(QuartersIntegration quartersIntegration) {
11+
this.quartersIntegration = quartersIntegration;
12+
}
913

1014
@Override
1115
public String lookup() {
@@ -14,6 +18,6 @@ public String lookup() {
1418

1519
@Override
1620
public JsonArray getJsonElement() {
17-
return EndpointUtils.getQuarterArray(QuarterManager.getInstance().getAllQuarters());
21+
return quartersIntegration.getAllQuartersArray();
1822
}
1923
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.earthmc.emcapi.integration;
2+
3+
public class DiscordIntegration extends Integration {
4+
public DiscordIntegration() {
5+
super("DiscordSRV");
6+
}
7+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package net.earthmc.emcapi.integration;
2+
3+
import net.earthmc.emcapi.util.HttpExceptions;
4+
5+
/**
6+
* Represents an integration with another plugin.
7+
*/
8+
public abstract class Integration {
9+
private final String name;
10+
private boolean enabled;
11+
12+
protected Integration(final String name) {
13+
this.name = name;
14+
}
15+
16+
/**
17+
* {@return the name of the plugin that this is integrating with}
18+
*/
19+
public String name() {
20+
return this.name;
21+
}
22+
23+
/**
24+
* {@return whether the plugin for this integration is currently enabled}
25+
*/
26+
public boolean isEnabled() {
27+
return this.enabled;
28+
}
29+
30+
public void setEnabled(boolean enabled) {
31+
this.enabled = enabled;
32+
}
33+
34+
public void throwIfDisabled() {
35+
if (!this.enabled) {
36+
throw HttpExceptions.MISSING_PLUGIN;
37+
}
38+
}
39+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package net.earthmc.emcapi.integration;
2+
3+
import net.earthmc.emcapi.EMCAPI;
4+
import org.bukkit.event.EventHandler;
5+
import org.bukkit.event.Listener;
6+
import org.bukkit.event.server.PluginDisableEvent;
7+
import org.bukkit.event.server.PluginEnableEvent;
8+
9+
import java.util.Map;
10+
import java.util.concurrent.ConcurrentHashMap;
11+
12+
public class Integrations implements Listener {
13+
private final EMCAPI plugin;
14+
15+
private final Map<String, Integration> integrations = new ConcurrentHashMap<>();
16+
private final DiscordIntegration discordIntegration;
17+
private final QuartersIntegration quartersIntegration;
18+
private final SuperbVoteIntegration superbVoteIntegration;
19+
private final MysteryMasterIntegration mysteryMasterIntegration;
20+
21+
public Integrations(final EMCAPI plugin) {
22+
this.plugin = plugin;
23+
24+
this.discordIntegration = addIntegration(new DiscordIntegration());
25+
this.quartersIntegration = addIntegration(new QuartersIntegration());
26+
this.superbVoteIntegration = addIntegration(new SuperbVoteIntegration());
27+
this.mysteryMasterIntegration = addIntegration(new MysteryMasterIntegration());
28+
}
29+
30+
private <T extends Integration> T addIntegration(final T integration) {
31+
integrations.put(integration.name(), integration);
32+
33+
integration.setEnabled(plugin.getServer().getPluginManager().isPluginEnabled(integration.name()));
34+
return integration;
35+
}
36+
37+
public DiscordIntegration discordIntegration() {
38+
return this.discordIntegration;
39+
}
40+
41+
public QuartersIntegration quartersIntegration() {
42+
return this.quartersIntegration;
43+
}
44+
45+
public SuperbVoteIntegration superbVoteIntegration() {
46+
return this.superbVoteIntegration;
47+
}
48+
49+
public MysteryMasterIntegration mysteryMasterIntegration() {
50+
return this.mysteryMasterIntegration;
51+
}
52+
53+
@EventHandler
54+
public void onPluginEnable(final PluginEnableEvent event) {
55+
final Integration integration = integrations.get(event.getPlugin().getName());
56+
if (integration != null) {
57+
integration.setEnabled(true);
58+
}
59+
}
60+
61+
@EventHandler
62+
public void onPluginDisable(final PluginDisableEvent event) {
63+
final Integration integration = integrations.get(event.getPlugin().getName());
64+
if (integration != null) {
65+
integration.setEnabled(false);
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)