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 message(currentIndex
数组中的元素)最开始。
在此之后,它将 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;
});
我想让机器人 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 message(currentIndex
数组中的元素)最开始。
在此之后,它将 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;
});