package tc.oc.pgm.classes; import java.util.Objects; import javax.inject.Inject; import javax.inject.Singleton; import com.sk89q.minecraft.util.commands.*; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import tc.oc.api.bukkit.users.BukkitUserStore; import tc.oc.api.docs.User; import tc.oc.commons.core.commands.Commands; import tc.oc.commons.core.commands.TranslatableCommandException; import tc.oc.commons.core.formatting.StringUtils; import tc.oc.pgm.*; import tc.oc.pgm.commands.CommandUtils; import tc.oc.pgm.match.MatchFinder; import tc.oc.pgm.match.MatchPlayer; @Singleton public class ClassCommands implements Commands { private final MatchFinder matchFinder; private final BukkitUserStore userStore; @Inject private ClassCommands(MatchFinder matchFinder, BukkitUserStore userStore) { this.matchFinder = matchFinder; this.userStore = userStore; } @Command( aliases = { "class", "selectclass", "c", "cl" }, desc = "Selects or views the player class", min = 0, max = -1 ) @CommandPermissions("pgm.class") public void selectclass(CommandContext args, CommandSender sender) throws CommandException { ClassMatchModule classModule = getClassModule(sender); MatchPlayer player = CommandUtils.senderToMatchPlayer(sender); final User user = userStore.getUser(player.getBukkit()); PlayerClass cls = classModule.selectedClass(user); if(args.argsLength() == 0) { // show current class sender.sendMessage(ChatColor.GREEN + PGMTranslations.t("command.class.view.currentClass", player) + " " + ChatColor.GOLD + ChatColor.UNDERLINE + cls.getName()); sender.sendMessage(ChatColor.DARK_PURPLE + PGMTranslations.t("command.class.view.list", player).replace("'/classes'", ChatColor.GOLD + "'/classes'" + ChatColor.DARK_PURPLE)); } else { if(!sender.hasPermission("pgm.class.select")) { throw new CommandPermissionsException(); } String search = args.getJoinedStrings(0); PlayerClass result = StringUtils.bestFuzzyMatch(search, classModule.getClasses(), 0.9); if(result == null) { throw new CommandException(PGMTranslations.t("command.class.select.classNotFound", player)); } if(!cls.canUse(player.getBukkit())) { throw new CommandException(PGMTranslations.t("command.class.restricted", player, ChatColor.GOLD, result.getName(), ChatColor.RED)); } try { classModule.setPlayerClass(user, result); } catch (IllegalStateException e) { throw new CommandException(PGMTranslations.t("command.class.stickyClass", player)); } sender.sendMessage(ChatColor.GREEN + PGMTranslations.t("command.class.select.confirm", player, ChatColor.GOLD.toString() + ChatColor.UNDERLINE + result.getName() + ChatColor.GREEN)); if(player.isParticipating()) { sender.sendMessage(ChatColor.GREEN + PGMTranslations.t("command.class.select.nextSpawn", player)); } } } @Command( aliases = { "classlist", "classes", "listclasses", "cls" }, desc = "Lists the classes available on this map", min = 0, max = 1 ) @CommandPermissions("pgm.class.list") public void listclasses(CommandContext args, CommandSender sender) throws CommandException { Player bukkit = tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender); ClassMatchModule classModule = getClassModule(bukkit); final PlayerClass senderClass = classModule.selectedClass(userStore.getUser(bukkit)); sender.sendMessage(StringUtils.dashedChatMessage(ChatColor.GOLD + PGMTranslations.get().t("command.class.list.title", sender), "-", ChatColor.RED.toString())); int i = 1; boolean doesntHave = false; for(PlayerClass cls : classModule.getClasses()) { StringBuilder result = new StringBuilder(); result.append(i++).append(". "); if(Objects.equals(cls, senderClass)) { result.append(ChatColor.GOLD); } else if(cls.canUse(bukkit)) { result.append(ChatColor.GREEN); } else { result.append(ChatColor.RED); doesntHave = true; } if(Objects.equals(cls, senderClass)) result.append(ChatColor.UNDERLINE); result.append(cls.getName()); if(cls.getDescription() != null) { result.append(ChatColor.DARK_PURPLE).append(" - ").append(ChatColor.RESET).append(cls.getDescription()); } sender.sendMessage(result.toString()); } } private ClassMatchModule getClassModule(CommandSender sender) throws CommandException { return matchFinder.needMatch(sender) .module(ClassMatchModule.class) .orElseThrow(() -> new TranslatableCommandException("command.class.notEnabled")); } }