diff --git a/ContentGrabbingJi-Event/pom.xml b/ContentGrabbingJi-Event/pom.xml
new file mode 100644
index 0000000..c45cf82
--- /dev/null
+++ b/ContentGrabbingJi-Event/pom.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+ ContentGrabbingJi
+ net.lamgc
+ 3.0.0-alpha-SNAPSHOT
+
+ 4.0.0
+
+ ContentGrabbingJi-Event
+
+
+
\ No newline at end of file
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/AbstractEventObject.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/AbstractEventObject.java
new file mode 100644
index 0000000..8697cc9
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/AbstractEventObject.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import java.util.UUID;
+
+/**
+ * 抽象事件对象.
+ *
已完成对 {@link EventObject#getEventId()} 的实现.
+ * @author LamGC
+ */
+public abstract class AbstractEventObject implements EventObject {
+
+ private final UUID eventId = UUID.randomUUID();
+
+ @Override
+ public UUID getEventId() {
+ return eventId;
+ }
+
+}
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/Cancelable.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/Cancelable.java
new file mode 100644
index 0000000..53b835e
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/Cancelable.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import java.util.Observer;
+
+/**
+ * 可取消接口.
+ *
实现了该接口的事件可对其处理进行取消.
+ *
取消状态不可撤回.
+ * @author LamGC
+ */
+public interface Cancelable {
+
+ /**
+ * 检查事件是否已被取消.
+ * @return 如果事件已被取消, 返回 true.
+ */
+ boolean canceled();
+
+ /**
+ * 注册事件取消监听器.
+ *
注意: 如果发生取消事件, 无论 {@link java.util.Observable} 是否为事件对象本身, 参数 {@code arg} 都必须传递事件对象自身!
+ * @param cancelObserver 观察者对象.
+ * @throws UnsupportedOperationException 当该可取消对象不支持 {@link java.util.Observable} 时抛出,
+ * 既然不支持观察取消事件, 那么 {@link #observableCancel()} 应当返回 {@code false}, 否则该方法不允许抛出该异常.
+ */
+ void registerCancelObserver(Observer cancelObserver) throws UnsupportedOperationException;
+
+ /**
+ * 是否可观察取消事件.
+ *
如果本方法返回 {@code true},
+ * 那么 {@link #registerCancelObserver(Observer)} 不允许抛出 {@link UnsupportedOperationException} 异常.
+ * @return 如果可以, 返回 true.
+ */
+ boolean observableCancel();
+
+}
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventExecutor.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventExecutor.java
new file mode 100644
index 0000000..5072944
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventExecutor.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+/**
+ * 事件执行器.
+ * @author LamGC
+ */
+public interface EventExecutor {
+
+ /**
+ * 执行事件.
+ * @param event 事件对象.
+ */
+ void execute(EventObject event);
+
+ /**
+ * 是否为异步事件执行器.
+ * @return 如果为异步事件执行器, 返回 {@code true}, 如果为同步事件执行器, 返回 {@code false}.
+ */
+ boolean isAsync();
+
+}
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventHandler.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventHandler.java
new file mode 100644
index 0000000..8090350
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventHandler.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 事件处理器注解.
+ *
标记了该注解的方法, 如符合处理方法条件, 则会被 {@link EventHandlerRegistry} 注册为事件处理方法.
+ * @author LamGC
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface EventHandler {
+
+ /**
+ * 是否接受事件对象的子类.
+ *
当该选项为 {@code true} 时, 子类事件也会传递到该方法进行处理.
+ * 例如事件 Parent, 和它的子类 Child, 处理方法: {@code handler(Parent event)};
+ * 如果该选项为 {@code true}, 那么 Child 也会传递到该方法进行处理, 反之, 如果该选项为 {@code false},
+ * 那么该方法只会接收 Parent 事件, 而不会接收它的子类 Child.
+ *
默认值: {@code false}
+ * @return 返回该方法是否支持继承性.
+ */
+ boolean inheritable() default false;
+
+}
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventHandlerRegistry.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventHandlerRegistry.java
new file mode 100644
index 0000000..caa71a0
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventHandlerRegistry.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * 事件处理注册器.
+ *
实现了该接口的类将允许注册事件处理方法.
+ * @author LamGC
+ */
+public interface EventHandlerRegistry {
+
+ /**
+ * 注册对象中的事件处理方法.
+ * @param handlerObject 包含事件处理方法的对象.\
+ * @return 返回已成功添加的方法数.
+ */
+ int registerHandler(Object handlerObject);
+
+ /**
+ * 获取能处理指定事件的所有方法.
+ * @param event 待匹配的事件对象.
+ * @return 返回一个集合, 集合存储了可处理该事件的所有方法.
+ */
+ Map getMatchedHandlerMethod(EventObject event);
+
+}
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventObject.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventObject.java
new file mode 100644
index 0000000..66a65f6
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventObject.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import java.util.UUID;
+
+/**
+ * 事件对象.
+ * @author LamGC
+ */
+public interface EventObject {
+
+ /**
+ * 获取事件 UUID.
+ * 需保证 UUID 对应了唯一的事件对象, 即使内容重复.
+ * @return 返回事件Id.
+ */
+ UUID getEventId();
+
+}
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventUtils.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventUtils.java
new file mode 100644
index 0000000..6132cb1
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/EventUtils.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 事件处理工具类.
+ * @author LamGC
+ */
+public final class EventUtils {
+
+ /**
+ * 检查 {@link EventExecutor} 是否支持取消事件.
+ * @param executor 事件执行器.
+ * @return 如果支持, 返回 {@code true}
+ */
+ public static boolean isSupportedCancel(EventExecutor executor) {
+ return executor instanceof SupportedCancel;
+ }
+
+ /**
+ * 检查方法是否符合事件处理方法条件.
+ * @param method 待检查的方法.
+ * @return 如果符合, 返回 true.
+ */
+ public static boolean checkEventHandlerMethod(Method method) {
+ int modifiers = method.getModifiers();
+ // 新版事件系统将不再允许静态方法作为事件处理方法, 以降低管理难度.
+ if (!Modifier.isPublic(modifiers) || Modifier.isAbstract(modifiers) || Modifier.isStatic(modifiers)) {
+ return false;
+ }
+ if (!method.isAnnotationPresent(EventHandler.class) || method.getParameterCount() != 1) {
+ return false;
+ }
+
+ Class> param = method.getParameterTypes()[0];
+ if (!EventObject.class.isAssignableFrom(param)) {
+ return false;
+ }
+ return method.getReturnType().equals(Void.TYPE);
+ }
+
+}
diff --git a/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/SupportedCancel.java b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/SupportedCancel.java
new file mode 100644
index 0000000..c0bba9a
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/main/java/net/lamgc/cgj/bot/event/SupportedCancel.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+/**
+ * 支持取消接口.
+ *
实现了该接口的 {@link EventExecutor} 可对已投递执行的事件进行取消, 以阻止事件被执行.
+ * @author LamGC
+ */
+public interface SupportedCancel {
+
+ /**
+ * 通过 EventId 取消事件的处理.
+ * @param eventId 事件Id.
+ * @return 如果成功, 返回 true, 如果事件已执行完成, 返回 false.
+ * @throws UnsupportedOperationException 当事件未实现 {@link Cancelable} 接口时抛出.
+ * @throws NoSuchElementException 当 EventId 所属事件在 {@link SupportedCancel} 中无法找到时抛出.
+ */
+ boolean cancelEvent(UUID eventId) throws UnsupportedOperationException, NoSuchElementException;
+
+ /**
+ * 通过 Event 对象取消事件的处理.
+ * @param event 事件对象.
+ * @return 如果成功, 返回 true, 如果事件已执行完成, 返回 false.
+ * @throws UnsupportedOperationException 当事件未实现 {@link Cancelable} 接口时抛出.
+ * @throws NoSuchElementException 当 EventId 所属事件在 {@link SupportedCancel} 中无法找到时抛出.
+ */
+ boolean cancelEvent(EventObject event) throws UnsupportedOperationException, NoSuchElementException;
+
+ /**
+ * 对可取消对象执行取消处理操作.
+ * @param cancelableEvent 可取消对象事件.
+ * @return 如果成功, 返回 true, 如果事件已执行完成, 返回 false.
+ * @throws NoSuchElementException 当 EventId 所属事件在 {@link SupportedCancel} 中无法找到时抛出.
+ */
+ boolean cancelEvent(Cancelable cancelableEvent) throws NoSuchElementException;
+
+}
diff --git a/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/EventUtilsTest.java b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/EventUtilsTest.java
new file mode 100644
index 0000000..32fbe17
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/EventUtilsTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event;
+
+import net.lamgc.cgj.bot.event.handler.IllegalHandler;
+import net.lamgc.cgj.bot.event.handler.StandardHandler;
+import net.lamgc.cgj.bot.event.object.TestEvent;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+public class EventUtilsTest {
+
+ @Test
+ public void supportedCancelCheckTest() {
+ class NonSupportedCancelClass implements EventExecutor {
+ @Override
+ public void execute(EventObject event) {
+
+ }
+
+ @Override
+ public boolean isAsync() {
+ return false;
+ }
+ }
+ class SupportedCancelClass implements SupportedCancel, EventExecutor {
+
+ @Override
+ public boolean cancelEvent(UUID eventId) throws UnsupportedOperationException, NoSuchElementException {
+ return false;
+ }
+
+ @Override
+ public boolean cancelEvent(EventObject event) throws UnsupportedOperationException, NoSuchElementException {
+ return false;
+ }
+
+ @Override
+ public boolean cancelEvent(Cancelable cancelableEvent) throws NoSuchElementException {
+ return false;
+ }
+
+ @Override
+ public void execute(EventObject event) {
+
+ }
+
+ @Override
+ public boolean isAsync() {
+ return false;
+ }
+ }
+
+ Assert.assertTrue(EventUtils.isSupportedCancel(new SupportedCancelClass()));
+ Assert.assertFalse(EventUtils.isSupportedCancel(new NonSupportedCancelClass()));
+ }
+
+ @Test
+ public void standardHandlerMethodCheckTest() throws NoSuchMethodException {
+ Method targetMethod = StandardHandler.class.getMethod("standardHandle", TestEvent.class);
+ Assert.assertTrue(EventUtils.checkEventHandlerMethod(targetMethod));
+ }
+
+ @Test
+ public void invalidHandlerMethodCheckTest() {
+ for (Method method : IllegalHandler.class.getDeclaredMethods()) {
+ Assert.assertFalse(EventUtils.checkEventHandlerMethod(method));
+ }
+ }
+
+}
diff --git a/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/handler/IllegalHandler.java b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/handler/IllegalHandler.java
new file mode 100644
index 0000000..1193dba
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/handler/IllegalHandler.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event.handler;
+
+import net.lamgc.cgj.bot.event.EventHandler;
+import net.lamgc.cgj.bot.event.object.TestEvent;
+
+public abstract class IllegalHandler {
+
+ @EventHandler
+ public void nonArgumentHandleMethod() {
+
+ }
+
+ @EventHandler
+ public abstract void abstractHandleMethod(TestEvent event);
+
+ @EventHandler
+ public static void staticHandleMethod(TestEvent event) {
+
+ }
+
+ @EventHandler
+ private void privateHandleMethod(TestEvent event) {
+
+ }
+
+ public void nonAnnotationHandle() {
+
+ }
+
+ @EventHandler
+ public void multiArgumentsHandleMethod(TestEvent event, Object object) {
+
+ }
+
+ @EventHandler
+ public void invalidArgumentMethod(Object object) {
+
+ }
+
+ @EventHandler
+ public Object invalidReturnTypeMethod(TestEvent event) {
+ return null;
+ }
+
+}
diff --git a/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/handler/StandardHandler.java b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/handler/StandardHandler.java
new file mode 100644
index 0000000..6a4de5a
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/handler/StandardHandler.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event.handler;
+
+import net.lamgc.cgj.bot.event.EventHandler;
+import net.lamgc.cgj.bot.event.object.TestEvent;
+
+public class StandardHandler {
+
+ @EventHandler
+ public void standardHandle(TestEvent event) {
+
+ }
+
+}
diff --git a/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/object/TestEvent.java b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/object/TestEvent.java
new file mode 100644
index 0000000..2a1247f
--- /dev/null
+++ b/ContentGrabbingJi-Event/src/test/java/net/lamgc/cgj/bot/event/object/TestEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 LamGC
+ *
+ * ContentGrabbingJi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * ContentGrabbingJi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package net.lamgc.cgj.bot.event.object;
+
+import net.lamgc.cgj.bot.event.AbstractEventObject;
+
+public class TestEvent extends AbstractEventObject {
+
+ private final String content;
+
+ public TestEvent(String content) {
+ this.content = content;
+ }
+
+ public String getContent() {
+ return content;
+ }
+}
diff --git a/ContentGrabbingJi-core/pom.xml b/ContentGrabbingJi-core/pom.xml
index eb873ef..0cc0c22 100644
--- a/ContentGrabbingJi-core/pom.xml
+++ b/ContentGrabbingJi-core/pom.xml
@@ -49,6 +49,11 @@
ContentGrabbingJi-pixiv
3.0.0-alpha-SNAPSHOT
+
+ net.lamgc
+ ContentGrabbingJi-Event
+ 3.0.0-alpha-SNAPSHOT
+
com.google.code.gson
diff --git a/ContentGrabbingJi-framework-api/pom.xml b/ContentGrabbingJi-framework-api/pom.xml
index 8acbff6..e2a529a 100644
--- a/ContentGrabbingJi-framework-api/pom.xml
+++ b/ContentGrabbingJi-framework-api/pom.xml
@@ -39,6 +39,17 @@
gson
2.8.6
+
+
+ net.lamgc
+ ContentGrabbingJi-Event
+ 3.0.0-alpha-SNAPSHOT
+
+
+ net.lamgc
+ ContentGrabbingJi-common
+ 3.0.0-alpha-SNAPSHOT
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index a8006c1..9c1ba67 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,7 @@
ContentGrabbingJi-CacheStore-redis
ContentGrabbingJi-CacheStore-local
ContentGrabbingJi-common
+ ContentGrabbingJi-Event