【问题标题】:How do I let delete my java discord bots automaticly after 5 seconds?如何让我在 5 秒后自动删除我的 java discord 机器人?
【发布时间】:2020-09-23 15:41:12
【问题描述】:

我如何让我的不和谐 java 机器人在例如 5 秒后删除消息???

String[] messageArgs = event.getMessage().getContentRaw().toLowerCase().split(" ");
for (String args : messageArgs) {
    if (blacklistWords.contains(args)) {
        if (memberRoles.contains(warn0)) {                          
            event.getMessage().delete().queue();            
            event.getMessage().getChannel().sendMessage
            ("**" + MemberMention + "** unterlasse bitte diese **Wortwahl.**"
             + "\nBei **3 Verwarnungen** wirst du **gekickt!**").queue();

            event.getGuild().addRoleToMember(user, warn1).complete();
            event.getJDA().getGuildById(Secrets.guildID).removeRoleFromMember(user, warn0).complete();

            break;
        }
    }
}

【问题讨论】:

标签: java discord-jda


【解决方案1】:

在调用函数删除消息之前,只需使用Thread.sleep(5000); 之类的内容暂停一下即可。这将暂停 5000 毫秒或 5 秒。

【讨论】:

  • 这会使机器人在 5 秒内无响应。不是一个好的解决方案。
【解决方案2】:

在对消息运行删除命令之前,您可以启动一个新线程并暂停该线程。这样您就不会导致其他代码行出现问题。

String[] messageArgs = event.getMessage().getContentRaw().toLowerCase().split(" ");
for (String args : messageArgs) {
    if (blacklistWords.contains(args)) {
        if (memberRoles.contains(warn0)) {

            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        // pause for 5 seconds
                        wait(5000);

                        event.getMessage().delete().queue();

                        event.getMessage().getChannel().sendMessage
                            ("**" + MemberMention + "** unterlasse bitte diese **Wortwahl.**"
                                > here + "\nBei **3 Verwarnungen** wirst du **gekickt!**").queue();

                        event.getGuild().addRoleToMember(user, warn1).complete();
                        event.getJDA().getGuildById(Secrets.guildID).removeRoleFromMember(user, warn0)
                            .complete();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };

            Thread t = new Thread(r);
            t.start();

            break;
        }
    }
}

【讨论】:

  • wait 不是正确的睡眠方式。而且您也不需要为此创建新线程。正确的方法是使用 ScheduledExecutorService 或queueAfter。这在这里解释:stackoverflow.com/questions/57564998/…
  • 谢谢你的回答,我知道queueAfter,但我不知道如何删除queueAfter 的消息。我还阅读了下面的帖子。
【解决方案3】:

执行此操作的正确方法是在发送消息时将消费者传递给您的 .queue 方法。连同使用 RestAction#queueAfter 你会得到

channel.sendMessage("message").queue(message -> message.delete().queueAfter(5, 
TIMEUNIT.SECONDS);

见queue with Consumer和queueAfter。

还有另一种使用RestAction#delay的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2018-12-13
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2021-06-13
    相关资源
    最近更新 更多