links.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package sub
  2. import (
  3. "strings"
  4. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  5. "github.com/mhsanaei/3x-ui/v3/internal/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. remarkTemplate, _ := p.settingService.GetRemarkTemplate()
  15. svc := NewSubService(remarkTemplate)
  16. svc.PrepareForRequest(host)
  17. return svc
  18. }
  19. func (p *LinkProvider) SubLinksForSubId(host, subId string) ([]string, error) {
  20. svc := p.build(host)
  21. links, _, _, _, err := svc.GetSubs(subId, host)
  22. if err != nil {
  23. return nil, err
  24. }
  25. out := make([]string, 0, len(links))
  26. for _, l := range links {
  27. out = append(out, splitLinkLines(l)...)
  28. }
  29. return out, nil
  30. }
  31. func (p *LinkProvider) LinksForClient(host string, inbound *model.Inbound, email string) []string {
  32. svc := p.build(host)
  33. svc.projectThroughFallbackMaster(inbound)
  34. return splitLinkLines(svc.GetLink(inbound, email))
  35. }
  36. func splitLinkLines(raw string) []string {
  37. if raw == "" {
  38. return nil
  39. }
  40. parts := strings.Split(raw, "\n")
  41. out := make([]string, 0, len(parts))
  42. for _, p := range parts {
  43. if p = strings.TrimSpace(p); p != "" {
  44. out = append(out, p)
  45. }
  46. }
  47. return out
  48. }