From 218c16c60c40c6abf37ce4d8c67ca389b5837495 Mon Sep 17 00:00:00 2001 From: IMIG <85346617+ingoingyang@users.noreply.github.com> Date: Sun, 2 Nov 2025 08:59:35 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=E4=BC=9A?= =?UTF-8?q?=E5=91=98/=E6=B4=BB=E5=8A=A8=E7=89=B9=E6=AE=8A=E5=8A=A8?= =?UTF-8?q?=E5=9B=BE=EF=BC=88=E5=88=9B=E6=84=8F=E7=8E=A9=E6=B3=95=EF=BC=89?= =?UTF-8?q?=E6=88=B3=E4=B8=80=E6=88=B3=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加对创意玩法内只有表情动图而不带文字描述的会员与活动特殊戳一戳进行处理 已知问题:动图只能够识别第一帧(可以尝试通过动图URL解析成文字描述,但如果官方更新可能会失效(?),而且我不会python :( ) --- src/recv_handler/notice_handler.py | 75 ++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/src/recv_handler/notice_handler.py b/src/recv_handler/notice_handler.py index 1e51ea4..5518ae7 100644 --- a/src/recv_handler/notice_handler.py +++ b/src/recv_handler/notice_handler.py @@ -175,11 +175,11 @@ class NoticeHandler: ) -> Tuple[Seg | None, UserInfo | None]: # sourcery skip: merge-comparisons, merge-duplicate-blocks, remove-redundant-if, remove-unnecessary-else, swap-if-else-branches self_info: dict = await get_self_info(self.server_connection) - + if not self_info: logger.error("自身信息获取失败") return None, None - + self_id = raw_message.get("self_id") target_id = raw_message.get("target_id") target_name: str = None @@ -195,17 +195,15 @@ class NoticeHandler: else: user_name = "QQ用户" user_cardname = "QQ用户" - logger.info("无法获取戳一戳对方的用户昵称") + logger.info("无法获取戳一戳对方的用户昵称,使用默认昵称") # 计算Seg if self_id == target_id: display_name = "" target_name = self_info.get("nickname") - elif self_id == user_id: # 让ada不发送麦麦戳别人的消息 return None, None - else: # 老实说这一步判定没啥意义,毕竟私聊是没有其他人之间的戳一戳,但是感觉可以有这个判定来强限制群聊环境 if group_id: @@ -214,31 +212,70 @@ class NoticeHandler: target_name = fetched_member_info.get("nickname") else: target_name = "QQ用户" - logger.info("无法获取被戳一戳方的用户昵称") + logger.info("无法获取被戳一戳方的用户昵称,使用默认昵称") display_name = user_name else: return None, None - - first_txt: str = "戳了戳" - second_txt: str = "" - try: - first_txt = raw_info[2].get("txt", "戳了戳") - second_txt = raw_info[4].get("txt", "") - except Exception as e: - logger.warning(f"解析戳一戳消息失败: {str(e)},将使用默认文本") - + user_info: UserInfo = UserInfo( platform=global_config.maibot_server.platform_name, user_id=user_id, user_nickname=user_name, user_cardname=user_cardname, ) - - seg_data: Seg = Seg( + + seg_data: List[Seg] = [] + acton_seg: Seg = Seg(type=RealMessageType.text, data="戳了戳") + action: str = "戳了戳" + second_txt: str = "" + submit_notice_seg: Seg = None + + try: + if raw_info[2].get("type") == "qq": + """ + #可选不处理任意用户自戳 + if raw_info[2].get("tp") == "1": + logger.info("不处理用户自戳") + return None, None + """ + try: + image_base64 = await get_image_base64(raw_info[1].get("src")) + acton_seg = Seg(type="emoji", data=image_base64) + except Exception as e: + logger.error(f"会员/活动戳一戳动图处理失败: {str(e)}") + acton_seg = Seg(type=RealMessageType.text, data="戳了戳") + second_txt = raw_info[3].get("txt", "") + suffix: str = f"{target_name}{second_txt}" + + seg_data.append(Seg(type=RealMessageType.text, data=display_name)) + seg_data.append(acton_seg) + seg_data.append(Seg(type=RealMessageType.text, data=suffix)) + + submit_notice_seg = Seg( + type="seglist", + data=seg_data, + ) + return submit_notice_seg, user_info + else: + if raw_info[3].get("tp") == "1": + logger.info("不处理bot自戳") + return None, None + action = raw_info[2].get("txt", "戳了戳") + second_txt = raw_info[4].get("txt", "") + #Lagrange poke + #logger.info(f"action:{action}") + #logger.info(f"suffix:{second_txt}") + #action = raw_message.get("action", "戳了戳") + #second_txt = raw_message.get("suffix", "") + except Exception as e: + logger.warning(f"解析戳一戳消息失败: {str(e)},将使用默认文本") + + submit_notice_seg = Seg( type="text", - data=f"{display_name}{first_txt}{target_name}{second_txt}(这是QQ的一个功能,用于提及某人,但没那么明显)", + data=f"{display_name}{action}{target_name}{second_txt}(这是QQ的一个功能,用于提及某人,但没那么明显)", + #data=f"{display_name}{action}{target_name}{second_txt}", ) - return seg_data, user_info + return submit_notice_seg, user_info async def handle_ban_notify(self, raw_message: dict, group_id: int) -> Tuple[Seg, UserInfo] | Tuple[None, None]: if not group_id: From 05327ceaad39fdf01de0d7063c8ddcedb22ccd27 Mon Sep 17 00:00:00 2001 From: IMIG <85346617+ingoingyang@users.noreply.github.com> Date: Sun, 2 Nov 2025 09:37:52 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/recv_handler/notice_handler.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/recv_handler/notice_handler.py b/src/recv_handler/notice_handler.py index 5518ae7..a79e9cd 100644 --- a/src/recv_handler/notice_handler.py +++ b/src/recv_handler/notice_handler.py @@ -216,7 +216,7 @@ class NoticeHandler: display_name = user_name else: return None, None - + #提前构造User info user_info: UserInfo = UserInfo( platform=global_config.maibot_server.platform_name, user_id=user_id, @@ -229,21 +229,24 @@ class NoticeHandler: action: str = "戳了戳" second_txt: str = "" submit_notice_seg: Seg = None - + #catch意外越界error(TODO:减少try catch使用,尝试通过比较元素数量直接判断,napcat的raw info普通戳一戳包含5个元素, 自戳与特殊戳一戳包含四个元素(因为没有“戳一戳”、“拍一拍”等文字描述) try: + #判断是否为特殊戳一戳 if raw_info[2].get("type") == "qq": """ - #可选不处理任意用户自戳 + #可选不处理任意用户自戳, 自戳tp项参数为1 if raw_info[2].get("tp") == "1": logger.info("不处理用户自戳") return None, None """ + #获取并处理戳一戳动图 try: image_base64 = await get_image_base64(raw_info[1].get("src")) acton_seg = Seg(type="emoji", data=image_base64) except Exception as e: logger.error(f"会员/活动戳一戳动图处理失败: {str(e)}") acton_seg = Seg(type=RealMessageType.text, data="戳了戳") + second_txt = raw_info[3].get("txt", "") suffix: str = f"{target_name}{second_txt}" @@ -257,23 +260,18 @@ class NoticeHandler: ) return submit_notice_seg, user_info else: + #可选不处理使用bot账号进行的自戳,自戳tp项参数为1 if raw_info[3].get("tp") == "1": logger.info("不处理bot自戳") return None, None action = raw_info[2].get("txt", "戳了戳") second_txt = raw_info[4].get("txt", "") - #Lagrange poke - #logger.info(f"action:{action}") - #logger.info(f"suffix:{second_txt}") - #action = raw_message.get("action", "戳了戳") - #second_txt = raw_message.get("suffix", "") except Exception as e: logger.warning(f"解析戳一戳消息失败: {str(e)},将使用默认文本") submit_notice_seg = Seg( type="text", data=f"{display_name}{action}{target_name}{second_txt}(这是QQ的一个功能,用于提及某人,但没那么明显)", - #data=f"{display_name}{action}{target_name}{second_txt}", ) return submit_notice_seg, user_info From 2eb321675c24e4d85cbb8ebe279da8a23c094123 Mon Sep 17 00:00:00 2001 From: IMIG <85346617+ingoingyang@users.noreply.github.com> Date: Sun, 2 Nov 2025 13:34:33 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/recv_handler/notice_handler.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/recv_handler/notice_handler.py b/src/recv_handler/notice_handler.py index a79e9cd..c43ecb1 100644 --- a/src/recv_handler/notice_handler.py +++ b/src/recv_handler/notice_handler.py @@ -225,7 +225,7 @@ class NoticeHandler: ) seg_data: List[Seg] = [] - acton_seg: Seg = Seg(type=RealMessageType.text, data="戳了戳") + acton_seg: Seg = Seg(type="text", data="戳了戳") action: str = "戳了戳" second_txt: str = "" submit_notice_seg: Seg = None @@ -245,14 +245,14 @@ class NoticeHandler: acton_seg = Seg(type="emoji", data=image_base64) except Exception as e: logger.error(f"会员/活动戳一戳动图处理失败: {str(e)}") - acton_seg = Seg(type=RealMessageType.text, data="戳了戳") + acton_seg = Seg(type="text", data="戳了戳") second_txt = raw_info[3].get("txt", "") suffix: str = f"{target_name}{second_txt}" - seg_data.append(Seg(type=RealMessageType.text, data=display_name)) + seg_data.append(Seg(type="text", data=display_name)) seg_data.append(acton_seg) - seg_data.append(Seg(type=RealMessageType.text, data=suffix)) + seg_data.append(Seg(type="text", data=suffix)) submit_notice_seg = Seg( type="seglist", From 6712d76f4d57a4764af845a7d2d49fe294106816 Mon Sep 17 00:00:00 2001 From: IMIG <85346617+ingoingyang@users.noreply.github.com> Date: Sun, 2 Nov 2025 13:48:05 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/recv_handler/notice_handler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/recv_handler/notice_handler.py b/src/recv_handler/notice_handler.py index c43ecb1..a003f20 100644 --- a/src/recv_handler/notice_handler.py +++ b/src/recv_handler/notice_handler.py @@ -17,6 +17,7 @@ from src.utils import ( get_member_info, get_self_info, get_stranger_info, + get_image_base64, read_ban_list, )