diff --git a/app/chain/message.py b/app/chain/message.py index 1499a704..31e53b7a 100644 --- a/app/chain/message.py +++ b/app/chain/message.py @@ -388,13 +388,17 @@ class MessageChain(ChainBase): self.__post_torrents_message(channel=channel, source=source, title=_current_media.title, - items=cache_list, userid=userid, total=total) + items=cache_list, + userid=userid, + total=total) else: # 发送媒体数据 self.__post_medias_message(channel=channel, source=source, title=_current_meta.name, - items=cache_list, userid=userid, total=total) + items=cache_list, + userid=userid, + total=total) else: # 搜索或订阅 @@ -636,7 +640,7 @@ class MessageChain(ChainBase): note=note) def __post_medias_message(self, channel: MessageChannel, source: str, - title: str, items: list, userid: str, total: int, current_page: int = 0): + title: str, items: list, userid: str, total: int): """ 发送媒体列表消息 """ @@ -650,7 +654,7 @@ class MessageChain(ChainBase): else: title = f"【{title}】共找到{total}条相关信息,请选择操作" - buttons = self._create_media_buttons(channel, items, current_page, total) + buttons = self._create_media_buttons(channel, items, total) else: # 不支持按钮的渠道,使用文本提示 if total > self._page_size: @@ -669,36 +673,51 @@ class MessageChain(ChainBase): self.post_medias_message(notification, medias=items) - def _create_media_buttons(self, channel: MessageChannel, items: list, - current_page: int, total: int) -> List[List[Dict]]: + def _create_media_buttons(self, channel: MessageChannel, items: list, total: int) -> List[List[Dict]]: """ 创建媒体选择按钮 """ + global _current_page + buttons = [] max_text_length = ChannelCapabilityManager.get_max_button_text_length(channel) max_per_row = ChannelCapabilityManager.get_max_buttons_per_row(channel) # 为每个媒体项创建选择按钮 + current_row = [] for i in range(len(items)): media = items[i] - button_text = f"{i + 1}. {media.title_year}" - if len(button_text) > max_text_length: - button_text = button_text[:max_text_length - 3] + "..." - - # 根据渠道配置决定按钮布局 + if max_per_row == 1: - buttons.append([{"text": button_text, "callback_data": f"select_{current_page * self._page_size + i}"}]) + # 每行一个按钮,使用完整文本 + button_text = f"{i + 1}. {media.title_year}" + if len(button_text) > max_text_length: + button_text = button_text[:max_text_length - 3] + "..." + + buttons.append([{ + "text": button_text, + "callback_data": f"select_{_current_page * self._page_size + i}" + }]) else: - # 多按钮一行的情况,简化按钮文本 - short_text = f"{i + 1}" - buttons.append([{"text": short_text, "callback_data": f"select_{current_page * self._page_size + i}"}]) + # 多按钮一行的情况,使用简化文本 + button_text = f"{i + 1}" + + current_row.append({ + "text": button_text, + "callback_data": f"select_{_current_page * self._page_size + i}" + }) + + # 如果当前行已满或者是最后一个按钮,添加到按钮列表 + if len(current_row) == max_per_row or i == len(items) - 1: + buttons.append(current_row) + current_row = [] # 添加翻页按钮 if total > self._page_size: page_buttons = [] - if current_page > 0: + if _current_page > 0: page_buttons.append({"text": "⬅️ 上一页", "callback_data": "select_p"}) - if (current_page + 1) * self._page_size < total: + if (_current_page + 1) * self._page_size < total: page_buttons.append({"text": "下一页 ➡️", "callback_data": "select_n"}) if page_buttons: buttons.append(page_buttons) @@ -706,8 +725,7 @@ class MessageChain(ChainBase): return buttons def __post_torrents_message(self, channel: MessageChannel, source: str, - title: str, items: list, - userid: str, total: int, current_page: int = 0): + title: str, items: list, userid: str, total: int): """ 发送种子列表消息 """ @@ -721,7 +739,7 @@ class MessageChain(ChainBase): else: title = f"【{title}】共找到{total}条相关资源,请选择下载" - buttons = self._create_torrent_buttons(channel, items, current_page, total) + buttons = self._create_torrent_buttons(channel, items, total) else: # 不支持按钮的渠道,使用文本提示 if total > self._page_size: @@ -741,11 +759,13 @@ class MessageChain(ChainBase): self.post_torrents_message(notification, torrents=items) - def _create_torrent_buttons(self, channel: MessageChannel, items: list, - current_page: int, total: int) -> List[List[Dict]]: + def _create_torrent_buttons(self, channel: MessageChannel, items: list, total: int) -> List[List[Dict]]: """ 创建种子下载按钮 """ + + global _current_page + buttons = [] max_text_length = ChannelCapabilityManager.get_max_button_text_length(channel) max_per_row = ChannelCapabilityManager.get_max_buttons_per_row(channel) @@ -754,27 +774,41 @@ class MessageChain(ChainBase): buttons.append([{"text": "🤖 自动选择下载", "callback_data": "download_auto"}]) # 为每个种子项创建下载按钮 + current_row = [] for i in range(len(items)): context = items[i] torrent = context.torrent_info - # 根据渠道配置调整按钮文本 if max_per_row == 1: + # 每行一个按钮,使用完整文本 button_text = f"{i + 1}. {torrent.site_name} - {torrent.seeders}↑" if len(button_text) > max_text_length: button_text = button_text[:max_text_length - 3] + "..." + + buttons.append([{ + "text": button_text, + "callback_data": f"download_{_current_page * self._page_size + i}" + }]) else: # 多按钮一行的情况,使用简化文本 button_text = f"{i + 1}" - - buttons.append([{"text": button_text, "callback_data": f"download_{current_page * self._page_size + i}"}]) + + current_row.append({ + "text": button_text, + "callback_data": f"download_{_current_page * self._page_size + i}" + }) + + # 如果当前行已满或者是最后一个按钮,添加到按钮列表 + if len(current_row) == max_per_row or i == len(items) - 1: + buttons.append(current_row) + current_row = [] # 添加翻页按钮 if total > self._page_size: page_buttons = [] - if current_page > 0: + if _current_page > 0: page_buttons.append({"text": "⬅️ 上一页", "callback_data": "select_p"}) - if (current_page + 1) * self._page_size < total: + if (_current_page + 1) * self._page_size < total: page_buttons.append({"text": "下一页 ➡️", "callback_data": "select_n"}) if page_buttons: buttons.append(page_buttons) diff --git a/app/modules/__init__.py b/app/modules/__init__.py index 5bb5808d..fc72866c 100644 --- a/app/modules/__init__.py +++ b/app/modules/__init__.py @@ -112,7 +112,7 @@ class ServiceBase(Generic[TService, TConf], metaclass=ABCMeta): # 通过服务类型或工厂函数来创建实例 if isinstance(service_type, type): # 如果传入的是类类型,调用构造函数实例化 - self._instances[conf.name] = service_type(**conf.config) + self._instances[conf.name] = service_type(name=conf.name, **conf.config) else: # 如果传入的是工厂函数,直接调用工厂函数 self._instances[conf.name] = service_type(conf) diff --git a/app/modules/telegram/telegram.py b/app/modules/telegram/telegram.py index f4cd53af..bb86349f 100644 --- a/app/modules/telegram/telegram.py +++ b/app/modules/telegram/telegram.py @@ -77,7 +77,12 @@ class Telegram: "callback_query": { "id": call.id, "from": call.from_user.to_dict(), - "message": call.message.to_dict(), + "message": { + "message_id": call.message.message_id, + "chat": { + "id": call.message.chat.id, + } + }, "data": callback_data } } @@ -313,7 +318,7 @@ class Telegram: :param reply_markup: 内联键盘 """ if image: - res = RequestUtils(proxies=settings.PROXY).get_res(image) + res = RequestUtils(proxies=settings.PROXY, ua=settings.USER_AGENT).get_res(image) if res is None: raise Exception("获取图片失败") if res.content: diff --git a/app/schemas/message.py b/app/schemas/message.py index f535efc1..804e8cfa 100644 --- a/app/schemas/message.py +++ b/app/schemas/message.py @@ -184,7 +184,7 @@ class ChannelCapabilityManager: ChannelCapability.LINKS, ChannelCapability.FILE_SENDING }, - max_buttons_per_row=2, + max_buttons_per_row=4, max_button_rows=10, max_button_text_length=30 ), @@ -285,7 +285,7 @@ class ChannelCapabilityManager: 获取每行最大按钮数 """ channel_caps = cls.get_capabilities(channel) - return channel_caps.max_buttons_per_row if channel_caps else 5 + return channel_caps.max_buttons_per_row if channel_caps else 2 @classmethod def get_max_button_rows(cls, channel: MessageChannel) -> int: @@ -293,7 +293,7 @@ class ChannelCapabilityManager: 获取最大按钮行数 """ channel_caps = cls.get_capabilities(channel) - return channel_caps.max_button_rows if channel_caps else 10 + return channel_caps.max_button_rows if channel_caps else 5 @classmethod def get_max_button_text_length(cls, channel: MessageChannel) -> int: