From c3524d04d756b7907ff4b687bccfb6e3b86ee2d9 Mon Sep 17 00:00:00 2001 From: Tindy X <49061470+tindy2013@users.noreply.github.com> Date: Mon, 20 Nov 2023 20:48:29 +0800 Subject: [PATCH] Add support for exporting node list in sing-box format --- src/generator/config/subexport.cpp | 43 +++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/generator/config/subexport.cpp b/src/generator/config/subexport.cpp index 3e43631..bdac7a8 100644 --- a/src/generator/config/subexport.cpp +++ b/src/generator/config/subexport.cpp @@ -2110,12 +2110,15 @@ void proxyToSingBox(std::vector &nodes, rapidjson::Document &json, std::v std::vector nodelist; string_array remarks_list; - auto direct = buildObject(allocator, "type", "direct", "tag", "DIRECT"); - outbounds.PushBack(direct, allocator); - auto reject = buildObject(allocator, "type", "block", "tag", "REJECT"); - outbounds.PushBack(reject, allocator); - auto dns = buildObject(allocator, "type", "dns", "tag", "dns-out"); - outbounds.PushBack(dns, allocator); + if (!ext.nodelist) + { + auto direct = buildObject(allocator, "type", "direct", "tag", "DIRECT"); + outbounds.PushBack(direct, allocator); + auto reject = buildObject(allocator, "type", "block", "tag", "REJECT"); + outbounds.PushBack(reject, allocator); + auto dns = buildObject(allocator, "type", "dns", "tag", "dns-out"); + outbounds.PushBack(dns, allocator); + } for (Proxy &x : nodes) { @@ -2256,6 +2259,13 @@ void proxyToSingBox(std::vector &nodes, rapidjson::Document &json, std::v remarks_list.emplace_back(x.Remark); outbounds.PushBack(proxy, allocator); } + + if (ext.nodelist) + { + json | AddMemberOrReplace("outbounds", outbounds, allocator); + return; + } + for (const ProxyGroupConfig &x: extra_proxy_group) { string_array filtered_nodelist; @@ -2326,14 +2336,27 @@ std::string proxyToSingBox(std::vector &nodes, const std::string &base_co { using namespace rapidjson_ext; rapidjson::Document json; - json.Parse(base_conf.data()); - if(json.HasParseError()) + + if (!ext.nodelist) { - writeLog(0, "sing-box base loader failed with error: " + std::string(rapidjson::GetParseError_En(json.GetParseError())), LOG_LEVEL_ERROR); - return ""; + json.Parse(base_conf.data()); + if (json.HasParseError()) + { + writeLog(0, "sing-box base loader failed with error: " + + std::string(rapidjson::GetParseError_En(json.GetParseError())), LOG_LEVEL_ERROR); + return ""; + } + } + else + { + json.SetObject(); } proxyToSingBox(nodes, json, ruleset_content_array, extra_proxy_group, ext); + + if(ext.nodelist || !ext.enable_rule_generator) + return json | SerializeObject(); + rulesetToSingBox(json, ruleset_content_array, ext.overwrite_original_rules); return json | SerializeObject();