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.cs56
1 files changed, 56 insertions, 0 deletions
diff --git a/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs b/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs
new file mode 100644
index 0000000..8a57c9f
--- /dev/null
+++ b/tools/Crupest.SecretTool/Crupest.SecretTool/SurgeConfigGenerator.cs
@@ -0,0 +1,56 @@
+namespace Crupest.SecretTool;
+
+public class SurgeConfigGenerator(ProxyFile proxyFile, GeoSiteData geoData)
+{
+ public ProxyFile ProxyFile => proxyFile;
+ public GeoSiteData GeoData => geoData;
+
+ private static string ToSurgeRuleString(HostMatchKind kind, string value)
+ {
+ var ruleType = kind switch
+ {
+ HostMatchKind.DomainFull => "DOMAIN",
+ HostMatchKind.DomainSuffix => "DOMAIN-SUFFIX",
+ HostMatchKind.DomainKeyword => "DOMAIN-KEYWORD",
+ HostMatchKind.DomainRegex => "URL-REGEX",
+ _ => throw new Exception("Unacceptable matcher kind for Surge rule.")
+ };
+
+ return $"{ruleType},{value}";
+ }
+
+ public static string GenerateSurgeRuleSetString(List<RoutingRuleMatcher> rules)
+ {
+ return string.Join('\n', rules.Select(r => ToSurgeRuleString(r.MatchKind, r.MatchString)));
+ }
+
+ public string GenerateChinaRuleSet()
+ {
+ return GenerateSurgeRuleSetString(proxyFile.GetChinaRulesByGeoSite(GeoData));
+ }
+
+ public string GenerateGlobalRuleSet()
+ {
+ return GenerateSurgeRuleSetString(proxyFile.GetRulesFlattenGeoSite(geoData, true));
+ }
+
+ public static void GenerateTo(ProxyFile proxyFile, GeoSiteData geoSiteData, string cnPath, string globalPath, bool silent)
+ {
+ 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 directory, string cnPath, string globalPath, bool clean, bool 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());
+ if (!silent) Console.WriteLine($"Global rule set written to {globalPath}.");
+ }
+}