使用 JDA 在 Discord 消息中创建倒数计时器

Posted

技术标签:

【中文标题】使用 JDA 在 Discord 消息中创建倒数计时器【英文标题】:Creating a countdown timer in a Discord message using JDA 【发布时间】:2020-12-12 02:21:45 【问题描述】:

我正在尝试在 JDA 中创建倒数计时器。我不认为我做对了。输入的原始命令将不断编辑以显示正在进行的倒计时。如 for 循环所示,倒计时的最长时间为 48 小时。这是我的代码:

@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 && minute == 0 && second == 0) 
                event.getMessage().editMessage("00:00:00");
                event.getChannel().sendMessage("Countdown complete!").queue();
                break;
            
            // 0 1 1
            else if (hour == 0 && minute > 0 && second > 0) 
                minute--;
                second--;
                event.getMessage().editMessage(hour + ":" + minute + ":" + second).queue();;
            
            //0 1 0
            else if (hour == 0 && minute > 0 && second == 0) 
                minute--;
                second = 59;
                event.getMessage().editMessage(hour + ":" + minute + ":" + second).queue();;
            
            //1 0 0 
            else if (hour > 0 && minute == 0 && 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 && minute == 0 && second > 0) || (hour > 0 && minute == 0 && second > 0) || (hour > 0 && minute > 0 && second > 0)) 
                second--;
                event.getMessage().editMessage(hour + ":" + minute + ":" + second).queue();
            
    
            //1 1 0
            else if (hour > 0 && minute > 0 && second == 0) 
                minute--;
                event.getMessage().editMessage(hour + ":" + minute + ":" + second).queue();
            
            
        
    

似乎有一种更简单的方法可以做到这一点。使用 Timer 或 SimpleDateFormat 或其他东西,但我只是不知道那会是什么。由于某种原因,我的消息没有被.editMessage() 方法编辑。

输出:

!countdown 01:02:02 //user keyed discord bot command

对于预期的输出,“!countdown 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】:

你应该可以使用 Timer 和 TimerTask,Timer 用于调度 Timer Task。计时器用于在线程的后台调度任务,如下所示:

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);

【讨论】:

我试试看,但 Heroku 似乎不喜欢我出于任何原因使用 ; 语法执行回调或其他函数。还有其他方法吗? 我之前遇到的问题是因为我没有使用正确的 JRE 版本

以上是关于使用 JDA 在 Discord 消息中创建倒数计时器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDA 在 Discord 服务器(不是用户/机器人 DM)中创建私人频道:Java Discord API

Discord JDA 无法创建角色

如何使用 Java 中的 Discord JDA 在 Discord 上的特定时间发送消息

Discord bot 无法使用 JDA 在 java 中发送消息

#general 频道 Discord - 超时和 JDA 未收到消息

使用 JDA 制作的 Discord 机器人正在删除不正确的消息