links.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 (p *LinkProvider) LinksForInbounds(host string, inbounds []*model.Inbound) []string {
  37. svc := p.build(host)
  38. var out []string
  39. for _, inbound := range inbounds {
  40. out = append(out, svc.inboundLinks(inbound)...)
  41. }
  42. return out
  43. }
  44. func splitLinkLines(raw string) []string {
  45. if raw == "" {
  46. return nil
  47. }
  48. parts := strings.Split(raw, "\n")
  49. out := make([]string, 0, len(parts))
  50. for _, p := range parts {
  51. if p = strings.TrimSpace(p); p != "" {
  52. out = append(out, p)
  53. }
  54. }
  55. return out
  56. }