Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -329,27 +329,15 @@ def _split_message_chain_by_media(message: MessageChain) -> list[MessageChain]:
for component in message.chain:
is_media = isinstance(component, Image | Record | Video | File)
if is_media and current_has_media:
chunks.append(
MessageChain(
chain=current_chain,
use_t2i_=message.use_t2i_,
type=message.type,
)
)
chunks.append(message.derive(current_chain))
current_chain = []
current_has_media = False

current_chain.append(component)
current_has_media = current_has_media or is_media

if current_chain or not message.chain:
chunks.append(
MessageChain(
chain=current_chain,
use_t2i_=message.use_t2i_,
type=message.type,
)
)
chunks.append(message.derive(current_chain))

return chunks

Expand Down Expand Up @@ -611,8 +599,8 @@ async def _post_send_one(

return ret

@staticmethod
async def _send_with_markdown_fallback(
self,
send_func,
payload: dict,
plain_text: str,
Expand All @@ -638,7 +626,9 @@ async def _send_with_markdown_fallback(

# QQ 流式 markdown 分片校验:内容必须以换行结尾。
# 某些边界场景服务端仍可能判定失败,这里做一次修正重试。
if stream and self.STREAM_MARKDOWN_NEWLINE_ERROR in str(err):
if stream and QQOfficialMessageEvent.STREAM_MARKDOWN_NEWLINE_ERROR in str(
err
):
retry_payload = payload.copy()

markdown_payload = retry_payload.get("markdown")
Expand All @@ -657,7 +647,7 @@ async def _send_with_markdown_fallback(
return await send_func(retry_payload)

if (
self.MARKDOWN_NOT_ALLOWED_ERROR not in str(err)
QQOfficialMessageEvent.MARKDOWN_NOT_ALLOWED_ERROR not in str(err)
or not payload.get("markdown")
or not plain_text
):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from botpy import Client
from botpy.connection import ConnectionState
from botpy.gateway import BotWebSocket
from botpy.types.message import MarkdownPayload

from astrbot import logger
from astrbot.api.event import MessageChain
Expand Down Expand Up @@ -396,7 +397,14 @@ async def _send_by_session_common(
)
return

payload: dict[str, Any] = {"content": plain_text}
use_md = getattr(message_chain, "use_markdown_", None)
if use_md is False:
payload: dict[str, Any] = {"content": plain_text}
else:
payload = {
Comment thread
sourcery-ai[bot] marked this conversation as resolved.
"markdown": MarkdownPayload(content=plain_text) if plain_text else None,
"msg_type": 2,
Comment thread
sourcery-ai[bot] marked this conversation as resolved.
}
if msg_id and not allow_group_proactive_send:
payload["msg_id"] = msg_id
ret: Any = None
Expand All @@ -414,6 +422,8 @@ async def _send_by_session_common(
)
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None
if record_file_path:
media = await QQOfficialMessageEvent.upload_group_and_c2c_media(
send_helper, # type: ignore
Expand All @@ -424,6 +434,8 @@ async def _send_by_session_common(
if media:
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None
if video_file_source:
media = await QQOfficialMessageEvent.upload_group_and_c2c_media(
send_helper, # type: ignore
Expand All @@ -434,6 +446,8 @@ async def _send_by_session_common(
if media:
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None
payload.pop("msg_id", None)
if file_source:
media = await QQOfficialMessageEvent.upload_group_and_c2c_media(
Expand All @@ -446,17 +460,29 @@ async def _send_by_session_common(
if media:
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None
payload.pop("msg_id", None)
ret = await self.client.api.post_group_message(
group_openid=session.session_id,
**payload,
ret = await QQOfficialMessageEvent._send_with_markdown_fallback(
send_func=lambda retry_payload: self.client.api.post_group_message(
group_openid=session.session_id,
**retry_payload,
),
payload=payload,
plain_text=plain_text,
)
else:
if image_path:
payload["file_image"] = image_path
ret = await self.client.api.post_message(
channel_id=session.session_id,
**payload,
# Guild text-channel send API does not use the QQ v2 msg_type field.
payload.pop("msg_type", None)
ret = await QQOfficialMessageEvent._send_with_markdown_fallback(
send_func=lambda retry_payload: self.client.api.post_message(
channel_id=session.session_id,
**retry_payload,
),
payload=payload,
plain_text=plain_text,
)

elif session.message_type == MessageType.FRIEND_MESSAGE:
Expand All @@ -473,6 +499,8 @@ async def _send_by_session_common(
)
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None
if record_file_path:
media = await QQOfficialMessageEvent.upload_group_and_c2c_media(
send_helper, # type: ignore
Expand All @@ -483,6 +511,8 @@ async def _send_by_session_common(
if media:
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None
if video_file_source:
media = await QQOfficialMessageEvent.upload_group_and_c2c_media(
send_helper, # type: ignore
Expand All @@ -493,6 +523,8 @@ async def _send_by_session_common(
if media:
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None
if file_source:
media = await QQOfficialMessageEvent.upload_group_and_c2c_media(
send_helper, # type: ignore
Expand All @@ -504,11 +536,17 @@ async def _send_by_session_common(
if media:
payload["media"] = media
payload["msg_type"] = 7
payload.pop("markdown", None)
payload["content"] = plain_text or None

ret = await QQOfficialMessageEvent.post_c2c_message(
send_helper, # type: ignore
openid=session.session_id,
**payload,
ret = await QQOfficialMessageEvent._send_with_markdown_fallback(
send_func=lambda retry_payload: QQOfficialMessageEvent.post_c2c_message(
send_helper, # type: ignore
openid=session.session_id,
**retry_payload,
),
payload=payload,
plain_text=plain_text,
)
else:
logger.warning(
Expand Down
Loading