Discord JDA Как сделать команду уникальной для каждого пользователя, который ее использует?

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

У меня вопрос: как я могу заставить эту функцию работать для каждого пользователя отдельно, чтобы другие пользователи не перезаписывали предыдущее время будильника, которое уже было отмечено?

Этот метод вызывается в основном коде для запуска обратного отсчета.

    public void StartTimer(int seconds, GuildMessageReceivedEvent event) 
{
    timer = new Timer();
    timer.schedule(new TimerReminder(event), seconds * 1000);
}
public void StartTimer(int seconds, GuildMessageReceivedEvent event, String text) 
{
    timer = new Timer();
    timer.schedule(new TimerReminder(event, text), seconds * 1000);
}

У меня есть этот подкласс, который выполняет блок кода после времени .schedule ().

class TimerReminder extends TimerTask{
    GuildMessageReceivedEvent eventtrigger;
    String alarmText = "";
    private TimerReminder(GuildMessageReceivedEvent event) 
    {
        eventtrigger=event;
    }
    private TimerReminder(GuildMessageReceivedEvent event, String alarmArg) 
    {
        eventtrigger=event;
        alarmText=alarmArg;
        
    }
    public void run() 
    {
        if(alarmText.isEmpty()) 
        {
            eventtrigger.getChannel().sendMessage("<@"+auth+">, ***your alarm is ringing!***????????????????").queue();
            timer.cancel(); // Terminate the timer thread
            
        }
        else 
        {
            eventtrigger.getChannel().sendMessage("<@"+auth+">:\n"+alarmText).queue();
            timer.cancel(); // Terminate the timer thread
            alarmText="";
        }
    }   
}

person Karlo Jačmenjak    schedule 19.11.2020    source источник


Ответы (1)


В конце каждой задачи вы запускаете cancel для ссылки timer, которая отменяет не запущенный в данный момент таймер (если только никто другой не запустил команду), а скорее объект таймера, который в данный момент назначен ссылке timer, которая создает впечатление, что таймеры перезаписывают друг друга.

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

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

person MrBorder    schedule 20.11.2020
comment
О, теперь это действительно имеет смысл! Ну да, я имел в виду добавить опцию отмены, и Ваш ответ дал мне руководство по выполнению остальной части функции. Спасибо за ваше время и усилия, чтобы выручить меня! - person Karlo Jačmenjak; 21.11.2020