Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Обработка данных из аргумента команды

Migel

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Migel077
Как можно реализовать не что подобное:
Допустим у нас есть команда tempban мы указваем ник, а дальше должны указать время 5d 16h 26m как распозновать введëнное время и + ещë в конце чтобы можно было указать время?
Возможное решение это проверять на наличие в каждом аргументе букв-указателей на тип времени (y, d, mo, m, s) а если нет указателя в аргументе, всë остальное нулями, + дальше аргументы добавлять в "причину" бана
 
Делал такой метод - считает миллисекунды из строки. Можно расширить для годов и прочего, выйдет как-то так
PHP:
private static final Pattern TIME_PRECISE = Pattern.compile("(\\d+)(m[os]?|[ywhdst])?");

public static final long MS_PER_SECOND = 1000L;
public static final long MS_PER_TICK = MS_PER_SECOND / 20;
public static final long MS_PER_MINUTE = MS_PER_SECOND * 60L;
public static final long MS_PER_HOUR = MS_PER_MINUTE * 60L;
public static final long MS_PER_DAY = MS_PER_HOUR * 24L;
public static final long MS_PER_WEEK = MS_PER_DAY * 7L;
public static final long MS_PER_MONTH = MS_PER_DAY * 30L;
public static final long MS_PER_YEAR = MS_PER_DAY * 365L;

public static long parseTimePrecise(String timeStr) {
    Matcher matcher = TIME_PRECISE.matcher(timeStr);
    long time = 0;
    while (matcher.find()) {
        String unit = matcher.group(2);
        if (unit == null) unit = "s";
        time += Long.parseLong(matcher.group(1)) * switch (unit) {
            case "y" -> MS_PER_YEAR;
            case "mo" -> MS_PER_MONTH;
            case "w" -> MS_PER_WEEK;
            case "d" -> MS_PER_DAY;
            case "h" -> MS_PER_HOUR;
            case "m" -> MS_PER_MINUTE;
            default -> MS_PER_SECOND;
            case "ms" -> 1L;
            case "t" -> MS_PER_TICK;
        };
    }
    return time;
}
Константы MS_PER_X сделаны чисто для удобства.
 

Поделиться этой страницей

Назад
Верх