Commit 7ecfee0a authored by Him188moe's avatar Him188moe

Merge remote-tracking branch 'origin/master'

parents cb56add8 8df21a74
package net.mamoe.mirai.event; package net.mamoe.mirai.event;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import net.mamoe.mirai.event.events.Cancellable; import net.mamoe.mirai.event.events.Cancellable;
import net.mamoe.mirai.event.events.MiraiEvent; import net.mamoe.mirai.event.events.MiraiEvent;
import net.mamoe.mirai.event.events.server.ServerDisableEvent;
import java.io.Closeable;
import java.io.IOException;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
public class MiraiEventHook<T extends MiraiEvent> { public class MiraiEventHook<T extends MiraiEvent> implements Closeable {
@Getter @Getter
Class<T> eventClass; Class<T> eventClass;
...@@ -21,6 +25,10 @@ public class MiraiEventHook<T extends MiraiEvent> { ...@@ -21,6 +25,10 @@ public class MiraiEventHook<T extends MiraiEvent> {
@Getter @Getter
private volatile boolean ignoreCancelled = true; private volatile boolean ignoreCancelled = true;
@Getter
@Setter
private volatile boolean mount = false;
/** /**
* return true -> this hook need to be removed * return true -> this hook need to be removed
*/ */
...@@ -28,7 +36,7 @@ public class MiraiEventHook<T extends MiraiEvent> { ...@@ -28,7 +36,7 @@ public class MiraiEventHook<T extends MiraiEvent> {
private Predicate<T> valid; private Predicate<T> valid;
public MiraiEventHook(Class<T> eventClass) { public MiraiEventHook(Class<T> eventClass) {
this(eventClass,a -> {}); this(eventClass,null);
} }
public MiraiEventHook(Class<T> eventClass, Consumer<T> handler){ public MiraiEventHook(Class<T> eventClass, Consumer<T> handler){
...@@ -74,4 +82,29 @@ public class MiraiEventHook<T extends MiraiEvent> { ...@@ -74,4 +82,29 @@ public class MiraiEventHook<T extends MiraiEvent> {
return this.valid.test((T)event); return this.valid.test((T)event);
} }
/**
* 更加安全高效的方式
* Remember to use {@link this.mount()} at last
* */
public static <D extends MiraiEvent> MiraiEventHook<D> onEvent(Class<D> event){
return new MiraiEventHook<>(event);
}
public void mount(){
if(this.handler == null)this.handler = a -> {};
MiraiEventManager.getInstance().registerHook(this);
}
public void mountOnce(){
if(this.handler == null)this.handler = a -> {};
MiraiEventManager.getInstance().hookOnce(this);
}
@Override
public void close(){
this.handler = null;
this.valid = null;
}
} }
...@@ -26,17 +26,11 @@ public class MiraiEventManager { ...@@ -26,17 +26,11 @@ public class MiraiEventManager {
private Map<Class<? extends MiraiEvent>, List<MiraiEventHook<? extends MiraiEvent>>> hooks = new HashMap<>(); private Map<Class<? extends MiraiEvent>, List<MiraiEventHook<? extends MiraiEvent>>> hooks = new HashMap<>();
public <D extends MiraiEvent> void hookUntil(MiraiEventHook<D> hook, Predicate<D> toRemove){ public <D extends MiraiEvent> void hookUntil(MiraiEventHook<D> hook, Predicate<D> toRemove){
hooksLock.lock(); this.mountHook(hook.setValidUntil(toRemove));
hooks.putIfAbsent(hook.getEventClass(),new ArrayList<>());
hooks.get(hook.getEventClass()).add(hook.setValidUntil(toRemove));
hooksLock.unlock();
} }
public <D extends MiraiEvent> void hookWhile(MiraiEventHook<D> hook, Predicate<D> toKeep){ public <D extends MiraiEvent> void hookWhile(MiraiEventHook<D> hook, Predicate<D> toKeep){
hooksLock.lock(); this.mountHook(hook.setValidWhile(toKeep));
hooks.putIfAbsent(hook.getEventClass(),new ArrayList<>());
hooks.get(hook.getEventClass()).add(hook.setValidWhile(toKeep));
hooksLock.unlock();
} }
public <D extends MiraiEvent> void hookOnce(MiraiEventHook<D> hook){ public <D extends MiraiEvent> void hookOnce(MiraiEventHook<D> hook){
...@@ -44,15 +38,25 @@ public class MiraiEventManager { ...@@ -44,15 +38,25 @@ public class MiraiEventManager {
} }
public <D extends MiraiEvent> void registerHook(MiraiEventHook<D> hook){ public <D extends MiraiEvent> void registerHook(MiraiEventHook<D> hook){
this.hookUntil(hook,(a) -> false); this.mountHook(hook);
} }
private <D extends MiraiEvent> void mountHook(MiraiEventHook<D> hook){
if(!hook.isMount()) {
hook.setMount(true);
hooksLock.lock();
hooks.putIfAbsent(hook.getEventClass(), new ArrayList<>());
hooks.get(hook.getEventClass()).add(hook);
hooksLock.unlock();
}
}
/** /**
* 不推荐onEvent * 不推荐onEvent
* 非线程安全 * 由于不能保证Hook的原子性 非线程安全
* 不能保证下一个 D event发生时handler就位 * 不能保证下一个 D event发生时handler就位
* @author NaturalHG Aug27 * @author NaturalHG Aug27
* use {@link MiraiEventHook::onEvent()} to replace
*/ */
@Deprecated @Deprecated
...@@ -85,6 +89,7 @@ public class MiraiEventManager { ...@@ -85,6 +89,7 @@ public class MiraiEventManager {
public void boardcastEvent(MiraiEvent event){ public void boardcastEvent(MiraiEvent event){
hooksLock.lock(); hooksLock.lock();
if(hooks.containsKey(event.getClass())){ if(hooks.containsKey(event.getClass())){
......
...@@ -2,6 +2,7 @@ package net.mamoe.mirai.task; ...@@ -2,6 +2,7 @@ package net.mamoe.mirai.task;
import net.mamoe.mirai.MiraiServer; import net.mamoe.mirai.MiraiServer;
import net.mamoe.mirai.event.MiraiEventHook;
import net.mamoe.mirai.event.events.server.ServerDisableEvent; import net.mamoe.mirai.event.events.server.ServerDisableEvent;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
...@@ -26,9 +27,10 @@ public class MiraiTaskManager { ...@@ -26,9 +27,10 @@ public class MiraiTaskManager {
private MiraiTaskManager() { private MiraiTaskManager() {
this.pool = new MiraiThreadPool(); this.pool = new MiraiThreadPool();
MiraiServer.getInstance().getEventManager() MiraiEventHook
.onEvent(ServerDisableEvent.class) .onEvent(ServerDisableEvent.class)
.setHandler(a -> this.pool.close()); .setHandler(a -> this.pool.close())
.mount();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment