当前位置: 首页 > 知识库问答 >
问题:

如何使用Java中的Discord JDA在Discord上发送特定时间的消息

郏博瀚
2023-03-14
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个答案

夏侯俊美
2023-03-14

您可以使用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);
}

这只是第一课的一个基本想法。其余的由您来实现。

 类似资料:
  • 问题内容: 如何要求机器人将消息发送到与机器人接收命令不同的另一个通道(特定通道)? 假设bot 在channel中接收到消息,并且如果操作完成,则bot发送到channel 。 代码: 代码: 问题答案: 答案很简单:

  • 我想创建一个不和谐机器人,每天在特定的时间发送2条消息。下面的代码将使消息进入一个循环,例如每5秒发送一条消息。我如何设置每天发送消息的具体时间,例如,消息1在下午6点,消息2在上午10点。我在这里找到了这段代码,但是没有找到我想要的。

  • 问题是我想将“发送消息”命令集成到一个现有代码中,该代码与主代码冲突。 我尝试过循环消息,例如:等待5分钟,然后每100分钟发送一次“你的消息”,但它进入循环,不会加载我的主代码。 切换订单结果: 主代码之前的“循环消息”代码:在我在我的discord频道上收到我想要的消息后,我按ctrl^C中止,直到我的bot开始加载,但加载后最终由于中止而再次停止$bb命令从未工作,因为主代码未加载。 主代码

  • 我正在阅读websockets,在阅读了大量的教程和博客(主要是关于创建一个简单的聊天应用程序)之后,仍然有一个问题没有得到回答: 那么,是否不可能让一些外部应用程序或事件调用一些脚本(bash或php)来使用现有运行的websocket实例向一个或多个连接的浏览器(websocket客户端)发送/广播一些信息(文本)? 抱歉,如果这是一个愚蠢的问题,但我无法找到答案,通过阅读这些博客在网上。 谢

  • 我想我的机器人发送消息时,有人加入服务器(也提到他们) 我唯一想改变的是,这应该显示在一般渠道(它现在在终端打印它),而不是只显示人的名字,我希望它提到他们。谢谢你的帮助!

  • 问题内容: 如何仅从服务器向特定用户发送websocket消息? 我的webapp具有spring安全设置,并使用websocket。我在尝试仅从服务器向特定用户发送消息时遇到棘手的问题。 通过阅读手册,我的理解是来自我们可以做的服务器 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的方法,但是没有运气。 如果我将其发送到/ topic / reply,它可以工作,但所有其他已连接用户也