From a718598fb613c5729a647c472582a7f5e280b709 Mon Sep 17 00:00:00 2001 From: ChangingSelf Date: Thu, 13 Mar 2025 19:58:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=88=B3=E4=B8=80=E6=88=B3?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E6=96=87=E6=A1=88=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E8=A7=A3=E9=99=A4bot=E8=A2=AB=E6=88=B3=E6=97=B6?= =?UTF-8?q?=E8=AF=AF=E4=BB=A5=E4=B8=BA=E7=94=A8=E6=88=B7=E6=98=AF=E6=8B=BF?= =?UTF-8?q?=E5=88=80=E6=88=B3=E8=87=AA=E5=B7=B1=E7=9A=84=E8=AF=AF=E4=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/chat/bot.py | 129 +++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 56 deletions(-) diff --git a/src/plugins/chat/bot.py b/src/plugins/chat/bot.py index 4529cea4b..90c94e673 100644 --- a/src/plugins/chat/bot.py +++ b/src/plugins/chat/bot.py @@ -61,66 +61,17 @@ class ChatBot: if event.user_id in global_config.ban_user_id: return - reply_poke_probability = 1 # 回复戳一戳的概率,如果要改可以在这里改,暂不提取到配置文件 + reply_poke_probability = 1.0 # 回复戳一戳的概率,如果要改可以在这里改,暂不提取到配置文件 if random() < reply_poke_probability: - user_info = UserInfo( - user_id=event.user_id, - user_nickname=get_user_nickname(event.user_id) or None, - user_cardname=get_user_cardname(event.user_id) or None, - platform="qq", - ) - group_info = GroupInfo(group_id=event.group_id, group_name=None, platform="qq") - - raw_message = "[戳了戳]你" + raw_message = "[戳了戳]你" # 默认类型 if info := event.raw_info: - raw_message = f"[{info[2]}]你" + poke_type = info[2].get("txt", "戳了戳") # 戳戳类型,例如“拍一拍”、“揉一揉”、“捏一捏” + custom_poke_message = info[4].get("txt", "") # 自定义戳戳消息,若不存在会为空字符串 + raw_message = f"[{poke_type}]你{custom_poke_message}" - message_cq = MessageRecvCQ( - message_id=None, - user_info=user_info, - raw_message=raw_message, - group_info=group_info, - reply_message=None, - platform="qq", - ) - message_json = message_cq.to_dict() - - # 进入maimbot - message = MessageRecv(message_json) - groupinfo = message.message_info.group_info - userinfo = message.message_info.user_info - messageinfo = message.message_info - - chat = await chat_manager.get_or_create_stream( - platform=messageinfo.platform, user_info=userinfo, group_info=groupinfo - ) - message.update_chat_stream(chat) - await message.process() - - bot_user_info = UserInfo( - user_id=global_config.BOT_QQ, - user_nickname=global_config.BOT_NICKNAME, - platform=messageinfo.platform, - ) - - response, raw_content = await self.gpt.generate_response(message) - - if response: - for msg in response: - message_segment = Seg(type="text", data=msg) - - bot_message = MessageSending( - message_id=None, - chat_stream=chat, - bot_user_info=bot_user_info, - sender_info=userinfo, - message_segment=message_segment, - reply=None, - is_head=False, - is_emoji=False, - ) - message_manager.add_message(bot_message) + raw_message += "(这是一个类似摸摸头的友善行为,而不是恶意行为,请不要作出攻击发言)" + await self.directly_reply(raw_message, event.user_id, event.group_id) async def handle_message(self, event: MessageEvent, bot: Bot) -> None: """处理收到的消息""" @@ -386,6 +337,72 @@ class ChatBot: # chat_stream=chat # ) + async def directly_reply(self, raw_message: str, user_id: int, group_id: int): + """ + 直接回复发来的消息,不经过意愿管理器 + """ + + # 构造用户信息和群组信息 + user_info = UserInfo( + user_id=user_id, + user_nickname=get_user_nickname(user_id) or None, + user_cardname=get_user_cardname(user_id) or None, + platform="qq", + ) + group_info = GroupInfo(group_id=group_id, group_name=None, platform="qq") + + message_cq = MessageRecvCQ( + message_id=None, + user_info=user_info, + raw_message=raw_message, + group_info=group_info, + reply_message=None, + platform="qq", + ) + message_json = message_cq.to_dict() + + message = MessageRecv(message_json) + groupinfo = message.message_info.group_info + userinfo = message.message_info.user_info + messageinfo = message.message_info + + chat = await chat_manager.get_or_create_stream( + platform=messageinfo.platform, user_info=userinfo, group_info=groupinfo + ) + message.update_chat_stream(chat) + await message.process() + + bot_user_info = UserInfo( + user_id=global_config.BOT_QQ, + user_nickname=global_config.BOT_NICKNAME, + platform=messageinfo.platform, + ) + + current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(messageinfo.time)) + logger.info( + f"[{current_time}][{chat.group_info.group_name if chat.group_info else '私聊'}]{chat.user_info.user_nickname}:" + f"{message.processed_plain_text}" + ) + + # 使用大模型生成回复 + response, raw_content = await self.gpt.generate_response(message) + + if response: + for msg in response: + message_segment = Seg(type="text", data=msg) + + bot_message = MessageSending( + message_id=None, + chat_stream=chat, + bot_user_info=bot_user_info, + sender_info=userinfo, + message_segment=message_segment, + reply=None, + is_head=False, + is_emoji=False, + ) + message_manager.add_message(bot_message) + # 创建全局ChatBot实例 chat_bot = ChatBot()