diff options
| author | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-04-25 18:13:37 +0300 |
|---|---|---|
| committer | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-04-25 18:13:37 +0300 |
| commit | 379451135decb1a90bf9d56c359d4ae5d88213ea (patch) | |
| tree | 6ee37fd3cc3ca7b1dc1dc6eee275940f8a43a6c2 /web/service | |
| parent | bc06dbab21df01ede095d850a41ac769ae582469 (diff) | |
[feature] delete depleted clients
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'web/service')
| -rw-r--r-- | web/service/inbound.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/web/service/inbound.go b/web/service/inbound.go index ab2ceb66..db0e6aaf 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -3,6 +3,7 @@ package service import ( "encoding/json" "fmt" + "strings" "time" "x-ui/database" "x-ui/database/model" @@ -715,6 +716,84 @@ func (s *InboundService) ResetAllTraffics() error { return nil } +func (s *InboundService) DelDepletedClients(id int) (err error) { + db := database.GetDB() + tx := db.Begin() + defer func() { + if err == nil { + tx.Commit() + } else { + tx.Rollback() + } + }() + + whereText := "inbound_id " + if id < 0 { + whereText += "> ?" + } else { + whereText += "= ?" + } + + depletedClients := []xray.ClientTraffic{} + err = db.Model(xray.ClientTraffic{}).Where(whereText+" and enable = ?", id, false).Select("inbound_id, GROUP_CONCAT(email) as email").Group("inbound_id").Find(&depletedClients).Error + if err != nil { + return err + } + + for _, depletedClient := range depletedClients { + emails := strings.Split(depletedClient.Email, ",") + oldInbound, err := s.GetInbound(depletedClient.InboundId) + if err != nil { + return err + } + var oldSettings map[string]interface{} + err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings) + if err != nil { + return err + } + + oldClients := oldSettings["clients"].([]interface{}) + var newClients []interface{} + for _, client := range oldClients { + deplete := false + c := client.(map[string]interface{}) + for _, email := range emails { + if email == c["email"].(string) { + deplete = true + break + } + } + if !deplete { + newClients = append(newClients, client) + } + } + if len(newClients) > 0 { + oldSettings["clients"] = newClients + + newSettings, err := json.MarshalIndent(oldSettings, "", " ") + if err != nil { + return err + } + + oldInbound.Settings = string(newSettings) + err = tx.Save(oldInbound).Error + if err != nil { + return err + } + } else { + // Delete inbound if no client remains + s.DelInbound(depletedClient.InboundId) + } + } + + err = tx.Where(whereText+" and enable = ?", id, false).Delete(xray.ClientTraffic{}).Error + if err != nil { + return err + } + + return nil +} + func (s *InboundService) GetClientTrafficTgBot(tguname string) ([]*xray.ClientTraffic, error) { db := database.GetDB() var inbounds []*model.Inbound |
