diff --git a/service/controller/control.go b/service/controller/control.go index 062edd7..02e1e6c 100644 --- a/service/controller/control.go +++ b/service/controller/control.go @@ -9,6 +9,7 @@ import ( "github.com/xtls/xray-core/core" "github.com/xtls/xray-core/features/inbound" "github.com/xtls/xray-core/features/outbound" + "github.com/xtls/xray-core/features/stats" "github.com/xtls/xray-core/proxy" ) @@ -102,21 +103,31 @@ func (c *Controller) removeUsers(users []string, tag string) error { return nil } -func (c *Controller) getTraffic(email string) (up int64, down int64) { +func (c *Controller) getTraffic(email string) (up int64, down int64, upCounter stats.Counter, downCounter stats.Counter) { upName := "user>>>" + email + ">>>traffic>>>uplink" downName := "user>>>" + email + ">>>traffic>>>downlink" - upCounter := c.stm.GetCounter(upName) - downCounter := c.stm.GetCounter(downName) - if upCounter != nil { + upCounter = c.stm.GetCounter(upName) + downCounter = c.stm.GetCounter(downName) + if upCounter != nil && upCounter.Value() != 0 { up = upCounter.Value() + } else { + upCounter = nil + } + if downCounter != nil && upCounter.Value() != 0 { + down = downCounter.Value() + } else { + downCounter = nil + } + return up, down, upCounter, downCounter +} + +func (c *Controller) resetTraffic(upCounterList *[]stats.Counter, downCounterList *[]stats.Counter) { + for _, upCounter := range *upCounterList { upCounter.Set(0) } - if downCounter != nil { - down = downCounter.Value() + for _, downCounter := range *downCounterList { downCounter.Set(0) } - return up, down - } func (c *Controller) AddInboundLimiter(tag string, nodeSpeedLimit uint64, userList *[]api.UserInfo) error { diff --git a/service/controller/controller.go b/service/controller/controller.go index b326836..47e3f39 100644 --- a/service/controller/controller.go +++ b/service/controller/controller.go @@ -427,21 +427,36 @@ func (c *Controller) userInfoMonitor() (err error) { } // Get User traffic - userTraffic := make([]api.UserTraffic, 0) + var userTraffic []api.UserTraffic + var upCounterList []stats.Counter + var downCounterList []stats.Counter for _, user := range *c.userList { - up, down := c.getTraffic(c.buildUserTag(&user)) + up, down, upCounter, downCounter := c.getTraffic(c.buildUserTag(&user)) if up > 0 || down > 0 { userTraffic = append(userTraffic, api.UserTraffic{ UID: user.UID, Email: user.Email, Upload: up, Download: down}) + + if upCounter != nil { + upCounterList = append(upCounterList, upCounter) + } + if downCounter != nil { + downCounterList = append(downCounterList, downCounter) + } } } - if len(userTraffic) > 0 && !c.config.DisableUploadTraffic { - err = c.apiClient.ReportUserTraffic(&userTraffic) + if len(userTraffic) > 0 { + var err error // Define an empty error + if !c.config.DisableUploadTraffic { + err = c.apiClient.ReportUserTraffic(&userTraffic) + } + // If report traffic error, not clear the traffic if err != nil { log.Print(err) + } else { + c.resetTraffic(&upCounterList, &downCounterList) } }