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 }