Skip to content

Commit 921efdd

Browse files
committed
Fix discord queries
1 parent 8ab545a commit 921efdd

2 files changed

Lines changed: 66 additions & 19 deletions

File tree

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

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import com.palmergames.bukkit.towny.TownyAPI;
77
import com.palmergames.bukkit.towny.TownyEconomyHandler;
88
import com.palmergames.bukkit.towny.object.Resident;
9-
import github.scarsz.discordsrv.DiscordSRV;
109
import io.javalin.http.BadRequestResponse;
1110
import net.earthmc.emcapi.EMCAPI;
11+
import net.earthmc.emcapi.integration.DiscordIntegration;
1212
import net.earthmc.emcapi.integration.Integrations;
1313
import net.earthmc.emcapi.manager.KeyManager;
1414
import net.earthmc.emcapi.object.endpoint.PostEndpoint;
@@ -22,6 +22,7 @@
2222

2323
public class PlayersEndpoint extends PostEndpoint<Resident> {
2424
private static final Pattern DISCORD_ID_PATTERN = Pattern.compile("^\\d{17,19}$");
25+
private final DiscordIntegration integration = Integrations.getIntegration("DiscordSRV");
2526

2627
public PlayersEndpoint(final EMCAPI plugin) {
2728
super(plugin);
@@ -39,7 +40,7 @@ public Resident getObjectOrNull(JsonElement element, @Nullable String key) {
3940
resident = TownyAPI.getInstance().getResident(string);
4041
}
4142
if (resident == null && DISCORD_ID_PATTERN.matcher(string).find()) {
42-
UUID uuid = getUUIDFromDiscordId(string);
43+
UUID uuid = integration.getUUID(string);
4344
if (uuid != null) {
4445
resident = TownyAPI.getInstance().getResident(uuid);
4546
}
@@ -95,7 +96,7 @@ public JsonElement getJsonElement(Resident resident, @Nullable String key) {
9596

9697
playerObject.add("friends", EndpointUtils.getResidentArray(resident.getFriends()));
9798

98-
playerObject.addProperty("discord", getDiscordId(resident.getUUID()));
99+
playerObject.addProperty("discord", integration.getDiscord(resident.getUUID()));
99100

100101
return playerObject;
101102
}
@@ -109,20 +110,4 @@ private JsonArray getRankArray(List<String> ranks) {
109110

110111
return jsonArray;
111112
}
112-
113-
private String getDiscordId(UUID uuid) {
114-
if (!Integrations.getIntegration("DiscordSRV").isEnabled() || DiscordSRV.getPlugin().getAccountLinkManager() == null) {
115-
return null;
116-
}
117-
118-
return DiscordSRV.getPlugin().getAccountLinkManager().getDiscordId(uuid);
119-
}
120-
121-
private UUID getUUIDFromDiscordId(String discordId) {
122-
if (!Integrations.getIntegration("DiscordSRV").isEnabled() || !DISCORD_ID_PATTERN.matcher(discordId).find() || DiscordSRV.getPlugin().getAccountLinkManager() == null) {
123-
return null;
124-
}
125-
126-
return DiscordSRV.getPlugin().getAccountLinkManager().getUuid(discordId);
127-
}
128113
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,69 @@
11
package net.earthmc.emcapi.integration;
22

3+
import com.palmergames.bukkit.towny.TownyAPI;
4+
import com.palmergames.bukkit.towny.object.Resident;
5+
import github.scarsz.discordsrv.DiscordSRV;
6+
import github.scarsz.discordsrv.api.ListenerPriority;
7+
import github.scarsz.discordsrv.api.Subscribe;
8+
import github.scarsz.discordsrv.api.events.AccountLinkedEvent;
9+
import github.scarsz.discordsrv.api.events.AccountUnlinkedEvent;
10+
import org.bukkit.OfflinePlayer;
11+
12+
import java.util.Map;
13+
import java.util.Set;
14+
import java.util.UUID;
15+
import java.util.concurrent.ConcurrentHashMap;
16+
import java.util.concurrent.TimeUnit;
17+
import java.util.stream.Collectors;
18+
319
public class DiscordIntegration extends Integration {
20+
private static final Map<UUID, String> UUID_TO_DISCORD = new ConcurrentHashMap<>();
21+
private static final Map<String, UUID> DISCORD_TO_UUID = new ConcurrentHashMap<>();
22+
423
public DiscordIntegration() {
524
super("DiscordSRV");
625
}
26+
27+
@Override
28+
public void register() {
29+
super.register();
30+
if (isEnabled()) {
31+
plugin.getServer().getAsyncScheduler().runDelayed(plugin, t -> {
32+
Set<UUID> uuids = TownyAPI.getInstance().getResidents().stream().filter(res -> !res.isNPC()).map(Resident::getUUID).collect(Collectors.toSet());
33+
34+
Map<UUID, String> result = DiscordSRV.getPlugin().getAccountLinkManager().getManyDiscordIds(uuids);
35+
UUID_TO_DISCORD.putAll(result);
36+
37+
for (Map.Entry<UUID, String> entry : result.entrySet()) {
38+
DISCORD_TO_UUID.put(entry.getValue(), entry.getKey());
39+
}
40+
}, 30, TimeUnit.SECONDS);
41+
}
42+
}
43+
44+
public UUID getUUID(String discordId) {
45+
return DISCORD_TO_UUID.get(discordId);
46+
}
47+
48+
public String getDiscord(UUID uuid) {
49+
return UUID_TO_DISCORD.get(uuid);
50+
}
51+
52+
@Subscribe(priority = ListenerPriority.MONITOR)
53+
public void onDiscordLink(AccountLinkedEvent event) {
54+
OfflinePlayer player = event.getPlayer();
55+
String discordId = event.getUser().getId();
56+
57+
UUID_TO_DISCORD.put(player.getUniqueId(), discordId);
58+
DISCORD_TO_UUID.put(discordId, player.getUniqueId());
59+
}
60+
61+
@Subscribe(priority = ListenerPriority.MONITOR)
62+
public void onDiscordUnlink(AccountUnlinkedEvent event) {
63+
OfflinePlayer player = event.getPlayer();
64+
String discordId = event.getDiscordId();
65+
66+
UUID_TO_DISCORD.remove(player.getUniqueId());
67+
DISCORD_TO_UUID.remove(discordId);
68+
}
769
}

0 commit comments

Comments
 (0)