Update main.py

This commit is contained in:
谢幕 2025-07-18 20:57:07 +08:00 committed by GitHub
parent 3fae6c884b
commit edc824d8b4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

101
main.py
View File

@ -32,3 +32,104 @@ class MyPlugin(Star):
logger.error(f"下载图片失败: {e}") logger.error(f"下载图片失败: {e}")
yield event.plain_result("下载 GitHub 图片失败: " + str(e)) yield event.plain_result("下载 GitHub 图片失败: " + str(e))
return return
@filter.command("ghsub")
async def subscribe_repo(self, event: AstrMessageEvent, repo: str):
"""订阅 GitHub 仓库的 Issue、PR 和评论。例如: /ghsub Soulter/AstrBot"""
# 验证仓库格式
if not self._is_valid_repo(repo):
yield event.plain_result("请提供有效的仓库名,格式为: 用户名/仓库名")
return
# 标准化仓库名称(统一大小写)
normalized_repo = self._normalize_repo_name(repo)
# 验证仓库是否存在
try:
async with aiohttp.ClientSession() as session:
async with session.get(
GITHUB_API_URL.format(repo=repo),
headers=self._get_github_headers()
) as resp:
if resp.status != 200:
yield event.plain_result(f"仓库 {repo} 不存在或无法访问")
return
repo_data = await resp.json()
display_name = repo_data.get("full_name", repo)
except Exception as e:
logger.error(f"验证仓库失败: {e}")
yield event.plain_result(f"验证仓库时出错: {str(e)}")
return
# 获取订阅者唯一标识如群聊ID或用户ID
subscriber_id = event.unified_msg_origin
# 处理订阅逻辑
if normalized_repo not in self.subscriptions:
self.subscriptions[normalized_repo] = [] # 初始化订阅列表
if subscriber_id not in self.subscriptions[normalized_repo]:
self.subscriptions[normalized_repo].append(subscriber_id)
self._save_subscriptions() # 持久化订阅数据
# 初始化订阅时间戳(用于后续检测新内容)
self._init_subscription_timestamp(normalized_repo)
yield event.plain_result(f"成功订阅仓库 {display_name} 的更新Issue/PR/评论)")
else:
yield event.plain_result(f"你已订阅仓库 {display_name}")
# 自动将该仓库设为当前会话的默认仓库
self.default_repos[subscriber_id] = normalized_repo
self._save_default_repos()
@filter.command("ghunsub")
async def unsubscribe_repo(self, event: AstrMessageEvent, repo: str = None):
"""取消订阅 GitHub 仓库。例如: /ghunsub Soulter/AstrBot不提供仓库名则取消所有订阅"""
subscriber_id = event.unified_msg_origin
if repo is None:
# 取消所有订阅
unsubscribed_repos = []
# 遍历所有仓库,移除当前订阅者
for repo_name in list(self.subscriptions.keys()):
if subscriber_id in self.subscriptions[repo_name]:
self.subscriptions[repo_name].remove(subscriber_id)
unsubscribed_repos.append(repo_name)
# 若仓库无订阅者,删除该仓库记录
if not self.subscriptions[repo_name]:
del self.subscriptions[repo_name]
# 清理对应的时间戳
self._cleanup_subscription_timestamp(repo_name)
self._save_subscriptions()
if unsubscribed_repos:
yield event.plain_result(f"已取消订阅以下仓库: {', '.join(unsubscribed_repos)}")
else:
yield event.plain_result("你当前没有订阅任何仓库")
return
# 验证仓库格式
if not self._is_valid_repo(repo):
yield event.plain_result("请提供有效的仓库名,格式为: 用户名/仓库名")
return
# 标准化仓库名称
normalized_repo = self._normalize_repo_name(repo)
# 兼容大小写差异(如用户输入大写,实际存储为小写)
matched_repos = [r for r in self.subscriptions.keys() if r.lower() == normalized_repo.lower()]
if matched_repos:
normalized_repo = matched_repos[0]
# 取消单个仓库订阅
if normalized_repo in self.subscriptions and subscriber_id in self.subscriptions[normalized_repo]:
self.subscriptions[normalized_repo].remove(subscriber_id)
# 若仓库无订阅者,删除记录
if not self.subscriptions[normalized_repo]:
del self.subscriptions[normalized_repo]
self._cleanup_subscription_timestamp(normalized_repo)
self._save_subscriptions()
yield event.plain_result(f"已取消订阅仓库 {normalized_repo}")
else:
yield event.plain_result(f"你未订阅仓库 {repo}")