feat: add GeofileUpdateJob for scheduled geofile updates

This commit is contained in:
root 2026-04-28 10:13:32 +08:00
parent 9bb4cc8d7f
commit b4d7192023
2 changed files with 76 additions and 0 deletions

View file

@ -0,0 +1,75 @@
package job
import (
"time"
"github.com/mhsanaei/3x-ui/v2/database"
"github.com/mhsanaei/3x-ui/v2/logger"
"github.com/mhsanaei/3x-ui/v2/web/service"
)
// GeofileUpdateJob handles scheduled geofile updates.
type GeofileUpdateJob struct {
settingService service.SettingService
serverService service.ServerService
}
// NewGeofileUpdateJob creates a new GeofileUpdateJob instance.
func NewGeofileUpdateJob() *GeofileUpdateJob {
return &GeofileUpdateJob{}
}
// Run executes the scheduled geofile update if enabled and time matches the configured frequency.
func (j *GeofileUpdateJob) Run() {
enabled, err := j.settingService.GetGeofileUpdateEnabled()
if err != nil || !enabled {
return
}
frequency, err := j.settingService.GetGeofileUpdateFrequency()
if err != nil {
return
}
if !j.shouldRun(frequency) {
return
}
if err := j.serverService.UpdateGeofile(""); err != nil {
logger.Warning("scheduled geofile update failed:", err)
return
}
if err := database.BumpSharedGeoVersion(database.GetDB()); err != nil {
logger.Warning("bump shared geo version failed:", err)
}
}
// shouldRun checks if the geofile update should run based on the configured frequency.
func (j *GeofileUpdateJob) shouldRun(frequency string) bool {
now := time.Now()
switch frequency {
case "hourly":
return now.Minute() == 0
case "every12h":
return (now.Hour() == 0 || now.Hour() == 12) && now.Minute() == 0
case "daily":
hour, err := j.settingService.GetGeofileUpdateHour()
if err != nil {
hour = 4
}
return now.Hour() == hour && now.Minute() == 0
case "weekly":
if now.Weekday() != time.Sunday {
return false
}
hour, err := j.settingService.GetGeofileUpdateHour()
if err != nil {
hour = 4
}
return now.Hour() == hour && now.Minute() == 0
default:
return false
}
}

View file

@ -413,6 +413,7 @@ func (s *Server) startTask() {
// Schedule database backup job (runs every minute, checks schedule internally) // Schedule database backup job (runs every minute, checks schedule internally)
s.cron.AddJob("@every 1m", job.NewBackupJob()) s.cron.AddJob("@every 1m", job.NewBackupJob())
s.cron.AddJob("@every 1m", job.NewGeofileUpdateJob())
} }
func (s *Server) startNodeLoops() { func (s *Server) startNodeLoops() {