使用不和谐 JDA 清除聊天

Posted

技术标签:

【中文标题】使用不和谐 JDA 清除聊天【英文标题】:Clearing chat using discord JDA 【发布时间】:2020-08-20 15:55:49 【问题描述】:

我正在用 java 编写一个不和谐机器人,我使用不和谐 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 命令时才发送消息。

【问题讨论】:

【参考方案1】:

我找到了一个解决方案,您可以将消耗品或任何其调用的内容传递给 .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();
            
        
    

【讨论】:

【参考方案2】:

你说你已经明白了,但我想更多地解释它的实际工作原理并完善你的答案。

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*/
    

所以您需要在方法的主体中过滤这些事件,您对答案所做的是检查发送消息的人是否有权管理消息,这不是您实际需要删除频道的权限,它是 @987654327 @,您可以在服务器的角色选项卡中找到。

然后你调用createCopy(),它基本上创建了频道信息的浅表副本

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

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

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

基本上,消费者代表一个将单个参数作为输入的操作(在本例中为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() 它以long 为值,以TimeUnit 对象指定该值的时间单位,例如:

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

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

或者,您可以只使用Thread.sleep(),它需要一个长值作为输入:Thread.sleep(10000) 10 秒(10000 毫秒)。

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

【讨论】:

这是一个很好的解释,但我所做的代码至少可以像我想要的那样完美地工作。这段代码基本上清除了所有聊天(它删除了频道,因为不和谐的清除方法最多只能删除 14 天前)然后它在新创建的频道中写入 nuked chat。无论如何,不​​错的帖子:D

以上是关于使用不和谐 JDA 清除聊天的主要内容,如果未能解决你的问题,请参考以下文章

编辑带有图像附件的嵌入消息在聊天中加倍 - Discord JDA

JDA getMembers() 只返回自机器人启动以来在聊天中写过的用户?

不和谐.js |聊天记录 (txt) 已保存

试图为不和谐制作一个聊天机器人,但它不起作用

如何让我的不和谐机器人只在聊天中工作?

如何让我的不和谐机器人在聊天中显示,例如“机器人正在打字”