mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-10 12:17:03 +08:00
Events and Tasks
This commit is contained in:
parent
d411df85ca
commit
5d0e600f9f
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright 2020 Mamoe Technologies and contributors.
|
||||
*
|
||||
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
|
||||
*
|
||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
package net.mamoe.mirai.console.events;
|
||||
|
||||
import kotlinx.coroutines.GlobalScope;
|
||||
import net.mamoe.mirai.event.Event;
|
||||
import net.mamoe.mirai.event.Listener;
|
||||
import net.mamoe.mirai.event.ListeningStatus;
|
||||
import net.mamoe.mirai.event.internal.EventInternalJvmKt;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* 事件处理
|
||||
*/
|
||||
public final class Events {
|
||||
|
||||
/**
|
||||
* 监听一个事件, 当 {@code onEvent} 返回 {@link ListeningStatus#STOPPED} 时停止监听.
|
||||
* 机器人离线后不会停止监听.
|
||||
*
|
||||
* @param eventClass 事件类
|
||||
* @param onEvent 事件处理. 返回 {@link ListeningStatus#LISTENING} 时继续监听.
|
||||
* @param <E> 事件类型
|
||||
* @return 事件监听器. 可调用 {@link Listener#complete()} 或 {@link Listener#completeExceptionally(Throwable)} 让监听正常停止或异常停止.
|
||||
*/
|
||||
@NotNull
|
||||
public static <E extends Event> Listener<E> subscribe(@NotNull Class<E> eventClass, @NotNull Function<E, ListeningStatus> onEvent) {
|
||||
return EventInternalJvmKt._subscribeEventForJaptOnly(eventClass, GlobalScope.INSTANCE, onEvent);
|
||||
}
|
||||
|
||||
/**
|
||||
* 监听一个事件, 直到手动停止.
|
||||
* 机器人离线后不会停止监听.
|
||||
*
|
||||
* @param eventClass 事件类
|
||||
* @param onEvent 事件处理. 返回 {@link ListeningStatus#LISTENING} 时继续监听.
|
||||
* @param <E> 事件类型
|
||||
* @return 事件监听器. 可调用 {@link Listener#complete()} 或 {@link Listener#completeExceptionally(Throwable)} 让监听正常停止或异常停止.
|
||||
*/
|
||||
@NotNull
|
||||
public static <E extends Event> Listener<E> subscribeAlways(@NotNull Class<E> eventClass, @NotNull Consumer<E> onEvent) {
|
||||
return EventInternalJvmKt._subscribeEventForJaptOnly(eventClass, GlobalScope.INSTANCE, onEvent);
|
||||
}
|
||||
|
||||
/**
|
||||
* 阻塞地广播一个事件.
|
||||
*
|
||||
* @param event 事件
|
||||
* @param <E> 事件类型
|
||||
* @return {@code event} 本身
|
||||
*/
|
||||
@NotNull
|
||||
public static <E extends Event> E broadcast(@NotNull E event) {
|
||||
return EventsImplKt.broadcast(event);
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright 2020 Mamoe Technologies and contributors.
|
||||
*
|
||||
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
|
||||
*
|
||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
package net.mamoe.mirai.console.events;
|
||||
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import net.mamoe.mirai.event.Event
|
||||
import net.mamoe.mirai.event.broadcast
|
||||
|
||||
internal fun <E : Event> broadcast(e: E): E = runBlocking { e.broadcast() }
|
@ -0,0 +1,69 @@
|
||||
package net.mamoe.mirai.console.scheduler
|
||||
|
||||
import net.mamoe.mirai.console.plugins.PluginBase
|
||||
|
||||
interface SchedulerTask<T:PluginBase>{
|
||||
abstract fun onTick(i:Long)
|
||||
abstract fun onRun()
|
||||
}
|
||||
|
||||
abstract class RepeatTask<T:PluginBase>(
|
||||
val intervalInMs: Int
|
||||
):SchedulerTask<T>{
|
||||
|
||||
override fun onTick(i: Long) {
|
||||
if(i%intervalInMs == 0L){
|
||||
onRun()
|
||||
}
|
||||
}
|
||||
|
||||
companion object{
|
||||
fun <T:PluginBase> of(
|
||||
intervalInMs: Int, runnable: () -> Unit
|
||||
):RepeatTask<T>{
|
||||
return AnonymousRepeatTask<T>(
|
||||
intervalInMs, runnable
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class AnonymousRepeatTask<T: PluginBase>(
|
||||
intervalInMs: Int, private val runnable: () -> Unit
|
||||
): RepeatTask<T>(intervalInMs){
|
||||
override fun onRun() {
|
||||
runnable.invoke()
|
||||
}
|
||||
}
|
||||
|
||||
fun <T:PluginBase> T.repeatTask(
|
||||
intervalInMs: Int, runnable: () -> Unit
|
||||
):RepeatTask<T>{
|
||||
return AnonymousRepeatTask<T>(
|
||||
intervalInMs, runnable
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
fun <T> repeatTask(){
|
||||
|
||||
}
|
||||
|
||||
class X: PluginBase() {
|
||||
override fun onLoad() {
|
||||
//kotlin
|
||||
this.repeatTask(5){
|
||||
|
||||
}
|
||||
//java1
|
||||
RepeatTask.of<X>(5){
|
||||
|
||||
}
|
||||
//java2
|
||||
class Xtask:RepeatTask<X>(5){
|
||||
override fun onRun() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user