diff --git a/bukkit/src/main/java/co/aikar/commands/ACFBukkitUtil.java b/bukkit/src/main/java/co/aikar/commands/ACFBukkitUtil.java index ff643718..e4890d48 100644 --- a/bukkit/src/main/java/co/aikar/commands/ACFBukkitUtil.java +++ b/bukkit/src/main/java/co/aikar/commands/ACFBukkitUtil.java @@ -23,7 +23,6 @@ package co.aikar.commands; -import co.aikar.locales.MessageKey; import com.google.common.collect.Iterables; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -41,6 +40,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Collectors; public class ACFBukkitUtil { @@ -61,12 +61,11 @@ public class ACFBukkitUtil { return ChatColor.translateAlternateColorCodes('&', message); } - public static void sendMsg(CommandIssuer issuer, MessageKey key, String... replacements) { - sendMsg(issuer, MessageType.INFO, key, replacements); - } - public static void sendMsg(CommandIssuer issuer, MessageType type, MessageKey key, String... replacements) { - issuer.sendMessage(type, key, replacements); - } + /** + * Move to Message Keys on the CommandIssuer + * @deprecated + */ + @Deprecated public static void sendMsg(CommandSender player, String message) { message = color(message); for (String msg : ACFPatterns.NEWLINE.split(message)) { @@ -241,17 +240,14 @@ public class ACFBukkitUtil { /** * Please move to the CommandIssuer version - * @param requester - * @param origName * @deprecated - * @return */ @Deprecated - public static Player findPlayerSmart(CommandSender requester, String origName) { - if (origName == null) { + public static Player findPlayerSmart(CommandSender requester, String search) { + if (search == null) { return null; } - String name = ACFUtil.replace(origName, ":confirm", ""); + String name = ACFUtil.replace(search, ":confirm", ""); if (name.length() < 3) { requester.sendMessage("§cUsername too short, must be at least three characters"); return null; @@ -265,20 +261,7 @@ public class ACFBukkitUtil { List confirmList = new ArrayList<>(); // Remove confirmList players from smart matching. - Iterator iter = matches.iterator(); - while (iter.hasNext()) { - Player player = iter.next(); - if (requester instanceof Player && !((Player) requester).canSee(player)) { - if (requester.hasPermission("acf.seevanish")) { - if (!origName.endsWith(":confirm")) { - confirmList.add(player); - iter.remove(); - } - } else { - iter.remove(); - } - } - } + findMatches(search, requester, matches, confirmList); if (matches.size() > 1 || confirmList.size() > 1) { requester.sendMessage("§cMultiple players matched '" + name + "', please be more specific"); @@ -301,12 +284,12 @@ public class ACFBukkitUtil { return matches.get(0); } - public static Player findPlayerSmart(CommandIssuer issuer, String origName) { + public static Player findPlayerSmart(CommandIssuer issuer, String search) { CommandSender requester = issuer.getIssuer(); - if (origName == null) { + if (search == null) { return null; } - String name = ACFUtil.replace(origName, ":confirm", ""); + String name = ACFUtil.replace(search, ":confirm", ""); if (name.length() < 3) { issuer.sendError(BukkitMessageKeys.USERNAME_TOO_SHORT); return null; @@ -318,14 +301,39 @@ public class ACFBukkitUtil { List matches = Bukkit.getServer().matchPlayer(name); List confirmList = new ArrayList<>(); + findMatches(search, requester, matches, confirmList); - // Remove confirmList players from smart matching. + + if (matches.size() > 1 || confirmList.size() > 1) { + String allMatches = matches.stream().map(Player::getName).collect(Collectors.joining(", ")); + issuer.sendError(BukkitMessageKeys.MULTIPLE_PLAYERS_MATCH, + "{search}", name, "{all}", allMatches); + return null; + } + + if (matches.isEmpty()) { + if (confirmList.isEmpty()) { + issuer.sendError(BukkitMessageKeys.NO_PLAYER_FOUND_SERVER, + "{search}", name); + return null; + } else { + Player player = Iterables.getOnlyElement(confirmList); + issuer.sendInfo(BukkitMessageKeys.PLAYER_IS_VANISHED_CONFIRM, "{vanished}", player.getName()); + return null; + } + } + + return matches.get(0); + } + + private static void findMatches(String search, CommandSender requester, List matches, List confirmList) { + // Remove vanished players from smart matching. Iterator iter = matches.iterator(); while (iter.hasNext()) { Player player = iter.next(); if (requester instanceof Player && !((Player) requester).canSee(player)) { if (requester.hasPermission("acf.seevanish")) { - if (!origName.endsWith(":confirm")) { + if (!search.endsWith(":confirm")) { confirmList.add(player); iter.remove(); } @@ -334,24 +342,6 @@ public class ACFBukkitUtil { } } } - - if (matches.size() > 1 || confirmList.size() > 1) { - requester.sendMessage("§cMultiple players matched '" + name + "', please be more specific"); - return null; - } - - if (matches.isEmpty()) { - if (confirmList.isEmpty()) { - requester.sendMessage("§cNo player matching '" + name + "' is connected to this server"); - return null; - } else { - Player player = Iterables.getOnlyElement(confirmList); - issuer.sendMessage(MessageType.INFO, BukkitMessageKeys.PLAYER_IS_VANISHED_CONFIRM, "{vanished}", player.getName()); - return null; - } - } - - return matches.get(0); } diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java b/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java index a0491973..aa7def37 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java @@ -49,8 +49,8 @@ public class BukkitCommandContexts extends CommandContexts getOnlinePlayer(c.getIssuer(), c.popFirstArg(), c.hasAnnotation(Optional.class))); registerContext(OnlinePlayer[].class, (c) -> { - CommandSender sender = c.getSender(); - final String input = c.popFirstArg(); + BukkitCommandIssuer issuer = c.getIssuer(); + final String search = c.popFirstArg(); boolean allowMissing = c.hasFlag("allowmissing"); Set players = new HashSet<>(); Pattern split = ACFPatterns.COMMA; @@ -58,14 +58,16 @@ public class BukkitCommandContexts extends CommandContexts ChatColor.YELLOW + ACFUtil.simplifyString(color.name())) - .collect(Collectors.joining(", ")); + .map(color -> "" + ACFUtil.simplifyString(color.name()) + "") + .collect(Collectors.joining(", ")); throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF, "{valid}", valid); } diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitMessageKeys.java b/bukkit/src/main/java/co/aikar/commands/BukkitMessageKeys.java index 63a39976..ba50da3b 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitMessageKeys.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitMessageKeys.java @@ -28,7 +28,13 @@ import co.aikar.locales.MessageKey; public enum BukkitMessageKeys implements MessageKeyProvider { INVALID_WORLD, YOU_MUST_BE_HOLDING_ITEM, - PLAYER_IS_VANISHED_CONFIRM, USERNAME_TOO_SHORT, IS_NOT_A_VALID_NAME; + PLAYER_IS_VANISHED_CONFIRM, + USERNAME_TOO_SHORT, + IS_NOT_A_VALID_NAME, + MULTIPLE_PLAYERS_MATCH, + NO_PLAYER_FOUND_SERVER, + NO_PLAYER_FOUND + ; private final MessageKey key = MessageKey.of(this.name().toLowerCase()); public MessageKey getMessageKey() { diff --git a/bungee/src/main/java/co/aikar/commands/ACFBungeeUtil.java b/bungee/src/main/java/co/aikar/commands/ACFBungeeUtil.java index 096edca5..2cb78f96 100644 --- a/bungee/src/main/java/co/aikar/commands/ACFBungeeUtil.java +++ b/bungee/src/main/java/co/aikar/commands/ACFBungeeUtil.java @@ -32,6 +32,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; +import java.util.stream.Collectors; public class ACFBungeeUtil { @@ -39,12 +40,11 @@ public class ACFBungeeUtil { return ChatColor.translateAlternateColorCodes('&', message); } - public static void sendMsg(CommandIssuer issuer, MessageKey key, String... replacements) { - sendMsg(issuer, MessageType.INFO, key, replacements); - } - public static void sendMsg(CommandIssuer issuer, MessageType type, MessageKey key, String... replacements) { - issuer.sendMessage(type, key, replacements); - } + /** + * Move to Message Keys on the CommandIssuer + * @deprecated + */ + @Deprecated public static void sendMsg(CommandSender player, String message) { message = color(message); for (String msg : ACFPatterns.NEWLINE.split(message)) { @@ -110,8 +110,43 @@ public class ACFBungeeUtil { } - public static ProxiedPlayer findPlayerSmart(CommandSender requester, String origName) { - String name = ACFUtil.replace(origName, ":confirm", ""); + public static ProxiedPlayer findPlayerSmart(CommandIssuer issuer, String search) { + CommandSender requester = issuer.getIssuer(); + String name = ACFUtil.replace(search, ":confirm", ""); + if (name.length() < 3) { + issuer.sendError(BungeeMessageKeys.USERNAME_TOO_SHORT); + return null; + } + if (!isValidName(name)) { + issuer.sendError(BungeeMessageKeys.IS_NOT_A_VALID_NAME, "{name}", name); + return null; + } + + List matches = new ArrayList<>(ProxyServer.getInstance().matchPlayer(name)); + + if (matches.size() > 1) { + String allMatches = matches.stream().map(ProxiedPlayer::getName).collect(Collectors.joining(", ")); + issuer.sendError(BungeeMessageKeys.MULTIPLE_PLAYERS_MATCH, + "{search}", name, "{all}", allMatches); + return null; + } + + if (matches.isEmpty()) { + issuer.sendError(BungeeMessageKeys.NO_PLAYER_FOUND_SERVER, + "{search}", name); + return null; + } + + return matches.get(0); + } + + /** + * Please move to the CommandIssuer version + * @deprecated + */ + @Deprecated + public static ProxiedPlayer findPlayerSmart(CommandSender requester, String search) { + String name = ACFUtil.replace(search, ":confirm", ""); if (name.length() < 3) { requester.sendMessage("§cUsername too short, must be at least three characters"); return null; diff --git a/bungee/src/main/java/co/aikar/commands/BungeeCommandContexts.java b/bungee/src/main/java/co/aikar/commands/BungeeCommandContexts.java index 0fb83c17..e230ceeb 100644 --- a/bungee/src/main/java/co/aikar/commands/BungeeCommandContexts.java +++ b/bungee/src/main/java/co/aikar/commands/BungeeCommandContexts.java @@ -58,6 +58,7 @@ public class BungeeCommandContexts extends CommandContexts { String first = c.popFirstArg(); Stream colors = Stream.of(ChatColor.values()); @@ -74,8 +75,8 @@ public class BungeeCommandContexts extends CommandContexts ChatColor.YELLOW + ACFUtil.simplifyString(color.name())) - .collect(Collectors.joining(", ")); + .map(color -> "" + ACFUtil.simplifyString(color.name()) + "") + .collect(Collectors.joining(", ")); throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF, "{valid}", valid); } diff --git a/bungee/src/main/java/co/aikar/commands/BungeeMessageKeys.java b/bungee/src/main/java/co/aikar/commands/BungeeMessageKeys.java new file mode 100644 index 00000000..e5f5a764 --- /dev/null +++ b/bungee/src/main/java/co/aikar/commands/BungeeMessageKeys.java @@ -0,0 +1,17 @@ +package co.aikar.commands; + +import co.aikar.locales.MessageKey; + +public enum BungeeMessageKeys implements MessageKeyProvider { + USERNAME_TOO_SHORT, + IS_NOT_A_VALID_NAME, + MULTIPLE_PLAYERS_MATCH, + NO_PLAYER_FOUND_SERVER, + NO_PLAYER_FOUND + ; + + private final MessageKey key = MessageKey.of(this.name().toLowerCase()); + public MessageKey getMessageKey() { + return key; + } +} diff --git a/languages/minecraft/acf-minecraft_en.properties b/languages/minecraft/acf-minecraft_en.properties index ef7535b4..e74aa595 100644 --- a/languages/minecraft/acf-minecraft_en.properties +++ b/languages/minecraft/acf-minecraft_en.properties @@ -29,4 +29,7 @@ player_is_vanished_confirm = \ Ex: {vanished}:confirm username_too_short = Error: Username too short, must be at least three characters. is_not_a_valid_name = Error: {name} is not a valid username. -multiple_players_matched = Error: Multiple players matched {search}, please be more specific. +multiple_players_matched = Error: Multiple players matched {search} ({all}), please be more specific. +no_player_found_server = No player matching {search} is connected to this server. +no_player_found = No player matching {search} could be found. +