aboutsummaryrefslogtreecommitdiff
path: root/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs')
-rw-r--r--tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs42
1 files changed, 19 insertions, 23 deletions
diff --git a/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs b/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs
index 451db3e..8a57c9f 100644
--- a/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs
+++ b/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs
@@ -1,9 +1,9 @@
namespace Crupest.SecretTool;
-public class SurgeConfigGenerator(ProxyFile proxyFile, GeoSiteData geoSiteData)
+public class SurgeConfigGenerator(ProxyFile proxyFile, GeoSiteData geoData)
{
- public ProxyFile ProxyFile { get; } = proxyFile;
- public GeoSiteData GeoSiteData { get; } = geoSiteData;
+ public ProxyFile ProxyFile => proxyFile;
+ public GeoSiteData GeoData => geoData;
private static string ToSurgeRuleString(HostMatchKind kind, string value)
{
@@ -19,39 +19,35 @@ public class SurgeConfigGenerator(ProxyFile proxyFile, GeoSiteData geoSiteData)
return $"{ruleType},{value}";
}
- private static List<HostMatchKind> DomainMatcherKinds { get; } = [
- HostMatchKind.DomainFull, HostMatchKind.DomainKeyword,
- HostMatchKind.DomainRegex, HostMatchKind.DomainSuffix,
- ];
+ public static string GenerateSurgeRuleSetString(List<RoutingRuleMatcher> rules)
+ {
+ return string.Join('\n', rules.Select(r => ToSurgeRuleString(r.MatchKind, r.MatchString)));
+ }
public string GenerateChinaRuleSet()
{
- var geoSites = ProxyFile.Config.Items.Where(i => i.Kind == HostMatchKind.GeoSite).Select(i => i.MatchString).ToList();
- var cnRules = GeoSiteData.GetEntriesRecursive(geoSites, DomainMatcherKinds, ["cn"]).ToList();
- return string.Join('\n', cnRules.Select(r => ToSurgeRuleString(r.Kind, r.Value)));
+ return GenerateSurgeRuleSetString(proxyFile.GetChinaRulesByGeoSite(GeoData));
}
public string GenerateGlobalRuleSet()
{
- var geoSites = ProxyFile.Config.Items.Where(i => i.Kind == HostMatchKind.GeoSite).Select(i => i.MatchString).ToList();
- var nonCnRules = GeoSiteData.GetEntriesRecursive(geoSites, DomainMatcherKinds).Where(e => !e.Attributes.Contains("cn")).ToList();
- var domainRules = ProxyFile.Config.Items.Where(i => DomainMatcherKinds.Contains(i.Kind)).ToList();
- return string.Join('\n', [
- ..nonCnRules.Select(r => ToSurgeRuleString(r.Kind, r.Value)),
- ..domainRules.Select(r => ToSurgeRuleString(r.Kind, r.MatchString))
- ]);
+ return GenerateSurgeRuleSetString(proxyFile.GetRulesFlattenGeoSite(geoData, true));
}
- public static SurgeConfigGenerator Create(string proxyFilePath, bool clean, bool silent)
+ public static void GenerateTo(ProxyFile proxyFile, GeoSiteData geoSiteData, string cnPath, string globalPath, bool silent)
{
- var proxyFile = new ProxyFile(proxyFilePath);
- var geoSiteData = GeoDataManager.Instance.GetOrCreateGeoSiteData(clean, silent);
- return new SurgeConfigGenerator(proxyFile, geoSiteData);
+ var generator = new SurgeConfigGenerator(proxyFile, geoSiteData);
+ File.WriteAllText(cnPath, generator.GenerateChinaRuleSet());
+ if (!silent) Console.WriteLine($"China rule set written to {cnPath}.");
+ File.WriteAllText(globalPath, generator.GenerateGlobalRuleSet());
+ if (!silent) Console.WriteLine($"Global rule set written to {globalPath}.");
}
- public static void GenerateTo(string proxyFilePath, string cnPath, string globalPath, bool clean, bool silent)
+ public static void GenerateTo(string directory, string cnPath, string globalPath, bool clean, bool silent)
{
- var generator = Create(proxyFilePath, clean, silent);
+ var geoSiteData = GeoDataManager.Instance.GetOrCreateGeoSiteData(clean, silent);
+ var proxyFile = new ProxyFile(Path.Combine(directory, ToolConfig.ProxyConfigFileName));
+ var generator = new SurgeConfigGenerator(proxyFile, geoSiteData);
File.WriteAllText(cnPath, generator.GenerateChinaRuleSet());
if (!silent) Console.WriteLine($"China rule set written to {cnPath}.");
File.WriteAllText(globalPath, generator.GenerateGlobalRuleSet());