diff options
| author | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-03-17 19:07:49 +0300 |
|---|---|---|
| committer | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-03-17 19:07:49 +0300 |
| commit | 96786c94189f3d2f3f04c1915529c786228bdf42 (patch) | |
| tree | 879085e09a3cd485f3246f46be907fe77eb84a1a /web/service/inbound.go | |
| parent | bc56e637376142c370c31b17558fc3778a863bd2 (diff) | |
alireza
Diffstat (limited to 'web/service/inbound.go')
| -rw-r--r-- | web/service/inbound.go | 255 |
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 +} |
