From be2dc6ba70396ba9201cbf1fc68c98f1c47e6fe0 Mon Sep 17 00:00:00 2001 From: Soulter <37870767+Soulter@users.noreply.github.com> Date: Mon, 22 May 2023 18:10:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8C=87=E4=BB=A4=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E9=9C=80=E8=A6=81=E5=9C=A8=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=89=8D=E5=8A=A0=E5=89=8D=E7=BC=80=20perf:=20=E6=94=B9?= =?UTF-8?q?=E5=96=84=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cores/qqbot/core.py | 120 +++++++++++++++++++++++++------------------- 1 file changed, 68 insertions(+), 52 deletions(-) diff --git a/cores/qqbot/core.py b/cores/qqbot/core.py index 6bde62664..2c7172b15 100644 --- a/cores/qqbot/core.py +++ b/cores/qqbot/core.py @@ -462,26 +462,43 @@ def oper_msg(message, role = "member" # 角色 hit = False # 是否命中指令 command_result = () # 调用指令返回的结果 - global admin_qq, admin_qqchan, cached_plugins, gocq_bot + global admin_qq, admin_qqchan, cached_plugins, gocq_bot, nick_qq + + with_tag = False # 是否带有昵称 + + # 将nick_qq(昵称)统一转换为tuple + if nick_qq == None: + nick_qq = ("ai","!","!") + if isinstance(nick_qq, str): + nick_qq = (nick_qq,) + if isinstance(nick_qq, list): + nick_qq = tuple(nick_qq) + + if platform == PLATFORM_GOCQ: + _len = 0 + for i in nick_qq: + if message.message[0].text.startswith(i): + _len = len(i) + with_tag = True + break + message.message[0].text = message.message[0].text[_len:].strip() + if platform == PLATFORM_QQCHAN: - gu.log(f"接收到消息:{message.content}", gu.LEVEL_INFO, tag="QQ频道") + gu.log(f"收到消息:{message.content}", gu.LEVEL_INFO, tag="QQ频道") user_id = message.author.id user_name = message.author.username global qqchan_loop if platform == PLATFORM_GOCQ: if isinstance(message.message[0], Plain): - gu.log(f"接收到消息:{message.message[0].text}", gu.LEVEL_INFO, tag="GOCQ") + gu.log(f"收到消息:{message.message[0].text}", gu.LEVEL_INFO, tag="GOCQ") elif isinstance(message.message[0], At): - gu.log(f"接收到消息:{message.message[1].text}", gu.LEVEL_INFO, tag="GOCQ") + gu.log(f"收到消息:{message.message[1].text}", gu.LEVEL_INFO, tag="GOCQ") user_id = message.user_id user_name = message.user_id global gocq_loop - if chosen_provider is None: - send_message(platform, message, f"没有启动任何一个语言模型。请至少在配置文件中启用一个语言模型。", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) - # 检查发言频率 if not check_frequency(user_id): send_message(platform, message, f'你的发言超过频率限制(╯▔皿▔)╯。\n管理员设置{frequency_time}秒内只能提问{frequency_count}次。', msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) @@ -502,7 +519,7 @@ def oper_msg(message, session_id = message.channel_id # 得到身份 if "2" in message.member.roles or "4" in message.member.roles or "5" in message.member.roles: - gu.log(f"检测到管理员身份", gu.LEVEL_INFO, tag="QQ频道") + # gu.log(f"检测到管理员身份", gu.LEVEL_INFO, tag="QQ频道") role = "admin" else: role = "member" @@ -534,7 +551,7 @@ def oper_msg(message, else: sender_id = str(message.sender.user_id) if sender_id == admin_qq or sender_id == admin_qqchan: - gu.log("检测到管理员身份", gu.LEVEL_INFO, tag="GOCQ") + # gu.log("检测到管理员身份", gu.LEVEL_INFO, tag="GOCQ") role = "admin" if qq_msg == "": @@ -590,12 +607,14 @@ def oper_msg(message, chatgpt_res = "" if chosen_provider == OPENAI_OFFICIAL: - if chatgpt == None: - send_message(platform, message, f"管理员未启动此模型或者此模型初始化时失败。", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) - return hit, command_result = command_openai_official.check_command(qq_msg, session_id, user_name, role, platform=platform, message_obj=message, cached_plugins=cached_plugins, qq_platform=gocq_bot) # hit: 是否触发了指令 if not hit: + if not with_tag: + return + if chatgpt == None: + send_message(platform, message, f"管理员未启动OpenAI模型或初始化时失败。", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + return # 请求ChatGPT获得结果 try: chatgpt_res = chatgpt.text_chat(qq_msg, session_id) @@ -606,11 +625,13 @@ def oper_msg(message, send_message(platform, message, f"OpenAI API错误, 原因: {str(e)}", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) elif chosen_provider == REV_CHATGPT: - if rev_chatgpt == None: - send_message(platform, message, f"管理员未启动此模型或者此模型初始化时失败。", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) - return hit, command_result = command_rev_chatgpt.check_command(qq_msg, role, platform=platform, message_obj=message, cached_plugins=cached_plugins, qq_platform=gocq_bot) if not hit: + if not with_tag: + return + if rev_chatgpt == None: + send_message(platform, message, f"管理员未启动此模型或者此模型初始化时失败。", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + return try: while rev_chatgpt.is_all_busy(): time.sleep(1) @@ -622,9 +643,6 @@ def oper_msg(message, send_message(platform, message, f"RevChatGPT错误, 原因: \n{str(e)}", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) elif chosen_provider == REV_EDGEGPT: - if rev_edgegpt == None: - send_message(platform, message, f"管理员未启动此模型或者此模型初始化时失败。", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) - return if bing_cache_loop == None: if platform == PLATFORM_GOCQ: bing_cache_loop = gocq_loop @@ -633,6 +651,11 @@ def oper_msg(message, hit, command_result = command_rev_edgegpt.check_command(qq_msg, bing_cache_loop, role, platform=platform, message_obj=message, cached_plugins=cached_plugins, qq_platform=gocq_bot) if not hit: try: + if not with_tag: + return + if rev_edgegpt == None: + send_message(platform, message, f"管理员未启动此模型或者此模型初始化时失败。", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + return while rev_edgegpt.is_busy(): time.sleep(1) @@ -669,14 +692,16 @@ def oper_msg(message, # 昵称 if command == "nick": with open("cmd_config.json", "r", encoding="utf-8") as f: - global nick_qq nick_qq = json.load(f)["nick_qq"] if command_result[0]: # 是否是画图指令 if isinstance(command_result[1], list) and len(command_result) == 3 and command_result[2] == 'draw': - for i in command_result[1]: - send_message(platform, message, i, msg_ref=msg_ref, image=i, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + if chatgpt != None: + for i in command_result[1]: + send_message(platform, message, i, msg_ref=msg_ref, image=i, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + else: + send_message(platform, message, "画图指令需要启用OpenAI官方模型.", msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) else: try: send_message(platform, message, command_result[1], msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) @@ -762,24 +787,15 @@ class gocqClient(): async def _(app: CQHTTP, source: GroupMessage): # gu.log(str(source), gu.LEVEL_INFO, max_len=9999) - global nick_qq - # 将nick_qq转换为元组 - if nick_qq == None: - nick_qq = ("ai","!","!") - if isinstance(nick_qq, str): - nick_qq = (nick_qq,) - if isinstance(nick_qq, list): - nick_qq = tuple(nick_qq) - if isinstance(source.message[0], Plain): - if source.message[0].text.startswith(nick_qq): - # print(nick_qq) - _len = 0 - for i in nick_qq: - if source.message[0].text.startswith(i): - _len = len(i) - source.message[0].text = source.message[0].text[_len:].strip() - new_sub_thread(oper_msg, (source, True, None, PLATFORM_GOCQ)) + # if source.message[0].text.startswith(nick_qq): + # # print(nick_qq) + # _len = 0 + # for i in nick_qq: + # if source.message[0].text.startswith(i): + # _len = len(i) + # source.message[0].text = source.message[0].text[_len:].strip() + new_sub_thread(oper_msg, (source, True, None, PLATFORM_GOCQ)) if isinstance(source.message[0], At): if source.message[0].qq == source.self_id: new_sub_thread(oper_msg, (source, True, None, PLATFORM_GOCQ)) @@ -803,22 +819,22 @@ class gocqClient(): @gocq_app.receiver("GuildMessage") async def _(app: CQHTTP, source: GuildMessage): # gu.log(str(source), gu.LEVEL_INFO, max_len=9999) - global nick_qq - if nick_qq == None: - nick_qq = ("ai","!","!") - if isinstance(nick_qq, str): - nick_qq = (nick_qq,) - if isinstance(nick_qq, list): - nick_qq = tuple(nick_qq) + # global nick_qq + # if nick_qq == None: + # nick_qq = ("ai","!","!") + # if isinstance(nick_qq, str): + # nick_qq = (nick_qq,) + # if isinstance(nick_qq, list): + # nick_qq = tuple(nick_qq) if isinstance(source.message[0], Plain): - if source.message[0].text.startswith(nick_qq): - _len = 0 - for i in nick_qq: - if source.message[0].text.startswith(i): - _len = len(i) - source.message[0].text = source.message[0].text[_len:].strip() - new_sub_thread(oper_msg, (source, True, None, PLATFORM_GOCQ)) + # if source.message[0].text.startswith(nick_qq): + # _len = 0 + # for i in nick_qq: + # if source.message[0].text.startswith(i): + # _len = len(i) + # source.message[0].text = source.message[0].text[_len:].strip() + new_sub_thread(oper_msg, (source, True, None, PLATFORM_GOCQ)) if isinstance(source.message[0], At): if source.message[0].tiny_id == source.self_tiny_id: new_sub_thread(oper_msg, (source, True, None, PLATFORM_GOCQ))