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:
Diffstat (limited to 'sub/subService.go')
-rw-r--r--sub/subService.go67
1 files changed, 36 insertions, 31 deletions
diff --git a/sub/subService.go b/sub/subService.go
index ddf9692b..06d1ed0a 100644
--- a/sub/subService.go
+++ b/sub/subService.go
@@ -25,47 +25,42 @@ type SubService struct {
settingService service.SettingService
}
-func (s *SubService) GetSubs(subId string, host string, showInfo bool) ([]string, []string, error) {
+func NewSubService(showInfo bool, remarkModel string) *SubService {
+ return &SubService{
+ showInfo: showInfo,
+ remarkModel: remarkModel,
+ }
+}
+
+func (s *SubService) GetSubs(subId string, host string) ([]string, string, error) {
s.address = host
- s.showInfo = showInfo
var result []string
- var headers []string
+ var header string
var traffic xray.ClientTraffic
var clientTraffics []xray.ClientTraffic
inbounds, err := s.getInboundsBySubId(subId)
if err != nil {
- return nil, nil, err
+ return nil, "", err
}
- s.remarkModel, err = s.settingService.GetRemarkModel()
+
+ s.datepicker, err = s.settingService.GetDatepicker()
if err != nil {
- s.remarkModel = "-ieo"
+ s.datepicker = "gregorian"
}
- s.datepicker, err = s.settingService.GetDatepicker()
- if err != nil {
- s.datepicker = "gregorian"
- }
for _, inbound := range inbounds {
clients, err := s.inboundService.GetClients(inbound)
if err != nil {
- logger.Error("SubService - GetSub: Unable to get clients from inbound")
+ logger.Error("SubService - GetClients: Unable to get clients from inbound")
}
if clients == nil {
continue
}
if len(inbound.Listen) > 0 && inbound.Listen[0] == '@' {
- fallbackMaster, err := s.getFallbackMaster(inbound.Listen)
+ listen, port, streamSettings, err := s.getFallbackMaster(inbound.Listen, inbound.StreamSettings)
if err == nil {
- inbound.Listen = fallbackMaster.Listen
- inbound.Port = fallbackMaster.Port
- var stream map[string]interface{}
- json.Unmarshal([]byte(inbound.StreamSettings), &stream)
- var masterStream map[string]interface{}
- json.Unmarshal([]byte(fallbackMaster.StreamSettings), &masterStream)
- stream["security"] = masterStream["security"]
- stream["tlsSettings"] = masterStream["tlsSettings"]
- stream["externalProxy"] = masterStream["externalProxy"]
- modifiedStream, _ := json.MarshalIndent(stream, "", " ")
- inbound.StreamSettings = string(modifiedStream)
+ inbound.Listen = listen
+ inbound.Port = port
+ inbound.StreamSettings = streamSettings
}
}
for _, client := range clients {
@@ -76,6 +71,8 @@ func (s *SubService) GetSubs(subId string, host string, showInfo bool) ([]string
}
}
}
+
+ // Prepare statistics
for index, clientTraffic := range clientTraffics {
if index == 0 {
traffic.Up = clientTraffic.Up
@@ -97,11 +94,8 @@ func (s *SubService) GetSubs(subId string, host string, showInfo bool) ([]string
}
}
}
- headers = append(headers, fmt.Sprintf("upload=%d; download=%d; total=%d; expire=%d", traffic.Up, traffic.Down, traffic.Total, traffic.ExpiryTime/1000))
- updateInterval, _ := s.settingService.GetSubUpdates()
- headers = append(headers, fmt.Sprintf("%d", updateInterval))
- headers = append(headers, subId)
- return result, headers, nil
+ header = fmt.Sprintf("upload=%d; download=%d; total=%d; expire=%d", traffic.Up, traffic.Down, traffic.Total, traffic.ExpiryTime/1000)
+ return result, header, nil
}
func (s *SubService) getInboundsBySubId(subId string) ([]*model.Inbound, error) {
@@ -130,7 +124,7 @@ func (s *SubService) getClientTraffics(traffics []xray.ClientTraffic, email stri
return xray.ClientTraffic{}
}
-func (s *SubService) getFallbackMaster(dest string) (*model.Inbound, error) {
+func (s *SubService) getFallbackMaster(dest string, streamSettings string) (string, int, string, error) {
db := database.GetDB()
var inbound *model.Inbound
err := db.Model(model.Inbound{}).
@@ -138,9 +132,19 @@ func (s *SubService) getFallbackMaster(dest string) (*model.Inbound, error) {
Where("EXISTS (SELECT * FROM json_each(settings, '$.fallbacks') WHERE json_extract(value, '$.dest') = ?)", dest).
Find(&inbound).Error
if err != nil {
- return nil, err
+ return "", 0, "", err
}
- return inbound, nil
+
+ var stream map[string]interface{}
+ json.Unmarshal([]byte(streamSettings), &stream)
+ var masterStream map[string]interface{}
+ json.Unmarshal([]byte(inbound.StreamSettings), &masterStream)
+ stream["security"] = masterStream["security"]
+ stream["tlsSettings"] = masterStream["tlsSettings"]
+ stream["externalProxy"] = masterStream["externalProxy"]
+ modifiedStream, _ := json.MarshalIndent(stream, "", " ")
+
+ return inbound.Listen, inbound.Port, string(modifiedStream), nil
}
func (s *SubService) getLink(inbound *model.Inbound, email string) string {
@@ -578,6 +582,7 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string
if sniValue, ok := searchKey(tlsSetting, "serverName"); ok {
params["sni"], _ = sniValue.(string)
}
+
tlsSettings, _ := searchKey(tlsSetting, "settings")
if tlsSetting != nil {
if fpValue, ok := searchKey(tlsSettings, "fingerprint"); ok {