Skip to content

Commit 9c32da6

Browse files
committed
Merge branch 'meta'
2 parents e20fc80 + dfce7f2 commit 9c32da6

File tree

13 files changed

+3541
-309
lines changed

13 files changed

+3541
-309
lines changed

src/generator/config/nodemanip.cpp

Lines changed: 59 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,13 @@ 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+
{
150+
custom_headers["User-Agent"] = *parse_set.custom_user_agent;
151+
}
152+
strSub = webGet(link, proxy, global.cacheSubscription, &extra_headers, &custom_headers);
146153
/*
147154
if(strSub.size() == 0)
148155
{
@@ -426,12 +433,14 @@ std::string removeEmoji(const std::string &orig_remark)
426433
return remark;
427434
}
428435

429-
std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, extra_settings &ext)
436+
std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, extra_settings &ext, const std::string &original_remark)
430437
{
431438
std::string real_rule, ret;
432439

433440
for(const RegexMatchConfig &x : emoji_array)
434441
{
442+
Proxy origNode = node;
443+
origNode.Remark = original_remark;
435444
if(!x.Script.empty() && ext.authorized)
436445
{
437446
std::string result;
@@ -444,9 +453,21 @@ std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, ex
444453
{
445454
ctx.eval(script);
446455
auto getEmoji = (std::function<std::string(const Proxy&)>) ctx.eval("getEmoji");
447-
ret = getEmoji(node);
456+
ret = getEmoji(origNode);
457+
if(ret.empty())
458+
ret = getEmoji(node);
448459
if(!ret.empty())
449-
result = ret + " " + node.Remark;
460+
{
461+
std::string trimmed = trim(node.Remark);
462+
if(trimmed != removeEmoji(trimmed))
463+
{
464+
result = node.Remark;
465+
}
466+
else if(startsWith(trimmed, ret) || startsWith(trimmed, ret + " "))
467+
result = node.Remark;
468+
else
469+
result = ret + " " + node.Remark;
470+
}
450471
}
451472
catch (qjs::exception)
452473
{
@@ -459,8 +480,24 @@ std::string addEmoji(const Proxy &node, const RegexMatchConfigs &emoji_array, ex
459480
}
460481
if(x.Replace.empty())
461482
continue;
483+
if(applyMatcher(x.Match, real_rule, origNode) && real_rule.size() && regFind(original_remark, real_rule))
484+
{
485+
std::string trimmed = trim(node.Remark);
486+
if(trimmed != removeEmoji(trimmed))
487+
return node.Remark;
488+
if(startsWith(trimmed, x.Replace) || startsWith(trimmed, x.Replace + " "))
489+
return node.Remark;
490+
return x.Replace + " " + node.Remark;
491+
}
462492
if(applyMatcher(x.Match, real_rule, node) && real_rule.size() && regFind(node.Remark, real_rule))
493+
{
494+
std::string trimmed = trim(node.Remark);
495+
if(trimmed != removeEmoji(trimmed))
496+
return node.Remark;
497+
if(startsWith(trimmed, x.Replace) || startsWith(trimmed, x.Replace + " "))
498+
return node.Remark;
463499
return x.Replace + " " + node.Remark;
500+
}
464501
}
465502
return node.Remark;
466503
}
@@ -469,13 +506,30 @@ void preprocessNodes(std::vector<Proxy> &nodes, extra_settings &ext)
469506
{
470507
std::for_each(nodes.begin(), nodes.end(), [&ext](Proxy &x)
471508
{
509+
std::string original_remark = x.Remark;
472510
if(ext.remove_emoji)
473511
x.Remark = trim(removeEmoji(x.Remark));
474512

475513
nodeRename(x, ext.rename_array, ext);
476514

477515
if(ext.add_emoji)
478-
x.Remark = addEmoji(x, ext.emoji_array, ext);
516+
{
517+
Proxy tmp = x;
518+
tmp.Remark = x.Remark;
519+
std::string added = addEmoji(tmp, ext.emoji_array, ext, original_remark);
520+
if(added != tmp.Remark)
521+
{
522+
if(added.size() >= tmp.Remark.size() && added.compare(added.size() - tmp.Remark.size(), tmp.Remark.size(), tmp.Remark) == 0)
523+
{
524+
std::string prefix = added.substr(0, added.size() - tmp.Remark.size());
525+
x.Remark = prefix + x.Remark;
526+
}
527+
else
528+
{
529+
x.Remark = added;
530+
}
531+
}
532+
}
479533
});
480534

481535
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: 31 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", "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", "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,27 @@ 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+
261+
//AND & OR & NOT
262+
if(startsWith(strLine, "AND") || startsWith(strLine, "OR") || startsWith(strLine, "NOT"))
263+
{
264+
output_content += " - " + strLine + "," + rule_group + "\n";
265+
}
266+
//SUB-RULE & RULE-SET
267+
else if(startsWith(strLine, "SUB-RULE") || startsWith(strLine, "RULE-SET"))
268+
{
269+
output_content += " - " + strLine + "\n";
270+
}
271+
else
272+
//OTHER
273+
{
274+
strLine = transformRuleToCommon(temp, strLine, rule_group);
275+
output_content += " - " + strLine + "\n";
276+
}
277+
// strLine = transformRuleToCommon(temp, strLine, rule_group);
278+
// if(!startsWith(strLine, "AND") && !startsWith(strLine, "OR") && !startsWith(strLine, "NOT") && count_least(strLine, ',', 3))
279+
// strLine = regReplace(strLine, rule_match_regex, "$1$3$2");
280+
// output_content += " - " + strLine + "\n";
253281
total_rules++;
254282
}
255283
}

0 commit comments

Comments
 (0)