diff --git a/web/job/periodic_client_traffic_reset_job.go b/web/job/periodic_client_traffic_reset_job.go new file mode 100644 index 00000000..8f02f0e2 --- /dev/null +++ b/web/job/periodic_client_traffic_reset_job.go @@ -0,0 +1,42 @@ +package job + +import ( + "x-ui/logger" + "x-ui/web/service" +) + +type PeriodicClientTrafficResetJob struct { + inboundService service.InboundService + period Period +} + +func NewPeriodicClientTrafficResetJob(period Period) *PeriodicClientTrafficResetJob { + return &PeriodicClientTrafficResetJob{ + period: period, + } +} + +func (j *PeriodicClientTrafficResetJob) Run() { + clients, err := j.inboundService.GetClientsByTrafficReset(string(j.period)) + logger.Infof("Running periodic client traffic reset job for period: %s", j.period) + if err != nil { + logger.Warning("Failed to get clients for traffic reset:", err) + return + } + + resetCount := 0 + + for _, client := range clients { + if err := j.inboundService.ResetClientTrafficByEmail(client.Email); err != nil { + logger.Warning("Failed to reset traffic for client", client.Email, ":", err) + continue + } + + resetCount++ + logger.Infof("Reset traffic for client %s", client.Email) + } + + if resetCount > 0 { + logger.Infof("Periodic client traffic reset completed: %d clients reseted", resetCount) + } +} diff --git a/web/job/periodic_traffic_reset_job.go b/web/job/periodic_traffic_reset_job.go index fdcb20bc..5d3cd178 100644 --- a/web/job/periodic_traffic_reset_job.go +++ b/web/job/periodic_traffic_reset_job.go @@ -1,7 +1,6 @@ package job import ( - "x-ui/database/model" "x-ui/logger" "x-ui/web/service" ) @@ -20,7 +19,7 @@ func NewPeriodicTrafficResetJob(period Period) *PeriodicTrafficResetJob { } func (j *PeriodicTrafficResetJob) Run() { - inbounds, err := j.inboundService.GetInboundsByPeriodicTrafficReset(string(j.period)) + inbounds, err := j.inboundService.GetInboundsByTrafficReset(string(j.period)) logger.Infof("Running periodic traffic reset job for period: %s", j.period) if err != nil { logger.Warning("Failed to get inbounds for traffic reset:", err) @@ -43,7 +42,3 @@ func (j *PeriodicTrafficResetJob) Run() { logger.Infof("Periodic traffic reset completed: %d inbounds reseted", resetCount) } } - -func (j *PeriodicTrafficResetJob) getResetKey(inbound *model.Inbound) string { - return inbound.PeriodicTrafficReset + "_" + inbound.Tag -} diff --git a/web/web.go b/web/web.go index e9333de3..67667dc2 100644 --- a/web/web.go +++ b/web/web.go @@ -269,13 +269,26 @@ func (s *Server) startTask() { // Periodic traffic resets logger.Info("Scheduling periodic traffic reset jobs") { + // Inbound traffic reset jobs // Run once a day, midnight + // TODO: for testing, run every minute, change back to daily later // s.cron.AddJob("@daily", job.NewPeriodicTrafficResetJob("daily")) s.cron.AddJob("* * * * *", job.NewPeriodicTrafficResetJob("daily")) // Run once a week, midnight between Sat/Sun s.cron.AddJob("@weekly", job.NewPeriodicTrafficResetJob("weekly")) // Run once a month, midnight, first of month s.cron.AddJob("@monthly", job.NewPeriodicTrafficResetJob("monthly")) + + // Client traffic reset jobs + logger.Info("Scheduling periodic client traffic reset jobs") + // Run once a day, midnight + // TODO: for testing, run every minute, change back to daily later + // s.cron.AddJob("@daily", job.NewPeriodicClientTrafficResetJob("daily")) + s.cron.AddJob("* * * * *", job.NewPeriodicClientTrafficResetJob("daily")) + // Run once a week, midnight between Sat/Sun + s.cron.AddJob("@weekly", job.NewPeriodicClientTrafficResetJob("weekly")) + // Run once a month, midnight, first of month + s.cron.AddJob("@monthly", job.NewPeriodicClientTrafficResetJob("monthly")) } // Make a traffic condition every day, 8:30