如何使用 Java 中的 Discord JDA 在 Discord 上的特定时间发送消息
Posted
技术标签:
【中文标题】如何使用 Java 中的 Discord JDA 在 Discord 上的特定时间发送消息【英文标题】:How to send message at specific time on Discord using Discord JDA in Java 【发布时间】:2021-05-05 02:57:30 【问题描述】:我正在尝试让我的不和谐机器人在特定时间发送消息。我在 Discord JDA 的 ListenerAdapter 中使用 onGuildAvailable(GuildAvailableEvent event) 方法。我也尝试过 onGuildReady(GuildReadyEvent 事件),但这似乎也不起作用。任何帮助表示赞赏。到目前为止,这是我的代码:
private static GuildAvailableEvent e;
private static final Timer timer = new Timer(1000, new Listener());
public void onGuildAvailable(GuildAvailableEvent event)
e = event;
timer.setRepeats(true);
timer.start();
timer.restart();
private static class Listener implements ActionListener
public void actionPerformed(ActionEvent event)
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("e HH:mm");
String time = dtf.format(LocalDateTime.now());
if(time.charAt(0) == '0' || time.charAt(0) == '2' || time.charAt(0) == '3' || time.charAt(0) == '4' || time.charAt(0) == '5')
String message = "Class is starting! Get to class!";
if(time.substring(2, time.length() - 1).equalsIgnoreCase("08:05"))
Objects.requireNonNull(e.getGuild().getDefaultChannel()).sendMessage(message).queue();
else if(time.substring(2, time.length() - 1).equalsIgnoreCase("09:25"))
Objects.requireNonNull(e.getGuild().getDefaultChannel()).sendMessage(message).queue();
else if(time.substring(2, time.length() - 1).equalsIgnoreCase("11:55"))
Objects.requireNonNull(e.getGuild().getDefaultChannel()).sendMessage(message).queue();
else if(time.substring(2, time.length() - 1).equalsIgnoreCase("13:30"))
Objects.requireNonNull(e.getGuild().getDefaultChannel()).sendMessage(message).queue();
else if(time.substring(2, time.length() - 1).equalsIgnoreCase("15:39")) // test time
Objects.requireNonNull(e.getGuild().getDefaultChannel()).sendMessage(message).queue();
【问题讨论】:
【参考方案1】:您可以使用ReadyEvent
,但我建议使用ScheduledExecutorService
发送这些消息。
首先,您必须将当前时间与您想要安排消息的时间进行比较。
public void onReady(@NotNull ReadyEvent event)
// get the current ZonedDateTime of your TimeZone
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
// set the ZonedDateTime of the first lesson at 8:05
ZonedDateTime nextFirstLesson = now.withHour(8).withMinute(05).withSecond(0);
// if it's already past the time (in this case 8:05) the first lesson will be scheduled for the next day
if (now.compareTo(nextFirstLesson) > 0)
nextFirstLesson = nextFirstLesson.plusDays(1);
// duration between now and the beginning of the next first lesson
Duration durationUntilFirstLesson = Duration.between(now, nextFirstLesson);
// in seconds
long initialDelayFirstLesson = durationUntilFirstLesson.getSeconds();
// schedules the reminder at a fixed rate of one day
ScheduledExecutorService schedulerFirstLesson = Executors.newScheduledThreadPool(1);
schedulerFirstLesson.scheduleAtFixedRate(() ->
// send a message
/*
String message = "Class is starting! Get to class!";
JDA jda = event.getJDA();
for (Guild guild : jda.getGuilds())
guild.getDefaultChannel().sendMessage(message).queue();
*/
,
initialDelayFirstLesson,
TimeUnit.DAYS.toSeconds(1),
TimeUnit.SECONDS);
这只是第一课的一个基本概念。其余部分由您决定。
例如,您可能想检查现在是哪一天以便不在周末发送消息,或者只为所有课程使用一个调度程序。
我不知道您是只想将这些消息发送到一个特定的服务器(在这种情况下,您可能只想硬编码公会 ID)还是发送到多个服务器(在这里您可以初始化公会列表或只是获取机器人所在的每个公会)。
【讨论】:
以上是关于如何使用 Java 中的 Discord JDA 在 Discord 上的特定时间发送消息的主要内容,如果未能解决你的问题,请参考以下文章
试图理解 Java 中的时间戳(Discord JDA 和 Mongodb)
如何使用 JDA 在 Discord 服务器(不是用户/机器人 DM)中创建私人频道:Java Discord API
Java:从 Discord JDA 获取并返回邀请 url
如何获取 Bot 消息 ID 并编辑消息 - Discord JDA Java