123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- package com.gmail.nossr50.util.commands;
- import com.gmail.nossr50.core.MetadataConstants;
- import com.gmail.nossr50.datatypes.player.McMMOPlayer;
- import com.gmail.nossr50.datatypes.player.PlayerProfile;
- import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
- import com.gmail.nossr50.mcMMO;
- import com.gmail.nossr50.util.Misc;
- import com.gmail.nossr50.util.StringUtils;
- import org.bukkit.OfflinePlayer;
- import org.bukkit.command.CommandSender;
- import org.bukkit.entity.Player;
- import java.util.ArrayList;
- import java.util.List;
- public final class CommandTools {
- private final mcMMO pluginRef;
- public CommandTools(mcMMO pluginRef) {
- this.pluginRef = pluginRef;
- }
- public boolean isChildSkill(CommandSender sender, PrimarySkillType skill) {
- if (skill == null || !pluginRef.getSkillTools().isChildSkill(skill)) {
- return false;
- }
- sender.sendMessage("Child skills are not supported by this command."); // TODO: Localize this
- return true;
- }
- public boolean tooFar(CommandSender sender, Player target, boolean hasPermission) {
- if(!target.isOnline() && !hasPermission) {
- sender.sendMessage(pluginRef.getLocaleManager().getString("Inspect.Offline"));
- return true;
- } else if (pluginRef.getConfigManager().getConfigCommands().isLimitInspectRange()
- && sender instanceof Player
- && !Misc.isNear(((Player) sender).getLocation(), target.getLocation(),
- pluginRef.getConfigManager().getConfigCommands().getInspectCommandMaxDistance())
- && !hasPermission) {
- sender.sendMessage(pluginRef.getLocaleManager().getString("Inspect.TooFar"));
- return true;
- }
- return false;
- }
- public boolean hidden(CommandSender sender, Player target, boolean hasPermission) {
- return sender instanceof Player && !((Player) sender).canSee(target) && !hasPermission;
- }
- public boolean noConsoleUsage(CommandSender sender) {
- if (sender instanceof Player) {
- return false;
- }
- sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.NoConsole"));
- return true;
- }
- /**
- * Checks if there is a valid mcMMOPlayer object.
- *
- * @param sender CommandSender who used the command
- * @param playerName name of the target player
- * @param mcMMOPlayer mcMMOPlayer object of the target player
- * @return true if the player is online and a valid mcMMOPlayer object was found
- */
- public boolean checkPlayerExistence(CommandSender sender, String playerName, McMMOPlayer mcMMOPlayer) {
- if (mcMMOPlayer != null) {
- if (hidden(sender, mcMMOPlayer.getPlayer(), false)) {
- sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.Offline"));
- return false;
- }
- return true;
- }
- PlayerProfile profile = new PlayerProfile(pluginRef, playerName, false);
- if (unloadedProfile(sender, profile)) {
- return false;
- }
- sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.DoesNotExist"));
- return false;
- }
- public boolean unloadedProfile(CommandSender sender, PlayerProfile profile) {
- if (profile.isLoaded()) {
- return false;
- }
- sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.Offline"));
- return true;
- }
- public boolean hasPlayerDataKey(CommandSender sender) {
- if (!(sender instanceof Player)) {
- return false;
- }
- boolean hasPlayerDataKey = ((Player) sender).hasMetadata(MetadataConstants.PLAYER_DATA_METAKEY);
- if (!hasPlayerDataKey) {
- sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.NotLoaded"));
- }
- return hasPlayerDataKey;
- }
- public boolean isLoaded(CommandSender sender, PlayerProfile profile) {
- if (profile.isLoaded()) {
- return true;
- }
- sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.NotLoaded"));
- return false;
- }
- public boolean isInvalidInteger(CommandSender sender, String value) {
- if (StringUtils.isInt(value)) {
- return false;
- }
- sender.sendMessage("That is not a valid integer."); // TODO: Localize
- return true;
- }
- public boolean isInvalidDouble(CommandSender sender, String value) {
- if (StringUtils.isDouble(value)) {
- return false;
- }
- sender.sendMessage("That is not a valid percentage."); // TODO: Localize
- return true;
- }
- public boolean isInvalidSkill(CommandSender sender, String skillName) {
- if (pluginRef.getSkillTools().isSkill(skillName)) {
- return false;
- }
- sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.Skill.Invalid"));
- return true;
- }
- public boolean shouldEnableToggle(String arg) {
- return arg.equalsIgnoreCase("on") || arg.equalsIgnoreCase("true") || arg.equalsIgnoreCase("enabled");
- }
- public boolean shouldDisableToggle(String arg) {
- return arg.equalsIgnoreCase("off") || arg.equalsIgnoreCase("false") || arg.equalsIgnoreCase("disabled");
- }
- /**
- * Print out details on Gathering skills. Only for online players.
- *
- * @param inspect The player to retrieve stats for
- * @param display The sender to display stats to
- */
- public void printGatheringSkills(Player inspect, CommandSender display) {
- printGroupedSkillData(inspect, display, pluginRef.getLocaleManager().getString("Stats.Header.Gathering"), pluginRef.getSkillTools().GATHERING_SKILLS);
- }
- public void printGatheringSkills(Player player) {
- printGatheringSkills(player, player);
- }
- /**
- * Print out details on Combat skills. Only for online players.
- *
- * @param inspect The player to retrieve stats for
- * @param display The sender to display stats to
- */
- public void printCombatSkills(Player inspect, CommandSender display) {
- printGroupedSkillData(inspect, display, pluginRef.getLocaleManager().getString("Stats.Header.Combat"), pluginRef.getSkillTools().COMBAT_SKILLS);
- }
- public void printCombatSkills(Player player) {
- printCombatSkills(player, player);
- }
- /**
- * Print out details on Misc skills. Only for online players.
- *
- * @param inspect The player to retrieve stats for
- * @param display The sender to display stats to
- */
- public void printMiscSkills(Player inspect, CommandSender display) {
- printGroupedSkillData(inspect, display, pluginRef.getLocaleManager().getString("Stats.Header.Misc"), pluginRef.getSkillTools().MISC_SKILLS);
- }
- public void printMiscSkills(Player player) {
- printMiscSkills(player, player);
- }
- public String displaySkill(PlayerProfile profile, PrimarySkillType skill) {
- if (pluginRef.getSkillTools().isChildSkill(skill)) {
- return pluginRef.getLocaleManager().getString("Skills.ChildStats", pluginRef.getLocaleManager().getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill));
- }
- return pluginRef.getLocaleManager().getString("Skills.Stats", pluginRef.getLocaleManager().getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill), profile.getSkillXpLevel(skill), profile.getXpToLevel(skill));
- }
- private void printGroupedSkillData(Player inspect, CommandSender display, String header, List<PrimarySkillType> skillGroup) {
- if (pluginRef.getUserManager().getPlayer(inspect) == null)
- return;
- PlayerProfile profile = pluginRef.getUserManager().getPlayer(inspect).getProfile();
- List<String> displayData = new ArrayList<>();
- displayData.add(header);
- for (PrimarySkillType primarySkillType : skillGroup) {
- if (pluginRef.getSkillTools().doesPlayerHaveSkillPermission(primarySkillType, inspect)) {
- displayData.add(displaySkill(profile, primarySkillType));
- }
- }
- int size = displayData.size();
- if (size > 1) {
- display.sendMessage(displayData.toArray(new String[size]));
- }
- }
- public List<String> getOnlinePlayerNames(CommandSender sender) {
- Player player = sender instanceof Player ? (Player) sender : null;
- List<String> onlinePlayerNames = new ArrayList<>();
- for (Player onlinePlayer : pluginRef.getServer().getOnlinePlayers()) {
- if (player != null && player.canSee(onlinePlayer)) {
- onlinePlayerNames.add(onlinePlayer.getName());
- }
- }
- return onlinePlayerNames;
- }
- /**
- * Get a matched player name if one was found in the database.
- *
- * @param partialName Name to match
- * @return Matched name or {@code partialName} if no match was found
- */
- public String getMatchedPlayerName(String partialName) {
- if (pluginRef.getConfigManager().getConfigCommands().getMisc().isMatchOfflinePlayers()) {
- List<String> matches = matchPlayer(partialName);
- if (matches.size() == 1) {
- partialName = matches.get(0);
- }
- } else {
- Player player = pluginRef.getServer().getPlayer(partialName);
- if (player != null) {
- partialName = player.getName();
- }
- }
- return partialName;
- }
- /**
- * Attempts to match any player names with the given name, and returns a list of all possibly matches.
- * <p>
- * This list is not sorted in any particular order.
- * If an exact match is found, the returned list will only contain a single result.
- *
- * @param partialName Name to match
- * @return List of all possible names
- */
- private List<String> matchPlayer(String partialName) {
- List<String> matchedPlayers = new ArrayList<>();
- for (OfflinePlayer offlinePlayer : pluginRef.getServer().getOfflinePlayers()) {
- String playerName = offlinePlayer.getName();
- if (playerName == null) { //Do null checking here to detect corrupted data before sending it throuogh .equals
- System.err.println("[McMMO] Player data file with UIID " + offlinePlayer.getUniqueId() + " is missing a player name. This may be a legacy file from before bukkit.lastKnownName. This should be okay to ignore.");
- continue; //Don't let an error here interrupt the loop
- }
- if (partialName.equalsIgnoreCase(playerName)) {
- // Exact match
- matchedPlayers.clear();
- matchedPlayers.add(playerName);
- break;
- }
- if (playerName.toLowerCase().contains(partialName.toLowerCase())) {
- // Partial match
- matchedPlayers.add(playerName);
- }
- }
- return matchedPlayers;
- }
- }
|