75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package sub
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
|
|
"github.com/alireza0/s-ui/logger"
|
|
"github.com/alireza0/s-ui/util"
|
|
)
|
|
|
|
type Link struct {
|
|
Type string `json:"type"`
|
|
Remark string `json:"remark"`
|
|
Uri string `json:"uri"`
|
|
}
|
|
|
|
type LinkService struct {
|
|
}
|
|
|
|
func (s *LinkService) GetLinks(linkJson *json.RawMessage, types string, clientInfo string) []string {
|
|
links := []Link{}
|
|
var result []string
|
|
err := json.Unmarshal(*linkJson, &links)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
for _, link := range links {
|
|
switch link.Type {
|
|
case "external":
|
|
result = append(result, link.Uri)
|
|
case "sub":
|
|
subLinks := util.GetExternalLink(link.Uri)
|
|
result = append(result, strings.Split(subLinks, "\n")...)
|
|
case "local":
|
|
if types == "all" {
|
|
result = append(result, s.addClientInfo(link.Uri, clientInfo))
|
|
}
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
func (s *LinkService) addClientInfo(uri string, clientInfo string) string {
|
|
if len(clientInfo) == 0 {
|
|
return uri
|
|
}
|
|
protocol := strings.Split(uri, "://")
|
|
if len(protocol) < 2 {
|
|
return uri
|
|
}
|
|
switch protocol[0] {
|
|
case "vmess":
|
|
var vmessJson map[string]interface{}
|
|
config, err := util.B64StrToByte(protocol[1])
|
|
if err != nil {
|
|
logger.Warning("sub: Error decoding vmess content:", err)
|
|
return uri
|
|
}
|
|
err = json.Unmarshal(config, &vmessJson)
|
|
if err != nil {
|
|
logger.Warning("sub: Error decoding vmess content:", err)
|
|
return uri
|
|
}
|
|
vmessJson["ps"] = vmessJson["ps"].(string) + clientInfo
|
|
result, err := json.MarshalIndent(vmessJson, "", " ")
|
|
if err != nil {
|
|
logger.Warning("sub: Error decoding vmess + clientInfo content:", err)
|
|
return uri
|
|
}
|
|
return "vmess://" + util.ByteToB64Str(result)
|
|
default:
|
|
return uri + clientInfo
|
|
}
|
|
}
|