Discord JDA - 有时有效,有时无效

Posted

技术标签:

【中文标题】Discord JDA - 有时有效,有时无效【英文标题】:Discord JDA - Sometimes working, sometimes not 【发布时间】:2022-01-05 19:08:47 【问题描述】:

我想做的是:

当一个人离开一个特定的语音频道,而这个频道现在是空的,机器人:

删除特定文本频道中除 1 条以外的所有消息 删除他刚刚离开的语音频道

问题:

语音通道已成功删除,但文本通道中的消息未被机器人删除

代码:

@Override
public void onGuildVoiceUpdate(GuildVoiceUpdateEvent event) 
     
    
      VoiceChannel channelLeft = event.getChannelLeft();
                
        if (channelLeft.getName().startsWith("???? Coaching de"))  
            
            if (channelLeft.getMembers().isEmpty())  
  
                channelLeft.delete().queue(); //The bot delete de channel successfully
                
                List<Message> messagesCoaching = event.getChannelLeft().getGuild().getTextChannelById("489420943991635988").getHistory().retrievePast(20).complete(); // Using a list to store the retrieved messages
        
                messagesCoaching.removeIf(m -> m.getId().equals("490567304971812885")); // Removing from the list the message i want to keep 
        
                event.getChannelLeft().getGuild().getTextChannelById("489420943991635988").deleteMessages(messagesCoaching).complete(); // Deleting all the messages (not working)
            
             
            
            
        

【问题讨论】:

【参考方案1】:

我不能 100% 确定您的错误是什么,但我可以向您保证,您正在尝试删除在文本频道中发送的所有消息。

目前,您的代码从您通过 ID 获得的文本通道获取最后 20 条消息。如果您有超过 20 条消息,机器人不会删除这些消息。如果消息超过 2 周,它也不会删除它们。此外,不要使用 complete(),因为这会停止机器人的主线程。我建议使用这样的代码:

    @Override
    public void onGuildVoiceUpdate(GuildVoiceUpdateEvent event) 
        VoiceChannel channelLeft = event.getChannelLeft();

        if (channelLeft.getName().startsWith("? Coaching de")) 

            if (channelLeft.getMembers().isEmpty()) 
                channelLeft.delete().queue(); // Telling the bot to delete the channel.
                MessageHistory history = event.getGuild().getTextChannelById("489420943991635988").getHistory(); // Pulling up the history from a text channel

                history.retrievePast(100).queue(messages ->  // Putting the past 100 messages in a queue, and using a lamba to do something with the returned messages
                    messages.removeIf(m -> m.getId().equals("490567304971812885")); // If a message contains the same ID as told here, it removes it.
                    event.getGuild().getTextChannelById("489420943991635988").deleteMessages(messages).queue(); // And now, delete all messages.
                );
            
        
    

【讨论】:

更好一点,因为它使用队列机制来防止停止整个机器人,直到它设法完成上述任务

以上是关于Discord JDA - 有时有效,有时无效的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 == 比较两个整数有时有效,有时无效? [复制]

R 不一致:为啥 add=T 有时有效,有时在 plot() 函数中无效?

为啥打印 unsigned char 有时有效,有时无效?在 C 中

CSS 过滤器 - 有时有效,有时无效?

在 viewDidLoad 和 viewDidAppear 之前 performSegueWithIdentifier 有时有效,有时无效

document.write 有时有效,有时无效