links.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package sub
  2. import (
  3. "strings"
  4. "github.com/mhsanaei/3x-ui/v3/database/model"
  5. "github.com/mhsanaei/3x-ui/v3/web/service"
  6. )
  7. type LinkProvider struct {
  8. settingService service.SettingService
  9. }
  10. func NewLinkProvider() *LinkProvider {
  11. return &LinkProvider{}
  12. }
  13. func (p *LinkProvider) build(host string) *SubService {
  14. showInfo, _ := p.settingService.GetSubShowInfo()
  15. rModel, err := p.settingService.GetRemarkModel()
  16. if err != nil {
  17. rModel = "-ieo"
  18. }
  19. svc := NewSubService(showInfo, rModel)
  20. svc.PrepareForRequest(host)
  21. return svc
  22. }
  23. func (p *LinkProvider) SubLinksForSubId(host, subId string) ([]string, error) {
  24. svc := p.build(host)
  25. links, _, _, err := svc.GetSubs(subId, host)
  26. if err != nil {
  27. return nil, err
  28. }
  29. out := make([]string, 0, len(links))
  30. for _, l := range links {
  31. out = append(out, splitLinkLines(l)...)
  32. }
  33. return out, nil
  34. }
  35. func (p *LinkProvider) LinksForClient(host string, inbound *model.Inbound, email string) []string {
  36. svc := p.build(host)
  37. svc.projectThroughFallbackMaster(inbound)
  38. return splitLinkLines(svc.GetLink(inbound, email))
  39. }
  40. func splitLinkLines(raw string) []string {
  41. if raw == "" {
  42. return nil
  43. }
  44. parts := strings.Split(raw, "\n")
  45. out := make([]string, 0, len(parts))
  46. for _, p := range parts {
  47. if p = strings.TrimSpace(p); p != "" {
  48. out = append(out, p)
  49. }
  50. }
  51. return out
  52. }