private void ban(MessageContext context, String args) {
    if (args.isEmpty()) {
      return;
    }
    String[] split = args.split(" ");
    List<String> banned = new ArrayList<>();
    List<String> failed = new ArrayList<>();
    Channel channel = context.getChannel();
    for (String userStr : split) {
      User user = findUser(context, userStr);
      String userId = user.getId();
      if (user == NO_USER) {
        userId = userStr;
      }

      if (banChecked(channel, context.getAuthor(), user, context.getServer())) {
        banned.add(userId + " " + user.getUsername());
      } else {
        failed.add(userId + " " + user.getUsername());
      }
    }

    if (channel.getId() != null) {
      StringJoiner joiner = new StringJoiner("\n");
      for (String s : banned) {
        String[] pair = s.split(" ", 2);
        joiner.add(loc.localize("commands.mod.ban.response", pair[1], pair[0]));
      }
      apiClient.sendMessage(joiner.toString(), channel);
    }
  }
 private void find(MessageContext context, String args) {
   DiscordApiClient apiClient = context.getApiClient();
   Channel channel = context.getChannel();
   Pattern pattern;
   try {
     pattern = Pattern.compile(args);
   } catch (PatternSyntaxException pse) {
     apiClient.sendMessage(loc.localize("commands.admin.find.response.invalid"), channel);
     return;
   }
   Predicate<String> matcher = pattern.asPredicate();
   List<User> results =
       context
           .getServer()
           .getMembers()
           .stream()
           .map(Member::getUser)
           .filter(u -> matcher.test(u.getUsername()))
           .collect(Collectors.toList());
   int size = results.size();
   if (size > 20) {
     apiClient.sendMessage(loc.localize("commands.admin.find.response.oversize", size), channel);
     return;
   }
   StringJoiner resultJoiner = new StringJoiner(", ");
   results.stream().map(this::userToResult).forEach(resultJoiner::add);
   apiClient.sendMessage(
       loc.localize("commands.admin.find.response.format", size, resultJoiner.toString()),
       channel);
 }
 private String formatDuration(Duration duration) {
   StringJoiner joiner = new StringJoiner(", ");
   long days = duration.toDays();
   if (days > 0) {
     long years = days / 365;
     if (years > 0) {
       long centuries = years / 100;
       if (centuries > 0) {
         long millenia = centuries / 10;
         joiner.add(loc.localize("time.millenia", millenia));
         centuries = centuries % 10;
         if (centuries > 0) {
           joiner.add(loc.localize("time.centuries", centuries));
         }
       }
       years = years % 100;
       if (years > 0) {
         joiner.add(loc.localize("time.years", years));
       }
     }
     days = days % 365;
     joiner.add(loc.localize("time.days", days));
   }
   long hours = duration.toHours() % 24L;
   if (hours > 0) {
     joiner.add(loc.localize("time.hours", hours));
   }
   long minutes = duration.toMinutes() % 60L;
   if (minutes > 0) {
     joiner.add(loc.localize("time.minutes", minutes));
   }
   long seconds = duration.getSeconds() % 60L;
   if (seconds > 0) {
     joiner.add(loc.localize("time.seconds", seconds));
   }
   return joiner.toString();
 }