以下是使用 Discord4J 发送倒计时信息的示例代码:

import discord4j.common.util.Snowflake;
import discord4j.core.DiscordClient;
import discord4j.core.GatewayDiscordClient;
import discord4j.core.event.domain.lifecycle.ReadyEvent;
import discord4j.core.event.domain.message.MessageCreateEvent;
import discord4j.core.object.entity.Message;
import discord4j.core.object.entity.channel.TextChannel;
import discord4j.rest.util.Color;

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicReference;

public class CountdownBot {

    private static final String TOKEN = "your_bot_token_here";

    public static void main(String[] args) {
        DiscordClient client = DiscordClient.create(TOKEN);
        GatewayDiscordClient gateway = client.login().block();

        gateway.on(ReadyEvent.class)
                .subscribe(event -> {
                    System.out.println("Logged in as: " + event.getSelf().getUsername());
                });

        gateway.on(MessageCreateEvent.class)
                .subscribe(event -> {
                    Message message = event.getMessage();
                    String content = message.getContent();
                    if (content.startsWith("!countdown")) {
                        String[] args1 = content.split("\\s+");
                        if (args1.length != 3) {
                            message.getChannel().block().createMessage("Invalid arguments. Usage: !countdown [event_name] [event_date_time]").block();
                            return;
                        }

                        String eventName = args1[1];
                        String eventDateTimeString = args1[2];

                        LocalDateTime eventDateTime = LocalDateTime.parse(eventDateTimeString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                        LocalDateTime now = LocalDateTime.now();
                        Duration duration = Duration.between(now, eventDateTime);

                        if (duration.isNegative()) {
                            message.getChannel().block().createMessage("Event date time must be in the future.").block();
                            return;
                        }

                        TextChannel channel = message.getChannel().ofType(TextChannel.class).block();
                        AtomicReference<Message> countdownMessage = new AtomicReference<>();
                        countdownMessage.set(channel.createMessage(spec -> {
                            spec.setEmbed(embed -> {
                                embed.setTitle(eventName);
                                embed.setColor(Color.TAHITI_GOLD);
                                embed.setDescription(durationToMessage(duration));
                            });
                        }).block());

                        gateway.getScheduler().schedulePeriodically(() -> {
                            duration = Duration.between(LocalDateTime.now(), eventDateTime);
                            if (duration.isNegative()) {
                                countdownMessage.get().delete().block();
                            } else {
                                countdownMessage.get().edit(spec -> {
                                    spec.setEmbed(embed -> {
                                        embed.setTitle(eventName);
                                        embed.setColor(Color.TAHITI_GOLD);
                                        embed.setDescription(durationToMessage(duration));
                                    });
                                }).block();
                            }
                        }, 1, 1, java.util.concurrent.TimeUnit.SECONDS);
                    }
                });

        gateway.onDisconnect().block();
    }

    private static String durationToMessage(Duration duration) {
        long days = duration.toDays();
        long hours = duration.toHours() % 24;
        long minutes = duration.toMinutes() % 60;
        long seconds = duration.getSeconds() % 60;

        StringBuilder sb = new StringBuilder();
        if (days > 0) {
            sb.append(days).append(" day").append(days == 1 ? "" : "s").append(", ");
        }
        sb.append(hours).append(" hour").append(hours == 1 ? "" : "s").append(", ");
        sb.append(minutes).append(" minute").append(minutes == 1 ? "" : "s").append(", ");
        sb.append(seconds).append(" second").append(seconds == 1 ? "" : "s");
        return sb.toString();
    }
}

此示例代码使用 !countdown 命令创建一个倒计时消息,并每秒钟更新一次倒计时消息。倒计时消息显示事件名称、倒计时剩余时间的天数、小时数、分钟数和秒数。在事件发生后,倒计时消息将自动删除。

java discord4j 发送倒计时信息

原文地址: https://www.cveoy.top/t/topic/bqDU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录