移除部分无用代码,增加websockets发送与接受的稳定性
parent
7945853fd1
commit
c497d4a8eb
|
|
@ -66,6 +66,7 @@ class RecvHandler:
|
|||
await asyncio.sleep(self.interval)
|
||||
|
||||
async def handle_raw_message(self, raw_message: dict) -> None:
|
||||
# sourcery skip: low-code-quality, remove-unreachable-code
|
||||
"""
|
||||
从Napcat接受的原始消息处理
|
||||
|
||||
|
|
@ -112,10 +113,7 @@ class RecvHandler:
|
|||
raw_message.get("group_id"),
|
||||
sender_info.get("user_id"),
|
||||
)
|
||||
nickname: str = None
|
||||
if fetched_member_info:
|
||||
nickname = fetched_member_info.get("nickname")
|
||||
|
||||
nickname = fetched_member_info.get("nickname") if fetched_member_info else None
|
||||
# 发送者用户信息
|
||||
user_info: UserInfo = UserInfo(
|
||||
platform=global_config.platform,
|
||||
|
|
@ -211,6 +209,7 @@ class RecvHandler:
|
|||
await self.message_process(message_base)
|
||||
|
||||
async def handle_real_message(self, raw_message: dict, in_reply: bool = False) -> List[Seg] | None:
|
||||
# sourcery skip: low-code-quality
|
||||
"""
|
||||
处理实际消息
|
||||
Parameters:
|
||||
|
|
@ -245,8 +244,6 @@ class RecvHandler:
|
|||
seg_message += ret_seg
|
||||
else:
|
||||
logger.warning("reply处理失败")
|
||||
else:
|
||||
pass
|
||||
case RealMessageType.image:
|
||||
ret_seg = await self.handle_image_message(sub_message)
|
||||
if ret_seg:
|
||||
|
|
@ -255,10 +252,8 @@ class RecvHandler:
|
|||
logger.warning("image处理失败")
|
||||
case RealMessageType.record:
|
||||
logger.warning("不支持语音解析")
|
||||
pass
|
||||
case RealMessageType.video:
|
||||
logger.warning("不支持视频解析")
|
||||
pass
|
||||
case RealMessageType.at:
|
||||
ret_seg = await self.handle_at_message(
|
||||
sub_message,
|
||||
|
|
@ -271,17 +266,13 @@ class RecvHandler:
|
|||
logger.warning("at处理失败")
|
||||
case RealMessageType.rps:
|
||||
logger.warning("暂时不支持猜拳魔法表情解析")
|
||||
pass
|
||||
case RealMessageType.dice:
|
||||
logger.warning("暂时不支持骰子表情解析")
|
||||
pass
|
||||
case RealMessageType.shake:
|
||||
# 预计等价于戳一戳
|
||||
logger.warning("暂时不支持窗口抖动解析")
|
||||
pass
|
||||
case RealMessageType.share:
|
||||
logger.warning("暂时不支持链接解析")
|
||||
pass
|
||||
case RealMessageType.forward:
|
||||
forward_message_data = sub_message.get("data")
|
||||
if not forward_message_data:
|
||||
|
|
@ -296,9 +287,8 @@ class RecvHandler:
|
|||
"echo": request_uuid,
|
||||
}
|
||||
)
|
||||
await self.server_connection.send(payload)
|
||||
# response = await self.server_connection.recv()
|
||||
try:
|
||||
await self.server_connection.send(payload)
|
||||
response: dict = await get_response(request_uuid)
|
||||
except TimeoutError:
|
||||
logger.error("获取转发消息超时")
|
||||
|
|
@ -326,10 +316,8 @@ class RecvHandler:
|
|||
logger.warning("转发消息处理失败")
|
||||
case RealMessageType.node:
|
||||
logger.warning("不支持转发消息节点解析")
|
||||
pass
|
||||
case _:
|
||||
logger.warning(f"未知消息类型:{sub_message_type}")
|
||||
pass
|
||||
return seg_message
|
||||
|
||||
async def handle_text_message(self, raw_message: dict) -> Seg:
|
||||
|
|
@ -342,8 +330,7 @@ class RecvHandler:
|
|||
"""
|
||||
message_data: dict = raw_message.get("data")
|
||||
plain_text: str = message_data.get("text")
|
||||
seg_data = Seg(type=RealMessageType.text, data=plain_text)
|
||||
return seg_data
|
||||
return Seg(type=RealMessageType.text, data=plain_text)
|
||||
|
||||
async def handle_face_message(self, raw_message: dict) -> Seg | None:
|
||||
"""
|
||||
|
|
@ -354,11 +341,10 @@ class RecvHandler:
|
|||
seg_data: Seg: 处理后的消息段
|
||||
"""
|
||||
message_data: dict = raw_message.get("data")
|
||||
face_raw_id: str = message_data.get("id")
|
||||
if str(face_raw_id) in qq_face:
|
||||
face_raw_id: str = str(message_data.get("id"))
|
||||
if face_raw_id in qq_face:
|
||||
face_content: str = qq_face.get(face_raw_id)
|
||||
seg_data = Seg(type="text", data=face_content)
|
||||
return seg_data
|
||||
return Seg(type="text", data=face_content)
|
||||
else:
|
||||
logger.warning(f"不支持的表情:{face_raw_id}")
|
||||
return None
|
||||
|
|
@ -380,14 +366,16 @@ class RecvHandler:
|
|||
return None
|
||||
if image_sub_type == 0:
|
||||
"""这部分认为是图片"""
|
||||
seg_data = Seg(type="image", data=image_base64)
|
||||
return seg_data
|
||||
else:
|
||||
return Seg(type="image", data=image_base64)
|
||||
elif image_sub_type == 1:
|
||||
"""这部分认为是表情包"""
|
||||
seg_data = Seg(type="emoji", data=image_base64)
|
||||
return seg_data
|
||||
return Seg(type="emoji", data=image_base64)
|
||||
else:
|
||||
logger.warning(f"不支持的图片类型:{image_sub_type}")
|
||||
return None
|
||||
|
||||
async def handle_at_message(self, raw_message: dict, self_id: int, group_id: int) -> Seg | None:
|
||||
# sourcery skip: use-named-expression
|
||||
"""
|
||||
处理at消息
|
||||
Parameters:
|
||||
|
|
@ -419,6 +407,7 @@ class RecvHandler:
|
|||
return None
|
||||
|
||||
async def handle_reply_message(self, raw_message: dict) -> Seg | None:
|
||||
# sourcery skip: move-assign-in-block, use-named-expression
|
||||
"""
|
||||
处理回复消息
|
||||
|
||||
|
|
@ -434,7 +423,7 @@ class RecvHandler:
|
|||
logger.warning("获取被引用的消息详情失败")
|
||||
return None
|
||||
reply_message = await self.handle_real_message(message_detail, in_reply=True)
|
||||
if reply_message == None:
|
||||
if reply_message is None:
|
||||
reply_message = "(获取发言内容失败)"
|
||||
sender_info: dict = message_detail.get("sender")
|
||||
sender_nickname: str = sender_info.get("nickname")
|
||||
|
|
@ -443,14 +432,11 @@ class RecvHandler:
|
|||
if not sender_nickname:
|
||||
logger.warning("无法获取被引用的人的昵称,返回默认值")
|
||||
seg_message.append(Seg(type="text", data="[回复 QQ用户(未知id):"))
|
||||
seg_message += reply_message
|
||||
seg_message.append(Seg(type="text", data="],说:"))
|
||||
return seg_message
|
||||
else:
|
||||
seg_message.append(Seg(type="text", data=f"[回复 {sender_nickname}({sender_id}):"))
|
||||
seg_message += reply_message
|
||||
seg_message.append(Seg(type="text", data="],说:"))
|
||||
return seg_message
|
||||
seg_message += reply_message
|
||||
seg_message.append(Seg(type="text", data="],说:"))
|
||||
return seg_message
|
||||
|
||||
async def handle_notice(self, raw_message: dict) -> None:
|
||||
notice_type = raw_message.get("notice_type")
|
||||
|
|
@ -466,12 +452,10 @@ class RecvHandler:
|
|||
logger.info("好友撤回一条消息")
|
||||
logger.info(f"撤回消息ID:{raw_message.get('message_id')}, 撤回时间:{raw_message.get('time')}")
|
||||
logger.warning("暂时不支持撤回消息处理")
|
||||
pass
|
||||
case NoticeType.group_recall:
|
||||
logger.info("群内用户撤回一条消息")
|
||||
logger.info(f"撤回消息ID:{raw_message.get('message_id')}, 撤回时间:{raw_message.get('time')}")
|
||||
logger.warning("暂时不支持撤回消息处理")
|
||||
pass
|
||||
case NoticeType.notify:
|
||||
sub_type = raw_message.get("sub_type")
|
||||
match sub_type:
|
||||
|
|
@ -553,11 +537,7 @@ class RecvHandler:
|
|||
raw_info: list = raw_message.get("raw_info")
|
||||
# 计算Seg
|
||||
if self_id == target_id:
|
||||
if self_info:
|
||||
target_name = self_info.get("nickname")
|
||||
else:
|
||||
logger.warning("无法获取bot的昵称,戳一戳消息可能无效")
|
||||
target_name = "你"
|
||||
target_name = self_info.get("nickname")
|
||||
else:
|
||||
return None
|
||||
try:
|
||||
|
|
@ -597,17 +577,16 @@ class RecvHandler:
|
|||
return None
|
||||
if image_count < 5 and image_count > 0:
|
||||
# 处理图片数量小于5的情况,此时解析图片为base64
|
||||
parsed_handled_message = await self._recursive_parse_image_seg(handled_message, True)
|
||||
return parsed_handled_message
|
||||
return await self._recursive_parse_image_seg(handled_message, True)
|
||||
elif image_count > 0:
|
||||
# 处理图片数量大于等于5的情况,此时解析图片为占位符
|
||||
parsed_handled_message = await self._recursive_parse_image_seg(handled_message, False)
|
||||
return parsed_handled_message
|
||||
return await self._recursive_parse_image_seg(handled_message, False)
|
||||
else:
|
||||
# 处理没有图片的情况,此时直接返回
|
||||
return handled_message
|
||||
|
||||
async def _recursive_parse_image_seg(self, seg_data: Seg, to_image: bool) -> Seg:
|
||||
# sourcery skip: merge-else-if-into-elif
|
||||
if to_image:
|
||||
if seg_data.type == "seglist":
|
||||
new_seg_list = []
|
||||
|
|
@ -642,14 +621,15 @@ class RecvHandler:
|
|||
return Seg(type="seglist", data=new_seg_list)
|
||||
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":
|
||||
image_url = seg_data.data
|
||||
return Seg(type="text", data="【动画表情】")
|
||||
return Seg(type="text", data="[动画表情]")
|
||||
else:
|
||||
return seg_data
|
||||
|
||||
async def _handle_forward_message(self, message_list: list, layer: int) -> Tuple[Seg, int] | Tuple[None, int]:
|
||||
# sourcery skip: low-code-quality
|
||||
"""
|
||||
递归处理实际转发消息
|
||||
Parameters:
|
||||
|
|
|
|||
11
src/utils.py
11
src/utils.py
|
|
@ -29,8 +29,8 @@ async def get_group_info(websocket: Server.ServerConnection, group_id: int) -> d
|
|||
"""
|
||||
request_uuid = str(uuid.uuid4())
|
||||
payload = json.dumps({"action": "get_group_info", "params": {"group_id": group_id}, "echo": request_uuid})
|
||||
await websocket.send(payload)
|
||||
try:
|
||||
await websocket.send(payload)
|
||||
socket_response: dict = await get_response(request_uuid)
|
||||
except TimeoutError:
|
||||
logger.error(f"获取群信息超时,群号: {group_id}")
|
||||
|
|
@ -56,8 +56,8 @@ async def get_member_info(websocket: Server.ServerConnection, group_id: int, use
|
|||
"echo": request_uuid,
|
||||
}
|
||||
)
|
||||
await websocket.send(payload)
|
||||
try:
|
||||
await websocket.send(payload)
|
||||
socket_response: dict = await get_response(request_uuid)
|
||||
except TimeoutError:
|
||||
logger.error(f"获取成员信息超时,群号: {group_id}, 用户ID: {user_id}")
|
||||
|
|
@ -70,6 +70,7 @@ async def get_member_info(websocket: Server.ServerConnection, group_id: int, use
|
|||
|
||||
|
||||
async def get_image_base64(url: str) -> str:
|
||||
# sourcery skip: raise-specific-error
|
||||
"""获取图片/表情包的Base64"""
|
||||
http = SSLAdapter()
|
||||
try:
|
||||
|
|
@ -106,8 +107,8 @@ async def get_self_info(websocket: Server.ServerConnection) -> dict:
|
|||
"""
|
||||
request_uuid = str(uuid.uuid4())
|
||||
payload = json.dumps({"action": "get_login_info", "params": {}, "echo": request_uuid})
|
||||
await websocket.send(payload)
|
||||
try:
|
||||
await websocket.send(payload)
|
||||
response: dict = await get_response(request_uuid)
|
||||
except TimeoutError:
|
||||
logger.error("获取自身信息超时")
|
||||
|
|
@ -142,8 +143,8 @@ async def get_stranger_info(websocket: Server.ServerConnection, user_id: int) ->
|
|||
"""
|
||||
request_uuid = str(uuid.uuid4())
|
||||
payload = json.dumps({"action": "get_stranger_info", "params": {"user_id": user_id}, "echo": request_uuid})
|
||||
await websocket.send(payload)
|
||||
try:
|
||||
await websocket.send(payload)
|
||||
response: dict = await get_response(request_uuid)
|
||||
except TimeoutError:
|
||||
logger.error(f"获取陌生人信息超时,用户ID: {user_id}")
|
||||
|
|
@ -166,8 +167,8 @@ async def get_message_detail(websocket: Server.ServerConnection, message_id: str
|
|||
"""
|
||||
request_uuid = str(uuid.uuid4())
|
||||
payload = json.dumps({"action": "get_msg", "params": {"message_id": message_id}, "echo": request_uuid})
|
||||
await websocket.send(payload)
|
||||
try:
|
||||
await websocket.send(payload)
|
||||
response: dict = await get_response(request_uuid)
|
||||
except TimeoutError:
|
||||
logger.error(f"获取消息详情超时,消息ID: {message_id}")
|
||||
|
|
|
|||
Loading…
Reference in New Issue