@Override
  public void execute(CommandSender sender, ICommandArguments args) throws CommandException {

    CommandException.checkNotConsole(getPlugin(), this, sender);

    String name = args.getString("friendName");
    int rawLevel;

    if (args.hasInteger("level")) {
      rawLevel = args.getInteger("level");
    } else {

      String levelName = args.getString("level");

      IFriendLevel level = Nucleus.getProviders().getFriends().getLevel(levelName);
      if (level == null) throw new CommandException(NucLang.get(_LEVEL_NOT_FOUND, levelName));

      rawLevel = level.getRawLevel();
    }

    UUID friendId = PlayerUtils.getPlayerId(name);
    if (friendId == null) throw new CommandException(NucLang.get(_PLAYER_NOT_FOUND, name));

    Player player = (Player) sender;

    IFriend friend = Friends.get(player, friendId);
    if (friend != null) {
      friend.setRawLevel(rawLevel);
      tellSuccess(sender, NucLang.get(_SUCCESS_SET, name));
    } else {
      Friends.add(player, friendId, rawLevel);
      tellSuccess(sender, NucLang.get(_SUCCESS_ADD, name));
    }
  }
    @Override
    protected void onPlayerLeave(final Player player, LeaveRegionReason reason) {
      PreCon.notNull(player);

      Scheduler.runTaskLater(
          Nucleus.getPlugin(),
          10,
          new Runnable() {
            @Override
            public void run() {

              // prevent player from leaving jail
              Location tpLocation = getRandomTeleport();

              if (tpLocation == null) tpLocation = getCenter();

              player.teleport(tpLocation);
            }
          });
    }
/**
 * Called when a teleport is scheduled.
 *
 * @see com.jcwhatever.nucleus.managed.teleport.Teleporter
 * @see com.jcwhatever.nucleus.managed.teleport.ITeleportManager
 */
public class TeleportScheduledEvent extends PlayerEvent implements ICancellable, Cancellable {

  private static final HandlerList handlers =
      new HandlerListExt(Nucleus.getPlugin(), TeleportScheduledEvent.class);

  private final Location _to;
  private int _delay;
  private boolean _isCancelled;

  /**
   * Constructor.
   *
   * @param player The player scheduled to be teleported.
   * @param to The location to be teleported to.
   * @param delay The teleport delay in ticks.
   */
  public TeleportScheduledEvent(Player player, Location to, int delay) {
    super(player);
    PreCon.notNull(player);
    PreCon.notNull(to);

    _to = to;
    _delay = delay;
  }

  /** Get the teleport delay in ticks. */
  public int getDelayTicks() {
    return _delay;
  }

  /**
   * Set the teleport delay.
   *
   * @param ticks The number of ticks to delay.
   */
  public void setDelayTicks(int ticks) {
    _delay = ticks;
  }

  /** Get a direct reference to the location the player will be teleported to. */
  public Location getTo() {
    return _to;
  }

  @Override
  public boolean isCancelled() {
    return _isCancelled;
  }

  @Override
  public void setCancelled(boolean isCancelled) {
    _isCancelled = isCancelled;
  }

  @Override
  public HandlerList getHandlers() {
    return handlers;
  }

  public static HandlerList getHandlerList() {
    return handlers;
  }
}