diff --git a/pkg/qqbot/blob.py b/pkg/qqbot/blob.py new file mode 100644 index 0000000..cfa6ca2 --- /dev/null +++ b/pkg/qqbot/blob.py @@ -0,0 +1,73 @@ +# 长消息处理相关 +import config +from mirai.models.message import MessageComponent, MessageChain +from mirai.models.message import ForwardMessageNode +from mirai.models.base import MiraiBaseModel +from typing import List, Optional +import pkg.utils.context as context + + +class ForwardMessageDiaplay(MiraiBaseModel): + title: str = "群聊的聊天记录" + brief: str = "[聊天记录]" + source: str = "聊天记录" + preview: List[str] = [] + summary: str = "查看x条转发消息" + + +class Forward(MessageComponent): + """合并转发。""" + type: str = "Forward" + """消息组件类型。""" + display: ForwardMessageDiaplay + """显示信息""" + node_list: List[ForwardMessageNode] + """转发消息节点列表。""" + def __init__(self, *args, **kwargs): + if len(args) == 1: + self.node_list = args[0] + super().__init__(**kwargs) + super().__init__(*args, **kwargs) + + def __str__(self): + return '[聊天记录]' + + + +def check_text(text: str) -> list: + """检查文本是否为长消息,并转换成该使用的消息链组件""" + if not hasattr(config, 'blob_message_threshold'): + return [text] + + if len(text) > config.blob_message_threshold: + if not hasattr(config, 'blob_message_strategy'): + raise AttributeError('未定义长消息处理策略') + + if config.blob_message_strategy == 'image': + # 转换成图片 + pass + elif config.blob_message_strategy == 'forward': + # 敏感词屏蔽 + text = context.get_qqbot_manager().reply_filter.process(text) + + # 包装转发消息 + display = ForwardMessageDiaplay( + title='群聊的聊天记录', + brief='[聊天记录]', + source='聊天记录', + preview=["bot: "+text], + summary="查看1条转发消息" + ) + + node = ForwardMessageNode( + sender_id=config.mirai_http_api_config['qq'], + sender_name='bot', + message_chain=MessageChain([text]) + ) + + forward = Forward( + display=display, + node_list=[node] + ) + + return [forward] \ No newline at end of file diff --git a/pkg/qqbot/message.py b/pkg/qqbot/message.py index 864fda2..e6106df 100644 --- a/pkg/qqbot/message.py +++ b/pkg/qqbot/message.py @@ -7,6 +7,7 @@ import pkg.openai.session import pkg.plugin.host as plugin_host import pkg.plugin.models as plugin_models +import pkg.qqbot.blob as blob def handle_exception(notify_admin: str = "", set_reply: str = "") -> list: @@ -63,7 +64,7 @@ def process_normal_message(text_message: str, mgr, config, launcher_type: str, reply = event.get_return_value("reply") if not event.is_prevented_default(): - reply = [prefix + text] + reply = blob.check_text(prefix + text) except openai.error.APIConnectionError as e: err_msg = str(e) if err_msg.__contains__('Error communicating with OpenAI'): diff --git a/pkg/qqbot/process.py b/pkg/qqbot/process.py index c1e39af..6c4cec5 100644 --- a/pkg/qqbot/process.py +++ b/pkg/qqbot/process.py @@ -153,7 +153,7 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes "..." if len(reply[0]) > 100 else ""))) reply = [mgr.reply_filter.process(reply[0])] else: - logging.info("回复[{}]图片消息:{}".format(session_name, reply)) + logging.info("回复[{}]消息:{}".format(session_name, reply)) finally: processing.remove(session_name)