Java tutorial
/* * The MIT License * * Copyright 2014 Chormon. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package pl.chormon.ultimatelib.commands; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import pl.chormon.ultimatelib.commands.req.Req; import pl.chormon.ultimatelib.utils.MsgUtils; import pl.chormon.ultimatelib.utils.StringUtils; /** * * @author Chormon */ public abstract class UltimateCommand implements CommandExecutor { protected String desc = "brak opisu"; protected List<String> aliases = new ArrayList<>(); protected List<UltimateCommand> subCommands = new ArrayList<>(); protected UltimateCommand parent = null; protected List<String> reqArgs = new ArrayList<>(); protected List<String> optionalArgs = new ArrayList<>(); protected List<Req> reqs = new ArrayList(); protected boolean errorOnToManyArgs = true; protected boolean senderIsConsole = false; protected CommandSender sender; protected List<String> args = new ArrayList<>(); protected void addSubCommand(UltimateCommand command) { command.parent = this; this.subCommands.add(command); } public List<UltimateCommand> getSubCommands() { return this.subCommands; } protected void setDesc(String desc) { this.desc = desc; } public String getDesc() { return this.desc; } protected void addAlias(String alias) { this.aliases.add(alias); } public List<String> getAliases() { return this.aliases; } public UltimateCommand getParent() { return this.parent; } public void addArg(String arg) { this.reqArgs.add(arg); } public List<String> getArgs() { return this.reqArgs; } public void addOptionalArg(String arg, String def) { this.optionalArgs.add(arg + "=" + def); } public List<String> getOptionalArgs() { return this.optionalArgs; } protected void addReq(Req req) { this.reqs.add(req); } protected void setErrorOnToManyArgs(boolean errorOnToManyArgs) { this.errorOnToManyArgs = errorOnToManyArgs; } public void perform(CommandSender sender, String label, List<String> args) { this.sender = sender; senderIsConsole = true; if (sender instanceof Player) { senderIsConsole = false; } this.args = args; perform(); } public void perform() { MsgUtils.msg(sender, "&2" + this.desc); for (UltimateCommand cmd : subCommands) { MsgUtils.msg(sender, printUsage(cmd)); } } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { parse(sender, this, label, new ArrayList<>(Arrays.asList(args))); return true; } private void parse(CommandSender sender, UltimateCommand command, String label, List<String> args) { if (!reqAreMet(sender, command)) { // noPerms(sender); return; } for (UltimateCommand cmd : command.getSubCommands()) { if (args.size() > 0 && StringUtils.containsIgnoreCase(cmd.getAliases(), args.get(0))) { args.remove(0); parse(sender, cmd, label, args); return; } } if (args.size() > (command.getArgs().size() + command.getOptionalArgs().size()) && command.errorOnToManyArgs) { tooManyParams(sender); printUsage(sender, command); return; } if (args.size() < command.getArgs().size()) { notEnoughParams(sender); printUsage(sender, command); return; } command.perform(sender, label, args); } private boolean reqAreMet(CommandSender sender, UltimateCommand command) { for (Req req : command.reqs) { if (!req.apply(sender)) { req.message(sender); return false; } } return true; } protected void tooManyParams(CommandSender sender) { MsgUtils.msg(sender, "&4Za duo argumentw!"); } protected void notEnoughParams(CommandSender sender) { MsgUtils.msg(sender, "&4Za mao argumentw!"); } protected void printUsage(CommandSender sender, UltimateCommand command) { MsgUtils.msg(sender, "&2Uycie: &f" + printUsage(command, false)); } protected void noPerms(CommandSender sender) { MsgUtils.msg(sender, "&4Nie masz uprawnie do uycia tej komendy!"); } protected String printUsage(UltimateCommand command) { return printUsage(command, true, true, true); } protected String printUsage(UltimateCommand command, boolean addDesc) { return printUsage(command, true, true, addDesc); } protected String printUsage(UltimateCommand command, boolean addArgs, boolean addOptionalArgs, boolean addDesc) { List<String> paths = new ArrayList<>(); String d = command.getDesc(); List<String> a = command.getArgs(); List<String> oa = command.getOptionalArgs(); while (command != null) { paths.add(StringUtils.implode(command.getAliases(), ",")); command = command.getParent(); } StringBuilder sb = new StringBuilder(); String path = StringUtils.implode(Lists.reverse(paths), " "); sb.append("/"); sb.append(path); if (addArgs) { for (String s : a) { sb.append(" <"); sb.append(s); sb.append(">"); } } if (addOptionalArgs) { for (String s : oa) { sb.append(" ["); sb.append(s); sb.append("]"); } } if (addDesc) { sb.append(" &7"); sb.append(d); } return sb.toString(); } }