修复因为消息类型结构变动而导致buffer异常

This commit is contained in:
meng_xi_pan
2025-04-16 14:06:16 +08:00
parent f3a4b292b7
commit 4501e19dc8
3 changed files with 41 additions and 11 deletions

View File

@@ -3,7 +3,7 @@ from src.common.logger import get_module_logger
import asyncio import asyncio
from dataclasses import dataclass, field from dataclasses import dataclass, field
from .message import MessageRecv from .message import MessageRecv
from ..message.message_base import BaseMessageInfo, GroupInfo from ..message.message_base import BaseMessageInfo, GroupInfo, Seg
import hashlib import hashlib
from typing import Dict from typing import Dict
from collections import OrderedDict from collections import OrderedDict
@@ -130,22 +130,36 @@ class MessageBuffer:
keep_msgs = OrderedDict() keep_msgs = OrderedDict()
combined_text = [] combined_text = []
found = False found = False
type = "text" type = "seglist"
is_update = True is_update = True
for msg_id, msg in self.buffer_pool[person_id_].items(): for msg_id, msg in self.buffer_pool[person_id_].items():
if msg_id == message.message_info.message_id: if msg_id == message.message_info.message_id:
found = True found = True
type = msg.message.message_segment.type if msg.message.message_segment.type != "seglist":
type = msg.message.message_segment.type
else:
if (isinstance(msg.message.message_segment.data, list)
and all(isinstance(x, Seg) for x in msg.message.message_segment.data)
and len(msg.message.message_segment.data) == 1):
type = msg.message.message_segment.data[0].type
combined_text.append(msg.message.processed_plain_text) combined_text.append(msg.message.processed_plain_text)
continue continue
if found: if found:
keep_msgs[msg_id] = msg keep_msgs[msg_id] = msg
elif msg.result == "F": elif msg.result == "F":
# 收集F消息的文本内容 # 收集F消息的文本内容
F_type = "seglist"
if msg.message.message_segment.type != "seglist":
F_type = msg.message.message_segment.type
else:
if (isinstance(msg.message.message_segment.data, list)
and all(isinstance(x, Seg) for x in msg.message.message_segment.data)
and len(msg.message.message_segment.data) == 1):
F_type = msg.message.message_segment.data[0].type
if hasattr(msg.message, "processed_plain_text") and msg.message.processed_plain_text: if hasattr(msg.message, "processed_plain_text") and msg.message.processed_plain_text:
if msg.message.message_segment.type == "text": if F_type == "text":
combined_text.append(msg.message.processed_plain_text) combined_text.append(msg.message.processed_plain_text)
elif msg.message.message_segment.type != "text": elif F_type != "text":
is_update = False is_update = False
elif msg.result == "U": elif msg.result == "U":
logger.debug(f"异常未处理信息id {msg.message.message_info.message_id}") logger.debug(f"异常未处理信息id {msg.message.message_info.message_id}")

View File

@@ -192,11 +192,19 @@ class ReasoningChat:
if not buffer_result: if not buffer_result:
await willing_manager.bombing_buffer_message_handle(message.message_info.message_id) await willing_manager.bombing_buffer_message_handle(message.message_info.message_id)
willing_manager.delete(message.message_info.message_id) willing_manager.delete(message.message_info.message_id)
if message.message_segment.type == "text": F_type = "seglist"
if message.message_segment.type != "seglist":
F_type =message.message_segment.type
else:
if (isinstance(message.message_segment.data, list)
and all(isinstance(x, Seg) for x in message.message_segment.data)
and len(message.message_segment.data) == 1):
F_type = message.message_segment.data[0].type
if F_type == "text":
logger.info(f"触发缓冲,已炸飞消息:{message.processed_plain_text}") logger.info(f"触发缓冲,已炸飞消息:{message.processed_plain_text}")
elif message.message_segment.type == "image": elif F_type == "image":
logger.info("触发缓冲,已炸飞表情包/图片") logger.info("触发缓冲,已炸飞表情包/图片")
elif message.message_segment.type == "seglist": elif F_type == "seglist":
logger.info("触发缓冲,已炸飞消息列") logger.info("触发缓冲,已炸飞消息列")
return return

View File

@@ -204,11 +204,19 @@ class ThinkFlowChat:
if not buffer_result: if not buffer_result:
await willing_manager.bombing_buffer_message_handle(message.message_info.message_id) await willing_manager.bombing_buffer_message_handle(message.message_info.message_id)
willing_manager.delete(message.message_info.message_id) willing_manager.delete(message.message_info.message_id)
if message.message_segment.type == "text": F_type = "seglist"
if message.message_segment.type != "seglist":
F_type =message.message_segment.type
else:
if (isinstance(message.message_segment.data, list)
and all(isinstance(x, Seg) for x in message.message_segment.data)
and len(message.message_segment.data) == 1):
F_type = message.message_segment.data[0].type
if F_type == "text":
logger.info(f"触发缓冲,已炸飞消息:{message.processed_plain_text}") logger.info(f"触发缓冲,已炸飞消息:{message.processed_plain_text}")
elif message.message_segment.type == "image": elif F_type == "image":
logger.info("触发缓冲,已炸飞表情包/图片") logger.info("触发缓冲,已炸飞表情包/图片")
elif message.message_segment.type == "seglist": elif F_type == "seglist":
logger.info("触发缓冲,已炸飞消息列") logger.info("触发缓冲,已炸飞消息列")
return return