JDA: Как определить, как участник был исключен из гильдии?

Я хочу отправить сообщение, когда одного участника выгнали, а другого - если его забанили.

Итак, в документации JDA указано, что событие onGuildMemberRemove включает Kick, Ban и Normal Leave.

    @Override
    public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) {

    }

Но как мне теперь определить, когда участника забанили или выгнали?


person Shiru    schedule 01.02.2021    source источник


Ответы (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
       });
}
person Minn    schedule 02.02.2021
comment
Могу ли я также получить участника, который кикнул / заблокировал участника с помощью метода? - person Shiru; 03.02.2021
comment
Да, AuditLogEntry # getUser - person Minn; 03.02.2021
comment
И возможно ли также получить причину Kick, для Ban вы можете использовать retriveBanEntries, но для удара можно ли получить Reason из AuditLogEntry? - person Shiru; 04.02.2021

Единственный способ добиться этого - использовать бота для кикинга или бана, поскольку вы не можете отличить пользователя, которого выгнали или забанили, или «нормального» ухода с помощью GuildMemberRemoveEvent.

Для обнаружения банов вы можете использовать GuildBanEvent, но имейте в виду, что это не обязательно означает, что пользователь действительно удален с сервера.

Если вы используете своего бота, чтобы выгнать и заблокировать пользователя, вы можете отправлять настраиваемое сообщение каждый раз, когда выдается команда кик или бан. Если пользователь уходит, и он не был предметом команды, вы можете вместо этого отправить обычное сообщение.

person Danny    schedule 02.02.2021