Files

100 lines
2.8 KiB
Go

package render
import (
"github.com/peterqiu0516/sub-store/internal/model"
)
// RenderLoonProxies renders proxies as Loon text lines.
func RenderLoonProxies(proxies []model.ProxyNode) (string, error) {
return RenderTextProxyList(proxies, model.TargetLoon, func(p model.ProxyNode) string {
return ToLoonProxyLine(p)
})
}
// ToLoonProxyLine converts a single proxy node to a Loon proxy line.
// Returns "" for unsupported proxy types.
func ToLoonProxyLine(proxy model.ProxyNode) string {
name := SanitizeTextProxyName(getString(proxy, "name"))
ptype := getString(proxy, "type")
server := getString(proxy, "server")
port := getInt(proxy, "port")
entries := CommonTextOptions(proxy)
switch ptype {
case "ss":
entries = AppendPluginOptions(entries, proxy, "loon")
return JoinTextProxy(
name+"=shadowsocks,"+server+","+itoa(port)+","+strOr(proxy, "cipher", "none")+","+QuoteTextValue(proxy["password"]),
entries,
)
case "ssr":
return JoinTextProxy(
name+"=shadowsocksr,"+server+","+itoa(port)+","+strOr(proxy, "cipher", "aes-256-cfb")+","+QuoteTextValue(proxy["password"])+","+strOr(proxy, "protocol", "origin")+","+strOr(proxy, "obfs", "plain"),
entries,
)
case "vmess", "vless":
entries = unshift(entries,
[2]any{"transport", networkOr(proxy, "tcp")},
[2]any{"over-tls", proxy["tls"]},
[2]any{"sni", proxy["servername"]},
[2]any{"flow", proxy["flow"]},
)
entries = AppendWsOptions(entries, proxy, "loon")
entries = AppendRealityOptions(entries, proxy)
method := strOr(proxy, "cipher", "auto")
if ptype == "vless" {
method = "none"
}
return JoinTextProxy(
name+"="+ptype+","+server+","+itoa(port)+","+method+","+QuoteTextValue(proxy["uuid"]),
entries,
)
case "trojan", "anytls":
entries = unshift(entries,
[2]any{"sni", sniOr(proxy, "sni", "servername")},
)
entries = AppendRealityOptions(entries, proxy)
return JoinTextProxy(
name+"="+ptype+","+server+","+itoa(port)+","+QuoteTextValue(proxy["password"]),
entries,
)
case "http", "socks5":
entries = unshift(entries,
[2]any{"username", proxy["username"]},
[2]any{"password", proxy["password"]},
[2]any{"over-tls", proxy["tls"]},
[2]any{"sni", sniOr(proxy, "sni", "servername")},
)
loonType := ptype
if ptype == "socks5" {
loonType = "socks5"
}
return JoinTextProxy(name+"="+loonType+","+server+","+itoa(port), entries)
case "hysteria2":
entries = unshift(entries,
[2]any{"tls-name", proxy["sni"]},
[2]any{"obfs", proxy["obfs"]},
[2]any{"obfs-password", proxy["obfs-password"]},
)
return JoinTextProxy(
name+"=Hysteria2,"+server+","+itoa(port)+","+QuoteTextValue(proxy["password"]),
entries,
)
}
return ""
}
func networkOr(proxy model.ProxyNode, def string) string {
s := getString(proxy, "network")
if s == "" {
return def
}
return s
}