事件监听
插件可以通过事件系统来监听和发送事件,实现插件之间或与 g0v0 核心功能的交互。
监听事件
使用装饰器
你可以使用 listen 装饰器来监听事件:
python
from app.plugins import listen
from app.models.events import MessageSentEvent
@listen
async def on_message_sent(event: MessageSentEvent):
print(f"User {event.sender_id} sent a message: {event.message_content}")警告
事件监听器必须是异步函数。
使用 subscribe_event 方法
你也可以直接使用 subscribe_event 方法来订阅事件:
python
from app.plugins import hub
from app.models.events import MessageSentEvent
async def my_event_handler(event: MessageSentEvent):
print(f"User {event.sender_id} sent a message: {event.message_content}")
hub.subscribe_event(my_event_handler)内置事件
g0v0 核心功能会在特定的时刻触发一些内置事件,例如用户注册成功、成绩提交等。你可以监听这些事件来实现特定的功能。例如:
python
from app.plugins import listen
from app.models.events import UserRegisteredEvent
from app.dependencies.database import Database
from app.database import User
@listen
async def on_user_registered(event: UserRegisteredEvent, session: Database):
user_id = event.user_id
user = await session.get(User, user_id)
print(f"User registered: {user.username}")查看内置事件以获取所有可用的内置事件。
定义事件
所有自定义事件都需要继承 PluginEvent 基类:
python
from app.models.events import PluginEvent
class MyCustomEvent(PluginEvent):
user_id: int
message: str发送事件
你可以使用 hub.emit() 方法来发送事件:
python
from app.plugins import hub
event = MyCustomEvent(user_id=123, message="Hello, world!")
hub.emit(event)事件会被异步发送到所有订阅了该事件类型的监听器。事件会在后台异步执行,不会阻塞发送方。
在 API 中使用
你也可以通过依赖注入在 API 端点中获取 EventHub 实例:
python
from app.dependencies.hub import EventHub
from app.plugins import register_api
router = register_api()
@router.post("/send-event")
async def send_event(hub: EventHub):
event = MyCustomEvent(user_id=1, message="Event from API")
hub.emit(event)
return {"status": "sent"}