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

7cjasjjr  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(342)

本质上,我有一个ongildmessagereceived方法,用于侦听命令警报,用户可以使用该方法设置倒计时以用消息通知他。他们输入一个时间量和最终的报警信息,并在该时间之后收到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="";
        }
    }   
}
qni6mghb

qni6mghb1#

在每个任务结束时,您将在 timer 引用,它取消的不是当前正在运行的计时器(除非没有其他人运行该命令),而是当前分配给 timer 参考,使它看起来像定时器是相互覆盖。
即使您保留了对所有计时器的引用以便可以取消它们,也不需要在任务完成后取消计时器,计时器会自动终止。
此外,您不需要保持对当前正在运行的计时器的静态引用,也不需要保持对它们的引用。创建计时器时,后台线程会保留对计时器和任务的引用,这样它们就不会被垃圾收集。最好在命令运行时将计时器创建为局部变量,并对计时器进行调度,仅此而已。如果你想通过一个不同的命令或任何你想取消计时器的功能,那么你应该保留一个列表或Map,其中包含所有当前计时器的引用,这样你就可以在需要时取消它们。

相关问题