JDA:如何检测成员是如何从公会中移除的?

Posted

技术标签:

【中文标题】JDA:如何检测成员是如何从公会中移除的?【英文标题】:JDA: How to detect how a Member got removed from the guild? 【发布时间】:2021-05-06 03:02:20 【问题描述】:

我想在一个成员被踢时发送消息,如果他被禁止发送另一个消息。

所以在 JDA 的文档中,onGuildMemberRemove 事件包括 Kick、Ban 和 Normal Leave。

    @Override
    public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) 

    

但是我现在应该如何检测成员何时被禁止或踢出?

【问题讨论】:

【参考方案1】:

您可以使用retrieveAuditLogs 并检查该用户最近是否被禁止或踢出目标。

例子:

@Override
public void onGuildMemberRemove(GuildMemberRemoveEvent event) 
  event.getGuild()
       .retrieveAuditLogs()
       .queueAfter(1, TimeUnit.SECONDS, (logs) ->  // Gotta wait a second for discord to populate the logs properly
         boolean isBan = false, isKick = false;
         for (AuditLogEntry log : logs) 
             if (log.getTargetIdLong() == event.getUser().getIdLong()) 
                 isBan = log.getType() == ActionType.BAN;
                 isKick = log.getType() == ActionType.KICK;
                 break;
             
         
         ... code here
       );

【讨论】:

我也可以得到用方法踢/禁止会员的会员吗? 是AuditLogEntry#getUser 还有可能得到Kick的原因吗,对于Ban你可以使用retriveBanEntries,但是对于kick是否有可能从AuditLogEntry得到原因?【参考方案2】:

实现此目的的唯一方法是使用机器人踢或禁止,因为您无法区分用户被踢或禁止或使用GuildMemberRemoveEvent“正常”离开。

您可以使用GuildBanEvent 来检测封禁,但请注意,这并不一定表示用户确实已从服务器中删除。

如果您使用您的机器人来踢和禁止用户,您可以在每次发出踢或禁止命令时发送自定义消息。如果用户离开并且不是命令的主题,您可以改为发送正常消息。

【讨论】:

以上是关于JDA:如何检测成员是如何从公会中移除的?的主要内容,如果未能解决你的问题,请参考以下文章

从 DOM 中移除的元素中取消绑定事件

html元素移除回调

云原生周刊:K8s 在 v1.27 中移除的特性和主要变更

如何从 UITextField 中移除焦点?

如何从JavaScript对象中移除一个属性

微信小程序怎么移除拼多多 微信小程序如何移除拼多多