今天要做的功能是讓使用者可以自行輸入想要查詢的天數,例如查看 1 天內、3 天內或更多天前的 changelog,方便快速了解最近的更新內容
撰寫程式碼
def get_merged_prs_since(since_date):
"""獲取指定時間後合併的 PR"""
try:
if not GH_TOKEN:
return None, "❌ GitHub Token 未設定"
headers = {
'Authorization': f'token {GH_TOKEN}',
'Accept': 'application/vnd.github.v3+json'
}
url = f'https://api.github.com/search/issues'
query = f'repo:{GITHUB_OWNER}/{GITHUB_REPO} is:pr is:merged merged:>={since_date}'
params = {'q': query, 'sort': 'updated', 'order': 'desc'}
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
data = response.json()
return data.get('items', []), None
except Exception as e:
return None, f"❌ 獲取 PR 時出錯: {str(e)}"
@bot.command()
async def changelog(ctx, days: int = None):
"""顯示近期更新日誌"""
if days is None:
days = CHECK_INTERVAL_DAYS
if days > 30:
await ctx.send("❌ 最多只能查詢 30 天內的更新")
return
wait_msg = await ctx.send(f"🔄 正在生成最近 {days} 天的更新日誌...")
since_date = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
prs, error = get_merged_prs_since(since_date)
if error:
await wait_msg.edit(content=error)
return
if not prs:
await wait_msg.edit(content=f"📭 最近 {days} 天沒有合併的 PR")
return
detailed_changelog = f"🚀 **最近 {days} 天更新日誌**\n\n"
for pr in prs:
pr_number = pr['number']
pr_title = pr['title']
pr_url = pr['html_url']
merged_at = pr['pull_request']['merged_at']
author = pr['user']['login']
merged_time = datetime.fromisoformat(merged_at.replace('Z', '+00:00'))
formatted_time = merged_time.strftime("%m/%d %H:%M")
detailed_changelog += f"**#{pr_number}** - {pr_title}\n"
detailed_changelog += f"⏰ {formatted_time} | 👤 {author}\n"
detailed_changelog += f"🔗 [查看PR]({pr_url})\n\n"
await wait_msg.edit(content=detailed_changelog)
成果展示