Discord JDA 如何使每个使用它的用户的命令都是唯一的?

Discord JDA How to make command be unique per user that uses it?

本质上,我有一个 onGuildMessageReceived 方法来侦听命令 alarm 用户可以使用该命令设置倒计时以通过消息通知他。他们键入一个时间量和最终警报消息,该消息将在该时间后收到 ping。

我的问题是,我怎样才能让这个功能分别对每个用户起作用,这样其他用户就不会覆盖之前已经设置的闹钟时间?

在主代码中调用此方法开始倒计时。

    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="";
        }
    }   
}

在每个任务结束时,您正在 运行ning 取消 timer 参考,它取消的不是当前正在 运行ning 的计时器(除非没有其他人 运行 命令)而是当前分配给 timer 引用的计时器对象,这使得计时器看起来像是在互相覆盖。

即使您保留了对所有计时器的引用以便可以取消它们,您也无需在任务完成后取消计时器,计时器会自行终止。

此外,您不需要保留对当前 运行ning 计时器的静态引用,或者根本不需要保留对它们的引用。当您创建计时器时,后台线程会保留对计时器和任务的引用,这样它们就不会被垃圾回收。当命令为 运行 时,您最好将计时器创建为局部变量,安排计时器,仅此而已。 如果您希望能够通过不同的命令或任何您想到的方式取消计时器,那么您应该保留一个列表或映射,其中包含对所有当前计时器的引用,以便您可以在需要时取消它们。