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