添加订阅列表

This commit is contained in:
chenxiangtong
2026-04-15 19:12:56 +08:00
parent 8824f0630f
commit 7b25f437b8
3 changed files with 76 additions and 0 deletions

26
main.py
View File

@@ -314,6 +314,19 @@ class BangumiPlugin(Star):
result = await self.subscription_service.unsubscribe(session_key, query) result = await self.subscription_service.unsubscribe(session_key, query)
yield event.plain_result(result) yield event.plain_result(result)
@filter.command("追番列表")
async def list_subscriptions(
self, event: AstrMessageEvent
) -> AsyncGenerator[object, None]:
"""列举当前会话的所有追番订阅。"""
if not self.subscription_service:
yield event.plain_result("❌ 订阅服务未就绪")
return
session_key = self._resolve_session_key(event)
result = self.subscription_service.list_subscriptions(session_key)
yield event.plain_result(result)
# --- LLM Tool 区 --- # --- LLM Tool 区 ---
@filter.llm_tool(name="bangumi_search") @filter.llm_tool(name="bangumi_search")
@@ -399,6 +412,19 @@ class BangumiPlugin(Star):
async for result in self.search_service.handle_calendar(event): async for result in self.search_service.handle_calendar(event):
yield result yield result
@filter.llm_tool(name="bangumi_list_subscriptions")
async def llm_list_subscriptions(
self, event: AstrMessageEvent
) -> AsyncGenerator[object, None]:
"""列举当前会话已订阅的所有追番包含番剧名称、Bangumi ID 和当前更新集数。当用户询问"我订阅了哪些番""追番列表""我在追什么"时调用。"""
if not self.subscription_service:
yield event.plain_result("❌ 订阅服务未就绪")
return
session_key = self._resolve_session_key(event)
result = self.subscription_service.list_subscriptions(session_key)
yield event.plain_result(result)
@filter.llm_tool(name="bangumi_subscribe") @filter.llm_tool(name="bangumi_subscribe")
async def llm_subscribe( async def llm_subscribe(
self, self,

View File

@@ -181,6 +181,31 @@ class BangumiRepository:
finally: finally:
session.close() session.close()
def get_session_subscribed_subjects(self, session_id: str) -> list[BangumiSubject]:
"""
获取指定会话(群组或私聊)的所有已订阅番剧详情。
Args:
session_id: 会话唯一标识unified_msg_origin
Returns:
BangumiSubject 对象列表,包含名称、集数等信息
"""
db_session = self.Session()
try:
subjects = (
db_session.query(BangumiSubject)
.join(Subscription, Subscription.subject_id == BangumiSubject.subject_id)
.filter(Subscription.group_id == str(session_id))
.all()
)
return subjects
except Exception as e:
logger.error(f"获取会话订阅列表失败: {e}")
raise DatabaseError(f"获取会话订阅列表失败: {e}") from e
finally:
db_session.close()
def get_monitored_subjects(self) -> list[BangumiSubject]: def get_monitored_subjects(self) -> list[BangumiSubject]:
""" """
获取所有已订阅的番剧列表,用于轮询更新 获取所有已订阅的番剧列表,用于轮询更新

View File

@@ -246,6 +246,31 @@ class SubscriptionService:
lines.append("(仅显示前 5 项)") lines.append("(仅显示前 5 项)")
return "\n".join(lines), None return "\n".join(lines), None
def list_subscriptions(self, session_id: str) -> str:
"""
列举当前会话的所有订阅番剧,格式化为可读文本。
"""
try:
subjects = self.storage.get_session_subscribed_subjects(session_id)
except DatabaseError as e:
logger.error(f"SubscriptionService.list_subscriptions 失败: {e}")
return f"❌ 查询失败: {e}"
if not subjects:
return "📭 当前会话暂无追番订阅。\n使用 /追番 <关键词> 添加订阅。"
lines = [f"📋 当前追番列表(共 {len(subjects)} 部):"]
for idx, subject in enumerate(subjects, start=1):
name = subject.name or "未知番剧"
subject_id = subject.subject_id
current_ep = subject.current_episode or 0
total_ep = subject.total_episodes or 0
ep_info = f"已更新至第 {current_ep}" if current_ep else "尚未更新"
if total_ep:
ep_info += f"(全 {total_ep} 集)"
lines.append(f"{idx}. 《{name}》(ID: {subject_id}) — {ep_info}")
return "\n".join(lines)
async def check_updates(self) -> None: async def check_updates(self) -> None:
""" """
定时任务核心逻辑:检查所有监控中的番剧是否有更新。 定时任务核心逻辑:检查所有监控中的番剧是否有更新。