warp_ip_job.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package job
  2. import (
  3. "time"
  4. "github.com/mhsanaei/3x-ui/v3/internal/logger"
  5. "github.com/mhsanaei/3x-ui/v3/internal/web/service"
  6. "github.com/mhsanaei/3x-ui/v3/internal/web/service/integration"
  7. )
  8. type WarpIpJob struct {
  9. settingService service.SettingService
  10. warpService integration.WarpService
  11. xrayService service.XrayService
  12. }
  13. func NewWarpIpJob() *WarpIpJob {
  14. return &WarpIpJob{}
  15. }
  16. func (j *WarpIpJob) Run() {
  17. allSetting, err := j.settingService.GetAllSetting()
  18. if err != nil {
  19. return
  20. }
  21. interval := allSetting.WarpUpdateInterval
  22. if interval <= 0 {
  23. return
  24. }
  25. lastUpdate, err := j.settingService.GetWarpLastUpdate()
  26. if err != nil {
  27. logger.Warning("Failed to read scheduled WARP IP update time: ", err)
  28. return
  29. }
  30. now := time.Now().Unix()
  31. // First run after the feature is enabled (e.g. interval set via direct
  32. // DB edit): establish a baseline instead of rotating immediately.
  33. if lastUpdate == 0 {
  34. if err := j.settingService.SetWarpLastUpdate(now); err != nil {
  35. logger.Warning("Failed to establish scheduled WARP IP update time: ", err)
  36. }
  37. return
  38. }
  39. if now-lastUpdate >= int64(interval*24*3600) {
  40. logger.Info("Starting scheduled WARP IP update...")
  41. _, err := j.warpService.ChangeWarpIP()
  42. if err != nil {
  43. logger.Warning("Failed to update WARP IP: ", err)
  44. return
  45. }
  46. if err := j.settingService.SetWarpLastUpdate(now); err != nil {
  47. logger.Warning("WARP IP changed but the next-update time was not saved: ", err)
  48. }
  49. j.xrayService.SetToNeedRestart()
  50. logger.Info("Successfully updated WARP IP and scheduled Xray restart")
  51. }
  52. }