1
0

links.go 1.7 KB

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