From e77e7b050a5e9c08bfa0270c83fd819058855c81 Mon Sep 17 00:00:00 2001 From: Soulter <37870767+Soulter@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:21:55 +0000 Subject: [PATCH] feat: QQ message plain texts to pic support #108 --- cores/qqbot/core.py | 18 ++++++++++++++---- model/platform/qq.py | 24 ++++++++++++++++++------ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/cores/qqbot/core.py b/cores/qqbot/core.py index 7f663c8b8..1fee6e238 100644 --- a/cores/qqbot/core.py +++ b/cores/qqbot/core.py @@ -122,6 +122,7 @@ cnt_valid = 0 cc.init_attributes(["qq_forward_threshold"], 200) cc.init_attributes(["qq_welcome"], "欢迎加入本群!\n欢迎给https://github.com/Soulter/QQChannelChatGPT项目一个Star😊~\n输入help查看帮助~\n") cc.init_attributes(["bing_proxy"], "") +cc.init_attributes(["qq_pic_mode"], False) def new_sub_thread(func, args=()): thread = threading.Thread(target=func, args=args, daemon=True) @@ -413,7 +414,9 @@ def save_provider_preference(chosen_provider): ''' 通用回复方法 ''' -def send_message(platform, message, res, msg_ref = None, image = None, gocq_loop = None, qqchannel_bot = None, gocq_bot = None): +def send_message(platform, message, res, msg_ref = None, image = None, gocq_loop = None, qqchannel_bot = None, gocq_bot = None, image_mode=False): + # imagemode: + # For GOCQ: when image_mode is true, ALL plain texts in res will change into a new pic global cnt_valid cnt_valid += 1 if platform == PLATFORM_QQCHAN: @@ -423,9 +426,10 @@ def send_message(platform, message, res, msg_ref = None, image = None, gocq_loop qqchannel_bot.send_qq_msg(message, str(res), msg_ref=msg_ref) if platform == PLATFORM_GOCQ: if image != None: - asyncio.run_coroutine_threadsafe(gocq_bot.send_qq_msg(message, image, image_mode=True), gocq_loop).result() + # image is a url string + asyncio.run_coroutine_threadsafe(gocq_bot.send_qq_msg(message, [Plain(text="好的,我根据你的需要为你生成了一张图片😊"),Image.fromURL(image)], False), gocq_loop).result() else: - asyncio.run_coroutine_threadsafe(gocq_bot.send_qq_msg(message, res, False, ), gocq_loop).result() + asyncio.run_coroutine_threadsafe(gocq_bot.send_qq_msg(message, res, image_mode), gocq_loop).result() def oper_msg(message, @@ -720,7 +724,13 @@ def oper_msg(message, # 发送qq信息 try: - send_message(platform, message, chatgpt_res, msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + if platform==GOCQ: + if cc.get("qq_pic_mode", False): + send_message(platform, message, chatgpt_res, image_mode=True, msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + else: + send_message(platform, message, chatgpt_res, msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) + else: + send_message(platform, message, chatgpt_res, msg_ref=msg_ref, gocq_loop=gocq_loop, qqchannel_bot=qqchannel_bot, gocq_bot=gocq_bot) except BaseException as e: gu.log("回复消息错误: \n"+str(e), gu.LEVEL_ERROR) diff --git a/model/platform/qq.py b/model/platform/qq.py index c4a3a3901..72b0f011a 100644 --- a/model/platform/qq.py +++ b/model/platform/qq.py @@ -31,6 +31,8 @@ class QQ: source, res, image_mode: bool = False): + # image_mode parameter is [deprecated]. + if not self.is_start: raise Exception("管理员未启动GOCQ平台") """ @@ -41,17 +43,27 @@ class QQ: if isinstance(source, int): source = FakeSource("GroupMessage", source) - + + # str convert to CQ Message Chain if isinstance(res, str): res_str = res res = [] if source.type == "GroupMessage": res.append(At(qq=source.user_id)) - if image_mode: - res.append(Plain(text="好的,我根据你的需要为你生成了一张图片😊")) - res.append(Image.fromURL(url=res)) - else: - res.append(Plain(text=res_str)) + res.append(Plain(text=res_str)) + + # if image mode, put all Plain texts into a new picture. + if image_mode and isinstance(res, list): + plains = [] + news = [] + for i in res: + if isinstance(i, Plain): + plains.append(i.text) + else: + news.append(i) + p = gu.create_text_image("", "".join(plains)) + res = [Image.fromFileSystem(p), news] + # 回复消息链 if isinstance(res, list) and len(res) > 0: