Как разрешить автоматическое удаление ботов java Discord через 5 секунд?

Как я могу позволить своему боту Discord Java удалить сообщение, например, через 5 секунд ???

String[] messageArgs = event.getMessage().getContentRaw().toLowerCase().split(" ");
for (String args : messageArgs) {
    if (blacklistWords.contains(args)) {
        if (memberRoles.contains(warn0)) {                          
            event.getMessage().delete().queue();            
            event.getMessage().getChannel().sendMessage
            ("**" + MemberMention + "** unterlasse bitte diese **Wortwahl.**"
             + "\nBei **3 Verwarnungen** wirst du **gekickt!**").queue();

            event.getGuild().addRoleToMember(user, warn1).complete();
            event.getJDA().getGuildById(Secrets.guildID).removeRoleFromMember(user, warn0).complete();

            break;
        }
    }
}

person Dex    schedule 04.06.2020    source источник
comment
Отвечает ли это на ваш вопрос? использовать сообщение об удалении JDA через 10 секунд после отправки   -  person Minn    schedule 04.06.2020


Ответы (3)


Правильный способ сделать это - передать потребителя вашему методу .queue при отправке сообщения. Вместе с RestAction # queueAfter вы получите

channel.sendMessage("message").queue(message -> message.delete().queueAfter(5, 
TIMEUNIT.SECONDS);

см. очередь с Потребителем и queueAfter.

Есть другой способ сделать это, используя RestAction # delay

person Damascus    schedule 06.11.2020

Просто поставьте паузу с чем-то вроде Thread.sleep(5000); перед вызовом функции для удаления сообщения. Это будет пауза на 5000 миллисекунд или 5 секунд.

person David De Martin    schedule 04.06.2020
comment
В результате бот перестанет отвечать на запросы в течение 5 секунд. Не лучшее решение. - person Minn; 04.06.2020

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

String[] messageArgs = event.getMessage().getContentRaw().toLowerCase().split(" ");
for (String args : messageArgs) {
    if (blacklistWords.contains(args)) {
        if (memberRoles.contains(warn0)) {

            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        // pause for 5 seconds
                        wait(5000);

                        event.getMessage().delete().queue();

                        event.getMessage().getChannel().sendMessage
                            ("**" + MemberMention + "** unterlasse bitte diese **Wortwahl.**"
                                > here + "\nBei **3 Verwarnungen** wirst du **gekickt!**").queue();

                        event.getGuild().addRoleToMember(user, warn1).complete();
                        event.getJDA().getGuildById(Secrets.guildID).removeRoleFromMember(user, warn0)
                            .complete();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };

            Thread t = new Thread(r);
            t.start();

            break;
        }
    }
}
person libanbn    schedule 04.06.2020
comment
wait - неправильный способ спать. И для этого не нужно создавать новую ветку. Правильный способ - использовать ScheduledExecutorService или queueAfter. Это объясняется здесь: stackoverflow.com/questions/57564998/ - person Minn; 04.06.2020
comment
спасибо за ответ, я знал queueAfter, но не знаю, как удалить сообщение с помощью queueAfter. Я также прочитал пост ниже. - person Dex; 04.06.2020