From 238ff0532e62827aaab050aff69b7a2bfbe4698f Mon Sep 17 00:00:00 2001
From: itdoginfo <koalav42@gmail.com>
Date: Sun, 9 Feb 2025 00:33:23 +0300
Subject: [PATCH] Added CIDR to srs meta, twitter, discord

---
 convert.py | 102 ++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 77 insertions(+), 25 deletions(-)

diff --git a/convert.py b/convert.py
index 33d0d24..d82bf98 100755
--- a/convert.py
+++ b/convert.py
@@ -19,6 +19,7 @@ uaDomainsOut='Ukraine/inside'
 DiscordSubnets = 'Subnets/IPv4/discord.lst'
 MetaSubnets = 'Subnets/IPv4/meta.lst'
 TwitterSubnets = 'Subnets/IPv4/twitter.lst'
+TelegramSubnets = 'Subnets/IPv4/telegram.lst'
 
 def raw(src, out):
     domains = set()
@@ -215,8 +216,12 @@ def generate_srs_for_categories(directories, output_json_directory='JSON', compi
     os.makedirs(output_json_directory, exist_ok=True)
     os.makedirs(compiled_output_directory, exist_ok=True)
 
+    exclude = {"meta", "twitter", "discord"}
+
     for directory in directories:
         for filename in os.listdir(directory):
+            if any(keyword in filename for keyword in exclude):
+                continue
             file_path = os.path.join(directory, filename)
             
             if os.path.isfile(file_path):
@@ -266,28 +271,14 @@ def generate_srs_subnets(input_file, output_json_directory='JSON', compiled_outp
             subnet = line.strip()
             if subnet:
                 subnets.append(subnet)
-
-    if input_file == "Subnets/IPv4/discord.lst":
-        data = {
-            "version": 2,
-            "rules": [
-                {
-                    "network": ["udp"],
-                    "ip_cidr": subnets,
-                    "port_range": ["50000:65535"]
-                }
-            ]
-        }
-
-    else:
-        data = {
-            "version": 2,
-            "rules": [
-                {
-                    "ip_cidr": subnets
-                }
-            ]
-        }
+    data = {
+        "version": 2,
+        "rules": [
+            {
+                "ip_cidr": subnets
+            }
+        ]
+    }
 
     filename = os.path.splitext(os.path.basename(input_file))[0]
     output_file_path = os.path.join(output_json_directory, f"{filename}_subnets.json")
@@ -306,6 +297,63 @@ def generate_srs_subnets(input_file, output_json_directory='JSON', compiled_outp
     except subprocess.CalledProcessError as e:
         print(f"Compile error {output_file_path}: {e}")
 
+def generate_srs_combined(input_subnets_file, input_domains_file, output_json_directory='JSON', compiled_output_directory='SRS'):
+    os.makedirs(output_json_directory, exist_ok=True)
+    os.makedirs(compiled_output_directory, exist_ok=True)
+
+    domains = []
+    if os.path.exists(input_domains_file):
+        with open(input_domains_file, 'r', encoding='utf-8') as file:
+            domains = [line.strip() for line in file if line.strip()]
+
+    subnets = []
+    if os.path.exists(input_subnets_file):
+        with open(input_subnets_file, 'r', encoding='utf-8') as file:
+            subnets = [line.strip() for line in file if line.strip()]
+
+    if input_subnets_file == "Subnets/IPv4/discord.lst":
+        data = {
+            "version": 2,
+            "rules": [
+                {
+                    "domain_suffix": domains
+                },
+                {
+                    "network": ["udp"],
+                    "ip_cidr": subnets,
+                    "port_range": ["50000:65535"]
+                }
+            ]
+        }
+    else:
+        data = {
+            "version": 2,
+            "rules": [
+                {
+                    "domain_suffix": domains,
+                    "ip_cidr": subnets
+                }
+            ]
+        }
+
+    filename = os.path.splitext(os.path.basename(input_subnets_file))[0]
+    output_file_path = os.path.join(output_json_directory, f"{filename}.json")
+
+    with open(output_file_path, 'w', encoding='utf-8') as output_file:
+        json.dump(data, output_file, indent=4)
+
+    print(f"JSON file generated: {output_file_path}")
+
+    srs_file_path = os.path.join(compiled_output_directory, f"{filename}.srs")
+    try:
+        subprocess.run(
+            ["sing-box", "rule-set", "compile", output_file_path, "-o", srs_file_path], check=True
+        )
+        print(f"Compiled .srs file: {srs_file_path}")
+    except subprocess.CalledProcessError as e:
+        print(f"Compile error {output_file_path}: {e}")
+
+
 def prepare_dat_domains(domains_or_dirs, output_name):
     output_lists_directory = 'geosite_data'
 
@@ -396,9 +444,13 @@ if __name__ == '__main__':
     generate_srs_for_categories(directories)
 
     # Sing-box subnets
-    generate_srs_subnets(DiscordSubnets)
-    generate_srs_subnets(TwitterSubnets)
-    generate_srs_subnets(MetaSubnets)
+    generate_srs_subnets(TelegramSubnets)
+    # generate_srs_subnets(TwitterSubnets)
+    # generate_srs_subnets(MetaSubnets)
+
+    generate_srs_combined(DiscordSubnets, "Services/meta.lst")
+    generate_srs_combined(TwitterSubnets, "Services/twitter.lst")
+    generate_srs_combined(MetaSubnets, "Services/discord.lst")
 
     # Xray domains
     prepare_dat_domains(directories, 'russia-inside')