Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMHSanaei <ho3ein.sanaei@gmail.com>2023-03-17 19:07:49 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2023-03-17 19:07:49 +0300
commit96786c94189f3d2f3f04c1915529c786228bdf42 (patch)
tree879085e09a3cd485f3246f46be907fe77eb84a1a /web/service/inbound.go
parentbc56e637376142c370c31b17558fc3778a863bd2 (diff)
alireza
Diffstat (limited to 'web/service/inbound.go')
-rw-r--r--web/service/inbound.go255
1 files changed, 203 insertions, 52 deletions
diff --git a/web/service/inbound.go b/web/service/inbound.go
index b3f3265b..87440c84 100644
--- a/web/service/inbound.go
+++ b/web/service/inbound.go
@@ -54,7 +54,7 @@ func (s *InboundService) getClients(inbound *model.Inbound) ([]model.Client, err
settings := map[string][]model.Client{}
json.Unmarshal([]byte(inbound.Settings), &settings)
if settings == nil {
- return nil, fmt.Errorf("Setting is null")
+ return nil, fmt.Errorf("setting is null")
}
clients := settings["clients"]
@@ -125,11 +125,18 @@ func (s *InboundService) AddInbound(inbound *model.Inbound) (*model.Inbound, err
return inbound, common.NewError("Duplicate email:", existEmail)
}
+ clients, err := s.getClients(inbound)
+ if err != nil {
+ return inbound, err
+ }
+
db := database.GetDB()
err = db.Save(inbound).Error
if err == nil {
- s.UpdateClientStat(inbound.Id, inbound.Settings)
+ for _, client := range clients {
+ s.AddClientStat(inbound.Id, &client)
+ }
}
return inbound, err
}
@@ -168,6 +175,10 @@ func (s *InboundService) AddInbounds(inbounds []*model.Inbound) error {
func (s *InboundService) DelInbound(id int) error {
db := database.GetDB()
+ err := db.Where("inbound_id = ?", id).Delete(xray.ClientTraffic{}).Error
+ if err != nil {
+ return err
+ }
return db.Delete(model.Inbound{}, id).Error
}
@@ -216,11 +227,108 @@ func (s *InboundService) UpdateInbound(inbound *model.Inbound) (*model.Inbound,
oldInbound.Sniffing = inbound.Sniffing
oldInbound.Tag = fmt.Sprintf("inbound-%v", inbound.Port)
- s.UpdateClientStat(inbound.Id, inbound.Settings)
db := database.GetDB()
return inbound, db.Save(oldInbound).Error
}
+func (s *InboundService) AddInboundClient(inbound *model.Inbound) error {
+ existEmail, err := s.checkEmailExistForInbound(inbound)
+ if err != nil {
+ return err
+ }
+
+ if existEmail != "" {
+ return common.NewError("Duplicate email:", existEmail)
+ }
+
+ clients, err := s.getClients(inbound)
+ if err != nil {
+ return err
+ }
+
+ oldInbound, err := s.GetInbound(inbound.Id)
+ if err != nil {
+ return err
+ }
+
+ oldClients, err := s.getClients(oldInbound)
+ if err != nil {
+ return err
+ }
+
+ oldInbound.Settings = inbound.Settings
+
+ if len(clients[len(clients)-1].Email) > 0 {
+ s.AddClientStat(inbound.Id, &clients[len(clients)-1])
+ }
+ for i := len(oldClients); i < len(clients); i++ {
+ if len(clients[i].Email) > 0 {
+ s.AddClientStat(inbound.Id, &clients[i])
+ }
+ }
+ db := database.GetDB()
+ return db.Save(oldInbound).Error
+}
+
+func (s *InboundService) DelInboundClient(inbound *model.Inbound, email string) error {
+ db := database.GetDB()
+ err := s.DelClientStat(db, email)
+ if err != nil {
+ logger.Error("Delete stats Data Error")
+ return err
+ }
+
+ oldInbound, err := s.GetInbound(inbound.Id)
+ if err != nil {
+ logger.Error("Load Old Data Error")
+ return err
+ }
+
+ oldInbound.Settings = inbound.Settings
+
+ return db.Save(oldInbound).Error
+}
+
+func (s *InboundService) UpdateInboundClient(inbound *model.Inbound, index int) error {
+ existEmail, err := s.checkEmailExistForInbound(inbound)
+ if err != nil {
+ return err
+ }
+ if existEmail != "" {
+ return common.NewError("Duplicate email:", existEmail)
+ }
+
+ clients, err := s.getClients(inbound)
+ if err != nil {
+ return err
+ }
+
+ oldInbound, err := s.GetInbound(inbound.Id)
+ if err != nil {
+ return err
+ }
+
+ oldClients, err := s.getClients(oldInbound)
+ if err != nil {
+ return err
+ }
+
+ oldInbound.Settings = inbound.Settings
+
+ db := database.GetDB()
+
+ if len(clients[index].Email) > 0 {
+ if len(oldClients[index].Email) > 0 {
+ s.UpdateClientStat(oldClients[index].Email, &clients[index])
+ } else {
+ s.AddClientStat(inbound.Id, &clients[index])
+ }
+ } else {
+ s.DelClientStat(db, oldClients[index].Email)
+ }
+ return db.Save(oldInbound).Error
+}
+
func (s *InboundService) AddTraffic(traffics []*xray.Traffic) (err error) {
if len(traffics) == 0 {
return nil
@@ -283,10 +391,12 @@ func (s *InboundService) AddClientTraffic(traffics []*xray.ClientTraffic) (err e
}
continue
}
+
err = txInbound.Where("id=?", client.InboundId).First(inbound).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
logger.Warning(err, traffic.Email)
+
}
continue
}
@@ -300,7 +410,7 @@ func (s *InboundService) AddClientTraffic(traffics []*xray.ClientTraffic) (err e
traffic.Total = client.TotalGB
}
}
- if tx.Where("inbound_id = ?", inbound.Id).Where("email = ?", traffic.Email).
+ if tx.Where("inbound_id = ? and email = ?", inbound.Id, traffic.Email).
UpdateColumns(map[string]interface{}{
"enable": true,
"expiry_time": traffic.ExpiryTime,
@@ -339,82 +449,92 @@ func (s *InboundService) DisableInvalidClients() (int64, error) {
count := result.RowsAffected
return count, err
}
-func (s *InboundService) UpdateClientStat(inboundId int, inboundSettings string) error {
+func (s *InboundService) AddClientStat(inboundId int, client *model.Client) error {
db := database.GetDB()
- // get settings clients
- settings := map[string][]model.Client{}
- json.Unmarshal([]byte(inboundSettings), &settings)
- clients := settings["clients"]
- for _, client := range clients {
- result := db.Model(xray.ClientTraffic{}).
- Where("inbound_id = ? and email = ?", inboundId, client.Email).
- Updates(map[string]interface{}{"enable": true, "total": client.TotalGB, "expiry_time": client.ExpiryTime})
- if result.RowsAffected == 0 {
- clientTraffic := xray.ClientTraffic{}
- clientTraffic.InboundId = inboundId
- clientTraffic.Email = client.Email
- clientTraffic.Total = client.TotalGB
- clientTraffic.ExpiryTime = client.ExpiryTime
- clientTraffic.Enable = true
- clientTraffic.Up = 0
- clientTraffic.Down = 0
- db.Create(&clientTraffic)
- }
- err := result.Error
- if err != nil {
- return err
- }
-
+ clientTraffic := xray.ClientTraffic{}
+ clientTraffic.InboundId = inboundId
+ clientTraffic.Email = client.Email
+ clientTraffic.Total = client.TotalGB
+ clientTraffic.ExpiryTime = client.ExpiryTime
+ clientTraffic.Enable = true
+ clientTraffic.Up = 0
+ clientTraffic.Down = 0
+ result := db.Create(&clientTraffic)
+ err := result.Error
+ if err != nil {
+ return err
}
return nil
}
-func (s *InboundService) DelClientStat(tx *gorm.DB, email string) error {
- return tx.Where("email = ?", email).Delete(xray.ClientTraffic{}).Error
-}
-func (s *InboundService) GetInboundClientIps(clientEmail string) (string, error) {
+func (s *InboundService) UpdateClientStat(email string, client *model.Client) error {
db := database.GetDB()
- InboundClientIps := &model.InboundClientIps{}
- err := db.Model(model.InboundClientIps{}).Where("client_email = ?", clientEmail).First(InboundClientIps).Error
+
+ result := db.Model(xray.ClientTraffic{}).
+ Where("email = ?", email).
+ Updates(map[string]interface{}{
+ "enable": true,
+ "email": client.Email,
+ "total": client.TotalGB,
+ "expiry_time": client.ExpiryTime})
+ err := result.Error
if err != nil {
- return "", err
+ return err
}
- return InboundClientIps.Ips, nil
+ return nil
}
-func (s *InboundService) ClearClientIps(clientEmail string) (error) {
+func (s *InboundService) DelClientStat(tx *gorm.DB, email string) error {
+ return tx.Where("email = ?", email).Delete(xray.ClientTraffic{}).Error
+}
+
+func (s *InboundService) ResetClientTraffic(id int, clientEmail string) error {
db := database.GetDB()
- result := db.Model(model.InboundClientIps{}).
- Where("client_email = ?", clientEmail).
- Update("ips", "")
- err := result.Error
+ result := db.Model(xray.ClientTraffic{}).
+ Where("inbound_id = ? and email = ?", id, clientEmail).
+ Updates(map[string]interface{}{"enable": true, "up": 0, "down": 0})
+ err := result.Error
if err != nil {
return err
}
return nil
}
-func (s *InboundService) ResetClientTraffic(clientEmail string) error {
+func (s *InboundService) GetClientTrafficTgBot(tguname string) (traffic []*xray.ClientTraffic, err error) {
db := database.GetDB()
+ var traffics []*xray.ClientTraffic
- result := db.Model(xray.ClientTraffic{}).
- Where("email = ?", clientEmail).
- Updates(map[string]interface{}{"up": 0, "down": 0})
+ err = db.Model(xray.ClientTraffic{}).Where("email like ?", "%@"+tguname).Find(&traffics).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ logger.Warning(err)
+ return nil, err
+ }
+ }
+ return traffics, err
+}
- err := result.Error
+func (s *InboundService) GetClientTrafficByEmail(email string) (traffic []*xray.ClientTraffic, err error) {
+ db := database.GetDB()
+ var traffics []*xray.ClientTraffic
+ err = db.Model(xray.ClientTraffic{}).Where("email like ?", "%"+email+"%").Find(&traffics).Error
if err != nil {
- return err
+ if err == gorm.ErrRecordNotFound {
+ logger.Warning(err)
+ return nil, err
+ }
}
- return nil
+ return traffics, err
}
-func (s *InboundService) GetClientTrafficById(uuid string) (traffic *xray.ClientTraffic, err error) {
+
+func (s *InboundService) SearchClientTraffic(query string) (traffic *xray.ClientTraffic, err error) {
db := database.GetDB()
inbound := &model.Inbound{}
traffic = &xray.ClientTraffic{}
- err = db.Model(model.Inbound{}).Where("settings like ?", "%"+uuid+"%").First(inbound).Error
+ err = db.Model(model.Inbound{}).Where("settings like ?", "%\""+query+"\"%").First(inbound).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
logger.Warning(err)
@@ -428,10 +548,18 @@ func (s *InboundService) GetClientTrafficById(uuid string) (traffic *xray.Client
json.Unmarshal([]byte(inbound.Settings), &settings)
clients := settings["clients"]
for _, client := range clients {
- if uuid == client.ID {
+ if client.ID == query && client.Email != "" {
+ traffic.Email = client.Email
+ break
+ }
+ if client.Password == query && client.Email != "" {
traffic.Email = client.Email
+ break
}
}
+ if traffic.Email == "" {
+ return nil, err
+ }
err = db.Model(xray.ClientTraffic{}).Where("email = ?", traffic.Email).First(traffic).Error
if err != nil {
logger.Warning(err)
@@ -439,3 +567,26 @@ func (s *InboundService) GetClientTrafficById(uuid string) (traffic *xray.Client
}
return traffic, err
}
+func (s *InboundService) GetInboundClientIps(clientEmail string) (string, error) {
+ db := database.GetDB()
+ InboundClientIps := &model.InboundClientIps{}
+ err := db.Model(model.InboundClientIps{}).Where("client_email = ?", clientEmail).First(InboundClientIps).Error
+ if err != nil {
+ return "", err
+ }
+ return InboundClientIps.Ips, nil
+}
+func (s *InboundService) ClearClientIps(clientEmail string) (error) {
+ db := database.GetDB()
+
+ result := db.Model(model.InboundClientIps{}).
+ Where("client_email = ?", clientEmail).
+ Update("ips", "")
+ err := result.Error
+
+
+ if err != nil {
+ return err
+ }
+ return nil
+}