Java 使用discord JDA清除聊天
我正在用java编写一个discord bot,我使用discord JDA和实用程序依赖项,我尝试使用实用程序一个,但没有成功,所以我尝试使用普通JDA,这就是我所做的,但我需要某种方法告诉bot,如果没有运行命令,不要在新通道中发送消息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
公共类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聊天