From 38050c74d69b564b5e44c6ec16b11b0be1ec37bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98KimigaiiWuyi=E2=80=99?= <444835641@qq.com> Date: Tue, 7 Nov 2023 20:11:59 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E4=BC=98=E5=8C=96=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E8=BD=AC=E6=8D=A2=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gsuid_core/bot.py | 6 +++-- gsuid_core/segment.py | 53 ++++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/gsuid_core/bot.py b/gsuid_core/bot.py index 703ff8a..bd212b6 100644 --- a/gsuid_core/bot.py +++ b/gsuid_core/bot.py @@ -36,6 +36,9 @@ class _Bot: ): _message = await convert_message(message) + if bot_id in ['qqgroup']: + _message = await to_markdown(_message) + if at_sender and sender_id: _message.append(MessageSegment.at(sender_id)) @@ -160,7 +163,6 @@ class Bot: _reply = await convert_message(reply) if self.ev.real_bot_id in ['qqgroup']: - _reply_str = await to_markdown(_reply) _buttons = [] for option in option_list: if isinstance(option, List): @@ -176,7 +178,7 @@ class Bot: else: _buttons.append(Button(option, option, option)) - await self.send(MessageSegment.markdown(_reply_str, _buttons)) + await self.send(await to_markdown(_reply, _buttons)) else: if unsuported_platform: _options: List[str] = [] diff --git a/gsuid_core/segment.py b/gsuid_core/segment.py index 8c4f25a..d1a415a 100644 --- a/gsuid_core/segment.py +++ b/gsuid_core/segment.py @@ -163,11 +163,21 @@ class MessageSegment: return Message(type=f'log_{type}', data=content) -async def convert_message( - message: Union[Message, List[Message], List[str], str, bytes] +async def _convert_message( + message: Union[Message, str, bytes] ) -> List[Message]: if isinstance(message, Message): - message = [message] + if message.type == 'image' and pclient is not None: + img_text: str = message.data # type: ignore + bio = BytesIO(b64decode(img_text[9:])) + img = Image.open(bio) + img_url = await pclient.upload(f'{uuid.uuid4()}.jpg', bio) + _message = [ + MessageSegment.image(img_url if img_url else img_text), + MessageSegment.image_size(img.size), + ] + else: + _message = [message] elif isinstance(message, str): if message.startswith('base64://'): bio = BytesIO(b64decode(message[9:])) @@ -177,12 +187,12 @@ async def convert_message( if pclient is not None: img_url = await pclient.upload(f'{uuid.uuid4()}.jpg', bio) - message = [ + _message = [ MessageSegment.image(img_url if img_url else message), MessageSegment.image_size(img.size), ] else: - message = [MessageSegment.text(message)] + _message = [MessageSegment.text(message)] elif isinstance(message, bytes): bio = BytesIO(message) img = Image.open(bio) @@ -191,17 +201,27 @@ async def convert_message( if pclient is not None: img_url = await pclient.upload(f'{uuid.uuid4()}.jpg', bio) - message = [ + _message = [ MessageSegment.image(img_url if img_url else message), MessageSegment.image_size(img.size), ] - elif isinstance(message, List): - if all(isinstance(x, str) for x in message): - message = [MessageSegment.node(message)] else: - message = [message] + _message = [message] + return _message - _message: List[Message] = message # type: ignore + +async def convert_message( + message: Union[Message, List[Message], List[str], str, bytes] +) -> List[Message]: + _message: List[Message] = [] + if isinstance(message, List): + if all(isinstance(x, str) for x in message): + _message.extend([MessageSegment.node(message)]) + else: + for i in message: + _message.extend(await _convert_message(i)) + else: + _message = await _convert_message(message) if R_enabled: result = ''.join( @@ -223,8 +243,12 @@ async def convert_message( return _message -async def to_markdown(message: List[Message]) -> str: +async def to_markdown( + message: List[Message], + buttons: Optional[Union[List[Button], List[List[Button]]]] = None, +) -> List[Message]: _markdown_list = [] + _message = [] url = None size = None for m in message: @@ -235,9 +259,12 @@ async def to_markdown(message: List[Message]) -> str: elif m.type == 'text': assert isinstance(m.data, str) _markdown_list.append(m.data.replace('\n', '\n\n')) + else: + _message.append(m) if url is not None and size is not None: _markdown_list.append(f'![test #{size[0]}px #{size[1]}px]({url})') _markdown = '\n'.join(_markdown_list) - return _markdown + _message.extend(MessageSegment.markdown(_markdown, buttons)) + return _message