添加订阅列表
This commit is contained in:
26
main.py
26
main.py
@@ -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,
|
||||||
|
|||||||
@@ -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]:
|
||||||
"""
|
"""
|
||||||
获取所有已订阅的番剧列表,用于轮询更新
|
获取所有已订阅的番剧列表,用于轮询更新
|
||||||
|
|||||||
@@ -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:
|
||||||
"""
|
"""
|
||||||
定时任务核心逻辑:检查所有监控中的番剧是否有更新。
|
定时任务核心逻辑:检查所有监控中的番剧是否有更新。
|
||||||
|
|||||||
Reference in New Issue
Block a user