Java 使用discord JDA清除聊天

Java 使用discord JDA清除聊天,java,discord-jda,Java,Discord Jda,我正在用java编写一个discord bot,我使用discord JDA和实用程序依赖项,我尝试使用实用程序一个,但没有成功,所以我尝试使用普通JDA,这就是我所做的,但我需要某种方法告诉bot,如果没有运行命令,不要在新通道中发送消息 公共类NukeCommand扩展ListeneraAdapter{ @凌驾 已接收公共无效OnGuildMessage(GuildMessageReceivedEvent事件){ if(event.getMessage().getContentRaw().e

我正在用java编写一个discord bot,我使用discord JDA和实用程序依赖项,我尝试使用实用程序一个,但没有成功,所以我尝试使用普通JDA,这就是我所做的,但我需要某种方法告诉bot,如果没有运行命令,不要在新通道中发送消息

公共类NukeCommand扩展ListeneraAdapter{
@凌驾
已接收公共无效OnGuildMessage(GuildMessageReceivedEvent事件){
if(event.getMessage().getContentRaw().equalsIgnoreCase(“.nuke”)){
event.getChannel().createCopy().queue();
event.getChannel().delete().queue();
}
}
@凌驾
public void onTextChannelCreate(TextChannelCreateEvent createEvent){
createEvent.getChannel().sendMessage(“:警告:无核通道:警告:\nhttps://imgur.com/a/93vq9R8)队列();
}
我对这两方面的答案都持开放态度。 这就是我想要的效果: 我有同样的效果,但每次我创建一个文本频道时,它都会发送消息。
我希望它仅在运行.nuke命令时发送消息。

我找到了一个解决方案,您可以将消耗品或其调用的任何内容传递到.queue方法中,该代码将在创建通道时运行。 我所做的:


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

你说你已经知道了,但我想我应该解释一下它是如何工作的,并完善你的答案

ListenerAdapter
的方法将为bot整个范围内发生的每个事件调用,例如,如果您

class Adapter extends ListenerAdapter {
    @Override
    public void onMessageReceived(MessageReceivedEvent event){
       /*This will be called for every message, everywhere, including the bot's private channel*/
    }
}
因此,您需要在方法主体中过滤这些事件,您在回答中所做的是检查发送消息的人是否有权限管理消息,而这不是您实际需要删除频道的权限,而是
权限。您可以在服务器的“角色”选项卡上找到“管理频道”

然后调用
createCopy()
,它基本上会创建频道信息的浅拷贝

我不认为你真的想这么做

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

队列方法可以将
消费者
作为参数,这意味着什么

基本上,使用者表示一个操作,该操作将单个参数作为输入(在本例中为
TextChannel
),但不返回任何内容。有关详细信息,请参见:

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

event.getChannel().sendMessage(":warning:Nuked channel:warning:\nhttps://imgur.com/a/93vq9R8").queue();
之后,您将立即删除该频道,这没有多大意义,因为很可能没有人能够看到被屏蔽的消息。 为此,JDA提供了另一种对任务进行排队的方法,这次有延迟:
queueAfter()
它使用
long
作为值,使用
TimeUnit
对象指定所述值的时间单位,例如:

event.getChannel().delete().queueAfter(10, TimeUnit.SECONDS);
这将在10秒内对要执行的任务进行排队,并且与
complete()
方法不同,它不会停止代码的执行

除此之外,您还可以使用
Thread.sleep()
,它接受一个长值作为输入:
Thread.sleep(10000)
持续10秒(10000毫秒)


您可以在这里找到更多关于JDA和开始提示的信息:

这是一个很好的解释,但我所做的代码至少与我想要的完全一样。这段代码基本上清除了所有聊天(它删除了频道,因为discord purge方法最多只能删除14天)然后它在新创建的频道中写nuked聊天