diff --git a/app/chain/message.py b/app/chain/message.py index 9eab2774..9f2e30fe 100644 --- a/app/chain/message.py +++ b/app/chain/message.py @@ -126,7 +126,7 @@ class MessageChain(ChainBase): def handle_message(self, channel: MessageChannel, source: str, userid: Union[str, int], username: str, text: str, - original_message_id: Optional[int] = None, + original_message_id: Optional[Union[str, int]] = None, original_chat_id: Optional[str] = None) -> None: """ 识别消息内容,执行操作 @@ -502,7 +502,7 @@ class MessageChain(ChainBase): def _handle_callback(self, text: str, channel: MessageChannel, source: str, userid: Union[str, int], username: str, - original_message_id: Optional[int] = None, + original_message_id: Optional[Union[str, int]] = None, original_chat_id: Optional[str] = None) -> None: """ 处理按钮回调 @@ -554,7 +554,7 @@ class MessageChain(ChainBase): logger.info(f"未知的回调数据:{callback_data}") def _handle_page_callback(self, callback_data: str, channel: MessageChannel, source: str, - userid: Union[str, int], original_message_id: Optional[int], + userid: Union[str, int], original_message_id: Optional[Union[str, int]], original_chat_id: Optional[str]): """ 处理翻页回调 @@ -669,7 +669,7 @@ class MessageChain(ChainBase): def __post_medias_message(self, channel: MessageChannel, source: str, title: str, items: list, userid: str, total: int, - original_message_id: Optional[int] = None, + original_message_id: Optional[Union[str, int]] = None, original_chat_id: Optional[str] = None): """ 发送媒体列表消息 @@ -758,7 +758,7 @@ class MessageChain(ChainBase): def __post_torrents_message(self, channel: MessageChannel, source: str, title: str, items: list, userid: str, total: int, - original_message_id: Optional[int] = None, + original_message_id: Optional[Union[str, int]] = None, original_chat_id: Optional[str] = None): """ 发送种子列表消息 diff --git a/app/modules/slack/slack.py b/app/modules/slack/slack.py index d44548b6..155ea4bb 100644 --- a/app/modules/slack/slack.py +++ b/app/modules/slack/slack.py @@ -52,7 +52,7 @@ class Slack: with requests.post(self._ds_url, json=message, timeout=10) as local_res: logger.debug("message: %s processed, response is: %s" % (message, local_res.text)) - @slack_app.action(re.compile(r"actionId-\d+")) + @slack_app.action(re.compile(r"actionId-.*")) def slack_action(ack, body): ack() with requests.post(self._ds_url, json=body, timeout=60) as local_res: @@ -258,67 +258,95 @@ class Slack: "type": "divider" }) index = 1 - for media in medias: - if media.get_poster_image(): - if media.vote_star: - text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \ - f"\n类型:{media.type.value}" \ - f"\n{media.vote_star}" \ - f"\n{media.get_overview_string(50)}" - else: - text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \ - f"\n类型:{media.type.value}" \ - f"\n{media.get_overview_string(50)}" - blocks.append( - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": text - }, - "accessory": { - "type": "image", - "image_url": f"{media.get_poster_image()}", - "alt_text": f"{media.title_year}" + + # 如果有自定义按钮,先添加所有媒体项,然后添加统一的按钮 + if buttons: + # 添加媒体列表(不带单独的选择按钮) + for media in medias: + if media.get_poster_image(): + if media.vote_star: + text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \ + f"\n类型:{media.type.value}" \ + f"\n{media.vote_star}" \ + f"\n{media.get_overview_string(50)}" + else: + text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \ + f"\n类型:{media.type.value}" \ + f"\n{media.get_overview_string(50)}" + blocks.append( + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": text + }, + "accessory": { + "type": "image", + "image_url": f"{media.get_poster_image()}", + "alt_text": f"{media.title_year}" + } } - } - ) - # 如果有自定义按钮,使用自定义按钮,否则使用默认选择按钮 - if buttons: - # 使用自定义按钮(通常来自MessageChain的智能生成) - for button_row in buttons: - elements = [] - for button in button_row: - if "url" in button: - elements.append({ - "type": "button", - "text": { - "type": "plain_text", - "text": button["text"], - "emoji": True - }, - "url": button["url"], - "action_id": f"actionId-url-{len(elements)}" - }) - else: - elements.append({ - "type": "button", - "text": { - "type": "plain_text", - "text": button["text"], - "emoji": True - }, - "value": button["callback_data"], - "action_id": f"actionId-{button['callback_data']}" - }) - if elements: - blocks.append({ - "type": "actions", - "elements": elements - }) - # 只为第一个媒体项添加按钮,避免重复 - buttons = None - else: + ) + index += 1 + + # 添加统一的自定义按钮(在所有媒体项之后) + for button_row in buttons: + elements = [] + for button in button_row: + if "url" in button: + elements.append({ + "type": "button", + "text": { + "type": "plain_text", + "text": button["text"], + "emoji": True + }, + "url": button["url"], + "action_id": f"actionId-url-{len(elements)}" + }) + else: + elements.append({ + "type": "button", + "text": { + "type": "plain_text", + "text": button["text"], + "emoji": True + }, + "value": button["callback_data"], + "action_id": f"actionId-{button['callback_data']}" + }) + if elements: + blocks.append({ + "type": "actions", + "elements": elements + }) + else: + # 使用默认的每个媒体项单独按钮 + for media in medias: + if media.get_poster_image(): + if media.vote_star: + text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \ + f"\n类型:{media.type.value}" \ + f"\n{media.vote_star}" \ + f"\n{media.get_overview_string(50)}" + else: + text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \ + f"\n类型:{media.type.value}" \ + f"\n{media.get_overview_string(50)}" + blocks.append( + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": text + }, + "accessory": { + "type": "image", + "image_url": f"{media.get_poster_image()}", + "alt_text": f"{media.title_year}" + } + } + ) # 使用默认选择按钮 blocks.append( { @@ -337,7 +365,7 @@ class Slack: ] } ) - index += 1 + index += 1 # 判断是编辑消息还是发送新消息 if original_message_id and original_chat_id: diff --git a/app/schemas/message.py b/app/schemas/message.py index fbfd1025..59345c89 100644 --- a/app/schemas/message.py +++ b/app/schemas/message.py @@ -30,7 +30,7 @@ class CommingMessage(BaseModel): # 回调数据 callback_data: Optional[str] = None # 消息ID(用于回调时定位原消息) - message_id: Optional[int] = None + message_id: Optional[Union[str, int]] = None # 聊天ID(用于回调时定位聊天) chat_id: Optional[str] = None # 完整的回调查询信息(原始数据) @@ -80,7 +80,7 @@ class Notification(BaseModel): # 按钮列表,格式:[[{"text": "按钮文本", "callback_data": "回调数据", "url": "链接"}]] buttons: Optional[List[List[dict]]] = None # 原消息ID,用于编辑消息 - original_message_id: Optional[int] = None + original_message_id: Optional[Union[str, int]] = None # 原消息的聊天ID,用于编辑消息 original_chat_id: Optional[str] = None