From bd7e08b483da5e36aa0f99f431999a1e83c679ac Mon Sep 17 00:00:00 2001 From: liujiahua123123 Date: Thu, 8 Aug 2019 23:25:05 +0800 Subject: [PATCH] Event Hook --- .../main/java/net/mamoe/mirai/MiraiMain.java | 30 ++++++++++++++++--- .../net/mamoe/mirai/event/MiraiEventHook.java | 14 ++++++++- .../mamoe/mirai/event/MiraiEventManager.java | 27 ++++++++++++++++- 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java b/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java index 026b2c8e6..3dd428da5 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/MiraiMain.java @@ -14,10 +14,32 @@ public final class MiraiMain { Runtime.getRuntime().addShutdownHook(new Thread(() -> { server.shutdown(); })); - server.getEventManager().register( - new MiraiEventHook<>(ServerDisableEvent.class) - .setHandler(a -> System.out.println("close")) - ); + server.getEventManager() + .onEvent(ServerDisableEvent.class) + .setHandler(a -> { + System.out.println("?"); + }); + + server.getEventManager() + .onEventOnce(ServerDisableEvent.class) + .setHandler(a -> { + System.out.println("?"); + }); + + server.getEventManager() + .onEvent(ServerDisableEvent.class) + .setHandler(a -> { + System.out.println("?"); + }) + .setValidWhile((a) -> true); + + + server.getEventManager() + .onEvent(ServerDisableEvent.class) + .setHandler(a -> { + System.out.println("?"); + }) + .setValidUntil((a) -> true); } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventHook.java b/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventHook.java index ec6df9d90..8382c5a23 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventHook.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventHook.java @@ -21,6 +21,9 @@ public class MiraiEventHook { @Getter private boolean ignoreCancelled = true; + /** + * return true -> this hook need to be removed + */ @Getter private Predicate valid; @@ -49,11 +52,20 @@ public class MiraiEventHook { } - public MiraiEventHook setValid(Predicate valid) { + private MiraiEventHook setValid(Predicate valid) { this.valid = valid; return this; } + public MiraiEventHook setValidUntil(Predicate valid) { + return this.setValid(valid); + } + + public MiraiEventHook setValidWhile(Predicate valid) { + return this.setValid(valid.negate()); + } + + @SuppressWarnings("unchecked") public boolean accept(MiraiEvent event) { if(!(event instanceof Cancellable && event.isCancelled() && this.isIgnoreCancelled())){ diff --git a/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java b/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java index 47eb1c4d3..b19afa53d 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/event/MiraiEventManager.java @@ -30,7 +30,12 @@ public class MiraiEventManager { public void registerUntil(MiraiEventHook hook, Predicate toRemove){ hooks.putIfAbsent(hook.getEventClass(),new ArrayList<>()); - hooks.get(hook.getEventClass()).add(hook.setValid(toRemove)); + hooks.get(hook.getEventClass()).add(hook.setValidUntil(toRemove)); + } + + public void registerWhile(MiraiEventHook hook, Predicate toKeep){ + hooks.putIfAbsent(hook.getEventClass(),new ArrayList<>()); + hooks.get(hook.getEventClass()).add(hook.setValidWhile(toKeep)); } public void registerOnce(MiraiEventHook hook){ @@ -47,6 +52,26 @@ public class MiraiEventManager { return hook; } + public MiraiEventHook onEventOnce(Class event){ + MiraiEventHook hook = new MiraiEventHook<>(event); + this.registerOnce(hook); + return hook; + } + + public MiraiEventHook onEventUntil(Class event, Predicate toRemove){ + MiraiEventHook hook = new MiraiEventHook<>(event); + this.registerUntil(hook,toRemove); + return hook; + } + + public MiraiEventHook onEventWhile(Class event, Predicate toKeep){ + MiraiEventHook hook = new MiraiEventHook<>(event); + this.registerWhile(hook,toKeep); + return hook; + } + + + public void boardcastEvent(MiraiEvent event){ hooksLock.lock(); if(hooks.containsKey(event.getClass())){