CommandTools.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package com.gmail.nossr50.util.commands;
  2. import com.gmail.nossr50.core.MetadataConstants;
  3. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  4. import com.gmail.nossr50.datatypes.player.PlayerProfile;
  5. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  6. import com.gmail.nossr50.mcMMO;
  7. import com.gmail.nossr50.util.Misc;
  8. import com.gmail.nossr50.util.StringUtils;
  9. import org.bukkit.OfflinePlayer;
  10. import org.bukkit.command.CommandSender;
  11. import org.bukkit.entity.Player;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. public final class CommandTools {
  15. private final mcMMO pluginRef;
  16. public CommandTools(mcMMO pluginRef) {
  17. this.pluginRef = pluginRef;
  18. }
  19. public boolean isChildSkill(CommandSender sender, PrimarySkillType skill) {
  20. if (skill == null || !pluginRef.getSkillTools().isChildSkill(skill)) {
  21. return false;
  22. }
  23. sender.sendMessage("Child skills are not supported by this command."); // TODO: Localize this
  24. return true;
  25. }
  26. public boolean tooFar(CommandSender sender, Player target, boolean hasPermission) {
  27. if(!target.isOnline() && !hasPermission) {
  28. sender.sendMessage(pluginRef.getLocaleManager().getString("Inspect.Offline"));
  29. return true;
  30. } else if (pluginRef.getConfigManager().getConfigCommands().isLimitInspectRange()
  31. && sender instanceof Player
  32. && !Misc.isNear(((Player) sender).getLocation(), target.getLocation(),
  33. pluginRef.getConfigManager().getConfigCommands().getInspectCommandMaxDistance())
  34. && !hasPermission) {
  35. sender.sendMessage(pluginRef.getLocaleManager().getString("Inspect.TooFar"));
  36. return true;
  37. }
  38. return false;
  39. }
  40. public boolean hidden(CommandSender sender, Player target, boolean hasPermission) {
  41. return sender instanceof Player && !((Player) sender).canSee(target) && !hasPermission;
  42. }
  43. public boolean noConsoleUsage(CommandSender sender) {
  44. if (sender instanceof Player) {
  45. return false;
  46. }
  47. sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.NoConsole"));
  48. return true;
  49. }
  50. /**
  51. * Checks if there is a valid mcMMOPlayer object.
  52. *
  53. * @param sender CommandSender who used the command
  54. * @param playerName name of the target player
  55. * @param mcMMOPlayer mcMMOPlayer object of the target player
  56. * @return true if the player is online and a valid mcMMOPlayer object was found
  57. */
  58. public boolean checkPlayerExistence(CommandSender sender, String playerName, McMMOPlayer mcMMOPlayer) {
  59. if (mcMMOPlayer != null) {
  60. if (hidden(sender, mcMMOPlayer.getPlayer(), false)) {
  61. sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.Offline"));
  62. return false;
  63. }
  64. return true;
  65. }
  66. PlayerProfile profile = new PlayerProfile(pluginRef, playerName, false);
  67. if (unloadedProfile(sender, profile)) {
  68. return false;
  69. }
  70. sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.DoesNotExist"));
  71. return false;
  72. }
  73. public boolean unloadedProfile(CommandSender sender, PlayerProfile profile) {
  74. if (profile.isLoaded()) {
  75. return false;
  76. }
  77. sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.Offline"));
  78. return true;
  79. }
  80. public boolean hasPlayerDataKey(CommandSender sender) {
  81. if (!(sender instanceof Player)) {
  82. return false;
  83. }
  84. boolean hasPlayerDataKey = ((Player) sender).hasMetadata(MetadataConstants.PLAYER_DATA_METAKEY);
  85. if (!hasPlayerDataKey) {
  86. sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.NotLoaded"));
  87. }
  88. return hasPlayerDataKey;
  89. }
  90. public boolean isLoaded(CommandSender sender, PlayerProfile profile) {
  91. if (profile.isLoaded()) {
  92. return true;
  93. }
  94. sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.NotLoaded"));
  95. return false;
  96. }
  97. public boolean isInvalidInteger(CommandSender sender, String value) {
  98. if (StringUtils.isInt(value)) {
  99. return false;
  100. }
  101. sender.sendMessage("That is not a valid integer."); // TODO: Localize
  102. return true;
  103. }
  104. public boolean isInvalidDouble(CommandSender sender, String value) {
  105. if (StringUtils.isDouble(value)) {
  106. return false;
  107. }
  108. sender.sendMessage("That is not a valid percentage."); // TODO: Localize
  109. return true;
  110. }
  111. public boolean isInvalidSkill(CommandSender sender, String skillName) {
  112. if (pluginRef.getSkillTools().isSkill(skillName)) {
  113. return false;
  114. }
  115. sender.sendMessage(pluginRef.getLocaleManager().getString("Commands.Skill.Invalid"));
  116. return true;
  117. }
  118. public boolean shouldEnableToggle(String arg) {
  119. return arg.equalsIgnoreCase("on") || arg.equalsIgnoreCase("true") || arg.equalsIgnoreCase("enabled");
  120. }
  121. public boolean shouldDisableToggle(String arg) {
  122. return arg.equalsIgnoreCase("off") || arg.equalsIgnoreCase("false") || arg.equalsIgnoreCase("disabled");
  123. }
  124. /**
  125. * Print out details on Gathering skills. Only for online players.
  126. *
  127. * @param inspect The player to retrieve stats for
  128. * @param display The sender to display stats to
  129. */
  130. public void printGatheringSkills(Player inspect, CommandSender display) {
  131. printGroupedSkillData(inspect, display, pluginRef.getLocaleManager().getString("Stats.Header.Gathering"), pluginRef.getSkillTools().GATHERING_SKILLS);
  132. }
  133. public void printGatheringSkills(Player player) {
  134. printGatheringSkills(player, player);
  135. }
  136. /**
  137. * Print out details on Combat skills. Only for online players.
  138. *
  139. * @param inspect The player to retrieve stats for
  140. * @param display The sender to display stats to
  141. */
  142. public void printCombatSkills(Player inspect, CommandSender display) {
  143. printGroupedSkillData(inspect, display, pluginRef.getLocaleManager().getString("Stats.Header.Combat"), pluginRef.getSkillTools().COMBAT_SKILLS);
  144. }
  145. public void printCombatSkills(Player player) {
  146. printCombatSkills(player, player);
  147. }
  148. /**
  149. * Print out details on Misc skills. Only for online players.
  150. *
  151. * @param inspect The player to retrieve stats for
  152. * @param display The sender to display stats to
  153. */
  154. public void printMiscSkills(Player inspect, CommandSender display) {
  155. printGroupedSkillData(inspect, display, pluginRef.getLocaleManager().getString("Stats.Header.Misc"), pluginRef.getSkillTools().MISC_SKILLS);
  156. }
  157. public void printMiscSkills(Player player) {
  158. printMiscSkills(player, player);
  159. }
  160. public String displaySkill(PlayerProfile profile, PrimarySkillType skill) {
  161. if (pluginRef.getSkillTools().isChildSkill(skill)) {
  162. return pluginRef.getLocaleManager().getString("Skills.ChildStats", pluginRef.getLocaleManager().getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill));
  163. }
  164. return pluginRef.getLocaleManager().getString("Skills.Stats", pluginRef.getLocaleManager().getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill), profile.getSkillXpLevel(skill), profile.getXpToLevel(skill));
  165. }
  166. private void printGroupedSkillData(Player inspect, CommandSender display, String header, List<PrimarySkillType> skillGroup) {
  167. if (pluginRef.getUserManager().getPlayer(inspect) == null)
  168. return;
  169. PlayerProfile profile = pluginRef.getUserManager().getPlayer(inspect).getProfile();
  170. List<String> displayData = new ArrayList<>();
  171. displayData.add(header);
  172. for (PrimarySkillType primarySkillType : skillGroup) {
  173. if (pluginRef.getSkillTools().doesPlayerHaveSkillPermission(primarySkillType, inspect)) {
  174. displayData.add(displaySkill(profile, primarySkillType));
  175. }
  176. }
  177. int size = displayData.size();
  178. if (size > 1) {
  179. display.sendMessage(displayData.toArray(new String[size]));
  180. }
  181. }
  182. public List<String> getOnlinePlayerNames(CommandSender sender) {
  183. Player player = sender instanceof Player ? (Player) sender : null;
  184. List<String> onlinePlayerNames = new ArrayList<>();
  185. for (Player onlinePlayer : pluginRef.getServer().getOnlinePlayers()) {
  186. if (player != null && player.canSee(onlinePlayer)) {
  187. onlinePlayerNames.add(onlinePlayer.getName());
  188. }
  189. }
  190. return onlinePlayerNames;
  191. }
  192. /**
  193. * Get a matched player name if one was found in the database.
  194. *
  195. * @param partialName Name to match
  196. * @return Matched name or {@code partialName} if no match was found
  197. */
  198. public String getMatchedPlayerName(String partialName) {
  199. if (pluginRef.getConfigManager().getConfigCommands().getMisc().isMatchOfflinePlayers()) {
  200. List<String> matches = matchPlayer(partialName);
  201. if (matches.size() == 1) {
  202. partialName = matches.get(0);
  203. }
  204. } else {
  205. Player player = pluginRef.getServer().getPlayer(partialName);
  206. if (player != null) {
  207. partialName = player.getName();
  208. }
  209. }
  210. return partialName;
  211. }
  212. /**
  213. * Attempts to match any player names with the given name, and returns a list of all possibly matches.
  214. * <p>
  215. * This list is not sorted in any particular order.
  216. * If an exact match is found, the returned list will only contain a single result.
  217. *
  218. * @param partialName Name to match
  219. * @return List of all possible names
  220. */
  221. private List<String> matchPlayer(String partialName) {
  222. List<String> matchedPlayers = new ArrayList<>();
  223. for (OfflinePlayer offlinePlayer : pluginRef.getServer().getOfflinePlayers()) {
  224. String playerName = offlinePlayer.getName();
  225. if (playerName == null) { //Do null checking here to detect corrupted data before sending it throuogh .equals
  226. 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.");
  227. continue; //Don't let an error here interrupt the loop
  228. }
  229. if (partialName.equalsIgnoreCase(playerName)) {
  230. // Exact match
  231. matchedPlayers.clear();
  232. matchedPlayers.add(playerName);
  233. break;
  234. }
  235. if (playerName.toLowerCase().contains(partialName.toLowerCase())) {
  236. // Partial match
  237. matchedPlayers.add(playerName);
  238. }
  239. }
  240. return matchedPlayers;
  241. }
  242. }