【发布时间】:2021-09-18 14:21:00
【问题描述】:
目前我正在尝试创建一个计时器,在每周的特定时间(星期四下午 1:00)通知我。我现在面临的问题是如何在不执行任何操作的情况下触发计时器启动。每次机器人启动时,我都需要计时器自行启动。任何帮助表示赞赏。
这是我的代码:
public class Reminder extends ListenerAdapter {
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent e) {
if (e.getGuild().getId().equalsIgnoreCase("77804326694381163")) {
TextChannel defaultChannel = e.getGuild().getDefaultChannel();
if (defaultChannel != null) {
Calendar time = Calendar.getInstance();
ZoneId zoneId = ZoneId.of("America/Los_Angeles");
time.setTimeZone(TimeZone.getTimeZone(zoneId));
Date timeGet = time.getTime();
DateFormat df = new SimpleDateFormat("EE HH:mm:ss");
String string = df.format(timeGet);
if (string.equalsIgnoreCase("Thu 13:00:00")) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
defaultChannel.getChannel().sendTyping().queue();
defaultChannel.getChannel().sendMessage("Works").queue();
}
}, time.getTime(), TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS));
}
} else if (defaultChannel == null) {
e.getChannel().sendTyping().queue();
e.getChannel().sendMessage("Failed to get default channel.").queue();
}
}
}
}
【问题讨论】:
-
您需要考虑如何存储不同运行之间的时间。也许您可以将 DateTime 字符串存储在数据库中,甚至将其写入文件,然后当机器人重新启动时,您只需从数据库或文件中加载数据,然后您的应用程序需要做的就是每 10 秒循环一次并检查时间是否已到达列表中。
-
嗯,不错的主意。但也许有更简单的方法吗?我认为这会更容易一些:p。
-
我不知道你说的更简单是什么意思?您需要在机器人重新启动之间的某处存储信息,否则,每次机器人开始检查以前的命令时,您都必须重新扫描整个频道内容。虽然这是可能的,但它既不高效也不有效,并且当频道收到太多消息时会中断,并且不和谐会对您的机器人施加速率限制以尝试扫描数百万条旧消息。保存到文件相对容易,有很多可用的教程,但您需要考虑创建一个循环,或使用结束/触发器启动计时器。
标签: java discord-jda