diff options
| author | MHSanaei <ho3ein.sanaei@gmail.com> | 2024-02-21 13:47:52 +0300 |
|---|---|---|
| committer | MHSanaei <ho3ein.sanaei@gmail.com> | 2024-02-21 13:47:52 +0300 |
| commit | 03b7a3479394f54a2e793f23f35e0f2b8a4b4a6a (patch) | |
| tree | 72e4bd1e7201f90bc118b8ee0f2bc86d4718bb97 /sub/subService.go | |
| parent | f3eb4f055db80372298d60c073870a5af1431785 (diff) | |
[sub] json + fragment
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'sub/subService.go')
| -rw-r--r-- | sub/subService.go | 67 |
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 { |
