java - 使用 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 命令时才发送消息。
解决方案
你说你已经明白了,但我想更多地解释它是如何工作的并完善你的答案。
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
推荐阅读
- amazon-web-services - 如何在一个 aws 域下托管多个静态网站、S3 存储桶?
- c# - GetFiles 排除字符串
- angular - 打字稿 - 类型“{..}”上不存在属性
- mysql - express.js 错误中的 API 删除方法
- node.js - 护照:身份验证不起作用
- validation - 仅保存非空数据集
- gams-math - 如何定义并集、交集、对称差?
- c# - c# 如何以编程方式加载具有相同命名空间的外部程序集
- javascript - JavaScript 承诺不会按顺序触发
- asp.net-core - Asp.net core 2.0 本地化在部分视图中不起作用。