mirror of
				https://github.com/MHSanaei/3x-ui.git
				synced 2025-10-27 10:30:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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]any{"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)
 | |
| 	}
 | |
| }
 | 
