mirror of
https://github.com/langbot-app/LangBot.git
synced 2025-11-25 03:15:06 +08:00
feat: 聊天的@用户id内容需要保留 (#1564)
* converters could use the application logger * keep @targets in message for some plugins may need it to their functionality * fix:form wxid in config fix:传参问题,可以直接从config中拿到wxid --------- Co-authored-by: fdc310 <82008029+fdc310@users.noreply.github.com>
This commit is contained in:
@@ -38,10 +38,10 @@ import logging
|
||||
|
||||
class WeChatPadMessageConverter(adapter.MessageConverter):
|
||||
|
||||
def __init__(self, config: dict):
|
||||
def __init__(self, config: dict, logger: logging.Logger):
|
||||
self.config = config
|
||||
self.bot = WeChatPadClient(self.config["wechatpad_url"],self.config["token"])
|
||||
self.logger = logging.getLogger("WeChatPadMessageConverter")
|
||||
self.logger = logger
|
||||
|
||||
@staticmethod
|
||||
async def yiri2target(
|
||||
@@ -90,21 +90,30 @@ class WeChatPadMessageConverter(adapter.MessageConverter):
|
||||
async def target2yiri(
|
||||
self,
|
||||
message: dict,
|
||||
bot_account_id: str
|
||||
bot_account_id: str,
|
||||
) -> platform_message.MessageChain:
|
||||
"""外部消息转平台消息"""
|
||||
# 数据预处理
|
||||
message_list = []
|
||||
bot_wxid = self.config['wxid']
|
||||
ats_bot = False # 是否被@
|
||||
content = message["content"]["str"]
|
||||
content_no_preifx = content # 群消息则去掉前缀
|
||||
is_group_message = self._is_group_message(message)
|
||||
if is_group_message:
|
||||
ats_bot = self._ats_bot(message, bot_account_id)
|
||||
self.logger.info(f"ats_bot: {ats_bot}; bot_account_id: {bot_account_id}; bot_wxid: {bot_wxid}")
|
||||
if "@所有人" in content:
|
||||
message_list.append(platform_message.AtAll())
|
||||
elif ats_bot:
|
||||
message_list.append(platform_message.At(target=bot_account_id))
|
||||
|
||||
# 解析@信息并生成At组件
|
||||
at_targets = self._extract_at_targets(message)
|
||||
for target_id in at_targets:
|
||||
if target_id != bot_wxid: # 避免重复添加机器人的At
|
||||
message_list.append(platform_message.At(target=target_id))
|
||||
|
||||
content_no_preifx, _ = self._extract_content_and_sender(content)
|
||||
|
||||
msg_type = message["msg_type"]
|
||||
@@ -458,6 +467,23 @@ class WeChatPadMessageConverter(adapter.MessageConverter):
|
||||
finally:
|
||||
return ats_bot
|
||||
|
||||
# 提取一下at的wxid列表
|
||||
def _extract_at_targets(self, message: dict) -> list[str]:
|
||||
"""从消息中提取被@用户的ID列表"""
|
||||
at_targets = []
|
||||
try:
|
||||
# 从msg_source中解析atuserlist
|
||||
msg_source = message.get('msg_source', '') or ''
|
||||
if len(msg_source) > 0:
|
||||
msg_source_data = ET.fromstring(msg_source)
|
||||
at_user_list = msg_source_data.findtext("atuserlist") or ""
|
||||
if at_user_list:
|
||||
# atuserlist格式通常是逗号分隔的用户ID列表
|
||||
at_targets = [user_id.strip() for user_id in at_user_list.split(',') if user_id.strip()]
|
||||
except Exception as e:
|
||||
self.logger.error(f"_extract_at_targets got except: {e}")
|
||||
return at_targets
|
||||
|
||||
# 提取一下content前面的sender_id, 和去掉前缀的内容
|
||||
def _extract_content_and_sender(self, raw_content: str) -> Tuple[str, Optional[str]]:
|
||||
try:
|
||||
@@ -482,10 +508,10 @@ class WeChatPadMessageConverter(adapter.MessageConverter):
|
||||
|
||||
class WeChatPadEventConverter(adapter.EventConverter):
|
||||
|
||||
def __init__(self, config: dict):
|
||||
def __init__(self, config: dict, logger: logging.Logger):
|
||||
self.config = config
|
||||
self.message_converter = WeChatPadMessageConverter(config)
|
||||
self.logger = logging.getLogger("WeChatPadEventConverter")
|
||||
self.message_converter = WeChatPadMessageConverter(config, logger)
|
||||
self.logger = logger
|
||||
|
||||
@staticmethod
|
||||
async def yiri2target(
|
||||
@@ -496,7 +522,7 @@ class WeChatPadEventConverter(adapter.EventConverter):
|
||||
async def target2yiri(
|
||||
self,
|
||||
event: dict,
|
||||
bot_account_id: str
|
||||
bot_account_id: str,
|
||||
) -> platform_events.MessageEvent:
|
||||
|
||||
# 排除公众号以及微信团队消息
|
||||
@@ -572,8 +598,8 @@ class WeChatPadAdapter(adapter.MessagePlatformAdapter):
|
||||
self.logger = logger
|
||||
self.quart_app = quart.Quart(__name__)
|
||||
|
||||
self.message_converter = WeChatPadMessageConverter(config)
|
||||
self.event_converter = WeChatPadEventConverter(config)
|
||||
self.message_converter = WeChatPadMessageConverter(config, ap.logger)
|
||||
self.event_converter = WeChatPadEventConverter(config, ap.logger)
|
||||
|
||||
async def ws_message(self, data):
|
||||
"""处理接收到的消息"""
|
||||
|
||||
Reference in New Issue
Block a user