@Override
    public void run() {
        Map<String, Ban> bans = plugin.getController().getBans();

        // empty ban list print info and stop
        if (bans.isEmpty()) {
            if (!silent) {
                String message = MessagesUtil.formatMessage("run_no_bans", null);
                log.log(Level.INFO, "[TimeBan] {0}", message);
            }
            return;
        }

        if (!silent) {
            String message = MessagesUtil.formatMessage("run_check", null);
            log.log(Level.INFO, "[TimeBan] {0}", message);
        }

        // go through list until unban date is in future
        List<Ban> sortedBans = new ArrayList<Ban>(bans.values());
        Collections.sort(sortedBans, new BanComparator(false));
        for (Ban b : sortedBans) {
            if (b.getUntil().before(Calendar.getInstance())) {
                TimeBanUnbanEvent event = new TimeBanUnbanEvent(b);
                event.setSilent(silent);
                Bukkit.getServer().getPluginManager().callEvent(event);
            } else {
                break;
            }
        }

        if (!silent) {
            String message = MessagesUtil.formatMessage("run_check_complete", null);
            log.log(Level.INFO, "[TimeBan] {0}", message);
        }
    }