feat: add periodic client traffic reset job and schedule tasks

This commit is contained in:
Vadim Iskuchekov 2025-09-09 17:40:04 +00:00
parent 7d75cfc947
commit 10d57d9502
3 changed files with 56 additions and 6 deletions

View file

@ -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)
}
}

View file

@ -1,7 +1,6 @@
package job package job
import ( import (
"x-ui/database/model"
"x-ui/logger" "x-ui/logger"
"x-ui/web/service" "x-ui/web/service"
) )
@ -20,7 +19,7 @@ func NewPeriodicTrafficResetJob(period Period) *PeriodicTrafficResetJob {
} }
func (j *PeriodicTrafficResetJob) Run() { 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) logger.Infof("Running periodic traffic reset job for period: %s", j.period)
if err != nil { if err != nil {
logger.Warning("Failed to get inbounds for traffic reset:", err) 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) logger.Infof("Periodic traffic reset completed: %d inbounds reseted", resetCount)
} }
} }
func (j *PeriodicTrafficResetJob) getResetKey(inbound *model.Inbound) string {
return inbound.PeriodicTrafficReset + "_" + inbound.Tag
}

View file

@ -269,13 +269,26 @@ func (s *Server) startTask() {
// Periodic traffic resets // Periodic traffic resets
logger.Info("Scheduling periodic traffic reset jobs") logger.Info("Scheduling periodic traffic reset jobs")
{ {
// Inbound traffic reset jobs
// Run once a day, midnight // 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("@daily", job.NewPeriodicTrafficResetJob("daily"))
s.cron.AddJob("* * * * *", job.NewPeriodicTrafficResetJob("daily")) s.cron.AddJob("* * * * *", job.NewPeriodicTrafficResetJob("daily"))
// Run once a week, midnight between Sat/Sun // Run once a week, midnight between Sat/Sun
s.cron.AddJob("@weekly", job.NewPeriodicTrafficResetJob("weekly")) s.cron.AddJob("@weekly", job.NewPeriodicTrafficResetJob("weekly"))
// Run once a month, midnight, first of month // Run once a month, midnight, first of month
s.cron.AddJob("@monthly", job.NewPeriodicTrafficResetJob("monthly")) 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 // Make a traffic condition every day, 8:30