100 lines
2.8 KiB
Go
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
|
|
}
|