Skip to content

Commit ae3ee8c

Browse files
committed
Merge branch 'meta'
2 parents b93c1a8 + 9e8977b commit ae3ee8c

File tree

12 files changed

+4022
-348
lines changed

12 files changed

+4022
-348
lines changed

src/generator/config/nodemanip.cpp

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ int addNodes(std::string link, std::vector<Proxy> &allNodes, int groupID, parse_
4141
RegexMatchConfigs &time_rules = *parse_set.time_rules;
4242
string_icase_map *request_headers = parse_set.request_header;
4343
bool &authorized = parse_set.authorized;
44+
string_icase_map custom_headers;
4445

4546
ConfType linkType = ConfType::Unknow;
4647
std::vector<Proxy> nodes;
@@ -142,7 +143,11 @@ int addNodes(std::string link, std::vector<Proxy> &allNodes, int groupID, parse_
142143
writeLog(LOG_TYPE_INFO, "Downloading subscription data...");
143144
if(startsWith(link, "surge:///install-config")) //surge config link
144145
link = urlDecode(getUrlArg(link, "url"));
145-
strSub = webGet(link, proxy, global.cacheSubscription, &extra_headers, request_headers);
146+
if(request_headers)
147+
custom_headers = *request_headers;
148+
if(parse_set.custom_user_agent && !parse_set.custom_user_agent->empty())
149+
custom_headers["User-Agent"] = *parse_set.custom_user_agent;
150+
strSub = webGet(link, proxy, global.cacheSubscription, &extra_headers, &custom_headers);
146151
/*
147152
if(strSub.size() == 0)
148153
{
@@ -426,12 +431,14 @@ std::string removeEmoji(const std::string &orig_remark)
426431
return remark;
427432
}
428433

429-
std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, extra_settings &ext)
434+
std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, extra_settings &ext, const std::string &original_remark)
430435
{
431436
std::string real_rule, ret;
432437

433438
for(const RegexMatchConfig &x : emoji_array)
434439
{
440+
Proxy origNode = node;
441+
origNode.Remark = original_remark;
435442
if(!x.Script.empty() && ext.authorized)
436443
{
437444
std::string result;
@@ -444,9 +451,19 @@ std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, ex
444451
{
445452
ctx.eval(script);
446453
auto getEmoji = (std::function<std::string(const Proxy&)>) ctx.eval("getEmoji");
447-
ret = getEmoji(node);
454+
ret = getEmoji(origNode);
455+
if(ret.empty())
456+
ret = getEmoji(node);
448457
if(!ret.empty())
449-
result = ret + " " + node.Remark;
458+
{
459+
std::string trimmed = trim(node.Remark);
460+
if(trimmed != removeEmoji(trimmed))
461+
result = node.Remark;
462+
else if(startsWith(trimmed, ret) || startsWith(trimmed, ret + " "))
463+
result = node.Remark;
464+
else
465+
result = ret + " " + node.Remark;
466+
}
450467
}
451468
catch (qjs::exception)
452469
{
@@ -459,8 +476,24 @@ std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, ex
459476
}
460477
if(x.Replace.empty())
461478
continue;
479+
if(applyMatcher(x.Match, real_rule, origNode) && real_rule.size() && regFind(original_remark, real_rule))
480+
{
481+
std::string trimmed = trim(node.Remark);
482+
if(trimmed != removeEmoji(trimmed))
483+
return node.Remark;
484+
if(startsWith(trimmed, x.Replace) || startsWith(trimmed, x.Replace + " "))
485+
return node.Remark;
486+
return x.Replace + " " + node.Remark;
487+
}
462488
if(applyMatcher(x.Match, real_rule, node) && real_rule.size() && regFind(node.Remark, real_rule))
489+
{
490+
std::string trimmed = trim(node.Remark);
491+
if(trimmed != removeEmoji(trimmed))
492+
return node.Remark;
493+
if(startsWith(trimmed, x.Replace) || startsWith(trimmed, x.Replace + " "))
494+
return node.Remark;
463495
return x.Replace + " " + node.Remark;
496+
}
464497
}
465498
return node.Remark;
466499
}
@@ -469,13 +502,28 @@ void preprocessNodes(std::vector<Proxy> &nodes, extra_settings &ext)
469502
{
470503
std::for_each(nodes.begin(), nodes.end(), [&ext](Proxy &x)
471504
{
505+
std::string original_remark = x.Remark;
472506
if(ext.remove_emoji)
473507
x.Remark = trim(removeEmoji(x.Remark));
474508

475509
nodeRename(x, ext.rename_array, ext);
476510

477511
if(ext.add_emoji)
478-
x.Remark = addEmoji(x, ext.emoji_array, ext);
512+
{
513+
Proxy tmp = x;
514+
tmp.Remark = x.Remark;
515+
std::string added = addEmoji(tmp, ext.emoji_array, ext, original_remark);
516+
if(added != tmp.Remark)
517+
{
518+
if(added.size() >= tmp.Remark.size() && added.compare(added.size() - tmp.Remark.size(), tmp.Remark.size(), tmp.Remark) == 0)
519+
{
520+
std::string prefix = added.substr(0, added.size() - tmp.Remark.size());
521+
x.Remark = prefix + x.Remark;
522+
}
523+
else
524+
x.Remark = added;
525+
}
526+
}
479527
});
480528

481529
if(ext.sort_flag)

src/generator/config/nodemanip.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct parse_settings
2424
std::string *sub_info = nullptr;
2525
bool authorized = false;
2626
string_icase_map *request_header = nullptr;
27+
std::string *custom_user_agent = nullptr;
2728
#ifndef NO_JS_RUNTIME
2829
qjs::Runtime *js_runtime = nullptr;
2930
qjs::Context *js_context = nullptr;

src/generator/config/ruleconvert.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
/// rule type lists
1212
#define basic_types "DOMAIN", "DOMAIN-SUFFIX", "DOMAIN-KEYWORD", "IP-CIDR", "SRC-IP-CIDR", "GEOIP", "MATCH", "FINAL"
13-
string_array ClashRuleTypes = {basic_types, "IP-CIDR6", "SRC-PORT", "DST-PORT", "PROCESS-NAME"};
13+
string_array ClashRuleTypes = {basic_types, "IP-CIDR6", "SRC-PORT", "DST-PORT", "PROCESS-NAME", "DOMAIN-REGEX", "DOMAIN-WILDCARD", "GEOSITE", "IP-SUFFIX", "IP-ASN", "SRC-GEOIP", "SRC-IP-ASN", "SRC-IP-SUFFIX", "IN-PORT", "IN-TYPE", "IN-USER", "IN-NAME", "PROCESS-PATH-REGEX", "PROCESS-PATH", "PROCESS-NAME-REGEX", "PROCESS-NAME-WILDCARD", "PROCESS-PATH-WILDCARD", "UID", "NETWORK", "DSCP", "SUB-RULE", "RULE-SET", "AND", "OR", "NOT"};
1414
string_array Surge2RuleTypes = {basic_types, "IP-CIDR6", "USER-AGENT", "URL-REGEX", "PROCESS-NAME", "IN-PORT", "DEST-PORT", "SRC-IP"};
1515
string_array SurgeRuleTypes = {basic_types, "IP-CIDR6", "USER-AGENT", "URL-REGEX", "AND", "OR", "NOT", "PROCESS-NAME", "IN-PORT", "DEST-PORT", "SRC-IP"};
1616
string_array QuanXRuleTypes = {basic_types, "USER-AGENT", "HOST", "HOST-SUFFIX", "HOST-KEYWORD"};
@@ -133,6 +133,7 @@ void rulesetToClash(YAML::Node &base_rule, std::vector<RulesetContent> &ruleset_
133133

134134
if(!overwrite_original_rules && base_rule[field_name].IsDefined())
135135
rules = base_rule[field_name];
136+
// const std::string rule_match_regex = "^(.*?,.*?)(,.*)(,.*)$";
136137

137138
std::vector<std::string_view> temp(4);
138139
for(RulesetContent &x : ruleset_content_array)
@@ -152,6 +153,8 @@ void rulesetToClash(YAML::Node &base_rule, std::vector<RulesetContent> &ruleset_
152153
if(startsWith(strLine, "FINAL"))
153154
strLine.replace(0, 5, "MATCH");
154155
strLine = transformRuleToCommon(temp, strLine, rule_group);
156+
// if(!startsWith(strLine, "AND") && !startsWith(strLine, "OR") && !startsWith(strLine, "NOT") && count_least(strLine, ',', 3))
157+
// strLine = regReplace(strLine, rule_match_regex, "$1$3$2");
155158
allRules.emplace_back(strLine);
156159
total_rules++;
157160
continue;
@@ -178,6 +181,8 @@ void rulesetToClash(YAML::Node &base_rule, std::vector<RulesetContent> &ruleset_
178181
strLine = trimWhitespace(strLine);
179182
}
180183
strLine = transformRuleToCommon(temp, strLine, rule_group);
184+
// if(!startsWith(strLine, "AND") && !startsWith(strLine, "OR") && !startsWith(strLine, "NOT") && count_least(strLine, ',', 3))
185+
// strLine = regReplace(strLine, rule_match_regex, "$1$3$2");
181186
allRules.emplace_back(strLine);
182187
}
183188
}
@@ -205,6 +210,8 @@ std::string rulesetToClashStr(YAML::Node &base_rule, std::vector<RulesetContent>
205210
}
206211
base_rule.remove(field_name);
207212

213+
// const std::string rule_match_regex = "^(.*?,.*?)(,.*)(,.*)$";
214+
208215
string_view_array temp(4);
209216
for(RulesetContent &x : ruleset_content_array)
210217
{
@@ -223,6 +230,8 @@ std::string rulesetToClashStr(YAML::Node &base_rule, std::vector<RulesetContent>
223230
if(startsWith(strLine, "FINAL"))
224231
strLine.replace(0, 5, "MATCH");
225232
strLine = transformRuleToCommon(temp, strLine, rule_group);
233+
// if(!startsWith(strLine, "AND") && !startsWith(strLine, "OR") && !startsWith(strLine, "NOT") && count_least(strLine, ',', 3))
234+
// strLine = regReplace(strLine, rule_match_regex, "$1$3$2");
226235
output_content += " - " + strLine + "\n";
227236
total_rules++;
228237
continue;
@@ -248,8 +257,26 @@ std::string rulesetToClashStr(YAML::Node &base_rule, std::vector<RulesetContent>
248257
strLine.erase(strLine.find("//"));
249258
strLine = trimWhitespace(strLine);
250259
}
251-
strLine = transformRuleToCommon(temp, strLine, rule_group);
252-
output_content += " - " + strLine + "\n";
260+
//AND & OR & NOT
261+
if(startsWith(strLine, "AND") || startsWith(strLine, "OR") || startsWith(strLine, "NOT"))
262+
{
263+
output_content += " - " + strLine + "," + rule_group + "\n";
264+
}
265+
//SUB-RULE & RULE-SET
266+
else if(startsWith(strLine, "SUB-RULE") || startsWith(strLine, "RULE-SET"))
267+
{
268+
output_content += " - " + strLine + "\n";
269+
}
270+
else
271+
//OTHER
272+
{
273+
strLine = transformRuleToCommon(temp, strLine, rule_group);
274+
output_content += " - " + strLine + "\n";
275+
}
276+
// strLine = transformRuleToCommon(temp, strLine, rule_group);
277+
// if(!startsWith(strLine, "AND") && !startsWith(strLine, "OR") && !startsWith(strLine, "NOT") && count_least(strLine, ',', 3))
278+
// strLine = regReplace(strLine, rule_match_regex, "$1$3$2");
279+
// output_content += " - " + strLine + "\n";
253280
total_rules++;
254281
}
255282
}

0 commit comments

Comments
 (0)