Discord 机器人每 30 秒更改一次状态 activity jda

Discord bot changing status activity every 30 seconds jda

我想让机器人 refresh/change 状态 (Activity) 每 30 秒发送两条不同的消息

jda.getPresence().setActivity(Activity.playing("message1"));
jda.getPresence().setActivity(Activity.playing("message2"));

基本上,您需要创建一个包含消息的数组和一个在 0 和最后一条消息之间交替的索引:

String[] messages={"message 1","message 2"};
int currentIndex=0;

每隔 30 秒,您可以执行以下操作:

jda.getPresence().setActivity(Activity.playing(messages[currentIndex]));
currentIndex=(currentIndex+1)%messages.length;

这个sets the Activity to the current messagecurrentIndex数组中的元素)最开始。

在此之后,它将 1 添加到 currentIndex

如果 currentIndex 超过数组长度,它会再次将其设置为 0。这是使用 Modulo operation.

完成的

为了每 30 秒执行一次,您可以使用以下方法之一:

java.util.Timer

执行此操作的旧方法是创建 Timer:

//Outside of any method
private String[] messages={"message 1","message 2"};
private int currentIndex=0;
//Run this once
new Timer().schedule(new TimerTask(){
  public void run(){
    jda.getPresence().setActivity(Activity.playing(messages[currentIndex]));
    currentIndex=(currentIndex+1)%messages.length;
  }},0,30_000);

Timer#schedule 可以在特定的延迟后执行一个 TimerTask(0 因为你想马上开始)并让它在指定的时间段后重复(延迟和时间段都以毫秒为单位) .

java.util.concurrent.ScheduledExecutorService

也可以使用允许更多自定义的 ScheduledExecutorService(此方法被认为比 Timer“更好”,例如 Java 并发实践,章节6.2.5):

//outside of any method
private String[] messages = { "message 1", "message 2" };
private int currentIndex = 0;
private ScheduledExecutorService threadPool = Executors.newSingleThreadScheduledExecutor();
//run this once
threadPool.scheduleWithFixedDelay(() -> {
    jda.getPresence().setActivity(Activity.playing(messages[currentIndex]));
    currentIndex = (currentIndex + 1) % messages.length;
}, 0, 30, TimeUnit.SECONDS);
//when you want to stop it (e.g. when the bot is stopped)
threadPool.shutdown();

首先,创建一个允许调度任务的线程池。

这个线程池也可以用于其他任务。

在此示例中,这是使用单个线程完成的。如果要使用多线程,可以使用Executors.newScheduledThreadPool(numberOfThreads);.

在此之后,您调用 ScheduledExecutorService#scheduleWithFixedDelay 每 30 秒运行一次提供的 Runnable

如果您希望它在应用程序停止时自动停止而不调用 shutdown(),您可以通过指定 ThreadFactory:

告诉它使用守护线程
ScheduledExecutorService threadPool = Executors.newSingleThreadScheduledExecutor(r->{
    Thread t=new Thread(r);
    t.setDaemon(true);
    return t;
});