package job import ( "encoding/json" "x-ui/logger" "x-ui/web/service" "x-ui/xray" "github.com/valyala/fasthttp" ) type XrayTrafficJob struct { settingService service.SettingService xrayService service.XrayService inboundService service.InboundService outboundService service.OutboundService } func NewXrayTrafficJob() *XrayTrafficJob { return new(XrayTrafficJob) } func (j *XrayTrafficJob) Run() { if !j.xrayService.IsXrayRunning() { return } traffics, clientTraffics, err := j.xrayService.GetXrayTraffic() if err != nil { return } err, needRestart0 := j.inboundService.AddTraffic(traffics, clientTraffics) if err != nil { logger.Warning("add inbound traffic failed:", err) } err, needRestart1 := j.outboundService.AddTraffic(traffics, clientTraffics) if err != nil { logger.Warning("add outbound traffic failed:", err) } if ExternalTrafficInformEnable, err := j.settingService.GetExternalTrafficInformEnable(); ExternalTrafficInformEnable { j.informTrafficToExternalAPI(traffics, clientTraffics) } else if err != nil { logger.Warning("get ExternalTrafficInformEnable failed:", err) } if needRestart0 || needRestart1 { j.xrayService.SetToNeedRestart() } } func (j *XrayTrafficJob) informTrafficToExternalAPI(inboundTraffics []*xray.Traffic, clientTraffics []*xray.ClientTraffic) { informURL, err := j.settingService.GetExternalTrafficInformURI() if err != nil { logger.Warning("get ExternalTrafficInformURI failed:", err) return } requestBody, err := json.Marshal(map[string]interface{}{"clientTraffics": clientTraffics, "inboundTraffics": inboundTraffics}) if err != nil { logger.Warning("parse client/inbound traffic failed:", err) return } request := fasthttp.AcquireRequest() defer fasthttp.ReleaseRequest(request) request.Header.SetMethod("POST") request.Header.SetContentType("application/json; charset=UTF-8") request.SetBody([]byte(requestBody)) request.SetRequestURI(informURL) response := fasthttp.AcquireResponse() defer fasthttp.ReleaseResponse(response) if err := fasthttp.Do(request, response); err != nil { logger.Warning("POST ExternalTrafficInformURI failed:", err) } }