Как лучше всего справиться с невозможностью отправить личное сообщение пользователю? - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю над диссон-ботом, который использует личные сообщения для информирования пользователя, если он был предупрежден модератором. Работая над этим, я обнаружил, что есть крайний случай, когда бот не может отправить сообщение пользователю из-за его настроек конфиденциальности. Как я могу написать свой код, чтобы открыть частный канал, попытаться отправить сообщение и обработать невозможность его отправки?

Вот код, который отправляет сообщение:

public static void sendNotification(Warning warning, TextChannel alt) {
    User target = jda.getUserById(warning.getuId());
    if(target == null)
        return;
    target.openPrivateChannel().queue(c -> c.sendMessage(WarningUtil.generateWarningMessage(warning)).queue());
}

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете использовать комбинацию flatMap и onErrorFlatMap:

public RestAction<Message> sendMessage(User user, TextChannel context, String content) {
    return user.openPrivateChannel() // RestAction<PrivateChannel>
        .flatMap((channel) -> channel.sendMessage(content)) // RestAction<Message>
        .onErrorFlatMap(CANNOT_SEND_TO_USER::test,
            (error) -> context.sendMessage("Cannot send direct message to " + user.getAsMention())
        ); // RestAction<Message> (must be the same as above)
}

В качестве альтернативы вы также можете использовать ErrorHandler

public static void sendMessage(User user, String content) {
    user.openPrivateChannel()
        .flapMap(channel -> channel.sendMessage(content))
        .queue(null, new ErrorHandler()
            .handle(ErrorResponse.CANNOT_SEND_TO_USER,
                (ex) -> System.out.println("Cannot send message to user")));
}
...