package server import ( "context" "github.com/go-co-op/gocron" "github.com/go-nunu/nunu-layout-advanced/internal/task" "github.com/go-nunu/nunu-layout-advanced/pkg/log" "go.uber.org/zap" "time" ) type TaskServer struct { log *log.Logger scheduler *gocron.Scheduler userTask task.UserTask gameShieldTask task.GameShieldTask wafTask task.WafTask } func NewTaskServer( log *log.Logger, userTask task.UserTask, gameShieldTask task.GameShieldTask, wafTask task.WafTask, ) *TaskServer { return &TaskServer{ log: log, userTask: userTask, gameShieldTask: gameShieldTask, wafTask: wafTask, } } func (t *TaskServer) Start(ctx context.Context) error { gocron.SetPanicHandler(func(jobName string, recoverData interface{}) { t.log.Error("TaskServer Panic", zap.String("job", jobName), zap.Any("recover", recoverData)) }) // eg: crontab task t.scheduler = gocron.NewScheduler(time.UTC) // if you are in China, you will need to change the time zone as follows // t.scheduler = gocron.NewScheduler(time.FixedZone("PRC", 8*60*60)) //_, err := t.scheduler.Every("3s").Do(func() //_, err := t.scheduler.CronWithSeconds("0/3 * * * * *").Do(func() { // err := t.userTask.CheckUser(ctx) // if err != nil { // t.log.Error("CheckUser error", zap.Error(err)) // } //}) //if err != nil { // t.log.Error("CheckUser error", zap.Error(err)) //} // 添加游戏盾检查任务 - 每1小时执行 //_, err := t.scheduler.Cron("0 */1 * * *").Do(func() { // err := t.gameShieldTask.CheckGameShield(ctx) // if err != nil { // t.log.Error("CheckGameShield error", zap.Error(err)) // } //}) //if err != nil { // t.log.Error("Register CheckGameShield task error", zap.Error(err)) //} // //// 添加游戏盾数据同步任务 - 每天凌晨3点执行 //_, err = t.scheduler.Cron("0 3 * * *").Do(func() { // err := t.gameShieldTask.SyncAllExpireTimeFromHost(ctx) // if err != nil { // t.log.Error("SyncAllExpireTimeFromHost error", zap.Error(err)) // } //}) //if err != nil { // t.log.Error("Register SyncAllExpireTimeFromHost task error", zap.Error(err)) //} _, err := t.scheduler.Cron("0 * * * *").Do(func() { err := t.wafTask.SynchronizationTime(ctx) if err != nil { t.log.Error("同步到期时间失败", zap.Error(err)) } }) if err != nil { t.log.Error("同步到期时间注册任务失败", zap.Error(err)) } _, err = t.scheduler.Cron("0 * * * *").Do(func() { err := t.wafTask.StopPlan(ctx) if err != nil { t.log.Error("停止套餐失败", zap.Error(err)) } }) if err != nil { t.log.Error("停止套餐注册任务失败", zap.Error(err)) } _, err = t.scheduler.Cron("0 * * * *").Do(func() { err := t.wafTask.RecoverRecentPlan(ctx) if err != nil { t.log.Error("续费失败", zap.Error(err)) } }) if err != nil { t.log.Error("续费注册任务失败", zap.Error(err)) } _, err = t.scheduler.Cron("0 * * * *").Do(func() { err := t.wafTask.CleanUpStaleRecords(ctx) if err != nil { t.log.Error("清理过期记录失败", zap.Error(err)) } }) if err != nil { t.log.Error("清理过期记录注册任务失败", zap.Error(err)) } // 使用非阻塞方式启动调度器,添加一条日志表明任务服务已启动 t.scheduler.StartAsync() t.log.Info("task server starting...") return nil } func (t *TaskServer) Stop(ctx context.Context) error { t.scheduler.Stop() t.log.Info("TaskServer stop...") return nil }