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-04-25 18:13:37 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2023-04-25 18:13:37 +0300
commit379451135decb1a90bf9d56c359d4ae5d88213ea (patch)
tree6ee37fd3cc3ca7b1dc1dc6eee275940f8a43a6c2 /web/service
parentbc06dbab21df01ede095d850a41ac769ae582469 (diff)
[feature] delete depleted clients
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'web/service')
-rw-r--r--web/service/inbound.go79
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