feat(wechat_woc): add delivered parts skip logic for multi-part messages
新增已发送分片跳过逻辑,支持重复发送时只发送未成功投递的消息分片,避免重复推送已送达内容
This commit is contained in:
parent
7174500a9a
commit
dbe25904b9
@ -252,6 +252,7 @@ class WeChatWocOutboundAdapter:
|
|||||||
*,
|
*,
|
||||||
idempotency_key: str | None = None,
|
idempotency_key: str | None = None,
|
||||||
channel_request_id: str | None = None,
|
channel_request_id: str | None = None,
|
||||||
|
delivered_parts: list[int] | None = None,
|
||||||
) -> list[MultiPartReceipt]:
|
) -> list[MultiPartReceipt]:
|
||||||
"""发送多部分消息(文本在前,媒体在后)。
|
"""发送多部分消息(文本在前,媒体在后)。
|
||||||
|
|
||||||
@ -306,6 +307,7 @@ class WeChatWocOutboundAdapter:
|
|||||||
"""
|
"""
|
||||||
receipts: list[MultiPartReceipt] = []
|
receipts: list[MultiPartReceipt] = []
|
||||||
seq = 0
|
seq = 0
|
||||||
|
skip_seqs = set(delivered_parts) if delivered_parts else set()
|
||||||
|
|
||||||
# 1. 发送前先校验所有媒体附件的出站能力,避免文本已发后才发现媒体
|
# 1. 发送前先校验所有媒体附件的出站能力,避免文本已发后才发现媒体
|
||||||
# 不支持导致文本无法回滚(M-3 修复)。任一媒体不支持即整体失败,
|
# 不支持导致文本无法回滚(M-3 修复)。任一媒体不支持即整体失败,
|
||||||
@ -342,23 +344,27 @@ class WeChatWocOutboundAdapter:
|
|||||||
|
|
||||||
# 2. 文本在前
|
# 2. 文本在前
|
||||||
if payload.content:
|
if payload.content:
|
||||||
resp = await self._client.send_text(
|
if seq not in skip_seqs:
|
||||||
account_id,
|
resp = await self._client.send_text(
|
||||||
peer_id,
|
account_id,
|
||||||
payload.content,
|
peer_id,
|
||||||
)
|
payload.content,
|
||||||
receipts.append(
|
)
|
||||||
MultiPartReceipt(
|
receipts.append(
|
||||||
platform_msg_id=_extract_channel_msg_id(resp),
|
MultiPartReceipt(
|
||||||
part_type=_PART_TYPE_TEXT,
|
platform_msg_id=_extract_channel_msg_id(resp),
|
||||||
sequence=seq,
|
part_type=_PART_TYPE_TEXT,
|
||||||
success=True,
|
sequence=seq,
|
||||||
|
success=True,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
seq += 1
|
seq += 1
|
||||||
|
|
||||||
# 3. 媒体在后(图片 / 文件)
|
# 3. 媒体在后(图片 / 文件)
|
||||||
for attachment in payload.attachments:
|
for attachment in payload.attachments:
|
||||||
|
if seq in skip_seqs:
|
||||||
|
seq += 1
|
||||||
|
continue
|
||||||
# attachment.url 必须为 bridge 容器内可访问的绝对路径(见方法
|
# attachment.url 必须为 bridge 容器内可访问的绝对路径(见方法
|
||||||
# docstring 中 ``attachment.url`` 语义重载说明)
|
# docstring 中 ``attachment.url`` 语义重载说明)
|
||||||
file_path = attachment.url
|
file_path = attachment.url
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user