Add support for per issuer locale in Sponge and BungeeCord (#104)

* Add support for per issuer locale in Sponge and BungeeCord

* Added Optional<UUID> getUniqueId to CommandIssuer
* Added update task and delayed join listener in BungeeCord
* Added settings change listener in Sponge
* Moved setLocale method up to the CommandManager to remove the
amount of duplicated code

* Remove Optional usage

* Remove player terminology in core
This commit is contained in:
games647
2018-02-28 23:53:27 +01:00
committed by Daniel Ennis
parent c3ee9d4f20
commit edf7ecc020
12 changed files with 179 additions and 29 deletions
@@ -0,0 +1,37 @@
package co.aikar.commands;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler;
import java.util.concurrent.TimeUnit;
public class ACFBungeeListener implements Listener {
private final BungeeCommandManager manager;
private final Plugin plugin;
public ACFBungeeListener(BungeeCommandManager manager, Plugin plugin) {
this.manager = manager;
this.plugin = plugin;
}
@EventHandler
public void onPlayerJoin(PostLoginEvent loginEvent) {
ProxiedPlayer player = loginEvent.getPlayer();
//the client settings are sent after a successful login
Runnable task = () -> manager.readLocale(player);
plugin.getProxy().getScheduler().schedule(plugin, task, 1, TimeUnit.SECONDS);
}
@EventHandler
public void onDisconnect(PlayerDisconnectEvent disconnectEvent) {
//cleanup
ProxiedPlayer player = disconnectEvent.getPlayer();
manager.issuersLocale.remove(player.getUniqueId());
}
}
@@ -25,8 +25,11 @@ package co.aikar.commands;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import org.jetbrains.annotations.NotNull;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.UUID;
public class BungeeCommandIssuer implements CommandIssuer {
private final BungeeCommandManager manager;
@@ -57,6 +60,16 @@ public class BungeeCommandIssuer implements CommandIssuer {
return sender instanceof ProxiedPlayer;
}
@Override
public @NotNull UUID getUniqueId() {
if (isPlayer()) {
return ((ProxiedPlayer) sender).getUniqueId();
}
//generate a unique id based of the name (like for the console command sender)
return UUID.nameUUIDFromBytes(sender.getName().getBytes(StandardCharsets.UTF_8));
}
@Override
public void sendMessageInternal(String message) {
sender.sendMessage(ACFBungeeUtil.color(message));
@@ -26,13 +26,17 @@ package co.aikar.commands;
import co.aikar.commands.apachecommonslang.ApacheCommonsExceptionUtil;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Plugin;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -57,8 +61,16 @@ public class BungeeCommandManager extends CommandManager<
this.formatters.put(MessageType.SYNTAX, new BungeeMessageFormatter(ChatColor.YELLOW, ChatColor.GREEN, ChatColor.WHITE));
this.formatters.put(MessageType.INFO, new BungeeMessageFormatter(ChatColor.BLUE, ChatColor.DARK_GREEN, ChatColor.GREEN));
this.formatters.put(MessageType.HELP, new BungeeMessageFormatter(ChatColor.AQUA, ChatColor.GREEN, ChatColor.YELLOW));
getLocales(); // auto load locales
plugin.getProxy().getPluginManager().registerListener(plugin, new ACFBungeeListener(this, plugin));
//BungeeCord has no event for listening for client setting changes
plugin.getProxy().getScheduler().schedule(plugin, () -> {
ProxyServer.getInstance().getPlayers().forEach(this::readLocale);
}, 5, 5, TimeUnit.SECONDS);
// TODO more default dependencies for bungee
registerDependency(plugin.getClass(), plugin);
registerDependency(Plugin.class, plugin);
@@ -93,6 +105,17 @@ public class BungeeCommandManager extends CommandManager<
return locales;
}
public void readLocale(ProxiedPlayer player) {
if (!player.isConnected()) {
return;
}
//This can be null if we didn't received a settings packet
Locale locale = player.getLocale();
if (locale != null) {
setIssuerLocale(player, player.getLocale());
}
}
@Override
public void registerCommand(BaseCommand command) {