GitHubSentinel / src /daemon_process.py
DjangoPeng's picture
add GitHubSentinel v0.8.2
3851ff8
import schedule # 导入 schedule 实现定时任务执行器
import time # 导入time库,用于控制时间间隔
import os # 导入os模块用于文件和目录操作
import signal # 导入signal库,用于信号处理
import sys # 导入sys库,用于执行系统相关的操作
from datetime import datetime # 导入 datetime 模块用于获取当前日期
from config import Config # 导入配置管理类
from github_client import GitHubClient # 导入GitHub客户端类,处理GitHub API请求
from hacker_news_client import HackerNewsClient
from notifier import Notifier # 导入通知器类,用于发送通知
from report_generator import ReportGenerator # 导入报告生成器类
from llm import LLM # 导入语言模型类,可能用于生成报告内容
from subscription_manager import SubscriptionManager # 导入订阅管理器类,管理GitHub仓库订阅
from logger import LOG # 导入日志记录器
def graceful_shutdown(signum, frame):
# 优雅关闭程序的函数,处理信号时调用
LOG.info("[优雅退出]守护进程接收到终止信号")
sys.exit(0) # 安全退出程序
def github_job(subscription_manager, github_client, report_generator, notifier, days):
LOG.info("[开始执行定时任务]GitHub Repo 项目进展报告")
subscriptions = subscription_manager.list_subscriptions() # 获取当前所有订阅
LOG.info(f"订阅列表:{subscriptions}")
for repo in subscriptions:
# 遍历每个订阅的仓库,执行以下操作
markdown_file_path = github_client.export_progress_by_date_range(repo, days)
# 从Markdown文件自动生成进展简报
report, _ = report_generator.generate_github_report(markdown_file_path)
notifier.notify_github_report(repo, report)
LOG.info(f"[定时任务执行完毕]")
def hn_topic_job(hacker_news_client, report_generator):
LOG.info("[开始执行定时任务]Hacker News 热点话题跟踪")
markdown_file_path = hacker_news_client.export_top_stories()
_, _ = report_generator.generate_hn_topic_report(markdown_file_path)
LOG.info(f"[定时任务执行完毕]")
def hn_daily_job(hacker_news_client, report_generator, notifier):
LOG.info("[开始执行定时任务]Hacker News 今日前沿技术趋势")
# 获取当前日期,并格式化为 'YYYY-MM-DD' 格式
date = datetime.now().strftime('%Y-%m-%d')
# 生成每日汇总报告的目录路径
directory_path = os.path.join('hacker_news', date)
# 生成每日汇总报告并保存
report, _ = report_generator.generate_hn_daily_report(directory_path)
notifier.notify_hn_report(date, report)
LOG.info(f"[定时任务执行完毕]")
def main():
# 设置信号处理器
signal.signal(signal.SIGTERM, graceful_shutdown)
config = Config() # 创建配置实例
github_client = GitHubClient(config.github_token) # 创建GitHub客户端实例
hacker_news_client = HackerNewsClient() # 创建 Hacker News 客户端实例
notifier = Notifier(config.email) # 创建通知器实例
llm = LLM(config) # 创建语言模型实例
report_generator = ReportGenerator(llm, config.report_types) # 创建报告生成器实例
subscription_manager = SubscriptionManager(config.subscriptions_file) # 创建订阅管理器实例
# 启动时立即执行(如不需要可注释)
# github_job(subscription_manager, github_client, report_generator, notifier, config.freq_days)
hn_daily_job(hacker_news_client, report_generator, notifier)
# 安排 GitHub 的定时任务
schedule.every(config.freq_days).days.at(
config.exec_time
).do(github_job, subscription_manager, github_client, report_generator, notifier, config.freq_days)
# 安排 hn_topic_job 每4小时执行一次,从0点开始
schedule.every(4).hours.at(":00").do(hn_topic_job, hacker_news_client, report_generator)
# 安排 hn_daily_job 每天早上10点执行一次
schedule.every().day.at("10:00").do(hn_daily_job, hacker_news_client, report_generator, notifier)
try:
# 在守护进程中持续运行
while True:
schedule.run_pending()
time.sleep(1) # 短暂休眠以减少 CPU 使用
except Exception as e:
LOG.error(f"主进程发生异常: {str(e)}")
sys.exit(1)
if __name__ == '__main__':
main()