Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,4 @@ default int performPrefixedCommand(S source, String string) {
string = string.startsWith("/") ? string.substring(1) : string;
return this.performCommand(source, string);
}


}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.xatuos.chatrobo.api.events;

public interface IEvent {
public abstract class Event {
}
30 changes: 30 additions & 0 deletions src/main/java/dev/xatuos/chatrobo/api/events/IEventBus.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,34 @@
package dev.xatuos.chatrobo.api.events;

import org.jetbrains.annotations.NotNull;

public interface IEventBus {
/**
* 注册事件监听器
*
* @param namespace 命名空间
* @param event 事件类型
* @param listener 事件监听器
*/
void register(@NotNull String namespace, @NotNull Class<? extends Event> event, @NotNull IEventListener listener);

/**
* 注册事件监听器
*
* @param namespace 命名空间
* @param listener 事件监听器
*/
void register(@NotNull String namespace, @NotNull Object listener);

/**
* 发布事件
*
* @param event 事件
*/
void call(@NotNull Event event);

@FunctionalInterface
interface IEventListener {
void call(Event event);
}
}
62 changes: 62 additions & 0 deletions src/main/java/dev/xatuos/chatrobo/impl/events/EventBus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,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);
}
}
}
}