优化消息处理逻辑

This commit is contained in:
jxxghp
2025-06-15 18:40:36 +08:00
parent 21addfb947
commit f8fbfdbba7
4 changed files with 72 additions and 33 deletions
+61 -27
View File
@@ -388,13 +388,17 @@ class MessageChain(ChainBase):
self.__post_torrents_message(channel=channel, self.__post_torrents_message(channel=channel,
source=source, source=source,
title=_current_media.title, title=_current_media.title,
items=cache_list, userid=userid, total=total) items=cache_list,
userid=userid,
total=total)
else: else:
# 发送媒体数据 # 发送媒体数据
self.__post_medias_message(channel=channel, self.__post_medias_message(channel=channel,
source=source, source=source,
title=_current_meta.name, title=_current_meta.name,
items=cache_list, userid=userid, total=total) items=cache_list,
userid=userid,
total=total)
else: else:
# 搜索或订阅 # 搜索或订阅
@@ -636,7 +640,7 @@ class MessageChain(ChainBase):
note=note) note=note)
def __post_medias_message(self, channel: MessageChannel, source: str, 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: else:
title = f"{title}】共找到{total}条相关信息,请选择操作" title = f"{title}】共找到{total}条相关信息,请选择操作"
buttons = self._create_media_buttons(channel, items, current_page, total) buttons = self._create_media_buttons(channel, items, total)
else: else:
# 不支持按钮的渠道,使用文本提示 # 不支持按钮的渠道,使用文本提示
if total > self._page_size: if total > self._page_size:
@@ -669,36 +673,51 @@ class MessageChain(ChainBase):
self.post_medias_message(notification, medias=items) self.post_medias_message(notification, medias=items)
def _create_media_buttons(self, channel: MessageChannel, items: list, def _create_media_buttons(self, channel: MessageChannel, items: list, total: int) -> List[List[Dict]]:
current_page: int, total: int) -> List[List[Dict]]:
""" """
创建媒体选择按钮 创建媒体选择按钮
""" """
global _current_page
buttons = [] buttons = []
max_text_length = ChannelCapabilityManager.get_max_button_text_length(channel) max_text_length = ChannelCapabilityManager.get_max_button_text_length(channel)
max_per_row = ChannelCapabilityManager.get_max_buttons_per_row(channel) max_per_row = ChannelCapabilityManager.get_max_buttons_per_row(channel)
# 为每个媒体项创建选择按钮 # 为每个媒体项创建选择按钮
current_row = []
for i in range(len(items)): for i in range(len(items)):
media = items[i] 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: 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: else:
# 多按钮一行的情况,简化按钮文本 # 多按钮一行的情况,使用简化文本
short_text = f"{i + 1}" button_text = f"{i + 1}"
buttons.append([{"text": short_text, "callback_data": f"select_{current_page * self._page_size + i}"}])
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: if total > self._page_size:
page_buttons = [] page_buttons = []
if current_page > 0: if _current_page > 0:
page_buttons.append({"text": "⬅️ 上一页", "callback_data": "select_p"}) 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"}) page_buttons.append({"text": "下一页 ➡️", "callback_data": "select_n"})
if page_buttons: if page_buttons:
buttons.append(page_buttons) buttons.append(page_buttons)
@@ -706,8 +725,7 @@ class MessageChain(ChainBase):
return buttons return buttons
def __post_torrents_message(self, channel: MessageChannel, source: str, def __post_torrents_message(self, channel: MessageChannel, source: str,
title: str, items: list, title: str, items: list, userid: str, total: int):
userid: str, total: int, current_page: int = 0):
""" """
发送种子列表消息 发送种子列表消息
""" """
@@ -721,7 +739,7 @@ class MessageChain(ChainBase):
else: else:
title = f"{title}】共找到{total}条相关资源,请选择下载" title = f"{title}】共找到{total}条相关资源,请选择下载"
buttons = self._create_torrent_buttons(channel, items, current_page, total) buttons = self._create_torrent_buttons(channel, items, total)
else: else:
# 不支持按钮的渠道,使用文本提示 # 不支持按钮的渠道,使用文本提示
if total > self._page_size: if total > self._page_size:
@@ -741,11 +759,13 @@ class MessageChain(ChainBase):
self.post_torrents_message(notification, torrents=items) self.post_torrents_message(notification, torrents=items)
def _create_torrent_buttons(self, channel: MessageChannel, items: list, def _create_torrent_buttons(self, channel: MessageChannel, items: list, total: int) -> List[List[Dict]]:
current_page: int, total: int) -> List[List[Dict]]:
""" """
创建种子下载按钮 创建种子下载按钮
""" """
global _current_page
buttons = [] buttons = []
max_text_length = ChannelCapabilityManager.get_max_button_text_length(channel) max_text_length = ChannelCapabilityManager.get_max_button_text_length(channel)
max_per_row = ChannelCapabilityManager.get_max_buttons_per_row(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"}]) buttons.append([{"text": "🤖 自动选择下载", "callback_data": "download_auto"}])
# 为每个种子项创建下载按钮 # 为每个种子项创建下载按钮
current_row = []
for i in range(len(items)): for i in range(len(items)):
context = items[i] context = items[i]
torrent = context.torrent_info torrent = context.torrent_info
# 根据渠道配置调整按钮文本
if max_per_row == 1: if max_per_row == 1:
# 每行一个按钮,使用完整文本
button_text = f"{i + 1}. {torrent.site_name} - {torrent.seeders}" button_text = f"{i + 1}. {torrent.site_name} - {torrent.seeders}"
if len(button_text) > max_text_length: if len(button_text) > max_text_length:
button_text = button_text[:max_text_length - 3] + "..." button_text = button_text[:max_text_length - 3] + "..."
buttons.append([{
"text": button_text,
"callback_data": f"download_{_current_page * self._page_size + i}"
}])
else: else:
# 多按钮一行的情况,使用简化文本 # 多按钮一行的情况,使用简化文本
button_text = f"{i + 1}" 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: if total > self._page_size:
page_buttons = [] page_buttons = []
if current_page > 0: if _current_page > 0:
page_buttons.append({"text": "⬅️ 上一页", "callback_data": "select_p"}) 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"}) page_buttons.append({"text": "下一页 ➡️", "callback_data": "select_n"})
if page_buttons: if page_buttons:
buttons.append(page_buttons) buttons.append(page_buttons)
+1 -1
View File
@@ -112,7 +112,7 @@ class ServiceBase(Generic[TService, TConf], metaclass=ABCMeta):
# 通过服务类型或工厂函数来创建实例 # 通过服务类型或工厂函数来创建实例
if isinstance(service_type, type): 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: else:
# 如果传入的是工厂函数,直接调用工厂函数 # 如果传入的是工厂函数,直接调用工厂函数
self._instances[conf.name] = service_type(conf) self._instances[conf.name] = service_type(conf)
+7 -2
View File
@@ -77,7 +77,12 @@ class Telegram:
"callback_query": { "callback_query": {
"id": call.id, "id": call.id,
"from": call.from_user.to_dict(), "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 "data": callback_data
} }
} }
@@ -313,7 +318,7 @@ class Telegram:
:param reply_markup: 内联键盘 :param reply_markup: 内联键盘
""" """
if image: 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: if res is None:
raise Exception("获取图片失败") raise Exception("获取图片失败")
if res.content: if res.content:
+3 -3
View File
@@ -184,7 +184,7 @@ class ChannelCapabilityManager:
ChannelCapability.LINKS, ChannelCapability.LINKS,
ChannelCapability.FILE_SENDING ChannelCapability.FILE_SENDING
}, },
max_buttons_per_row=2, max_buttons_per_row=4,
max_button_rows=10, max_button_rows=10,
max_button_text_length=30 max_button_text_length=30
), ),
@@ -285,7 +285,7 @@ class ChannelCapabilityManager:
获取每行最大按钮数 获取每行最大按钮数
""" """
channel_caps = cls.get_capabilities(channel) 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 @classmethod
def get_max_button_rows(cls, channel: MessageChannel) -> int: def get_max_button_rows(cls, channel: MessageChannel) -> int:
@@ -293,7 +293,7 @@ class ChannelCapabilityManager:
获取最大按钮行数 获取最大按钮行数
""" """
channel_caps = cls.get_capabilities(channel) 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 @classmethod
def get_max_button_text_length(cls, channel: MessageChannel) -> int: def get_max_button_text_length(cls, channel: MessageChannel) -> int: