enable store each Email Traffic

This commit is contained in:
Hossin Asaadi
2022-11-11 09:20:51 -05:00
parent dc8e00f2cf
commit 8deffb1b7c
5 changed files with 118 additions and 6 deletions

View File

@@ -27,4 +27,18 @@ func (j *XrayTrafficJob) Run() {
if err != nil {
logger.Warning("add traffic failed:", err)
}
// get Client Traffic
clientTraffics, err := j.xrayService.GetXrayClientTraffic()
if err != nil {
logger.Warning("get xray client traffic failed:", err)
return
}
err = j.inboundService.AddClientTraffic(clientTraffics)
if err != nil {
logger.Warning("add client traffic failed:", err)
}
}

View File

@@ -3,6 +3,7 @@ package service
import (
"fmt"
"time"
"encoding/json"
"x-ui/database"
"x-ui/database/model"
"x-ui/util/common"
@@ -166,6 +167,48 @@ func (s *InboundService) AddTraffic(traffics []*xray.Traffic) (err error) {
}
return
}
func (s *InboundService) AddClientTraffic(traffics []*xray.ClientTraffic) (err error) {
if len(traffics) == 0 {
return nil
}
db := database.GetDB()
db = db.Model(model.Inbound{})
tx := db.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
for _, traffic := range traffics {
inbound := &model.Inbound{}
err := tx.Where("settings like ?", "%" + traffic.Email + "%").First(inbound).Error
clientStats := map[string]*xray.ClientTraffic{}
json.Unmarshal([]byte(inbound.ClientStats), &clientStats)
if _, ok := clientStats[traffic.Email]; ok {
clientStats[traffic.Email].Up = clientStats[traffic.Email].Up + traffic.Up
clientStats[traffic.Email].Down = clientStats[traffic.Email].Down + traffic.Down
}else{
clientStats[traffic.Email] = traffic
}
jsonClientStats, err := json.Marshal(clientStats)
// if clientStats[traffic.Email]
err = tx.Where("settings like ?", "%" + traffic.Email + "%").
Update("client_stats", jsonClientStats).
Error
if err != nil {
return err
}
}
return
}
func (s *InboundService) DisableInvalidInbounds() (int64, error) {
db := database.GetDB()

View File

@@ -84,6 +84,12 @@ func (s *XrayService) GetXrayTraffic() ([]*xray.Traffic, error) {
}
return p.GetTraffic(true)
}
func (s *XrayService) GetXrayClientTraffic() ([]*xray.ClientTraffic, error) {
if !s.IsXrayRunning() {
return nil, errors.New("xray is not running")
}
return p.GetClientTraffic(true)
}
func (s *XrayService) RestartXray(isForce bool) error {
lock.Lock()