修复潜在问题,拆分部分内容,增强logger输出
parent
53dbbbd7a7
commit
c2525f4c55
2
main.py
2
main.py
|
|
@ -14,7 +14,7 @@ async def message_recv(server_connection: Server.ServerConnection):
|
||||||
recv_handler.server_connection = server_connection
|
recv_handler.server_connection = server_connection
|
||||||
send_handler.server_connection = server_connection
|
send_handler.server_connection = server_connection
|
||||||
async for raw_message in server_connection:
|
async for raw_message in server_connection:
|
||||||
logger.debug(f"{raw_message[:80]}..." if len(raw_message) > 80 else raw_message)
|
logger.debug(f"{raw_message[:100]}..." if len(raw_message) > 100 else raw_message)
|
||||||
decoded_raw_message: dict = json.loads(raw_message)
|
decoded_raw_message: dict = json.loads(raw_message)
|
||||||
post_type = decoded_raw_message.get("post_type")
|
post_type = decoded_raw_message.get("post_type")
|
||||||
if post_type in ["meta_event", "message", "notice"]:
|
if post_type in ["meta_event", "message", "notice"]:
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ class Config:
|
||||||
for key in include_configs:
|
for key in include_configs:
|
||||||
if key not in raw_config:
|
if key not in raw_config:
|
||||||
logger.error(f"配置文件中缺少必需的字段: '{key}'")
|
logger.error(f"配置文件中缺少必需的字段: '{key}'")
|
||||||
|
logger.error("你的配置文件可能过时,请尝试手动更新配置文件。")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
self.server_host = raw_config["Napcat_Server"].get("host", "localhost")
|
self.server_host = raw_config["Napcat_Server"].get("host", "localhost")
|
||||||
|
|
@ -71,6 +72,21 @@ class Config:
|
||||||
self.use_tts = raw_config["Voice"].get("use_tts", False)
|
self.use_tts = raw_config["Voice"].get("use_tts", False)
|
||||||
|
|
||||||
self.debug_level = raw_config["Debug"].get("level", "INFO")
|
self.debug_level = raw_config["Debug"].get("level", "INFO")
|
||||||
|
if self.debug_level == "DEBUG":
|
||||||
|
logger.debug("原始配置文件内容:")
|
||||||
|
logger.debug(raw_config)
|
||||||
|
logger.debug("读取到的配置内容:")
|
||||||
|
logger.debug(f"平台: {self.platform}")
|
||||||
|
logger.debug(f"MaiBot服务器地址: {self.mai_host}:{self.mai_port}")
|
||||||
|
logger.debug(f"Napcat服务器地址: {self.server_host}:{self.server_port}")
|
||||||
|
logger.debug(f"心跳间隔: {self.napcat_heartbeat_interval}秒")
|
||||||
|
logger.debug(f"群聊列表类型: {self.group_list_type}")
|
||||||
|
logger.debug(f"群聊列表: {self.group_list}")
|
||||||
|
logger.debug(f"私聊列表类型: {self.private_list_type}")
|
||||||
|
logger.debug(f"私聊列表: {self.private_list}")
|
||||||
|
logger.debug(f"禁用用户ID列表: {self.ban_user_id}")
|
||||||
|
logger.debug(f"是否启用TTS: {self.use_tts}")
|
||||||
|
logger.debug(f"调试级别: {self.debug_level}")
|
||||||
|
|
||||||
|
|
||||||
global_config = Config()
|
global_config = Config()
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
from .config import global_config
|
from .config import global_config
|
||||||
import sys
|
import sys
|
||||||
# import builtins
|
|
||||||
|
|
||||||
logger.remove()
|
logger.remove()
|
||||||
logger.add(
|
logger.add(
|
||||||
|
|
@ -9,17 +8,3 @@ logger.add(
|
||||||
level=global_config.debug_level,
|
level=global_config.debug_level,
|
||||||
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
|
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# def handle_output(message: str):
|
|
||||||
# if "连接失败" in message:
|
|
||||||
# logger.error(message)
|
|
||||||
# elif "收到无效的" in message:
|
|
||||||
# logger.warning(message)
|
|
||||||
# elif "检测到平台" in message:
|
|
||||||
# logger.warning(message)
|
|
||||||
# else:
|
|
||||||
# logger.info(message)
|
|
||||||
|
|
||||||
|
|
||||||
# builtins.print = handle_output
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ async def get_response(request_id: str) -> dict:
|
||||||
await asyncio.sleep(0.2)
|
await asyncio.sleep(0.2)
|
||||||
response = response_dict.pop(request_id)
|
response = response_dict.pop(request_id)
|
||||||
_ = response_time_dict.pop(request_id)
|
_ = response_time_dict.pop(request_id)
|
||||||
|
logger.trace(f"响应信息id: {request_id} 已从响应字典中取出")
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -27,6 +28,7 @@ async def put_response(response: dict):
|
||||||
now_time = time.time()
|
now_time = time.time()
|
||||||
response_dict[echo_id] = response
|
response_dict[echo_id] = response
|
||||||
response_time_dict[echo_id] = now_time
|
response_time_dict[echo_id] = now_time
|
||||||
|
logger.trace(f"响应信息id: {echo_id} 已存入响应字典")
|
||||||
|
|
||||||
|
|
||||||
async def check_timeout_response() -> None:
|
async def check_timeout_response() -> None:
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import time
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
import websockets as Server
|
import websockets as Server
|
||||||
from typing import List, Tuple, Optional
|
from typing import List, Tuple, Optional, Dict, Any
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from . import MetaEventType, RealMessageType, MessageType, NoticeType
|
from . import MetaEventType, RealMessageType, MessageType, NoticeType
|
||||||
|
|
@ -75,6 +75,7 @@ class RecvHandler:
|
||||||
Returns:
|
Returns:
|
||||||
bool: 是否允许聊天
|
bool: 是否允许聊天
|
||||||
"""
|
"""
|
||||||
|
logger.debug(f"群聊id: {group_id}, 用户id: {user_id}")
|
||||||
if group_id:
|
if group_id:
|
||||||
if global_config.group_list_type == "whitelist" and group_id not in global_config.group_list:
|
if global_config.group_list_type == "whitelist" and group_id not in global_config.group_list:
|
||||||
logger.warning("群聊不在聊天白名单中,消息被丢弃")
|
logger.warning("群聊不在聊天白名单中,消息被丢弃")
|
||||||
|
|
@ -84,10 +85,10 @@ class RecvHandler:
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
if global_config.private_list_type == "whitelist" and user_id not in global_config.private_list:
|
if global_config.private_list_type == "whitelist" and user_id not in global_config.private_list:
|
||||||
logger.warning("用户不在聊天白名单中,消息被丢弃")
|
logger.warning("私聊不在聊天白名单中,消息被丢弃")
|
||||||
return False
|
return False
|
||||||
elif global_config.private_list_type == "blacklist" and user_id in global_config.private_list:
|
elif global_config.private_list_type == "blacklist" and user_id in global_config.private_list:
|
||||||
logger.warning("用户在聊天黑名单中,消息被丢弃")
|
logger.warning("私聊在聊天黑名单中,消息被丢弃")
|
||||||
return False
|
return False
|
||||||
if user_id in global_config.ban_user_id:
|
if user_id in global_config.ban_user_id:
|
||||||
logger.warning("用户在全局黑名单中,消息被丢弃")
|
logger.warning("用户在全局黑名单中,消息被丢弃")
|
||||||
|
|
@ -110,7 +111,7 @@ class RecvHandler:
|
||||||
template_info: TemplateInfo = None # 模板信息,暂时为空,等待启用
|
template_info: TemplateInfo = None # 模板信息,暂时为空,等待启用
|
||||||
format_info: FormatInfo = FormatInfo(
|
format_info: FormatInfo = FormatInfo(
|
||||||
content_format=["text", "image", "emoji"],
|
content_format=["text", "image", "emoji"],
|
||||||
accept_format=["text", "image", "emoji", "reply"],
|
accept_format=["text", "image", "emoji", "reply", "voice"],
|
||||||
) # 格式化信息
|
) # 格式化信息
|
||||||
if message_type == MessageType.private:
|
if message_type == MessageType.private:
|
||||||
sub_type = raw_message.get("sub_type")
|
sub_type = raw_message.get("sub_type")
|
||||||
|
|
@ -169,7 +170,7 @@ class RecvHandler:
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.warning("私聊消息类型不支持")
|
logger.warning(f"私聊消息类型 {sub_type} 不支持")
|
||||||
return None
|
return None
|
||||||
elif message_type == MessageType.group:
|
elif message_type == MessageType.group:
|
||||||
sub_type = raw_message.get("sub_type")
|
sub_type = raw_message.get("sub_type")
|
||||||
|
|
@ -200,7 +201,7 @@ class RecvHandler:
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.warning("群聊消息类型不支持")
|
logger.warning(f"群聊消息类型 {sub_type} 不支持")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
additional_config: dict = {}
|
additional_config: dict = {}
|
||||||
|
|
@ -221,13 +222,13 @@ class RecvHandler:
|
||||||
|
|
||||||
# 处理实际信息
|
# 处理实际信息
|
||||||
if not raw_message.get("message"):
|
if not raw_message.get("message"):
|
||||||
logger.warning("消息内容为空")
|
logger.warning("原始消息内容为空")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# 获取Seg列表
|
# 获取Seg列表
|
||||||
seg_message: List[Seg] = await self.handle_real_message(raw_message)
|
seg_message: List[Seg] = await self.handle_real_message(raw_message)
|
||||||
if not seg_message:
|
if not seg_message:
|
||||||
logger.warning("消息内容为空")
|
logger.warning("处理后消息内容为空")
|
||||||
return None
|
return None
|
||||||
submit_seg: Seg = Seg(
|
submit_seg: Seg = Seg(
|
||||||
type="seglist",
|
type="seglist",
|
||||||
|
|
@ -309,38 +310,7 @@ class RecvHandler:
|
||||||
case RealMessageType.share:
|
case RealMessageType.share:
|
||||||
logger.warning("暂时不支持链接解析")
|
logger.warning("暂时不支持链接解析")
|
||||||
case RealMessageType.forward:
|
case RealMessageType.forward:
|
||||||
forward_message_data = sub_message.get("data")
|
messages = await self.get_forward_message(sub_message)
|
||||||
if not forward_message_data:
|
|
||||||
logger.warning("转发消息内容为空")
|
|
||||||
return None
|
|
||||||
forward_message_id = forward_message_data.get("id")
|
|
||||||
request_uuid = str(uuid.uuid4())
|
|
||||||
payload = json.dumps(
|
|
||||||
{
|
|
||||||
"action": "get_forward_msg",
|
|
||||||
"params": {"message_id": forward_message_id},
|
|
||||||
"echo": request_uuid,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
await self.server_connection.send(payload)
|
|
||||||
response: dict = await get_response(request_uuid)
|
|
||||||
except TimeoutError:
|
|
||||||
logger.error("获取转发消息超时")
|
|
||||||
return None
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"获取转发消息失败: {str(e)}")
|
|
||||||
return None
|
|
||||||
logger.debug(
|
|
||||||
f"转发消息原始格式:{json.dumps(response)[:80]}..."
|
|
||||||
if len(json.dumps(response)) > 80
|
|
||||||
else json.dumps(response)
|
|
||||||
)
|
|
||||||
response_data: dict = response.get("data")
|
|
||||||
if not response_data:
|
|
||||||
logger.warning("转发消息内容为空或获取失败")
|
|
||||||
return None
|
|
||||||
messages = response_data.get("messages")
|
|
||||||
if not messages:
|
if not messages:
|
||||||
logger.warning("转发消息内容为空或获取失败")
|
logger.warning("转发消息内容为空或获取失败")
|
||||||
return None
|
return None
|
||||||
|
|
@ -352,7 +322,7 @@ class RecvHandler:
|
||||||
case RealMessageType.node:
|
case RealMessageType.node:
|
||||||
logger.warning("不支持转发消息节点解析")
|
logger.warning("不支持转发消息节点解析")
|
||||||
case _:
|
case _:
|
||||||
logger.warning(f"未知消息类型:{sub_message_type}")
|
logger.warning(f"未知消息类型: {sub_message_type}")
|
||||||
return seg_message
|
return seg_message
|
||||||
|
|
||||||
async def handle_text_message(self, raw_message: dict) -> Seg:
|
async def handle_text_message(self, raw_message: dict) -> Seg:
|
||||||
|
|
@ -406,7 +376,7 @@ class RecvHandler:
|
||||||
"""这部分认为是表情包"""
|
"""这部分认为是表情包"""
|
||||||
return Seg(type="emoji", data=image_base64)
|
return Seg(type="emoji", data=image_base64)
|
||||||
else:
|
else:
|
||||||
logger.warning(f"不支持的图片类型:{image_sub_type}")
|
logger.warning(f"不支持的图片子类型:{image_sub_type}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def handle_at_message(self, raw_message: dict, self_id: int, group_id: int) -> Seg | None:
|
async def handle_at_message(self, raw_message: dict, self_id: int, group_id: int) -> Seg | None:
|
||||||
|
|
@ -424,22 +394,53 @@ class RecvHandler:
|
||||||
if message_data:
|
if message_data:
|
||||||
qq_id = message_data.get("qq")
|
qq_id = message_data.get("qq")
|
||||||
if str(self_id) == str(qq_id):
|
if str(self_id) == str(qq_id):
|
||||||
|
logger.debug("机器人被at")
|
||||||
self_info: dict = await get_self_info(self.server_connection)
|
self_info: dict = await get_self_info(self.server_connection)
|
||||||
if self_info:
|
if self_info:
|
||||||
return Seg(
|
return Seg(type="text", data=f"@<{self_info.get('nickname')}:{self_info.get('user_id')}>")
|
||||||
type=RealMessageType.text, data=f"@<{self_info.get('nickname')}:{self_info.get('user_id')}>"
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
member_info: dict = await get_member_info(self.server_connection, group_id=group_id, user_id=qq_id)
|
member_info: dict = await get_member_info(self.server_connection, group_id=group_id, user_id=qq_id)
|
||||||
if member_info:
|
if member_info:
|
||||||
return Seg(
|
return Seg(type="text", data=f"@<{member_info.get('nickname')}:{member_info.get('user_id')}>")
|
||||||
type=RealMessageType.text, data=f"@<{member_info.get('nickname')}:{member_info.get('user_id')}>"
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
async def get_forward_message(self, raw_message: dict) -> Dict[str, Any] | None:
|
||||||
|
forward_message_data: Dict = raw_message.get("data")
|
||||||
|
if not forward_message_data:
|
||||||
|
logger.warning("转发消息内容为空")
|
||||||
|
return None
|
||||||
|
forward_message_id = forward_message_data.get("id")
|
||||||
|
request_uuid = str(uuid.uuid4())
|
||||||
|
payload = json.dumps(
|
||||||
|
{
|
||||||
|
"action": "get_forward_msg",
|
||||||
|
"params": {"message_id": forward_message_id},
|
||||||
|
"echo": request_uuid,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
await self.server_connection.send(payload)
|
||||||
|
response: dict = await get_response(request_uuid)
|
||||||
|
except TimeoutError:
|
||||||
|
logger.error("获取转发消息超时")
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"获取转发消息失败: {str(e)}")
|
||||||
|
return None
|
||||||
|
logger.debug(
|
||||||
|
f"转发消息原始格式:{json.dumps(response)[:80]}..."
|
||||||
|
if len(json.dumps(response)) > 80
|
||||||
|
else json.dumps(response)
|
||||||
|
)
|
||||||
|
response_data: Dict = response.get("data")
|
||||||
|
if not response_data:
|
||||||
|
logger.warning("转发消息内容为空或获取失败")
|
||||||
|
return None
|
||||||
|
return response_data.get("messages")
|
||||||
|
|
||||||
async def handle_reply_message(self, raw_message: dict) -> Seg | None:
|
async def handle_reply_message(self, raw_message: dict) -> Seg | None:
|
||||||
# sourcery skip: move-assign-in-block, use-named-expression
|
# sourcery skip: move-assign-in-block, use-named-expression
|
||||||
"""
|
"""
|
||||||
|
|
@ -497,11 +498,11 @@ class RecvHandler:
|
||||||
if global_config.enable_poke:
|
if global_config.enable_poke:
|
||||||
handled_message: Seg = await self.handle_poke_notify(raw_message)
|
handled_message: Seg = await self.handle_poke_notify(raw_message)
|
||||||
else:
|
else:
|
||||||
logger.warning("戳一戳消息被禁用")
|
logger.warning("戳一戳消息被禁用,取消戳一戳处理")
|
||||||
case _:
|
case _:
|
||||||
logger.warning("不支持的notify类型")
|
logger.warning(f"不支持的notify类型: {notice_type}.{sub_type}")
|
||||||
case _:
|
case _:
|
||||||
logger.warning("不支持的notice类型")
|
logger.warning(f"不支持的notice类型: {notice_type}")
|
||||||
return None
|
return None
|
||||||
if not handled_message:
|
if not handled_message:
|
||||||
logger.warning("notice处理失败或不支持")
|
logger.warning("notice处理失败或不支持")
|
||||||
|
|
@ -538,6 +539,8 @@ class RecvHandler:
|
||||||
group_name: str = None
|
group_name: str = None
|
||||||
if fetched_group_info:
|
if fetched_group_info:
|
||||||
group_name = fetched_group_info.get("group_name")
|
group_name = fetched_group_info.get("group_name")
|
||||||
|
else:
|
||||||
|
logger.warning("无法获取戳一戳消息所在群的名称")
|
||||||
group_info = GroupInfo(
|
group_info = GroupInfo(
|
||||||
platform=global_config.platform,
|
platform=global_config.platform,
|
||||||
group_id=group_id,
|
group_id=group_id,
|
||||||
|
|
@ -581,7 +584,7 @@ class RecvHandler:
|
||||||
first_txt = raw_info[2].get("txt", "戳了戳")
|
first_txt = raw_info[2].get("txt", "戳了戳")
|
||||||
second_txt = raw_info[4].get("txt", "")
|
second_txt = raw_info[4].get("txt", "")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"解析戳一戳消息失败,使用默认文本:{str(e)}")
|
logger.warning(f"解析戳一戳消息失败: {str(e)},将使用默认文本")
|
||||||
first_txt = "戳了戳"
|
first_txt = "戳了戳"
|
||||||
second_txt = ""
|
second_txt = ""
|
||||||
"""
|
"""
|
||||||
|
|
@ -614,12 +617,15 @@ class RecvHandler:
|
||||||
return None
|
return None
|
||||||
if image_count < 5 and image_count > 0:
|
if image_count < 5 and image_count > 0:
|
||||||
# 处理图片数量小于5的情况,此时解析图片为base64
|
# 处理图片数量小于5的情况,此时解析图片为base64
|
||||||
|
logger.trace("图片数量小于5,开始解析图片为base64")
|
||||||
return await self._recursive_parse_image_seg(handled_message, True)
|
return await self._recursive_parse_image_seg(handled_message, True)
|
||||||
elif image_count > 0:
|
elif image_count > 0:
|
||||||
|
logger.trace("图片数量大于等于5,开始解析图片为占位符")
|
||||||
# 处理图片数量大于等于5的情况,此时解析图片为占位符
|
# 处理图片数量大于等于5的情况,此时解析图片为占位符
|
||||||
return await self._recursive_parse_image_seg(handled_message, False)
|
return await self._recursive_parse_image_seg(handled_message, False)
|
||||||
else:
|
else:
|
||||||
# 处理没有图片的情况,此时直接返回
|
# 处理没有图片的情况,此时直接返回
|
||||||
|
logger.trace("没有图片,直接返回")
|
||||||
return handled_message
|
return handled_message
|
||||||
|
|
||||||
async def _recursive_parse_image_seg(self, seg_data: Seg, to_image: bool) -> Seg:
|
async def _recursive_parse_image_seg(self, seg_data: Seg, to_image: bool) -> Seg:
|
||||||
|
|
@ -648,6 +654,7 @@ class RecvHandler:
|
||||||
return Seg(type="text", data="[表情包]")
|
return Seg(type="text", data="[表情包]")
|
||||||
return Seg(type="emoji", data=encoded_image)
|
return Seg(type="emoji", data=encoded_image)
|
||||||
else:
|
else:
|
||||||
|
logger.trace(f"不处理类型: {seg_data.type}")
|
||||||
return seg_data
|
return seg_data
|
||||||
else:
|
else:
|
||||||
if seg_data.type == "seglist":
|
if seg_data.type == "seglist":
|
||||||
|
|
@ -657,12 +664,11 @@ class RecvHandler:
|
||||||
new_seg_list.append(parsed_seg)
|
new_seg_list.append(parsed_seg)
|
||||||
return Seg(type="seglist", data=new_seg_list)
|
return Seg(type="seglist", data=new_seg_list)
|
||||||
elif seg_data.type == "image":
|
elif seg_data.type == "image":
|
||||||
image_url = seg_data.data
|
|
||||||
return Seg(type="text", data="[图片]")
|
return Seg(type="text", data="[图片]")
|
||||||
elif seg_data.type == "emoji":
|
elif seg_data.type == "emoji":
|
||||||
image_url = seg_data.data
|
|
||||||
return Seg(type="text", data="[动画表情]")
|
return Seg(type="text", data="[动画表情]")
|
||||||
else:
|
else:
|
||||||
|
logger.trace(f"不处理类型: {seg_data.type}")
|
||||||
return seg_data
|
return seg_data
|
||||||
|
|
||||||
async def _handle_forward_message(self, message_list: list, layer: int) -> Tuple[Seg, int] | Tuple[None, int]:
|
async def _handle_forward_message(self, message_list: list, layer: int) -> Tuple[Seg, int] | Tuple[None, int]:
|
||||||
|
|
@ -676,7 +682,7 @@ class RecvHandler:
|
||||||
seg_data: Seg: 处理后的消息段
|
seg_data: Seg: 处理后的消息段
|
||||||
image_count: int: 图片数量
|
image_count: int: 图片数量
|
||||||
"""
|
"""
|
||||||
seg_list = []
|
seg_list: List[Seg] = []
|
||||||
image_count = 0
|
image_count = 0
|
||||||
if message_list is None:
|
if message_list is None:
|
||||||
return None, 0
|
return None, 0
|
||||||
|
|
@ -693,12 +699,9 @@ class RecvHandler:
|
||||||
message_of_sub_message = message_of_sub_message_list[0]
|
message_of_sub_message = message_of_sub_message_list[0]
|
||||||
if message_of_sub_message.get("type") == RealMessageType.forward:
|
if message_of_sub_message.get("type") == RealMessageType.forward:
|
||||||
if layer >= 3:
|
if layer >= 3:
|
||||||
full_seg_data = (
|
full_seg_data = Seg(
|
||||||
Seg(
|
type="text",
|
||||||
type="text",
|
data=("--" * layer) + f"【{user_nickname}】:【转发消息】\n",
|
||||||
data=("--" * layer) + f"【{user_nickname}】:【转发消息】\n",
|
|
||||||
),
|
|
||||||
0,
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
sub_message_data = message_of_sub_message.get("data")
|
sub_message_data = message_of_sub_message.get("data")
|
||||||
|
|
@ -719,55 +722,43 @@ class RecvHandler:
|
||||||
continue
|
continue
|
||||||
text_message = sub_message_data.get("text")
|
text_message = sub_message_data.get("text")
|
||||||
seg_data = Seg(type="text", data=text_message)
|
seg_data = Seg(type="text", data=text_message)
|
||||||
|
data_list: List[Any] = []
|
||||||
if layer > 0:
|
if layer > 0:
|
||||||
seg_list.append(
|
data_list = [
|
||||||
Seg(
|
Seg(type="text", data=("--" * layer) + user_nickname_str),
|
||||||
type="seglist",
|
seg_data,
|
||||||
data=[
|
break_seg,
|
||||||
Seg(type="text", data=("--" * layer) + user_nickname_str),
|
]
|
||||||
seg_data,
|
|
||||||
break_seg,
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
seg_list.append(
|
data_list = [
|
||||||
Seg(
|
Seg(type="text", data=user_nickname_str),
|
||||||
type="seglist",
|
seg_data,
|
||||||
data=[
|
break_seg,
|
||||||
Seg(type="text", data=user_nickname_str),
|
]
|
||||||
seg_data,
|
seg_list.append(Seg(type="seglist", data=data_list))
|
||||||
break_seg,
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
elif message_of_sub_message.get("type") == RealMessageType.image:
|
elif message_of_sub_message.get("type") == RealMessageType.image:
|
||||||
image_count += 1
|
image_count += 1
|
||||||
image_data = message_of_sub_message.get("data")
|
image_data = message_of_sub_message.get("data")
|
||||||
sub_type = image_data.get("sub_type")
|
sub_type = image_data.get("sub_type")
|
||||||
image_url = image_data.get("url")
|
image_url = image_data.get("url")
|
||||||
|
data_list: List[Any] = []
|
||||||
if sub_type == 0:
|
if sub_type == 0:
|
||||||
seg_data = Seg(type="image", data=image_url)
|
seg_data = Seg(type="image", data=image_url)
|
||||||
else:
|
else:
|
||||||
seg_data = Seg(type="emoji", data=image_url)
|
seg_data = Seg(type="emoji", data=image_url)
|
||||||
if layer > 0:
|
if layer > 0:
|
||||||
full_seg_data = Seg(
|
data_list = [
|
||||||
type="seglist",
|
Seg(type="text", data=("--" * layer) + user_nickname_str),
|
||||||
data=[
|
seg_data,
|
||||||
Seg(type="text", data=("--" * layer) + user_nickname_str),
|
break_seg,
|
||||||
seg_data,
|
]
|
||||||
break_seg,
|
|
||||||
],
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
full_seg_data = Seg(
|
data_list = [
|
||||||
type="seglist",
|
Seg(type="text", data=user_nickname_str),
|
||||||
data=[
|
seg_data,
|
||||||
Seg(type="text", data=user_nickname_str),
|
break_seg,
|
||||||
seg_data,
|
]
|
||||||
break_seg,
|
full_seg_data = Seg(type="seglist", data=data_list)
|
||||||
],
|
|
||||||
)
|
|
||||||
seg_list.append(full_seg_data)
|
seg_list.append(full_seg_data)
|
||||||
return Seg(type="seglist", data=seg_list), image_count
|
return Seg(type="seglist", data=seg_list), image_count
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,12 @@ class SendHandler:
|
||||||
|
|
||||||
if processed_message:
|
if processed_message:
|
||||||
if group_info and user_info:
|
if group_info and user_info:
|
||||||
|
logger.debug("发送群聊消息")
|
||||||
target_id = group_info.group_id
|
target_id = group_info.group_id
|
||||||
action = "send_group_msg"
|
action = "send_group_msg"
|
||||||
id_name = "group_id"
|
id_name = "group_id"
|
||||||
elif user_info:
|
elif user_info:
|
||||||
|
logger.debug("发送私聊消息")
|
||||||
target_id = user_info.user_id
|
target_id = user_info.user_id
|
||||||
action = "send_private_msg"
|
action = "send_private_msg"
|
||||||
id_name = "user_id"
|
id_name = "user_id"
|
||||||
|
|
@ -81,7 +83,7 @@ class SendHandler:
|
||||||
if not seg_data.data:
|
if not seg_data.data:
|
||||||
return []
|
return []
|
||||||
for seg in seg_data.data:
|
for seg in seg_data.data:
|
||||||
payload = self.process_message_by_type(seg, payload)
|
payload.extend(self.process_message_by_type(seg, payload))
|
||||||
else:
|
else:
|
||||||
payload = self.process_message_by_type(seg_data, payload)
|
payload = self.process_message_by_type(seg_data, payload)
|
||||||
return payload
|
return payload
|
||||||
|
|
@ -119,6 +121,9 @@ class SendHandler:
|
||||||
temp_list = []
|
temp_list = []
|
||||||
temp_list.append(addon)
|
temp_list.append(addon)
|
||||||
for i in payload:
|
for i in payload:
|
||||||
|
if i.get("type") == "reply":
|
||||||
|
logger.debug("检测到多个回复,使用最新的回复")
|
||||||
|
continue
|
||||||
temp_list.append(i)
|
temp_list.append(i)
|
||||||
return temp_list
|
return temp_list
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
14
src/utils.py
14
src/utils.py
|
|
@ -27,6 +27,7 @@ async def get_group_info(websocket: Server.ServerConnection, group_id: int) -> d
|
||||||
|
|
||||||
返回值需要处理可能为空的情况
|
返回值需要处理可能为空的情况
|
||||||
"""
|
"""
|
||||||
|
logger.debug("获取群聊信息中")
|
||||||
request_uuid = str(uuid.uuid4())
|
request_uuid = str(uuid.uuid4())
|
||||||
payload = json.dumps({"action": "get_group_info", "params": {"group_id": group_id}, "echo": request_uuid})
|
payload = json.dumps({"action": "get_group_info", "params": {"group_id": group_id}, "echo": request_uuid})
|
||||||
try:
|
try:
|
||||||
|
|
@ -48,6 +49,7 @@ async def get_member_info(websocket: Server.ServerConnection, group_id: int, use
|
||||||
|
|
||||||
返回值需要处理可能为空的情况
|
返回值需要处理可能为空的情况
|
||||||
"""
|
"""
|
||||||
|
logger.debug("获取群成员信息中")
|
||||||
request_uuid = str(uuid.uuid4())
|
request_uuid = str(uuid.uuid4())
|
||||||
payload = json.dumps(
|
payload = json.dumps(
|
||||||
{
|
{
|
||||||
|
|
@ -72,6 +74,7 @@ async def get_member_info(websocket: Server.ServerConnection, group_id: int, use
|
||||||
async def get_image_base64(url: str) -> str:
|
async def get_image_base64(url: str) -> str:
|
||||||
# sourcery skip: raise-specific-error
|
# sourcery skip: raise-specific-error
|
||||||
"""获取图片/表情包的Base64"""
|
"""获取图片/表情包的Base64"""
|
||||||
|
logger.debug(f"下载图片: {url}")
|
||||||
http = SSLAdapter()
|
http = SSLAdapter()
|
||||||
try:
|
try:
|
||||||
response = http.request("GET", url, timeout=10)
|
response = http.request("GET", url, timeout=10)
|
||||||
|
|
@ -85,6 +88,14 @@ async def get_image_base64(url: str) -> str:
|
||||||
|
|
||||||
|
|
||||||
def convert_image_to_gif(image_base64: str) -> str:
|
def convert_image_to_gif(image_base64: str) -> str:
|
||||||
|
"""
|
||||||
|
将Base64编码的图片转换为GIF格式
|
||||||
|
Parameters:
|
||||||
|
image_base64: str: Base64编码的图片数据
|
||||||
|
Returns:
|
||||||
|
str: Base64编码的GIF图片数据
|
||||||
|
"""
|
||||||
|
logger.debug("转换图片为GIF格式")
|
||||||
try:
|
try:
|
||||||
image_bytes = base64.b64decode(image_base64)
|
image_bytes = base64.b64decode(image_base64)
|
||||||
image = Image.open(io.BytesIO(image_bytes))
|
image = Image.open(io.BytesIO(image_bytes))
|
||||||
|
|
@ -105,6 +116,7 @@ async def get_self_info(websocket: Server.ServerConnection) -> dict:
|
||||||
Returns:
|
Returns:
|
||||||
data: dict: 返回的自身信息
|
data: dict: 返回的自身信息
|
||||||
"""
|
"""
|
||||||
|
logger.debug("获取自身信息中")
|
||||||
request_uuid = str(uuid.uuid4())
|
request_uuid = str(uuid.uuid4())
|
||||||
payload = json.dumps({"action": "get_login_info", "params": {}, "echo": request_uuid})
|
payload = json.dumps({"action": "get_login_info", "params": {}, "echo": request_uuid})
|
||||||
try:
|
try:
|
||||||
|
|
@ -141,6 +153,7 @@ async def get_stranger_info(websocket: Server.ServerConnection, user_id: int) ->
|
||||||
Returns:
|
Returns:
|
||||||
dict: 返回的陌生人信息
|
dict: 返回的陌生人信息
|
||||||
"""
|
"""
|
||||||
|
logger.debug("获取陌生人信息中")
|
||||||
request_uuid = str(uuid.uuid4())
|
request_uuid = str(uuid.uuid4())
|
||||||
payload = json.dumps({"action": "get_stranger_info", "params": {"user_id": user_id}, "echo": request_uuid})
|
payload = json.dumps({"action": "get_stranger_info", "params": {"user_id": user_id}, "echo": request_uuid})
|
||||||
try:
|
try:
|
||||||
|
|
@ -165,6 +178,7 @@ async def get_message_detail(websocket: Server.ServerConnection, message_id: str
|
||||||
Returns:
|
Returns:
|
||||||
dict: 返回的消息详情
|
dict: 返回的消息详情
|
||||||
"""
|
"""
|
||||||
|
logger.debug("获取消息详情中")
|
||||||
request_uuid = str(uuid.uuid4())
|
request_uuid = str(uuid.uuid4())
|
||||||
payload = json.dumps({"action": "get_msg", "params": {"message_id": message_id}, "echo": request_uuid})
|
payload = json.dumps({"action": "get_msg", "params": {"message_id": message_id}, "echo": request_uuid})
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue