-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathEventBus.java
More file actions
62 lines (55 loc) · 2.56 KB
/
EventBus.java
File metadata and controls
62 lines (55 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package dev.xatuos.chatrobo.impl.events;
import dev.xatuos.chatrobo.ChatRobo;
import dev.xatuos.chatrobo.api.events.Event;
import dev.xatuos.chatrobo.api.events.IEventBus;
import dev.xatuos.chatrobo.api.events.SubscribeEvent;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
public class EventBus implements IEventBus {
private final Map<Class<? extends Event>, Map<String, List<IEventListener>>> listeners;
public EventBus() {
this.listeners = new ConcurrentHashMap<>();
}
@Override
public void register(@NotNull String namespace, @NotNull Class<? extends Event> event, @NotNull IEventListener listener) {
Map<String, List<IEventListener>> listeners = this.listeners.getOrDefault(event, new ConcurrentHashMap<>());
List<IEventListener> listenerList = listeners.getOrDefault(namespace, new Vector<>());
listenerList.add(listener);
if (!listeners.containsKey(namespace)) listeners.put(namespace, listenerList);
if (!this.listeners.containsKey(event)) this.listeners.put(event, listeners);
}
@Override
public void register(@NotNull String namespace, @NotNull Object listener) {
Method[] methods = listener.getClass().getMethods();
for (Method method : methods) {
if (method.getAnnotation(SubscribeEvent.class) == null) continue;
if (method.getParameterCount() != 1) continue;
if (Event.class.isAssignableFrom(method.getParameterTypes()[0])) continue;
Class<?> clazz = method.getParameterTypes()[0];
if (!(clazz.isAssignableFrom(Event.class))) continue;
Class<? extends Event> event = clazz.asSubclass(Event.class);
this.register(namespace, event, (event1) -> {
try {
method.invoke(listener, event1);
} catch (IllegalAccessException | InvocationTargetException exception) {
ChatRobo.LOGGER.printStackTrace(exception);
}
});
}
}
@Override
public void call(@NotNull Event event) {
Map<String, List<IEventListener>> listeners = this.listeners.getOrDefault(event.getClass(), null);
if (listeners == null) return;
for (List<IEventListener> listenerList : listeners.values()) {
for (IEventListener listener : listenerList) {
listener.call(event);
}
}
}
}