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

时间:2021-02-01 22:35:53

标签: java events discord-jda

我想在会员被踢时发送消息,如果他被禁止,我想发送消息。

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

e|---------------------------------|------------------------------------|
e|------------------------------------------------------------------|
B|-----1--------(1)----1-----------|-------1---------------1----------1-|
B|-----1--------(1)----0---------0-----1---------1-----3--------(3)-|
G|-----------0------------0--------|-------------0----------------0-----|
G|-----------0---------------0---------------0---------------0------|
D|-----0h2-----2-------2-----------|-------2-------2-------0--------0---|
D|-----2-------2-------2-------2-------2-------2-------0-------0----|
A|-3-------3-------3-------3-------|------------------------------------|
A|-0-------0--------------------------------------------------------|
E|-----------------------------0---|---1-------1-------3-------3--------|
E|-----------------0-------0--------1------1-------3-------3--------|


e|-------------------------------------------------------------------|
B|-----1---------1-----1---------1-----3---------3-------1---------1-|
G|-----------0---------------0---------------0-----------------0-----|
D|-----3-------2-------2-------2-------0-------0---------2-------2---|
A|-----------------3-------3-------------------------3-------3-------|
E|-1-------1-----------------------3-------3-------------------------|

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

2 个答案:

答案 0 :(得分:2)

您可以使用 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
       });
}

答案 1 :(得分:0)

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

为了检测禁令,您可以使用 GuildBanEvent,但请注意,它不一定表示用户确实已从服务器中删除。

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