mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-28 00:20:14 +08:00
event hook
This commit is contained in:
parent
73cbb5b2d1
commit
6e8d5ae9fd
@ -18,5 +18,6 @@ public final class MiraiMain {
|
|||||||
new MiraiEventHook<>(ServerDisableEvent.class)
|
new MiraiEventHook<>(ServerDisableEvent.class)
|
||||||
.setHandler(a -> System.out.println("close"))
|
.setHandler(a -> System.out.println("close"))
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
package net.mamoe.mirai.event;
|
package net.mamoe.mirai.event;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import net.mamoe.mirai.event.events.Cancellable;
|
||||||
import net.mamoe.mirai.event.events.MiraiEvent;
|
import net.mamoe.mirai.event.events.MiraiEvent;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public class MiraiEventHook<T extends MiraiEvent> {
|
public class MiraiEventHook<T extends MiraiEvent> {
|
||||||
|
|
||||||
@ -12,22 +14,23 @@ public class MiraiEventHook<T extends MiraiEvent> {
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private Consumer<T> handler;
|
private Consumer<T> handler;
|
||||||
@Getter
|
|
||||||
private MiraiHookPreferences preferences;
|
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private int priority = 0;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private boolean ignoreCancelled = true;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Predicate<T> valid;
|
||||||
|
|
||||||
public MiraiEventHook(Class<T> eventClass) {
|
public MiraiEventHook(Class<T> eventClass) {
|
||||||
this(eventClass,a -> {});
|
this(eventClass,a -> {});
|
||||||
}
|
}
|
||||||
|
|
||||||
public MiraiEventHook(Class<T> eventClass, Consumer<T> handler){
|
public MiraiEventHook(Class<T> eventClass, Consumer<T> handler){
|
||||||
this(eventClass,handler,new MiraiHookPreferences());
|
|
||||||
}
|
|
||||||
|
|
||||||
public MiraiEventHook(Class<T> eventClass, Consumer<T> handler, MiraiHookPreferences preferences){
|
|
||||||
this.eventClass = eventClass;
|
this.eventClass = eventClass;
|
||||||
this.setHandler(handler);
|
this.setHandler(handler);
|
||||||
this.setPreferences(preferences);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MiraiEventHook<T> setHandler(Consumer<T> handler){
|
public MiraiEventHook<T> setHandler(Consumer<T> handler){
|
||||||
@ -35,11 +38,29 @@ public class MiraiEventHook<T extends MiraiEvent> {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MiraiEventHook<T> setPreferences(MiraiHookPreferences preferences){
|
public MiraiEventHook<T> setPriority(int priority){
|
||||||
this.preferences = preferences;
|
this.priority = priority;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MiraiEventHook<T> setIgnoreCancelled(boolean ignoreCancelled){
|
||||||
|
this.ignoreCancelled = ignoreCancelled;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public MiraiEventHook<T> setValid(Predicate<T> valid) {
|
||||||
|
this.valid = valid;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public boolean accept(MiraiEvent event) {
|
||||||
|
if(!(event instanceof Cancellable && event.isCancelled() && this.isIgnoreCancelled())){
|
||||||
|
this.getHandler().accept((T) event);
|
||||||
|
}
|
||||||
|
return this.valid.test((T)event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,11 +26,11 @@ public class MiraiEventManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Lock hooksLock = new ReentrantLock();
|
Lock hooksLock = new ReentrantLock();
|
||||||
private Map<Class<? extends MiraiEvent>, List<MiraiEventConsumer<? extends MiraiEvent>>> hooks = new HashMap<>();
|
private Map<Class<? extends MiraiEvent>, List<MiraiEventHook<? extends MiraiEvent>>> hooks = new HashMap<>();
|
||||||
|
|
||||||
public <D extends MiraiEvent> void registerUntil(MiraiEventHook<D> hook, Predicate<D> toRemove){
|
public <D extends MiraiEvent> void registerUntil(MiraiEventHook<D> hook, Predicate<D> toRemove){
|
||||||
hooks.putIfAbsent(hook.getEventClass(),new ArrayList<>());
|
hooks.putIfAbsent(hook.getEventClass(),new ArrayList<>());
|
||||||
hooks.get(hook.getEventClass()).add(new MiraiEventConsumer<>(hook,toRemove));
|
hooks.get(hook.getEventClass()).add(hook.setValid(toRemove));
|
||||||
}
|
}
|
||||||
|
|
||||||
public <D extends MiraiEvent> void registerOnce(MiraiEventHook<D> hook){
|
public <D extends MiraiEvent> void registerOnce(MiraiEventHook<D> hook){
|
||||||
@ -53,7 +53,7 @@ public class MiraiEventManager {
|
|||||||
hooks.put(event.getClass(),
|
hooks.put(event.getClass(),
|
||||||
hooks.get(event.getClass())
|
hooks.get(event.getClass())
|
||||||
.stream()
|
.stream()
|
||||||
.sorted(Comparator.comparingInt(MiraiEventConsumer::getPriority))
|
.sorted(Comparator.comparingInt(MiraiEventHook::getPriority))
|
||||||
.dropWhile(a -> a.accept(event))
|
.dropWhile(a -> a.accept(event))
|
||||||
.collect(Collectors.toList())
|
.collect(Collectors.toList())
|
||||||
);
|
);
|
||||||
@ -62,23 +62,5 @@ public class MiraiEventManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
class MiraiEventConsumer<T extends MiraiEvent>{
|
|
||||||
private MiraiEventHook<T> hook;
|
|
||||||
private Predicate<T> remove;
|
|
||||||
|
|
||||||
|
|
||||||
public int getPriority(){
|
|
||||||
return hook.getPreferences().getPriority();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public boolean accept(MiraiEvent event) {
|
|
||||||
if(!(event instanceof Cancellable && event.isCancelled() && hook.getPreferences().isIgnoreCanceled())){
|
|
||||||
hook.getHandler().accept((T) event);
|
|
||||||
}
|
|
||||||
return remove.test((T)event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
package net.mamoe.mirai.event;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class MiraiHookPreferences {
|
|
||||||
private int priority = 0;
|
|
||||||
private boolean ignoreCanceled = true;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user