事件工厂111

This commit is contained in:
2026-01-01 18:43:14 +08:00
parent 046dd0860f
commit 3ba15d38f9
15 changed files with 1017 additions and 245 deletions

View File

@@ -11,7 +11,7 @@ from datetime import datetime
import websockets
from models import Event
from models import EventFactory
from .bot import Bot
from .command_manager import matcher
@@ -76,6 +76,7 @@ class WS:
data = json.loads(message)
# 1. 处理 API 响应
# 如果消息中包含 echo 字段,说明是 API 调用的响应
echo_id = data.get("echo")
if echo_id and echo_id in self._pending_requests:
future = self._pending_requests.pop(echo_id)
@@ -84,12 +85,14 @@ class WS:
continue
# 2. 处理上报事件
# 如果消息中包含 post_type 字段,说明是 OneBot 上报的事件
if "post_type" in data:
# 使用 create_task 异步执行,避免阻塞
# 使用 create_task 异步执行,避免阻塞 WebSocket 接收循环
asyncio.create_task(self.on_event(data))
except Exception as e:
print(f" 解析消息异常: {e}")
traceback.print_exc()
async def on_event(self, raw_data: dict):
"""
@@ -98,40 +101,25 @@ class WS:
:param raw_data: 原始事件数据字典
"""
try:
# 解析为 Event 对象
event = Event.from_dict(raw_data)
event.bot = self.bot
# 使用工厂创建事件对象
event = EventFactory.create_event(raw_data)
event.bot = self.bot # 注入 Bot 实例
# 格式化时间用于打印
# 打印日志
t = datetime.fromtimestamp(event.time).strftime("%H:%M:%S")
# --- 分流处理 ---
# A. 消息事件 (Message)
if event.post_type == "message":
print(
f" [{t}] [消息] {event.message_type} | {event.user_id}: {event.raw_message}"
)
await matcher.handle_message(self.bot, event)
# B. 通知事件 (Notice)
sender_name = event.sender.nickname if event.sender else "Unknown"
print(f" [{t}] [消息] {event.message_type} | {event.user_id}({sender_name}): {event.raw_message}")
elif event.post_type == "notice":
print(
f" [{t}] [通知] {event.notice_type} | 来自: {event.group_id or '私聊'}"
)
await matcher.handle_notice(self.bot, event)
# C. 请求事件 (Request)
print(f" [{t}] [通知] {event.notice_type}")
elif event.post_type == "request":
print(f" [{t}] [请求] {event.request_type} | 内容: {event.comment}")
await matcher.handle_request(self.bot, event)
print(f" [{t}] [请求] {event.request_type}")
# D. 元事件 (Meta Event) - 通常用来心跳检测,可不处理
elif event.post_type == "meta_event":
pass
# 分发事件
await matcher.handle_event(self.bot, event)
except Exception as e:
print(f"事件分发失败: {e}")
print(f" 事件处理异常: {e}")
traceback.print_exc()
async def call_api(self, action: str, params: dict = None):