@Override
  public void execute(final Player admin, final List<String> args) {
    int outdated = 0;
    final ObjectCounter<Class<?>> counter = new ObjectCounter<Class<?>>();

    final TurnNotifier turnNotifier = SingletonRepository.getTurnNotifier();
    final int currentTurn = turnNotifier.getCurrentTurnForDebugging();
    final Map<Integer, Set<TurnListener>> events = turnNotifier.getEventListForDebugging();

    for (final Map.Entry<Integer, Set<TurnListener>> it : events.entrySet()) {
      final Integer turn = it.getKey();

      // count outdated
      if (turn.intValue() < currentTurn) {
        outdated++;
      }

      // count classes
      for (final TurnListener event : it.getValue()) {
        counter.add(event.getClass());
      }
    }

    // send result
    admin.sendPrivateText(
        "Statistics: "
            + "\n"
            + counter.getMap()
            + "\nCounted turn events:"
            + events.size()
            + "\nOutdated turn events: "
            + outdated);
  }
  /**
   * Completes handling the buddy action.
   *
   * @param currentTurn ignored
   */
  @Override
  public void onTurnReached(int currentTurn) {
    QueryCanonicalCharacterNamesCommand checkcommand =
        DBCommandQueue.get().getOneResult(QueryCanonicalCharacterNamesCommand.class, handle);

    if (checkcommand == null) {
      TurnNotifier.get().notifyInTurns(0, new TurnListenerDecorator(this));
      return;
    }

    Player player = checkcommand.getPlayer();

    Collection<String> queriedNames = checkcommand.getQueriedNames();
    String who = queriedNames.iterator().next(); // We know, we queried exactly one character.

    Collection<String> validNames = checkcommand.getValidNames();
    if (validNames.isEmpty()) {
      player.sendPrivateText(NotificationType.ERROR, "Sorry, " + who + " could not be found.");
      return;
    }

    // get the canonical name
    who = validNames.iterator().next();
    final Player buddy = SingletonRepository.getRuleProcessor().getPlayer(who);

    if (player.addBuddy(who, (buddy != null) && !buddy.isGhost())) {
      new GameEvent(player.getName(), "buddy", "add", who).raise();
      player.sendPrivateText(who + " was added to your buddy list.");
    } else {
      player.sendPrivateText(who + " was already on your buddy list.");
    }

    new BuddyCleanup(player).cleanup();
  }
  /**
   * Starts to handle a buddy action.
   *
   * @param player The player.
   * @param action The action.
   */
  public void onAction(final Player player, final RPAction action) {
    if (countBuddies(player) > 500) {
      player.sendPrivateText(NotificationType.ERROR, "Sorry, you have already too many buddies");
      return;
    }

    final String who = action.get(TARGET);

    DBCommand command = new QueryCanonicalCharacterNamesCommand(player, Arrays.asList(who));
    DBCommandQueue.get().enqueueAndAwaitResult(command, handle);
    TurnNotifier.get().notifyInTurns(0, new TurnListenerDecorator(this));
  }