#java #countdown #discord-jda
#java #обратный отсчет #discord-jda
Вопрос:
Я пытаюсь создать таймер обратного отсчета в JDA. Хотя я не думаю, что делаю это правильно. Введенная исходная команда будет постоянно редактироваться, чтобы показать, что обратный отсчет продолжается. Максимальное время обратного отсчета должно составлять 48 часов, как показано в цикле for. Вот код, который у меня есть:
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
super.onGuildMessageReceived(event);
//!countdown hours:minutes:seconds
if (event.getMessage().getContentRaw().startsWith("!countdown")) {
String timebuilder = "";
char[] chararr = event.getMessage().getContentRaw().toCharArray();
for (int i = 11; i < chararr.length; i ) {
timebuilder = chararr[i];
}
// event.getChannel().sendMessage(timebuilder).queue();
int hour = Integer.parseInt(timebuilder.substring(0, 1));
int minute = Integer.parseInt(timebuilder.substring(3, 4));
int second = Integer.parseInt(timebuilder.substring(6, 7));
for (int i = 0; i < 172800; i ) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 0 0 0
if (hour == 0 amp;amp; minute == 0 amp;amp; second == 0) {
event.getMessage().editMessage("00:00:00");
event.getChannel().sendMessage("Countdown complete!").queue();
break;
}
// 0 1 1
else if (hour == 0 amp;amp; minute > 0 amp;amp; second > 0) {
minute--;
second--;
event.getMessage().editMessage(hour ":" minute ":" second).queue();;
}
//0 1 0
else if (hour == 0 amp;amp; minute > 0 amp;amp; second == 0) {
minute--;
second = 59;
event.getMessage().editMessage(hour ":" minute ":" second).queue();;
}
//1 0 0
else if (hour > 0 amp;amp; minute == 0 amp;amp; second == 0) {
second = 59;
minute = 59;
hour--;
event.getMessage().editMessage(hour ":" minute ":" second).queue();;
}
//0 0 1 //1 0 1 //1 1 1
else if ((hour == 0 amp;amp; minute == 0 amp;amp; second > 0) || (hour > 0 amp;amp; minute == 0 amp;amp; second > 0) || (hour > 0 amp;amp; minute > 0 amp;amp; second > 0)) {
second--;
event.getMessage().editMessage(hour ":" minute ":" second).queue();
}
//1 1 0
else if (hour > 0 amp;amp; minute > 0 amp;amp; second == 0) {
minute--;
event.getMessage().editMessage(hour ":" minute ":" second).queue();
}
}
}
}
Кажется, что был бы более простой способ сделать это. С помощью Timer или SimpleDateFormat или чего-то еще, но я просто не знаю, что бы это было. По какой-то причине мое сообщение не редактируется с помощью .editMessage()
метода.
Вывод:
!countdown 01:02:02 //user keyed discord bot command
Для ожидаемого результата сообщение «!обратный отсчет 01:02:02» должно постоянно редактироваться с обновленным обратным отсчетом. Как показано ниже:
Ожидаемый результат:
!countdown 01:02:02 //user keyed discord bot command
01:02:01 //original command
01:02:00 //original command
01:01:59 //original command
etc...
Ответ №1:
Вы должны иметь возможность использовать таймер и TimerTask, таймер используется для планирования задачи таймера. Таймеры используются для планирования задач в фоновом режиме потока следующим образом:
TimerTask task = new TimerTask(){
public void run(){
System.out.println("Code to be executed");
}
};
Timer timer = new Timer();
// The delay period is calculated in milliseconds iirc
timer.schedule(task, 5*1000);
Комментарии:
1. Я бы попробовал это, но Heroku, похоже, не нравится, когда я выполняю обратные вызовы или другие функции, используя
{ };
синтаксис по какой-либо причине. Есть ли другой способ сделать это?2. Предыдущая проблема, с которой я столкнулся, заключалась в том, что я не использовал правильную версию JRE