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] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=E4=BC=9A=E5=91=98/?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E7=89=B9=E6=AE=8A=E5=8A=A8=E5=9B=BE=EF=BC=88?= =?UTF-8?q?=E5=88=9B=E6=84=8F=E7=8E=A9=E6=B3=95=EF=BC=89=E6=88=B3=E4=B8=80?= =?UTF-8?q?=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: