示例#1
0
  protected Arguments verifyArgs(
      MethodWrapper mwrapper,
      MCCommand cmd,
      CommandSender sender,
      Command command,
      String label,
      String[] args,
      int startIndex)
      throws IllegalArgumentException {
    if (DEBUG) {
      Log.info(
          " method="
              + mwrapper.method.getName()
              + " verifyArgs "
              + cmd
              + " sender="
              + sender
              + ", label="
              + label
              + " args="
              + args);
      for (String arg : args) {
        Log.info(" -- arg=" + arg);
      }
      for (Class<?> t : mwrapper.method.getParameterTypes()) {
        Log.info(" -- type=" + t);
      }
    }
    final int paramLength = mwrapper.method.getParameterTypes().length;

    /// Check our permissions
    if (!cmd.perm().isEmpty()
        && !sender.hasPermission(cmd.perm())
        && !(cmd.admin() && hasAdminPerms(sender)))
      throw new IllegalArgumentException("You don't have permission to use this command");

    /// Verify min number of arguments
    if (args.length < cmd.min()) {
      throw new IllegalArgumentException("You need at least " + cmd.min() + " arguments");
    }
    /// Verfiy max number of arguments
    if (args.length > cmd.max()) {
      throw new IllegalArgumentException("You need less than " + cmd.max() + " arguments");
    }
    /// Verfiy max number of arguments
    if (cmd.exact() != -1 && args.length != cmd.exact()) {
      throw new IllegalArgumentException("You need exactly " + cmd.exact() + " arguments");
    }
    final boolean isPlayer = sender instanceof Player;
    final boolean isOp =
        (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender;

    if (cmd.op() && !isOp)
      throw new IllegalArgumentException("You need to be op to use this command");

    if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender)))
      throw new IllegalArgumentException("You need to be an Admin to use this command");

    Class<?> types[] = mwrapper.method.getParameterTypes();

    //		/// In game check
    if (types[0] == Player.class && !isPlayer) {
      throw new IllegalArgumentException(ONLY_INGAME);
    }
    int strIndex = startIndex /*skip the label*/, objIndex = 1;

    Arguments newArgs = new Arguments(); // / Our return value
    Object[] objs = new Object[paramLength]; // / Our new array of castable arguments

    newArgs.args = objs; // / Set our return object with the new castable arguments
    objs[0] = verifySender(sender, types[0]);
    AtomicBoolean usedString = new AtomicBoolean();
    for (int i = 1; i < types.length; i++) {
      Class<?> clazz = types[i];
      usedString.set(false);
      try {
        if (CommandSender.class == clazz) {
          objs[objIndex] = sender;
        } else if (String[].class == clazz) {
          objs[objIndex] = args;
        } else if (Object[].class == clazz) {
          objs[objIndex] = args;
        } else {
          String str = strIndex < args.length ? args[strIndex] : null;
          objs[objIndex] = verifyArg(clazz, command, str, usedString);
          if (objs[objIndex] == null) {
            throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null");
          }
        }
        if (DEBUG)
          Log.info(
              "   "
                  + objIndex
                  + " : "
                  + strIndex
                  + "  "
                  + (args.length > strIndex ? args[strIndex] : null)
                  + " <-> "
                  + objs[objIndex]
                  + " !!!!!!!!!!!!!!!!!!!!!!!!!!! Cs = "
                  + clazz.getCanonicalName());
        if (usedString.get()) {
          strIndex++;
        }
      } catch (ArrayIndexOutOfBoundsException e) {
        throw new IllegalArgumentException("You didnt supply enough arguments for this method");
      }
      objIndex++;
    }

    /// Verify alphanumeric
    if (cmd.alphanum().length > 0) {
      for (int index : cmd.alphanum()) {
        if (index >= args.length) throw new IllegalArgumentException("String Index out of range. ");
        if (!args[index].matches("[a-zA-Z0-9_]*")) {
          throw new IllegalArgumentException(
              "argument '" + args[index] + "' can only be alphanumeric with underscores");
        }
      }
    }
    return newArgs; /// Success
  }