首页 > 解决方案 > 使用 discord JDA 清除聊天

问题描述

我正在用java编写一个discord bot,我使用discord JDA和实用程序依赖项,我尝试使用实用程序但我没有让它工作,所以我尝试只使用普通的JDA,这就是我所做的,但是我需要一些方法来告诉机器人如果没有运行命令,不要在新频道中发送消息。

public class NukeCommand extends ListenerAdapter {

    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event){
        if (event.getMessage().getContentRaw().equalsIgnoreCase(".nuke")){
            event.getChannel().createCopy().queue();
            event.getChannel().delete().queue();
        }
    }
    @Override
    public void onTextChannelCreate(TextChannelCreateEvent createEvent){
        createEvent.getChannel().sendMessage(":warning:Nuked channel:warning:\nhttps://imgur.com/a/93vq9R8").queue();
    }

我对这两个依赖项的答案持开放态度。这是我想要的效果:https ://gyazo.com/e549fd8dda0ded62db19fb84e31d3a61 我有同样的效果,但它每次创建文本频道时都会发送消息。我希望它仅在运行 .nuke 命令时才发送消息。

标签: javadiscord-jda

解决方案


你说你已经明白了,但我想更多地解释它是如何工作的并完善你的答案。

ListenerAdapter的方法会为机器人整个范围内发生的每个事件调用,例如,如果您有

class Adapter extends ListenerAdapter {
    @Override
    public void onMessageReceived(MessageReceivedEvent event){
       /*This will be called for every message, everywhere, including the bot's private channel*/
    }
}

因此,您需要在方法的正文中过滤这些事件,您对答案所做的是检查发送消息的人是否有权管理消息,这不是您实际需要删除频道的权限Permission.MANAGE_CHANNELS,您可以在服务器中的角色选项卡。

然后你调用createCopy()它基本上创建了频道信息的浅表副本 在此处输入图像描述

我不认为你真的想这样做。

然后将该操作排队,(这是实际执行的操作)它被放入队列中以供 JDA 的线程进行异步处理,随后将通过 websocket 连接将其发送到 discord。

那个队列方法可以带aConsumer<TextChannel>作为参数,这是什么意思?

基本上,消费者代表一个将单个参数作为输入的操作(在本例中为 a TextChannel)并且不返回任何内容。更多信息在这里:https ://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

您在回答中给出的消费者正在做您真正想做的事情,在前一个队列操作的通道上发送消息,这意味着createCopy()完全没用,两个TextChannel对象都是相同的,适当的应该是:

event.getChannel().sendMessage(":warning:Nuked channel:warning:\nhttps://imgur.com/a/93vq9R8").queue();

之后,您立即删除频道,这没有多大意义,因为很可能没有人能够看到核消息。为此,JDA 提供了另一种排队任务的方法,这次有延迟: queueAfter() 它以 along作为值,并以一个TimeUnit对象来指定该值的时间单位是什么,例如:

event.getChannel().delete().queueAfter(10, TimeUnit.SECONDS);

与方法不同,这将使任务在 10 秒内执行,并且不会停止代码的执行complete()

或者,您可以只使用Thread.sleep()将 long 值作为输入:Thread.sleep(10000)持续 10 秒(10000 毫秒)。

您可以在此处找到有关 JDA 和开始提示的更多信息:https ://github.com/DV8FromTheWorld/JDA#creating-the-jda-object


推荐阅读