Skip to content

Commit acbb438

Browse files
committed
feat: Introduce UserLocaleProvider implementation for Spigot, Velocity, and Standalone platforms
1 parent 9ea8e9c commit acbb438

5 files changed

Lines changed: 132 additions & 10 deletions

File tree

platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibPlatform.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,17 @@
55
import io.github.retrooper.packetevents.bstats.charts.SimplePie;
66
import me.tofaa.entitylib.APIConfig;
77
import me.tofaa.entitylib.EntityLib;
8+
import me.tofaa.entitylib.UserLocaleProvider;
89
import me.tofaa.entitylib.common.AbstractPlatform;
9-
import me.tofaa.entitylib.utils.ConcurrentWeakIdentityHashMap;
10-
import org.bukkit.Bukkit;
11-
import org.bukkit.World;
12-
import org.bukkit.entity.Entity;
10+
import java.util.logging.Logger;
1311
import org.bukkit.plugin.Plugin;
1412
import org.bukkit.plugin.java.JavaPlugin;
1513
import org.jetbrains.annotations.NotNull;
16-
import org.jetbrains.annotations.Nullable;
17-
18-
import java.util.Map;
19-
import java.util.logging.Logger;
20-
import java.util.stream.Stream;
2114

2215
public class SpigotEntityLibPlatform extends AbstractPlatform<JavaPlugin> {
2316

2417
private SpigotEntityLibAPI api;
18+
private UserLocaleProvider userLocaleProvider = new SpigotPlayerLocaleProvider();
2519

2620
public SpigotEntityLibPlatform(@NotNull JavaPlugin plugin) {
2721
super(plugin);
@@ -36,7 +30,7 @@ public void setupApi(@NotNull APIConfig settings) {
3630
this.api.onLoad();
3731
this.api.onEnable();
3832
if (settings.shouldUseBstats()) {
39-
PacketEventsAPI<Plugin> pe = (PacketEventsAPI<Plugin>)api.getPacketEvents();
33+
PacketEventsAPI<Plugin> pe = (PacketEventsAPI<Plugin>) api.getPacketEvents();
4034
Metrics metrics = new Metrics(pe.getPlugin(), 21916);
4135
metrics.addCustomChart(new SimplePie("entitylib-version", () -> EntityLib.getVersion().toString()));
4236
}
@@ -52,4 +46,14 @@ public SpigotEntityLibAPI getAPI() {
5246
public String getName() {
5347
return "Spigot";
5448
}
49+
50+
@Override
51+
public @NotNull UserLocaleProvider getUserLocaleProvider() {
52+
return userLocaleProvider;
53+
}
54+
55+
@Override
56+
public void setUserLocaleProvider(@NotNull final UserLocaleProvider provider) {
57+
this.userLocaleProvider = provider;
58+
}
5559
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package me.tofaa.entitylib.spigot;
2+
3+
import me.tofaa.entitylib.UserLocaleProvider;
4+
import java.lang.invoke.MethodHandle;
5+
import java.lang.invoke.MethodHandles;
6+
import java.lang.invoke.MethodType;
7+
import java.util.Locale;
8+
import java.util.UUID;
9+
import java.util.function.Function;
10+
import net.kyori.adventure.translation.Translator;
11+
import org.bukkit.Bukkit;
12+
import org.bukkit.entity.Player;
13+
import org.jetbrains.annotations.NotNull;
14+
15+
16+
/**
17+
* This implementation is based on code from the scoreboard-library project:
18+
* <a href="https://github.com/MegavexNetwork/scoreboard-library/blob/bc8e3c2d2ecf9973ec0d6bb8ae4af94ed008b360/commons/src/main/java/net/megavex/scoreboardlibrary/implementation/commons/LocaleProvider.java">LocaleProvider</a>
19+
* Modified and adapted for use in EntityLib.
20+
*/
21+
public class SpigotPlayerLocaleProvider implements UserLocaleProvider {
22+
private static final Locale DEFAULT_LOCALE = Locale.US;
23+
private static final Function<Player, Locale> provider = get();
24+
25+
@Override
26+
public Locale locale(final UUID user) {
27+
final Player player = Bukkit.getPlayer(user);
28+
return player == null ? DEFAULT_LOCALE : provider.apply(player);
29+
}
30+
31+
private static @NotNull Function<Player, Locale> get() {
32+
MethodHandles.Lookup lookup = MethodHandles.publicLookup();
33+
try {
34+
MethodHandle adventureMethod = lookup.findVirtual(Player.class, "locale", MethodType.methodType(Locale.class));
35+
return player -> {
36+
try {
37+
return (Locale) adventureMethod.invokeExact(player);
38+
} catch (Throwable e) {
39+
throw new RuntimeException(e);
40+
}
41+
};
42+
} catch (IllegalAccessException | NoSuchMethodException ignored) {
43+
}
44+
45+
MethodType methodType = MethodType.methodType(String.class);
46+
try {
47+
MethodHandle legacySpigotMethod = lookup.findVirtual(Player.Spigot.class, "getLocale", methodType);
48+
return player -> {
49+
try {
50+
Locale locale = Translator.parseLocale((String) legacySpigotMethod.invokeExact(player.spigot()));
51+
return locale == null ? DEFAULT_LOCALE : locale;
52+
} catch (Throwable e) {
53+
throw new RuntimeException(e);
54+
}
55+
};
56+
} catch (IllegalAccessException | NoSuchMethodException ignored) {
57+
}
58+
59+
try {
60+
MethodHandle legacyMethod = lookup.findVirtual(Player.class, "getLocale", methodType);
61+
return player -> {
62+
try {
63+
Locale locale = Translator.parseLocale((String) legacyMethod.invokeExact(player));
64+
return locale == null ? DEFAULT_LOCALE : locale;
65+
} catch (Throwable e) {
66+
throw new RuntimeException(e);
67+
}
68+
};
69+
} catch (IllegalAccessException | NoSuchMethodException ignored) {
70+
throw new RuntimeException("No way to get players locale found");
71+
}
72+
}
73+
}

platforms/standalone/src/main/java/me/tofaa/entitylib/standalone/StandaloneEntityLibPlatform.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import me.tofaa.entitylib.APIConfig;
44
import me.tofaa.entitylib.EntityLibAPI;
5+
import me.tofaa.entitylib.UserLocaleProvider;
56
import me.tofaa.entitylib.common.AbstractPlatform;
7+
import java.util.Locale;
68
import org.jetbrains.annotations.NotNull;
79

810
public class StandaloneEntityLibPlatform extends AbstractPlatform<Object> {
911

1012

1113
private StandaloneEntityLibApi api;
14+
private UserLocaleProvider userLocaleProvider = (user) -> Locale.US;
1215

1316
public StandaloneEntityLibPlatform() {
1417
super(null);
@@ -34,4 +37,14 @@ public EntityLibAPI<?> getAPI() {
3437
public String getName() {
3538
return "Standalone";
3639
}
40+
41+
@Override
42+
public @NotNull UserLocaleProvider getUserLocaleProvider() {
43+
return userLocaleProvider;
44+
}
45+
46+
@Override
47+
public void setUserLocaleProvider(@NotNull final UserLocaleProvider provider) {
48+
this.userLocaleProvider = provider;
49+
}
3750
}

platforms/velocity/src/main/java/me/tofaa/entitylib/velocity/VelocityEntityLibPlatform.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
import io.github.retrooper.packetevents.velocity.factory.VelocityPacketEventsBuilder;
1010
import me.tofaa.entitylib.APIConfig;
1111
import me.tofaa.entitylib.EntityLibAPI;
12+
import me.tofaa.entitylib.UserLocaleProvider;
1213
import me.tofaa.entitylib.common.AbstractPlatform;
1314
import org.jetbrains.annotations.NotNull;
1415

1516
import java.util.logging.Logger;
1617

1718
public class VelocityEntityLibPlatform extends AbstractPlatform<ProxyServer> {
1819
private VelocityEntityLibAPI api;
20+
private UserLocaleProvider userLocaleProvider;
1921
private Object plugin;
2022

2123
public VelocityEntityLibPlatform(Object plugin, ProxyServer handle) {
@@ -54,4 +56,14 @@ public EntityLibAPI<?> getAPI() {
5456
public String getName() {
5557
return "Velocity";
5658
}
59+
60+
@Override
61+
public @NotNull UserLocaleProvider getUserLocaleProvider() {
62+
return userLocaleProvider;
63+
}
64+
65+
@Override
66+
public void setUserLocaleProvider(final UserLocaleProvider userLocaleProvider) {
67+
this.userLocaleProvider = userLocaleProvider;
68+
}
5769
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package me.tofaa.entitylib.velocity;
2+
3+
import com.velocitypowered.api.proxy.Player;
4+
import com.velocitypowered.api.proxy.ProxyServer;
5+
import me.tofaa.entitylib.UserLocaleProvider;
6+
import java.util.Locale;
7+
import java.util.UUID;
8+
9+
public class VelocityPlayerLocaleProvider implements UserLocaleProvider {
10+
private final ProxyServer proxyServer;
11+
12+
public VelocityPlayerLocaleProvider(final ProxyServer proxyServer) {
13+
this.proxyServer = proxyServer;
14+
}
15+
16+
@Override
17+
public Locale locale(final UUID user) {
18+
return proxyServer.getPlayer(user).map(Player::getEffectiveLocale).orElse(Locale.US);
19+
}
20+
}

0 commit comments

Comments
 (0)