From 6525bbab1186f3feb56d45e9fac00a30af36ba5d Mon Sep 17 00:00:00 2001 From: DaTekShaman Date: Mon, 5 Jan 2026 16:57:55 +0300 Subject: [PATCH] Update icon for IPv6 and add country detection rules for Belarus and China --- .../scripts/external-proxies-sanitizer.js | 96 ++++++++++--------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/config-sub-converter/scripts/external-proxies-sanitizer.js b/config-sub-converter/scripts/external-proxies-sanitizer.js index cbea649..79812f2 100644 --- a/config-sub-converter/scripts/external-proxies-sanitizer.js +++ b/config-sub-converter/scripts/external-proxies-sanitizer.js @@ -46,7 +46,7 @@ const ICON_RULES = [ { regex: uWordBoundaryGroup("Low Ping"), icon: "⚡️" }, { regex: uWordBoundaryGroup("10 Gbit"), icon: "🛤️" }, { regex: uWordBoundaryGroup("YT|Russia|Россия"), icon: "📺" }, - { regex: uWordBoundaryGroup("IPv6"), icon: "🔷" }, + { regex: uWordBoundaryGroup("IPv6"), icon: "6️⃣" }, { regex: uWordBoundaryGroup("Gemini|AI Studio"), icon: "🤖" }, { regex: uWordBoundaryGroup("Torrent|P2P|P2P-Torrents"), icon: "🧲" } ]; @@ -61,51 +61,53 @@ const NAME_NETWORK_TAGS = [ // 4) Country detection rules by NAME (regex). First match wins (priority = lower is earlier) const COUNTRY_RULES = [ - { regex: uWordBoundaryGroup("(Эстония|EE|EST|ESTONIA|TALLINN)"), iso3: "EST", flag: "🇪🇪", priority: 110 }, - { regex: uWordBoundaryGroup("(Финляндия|FI|FIN|FINLAND|HELSINKI)"), iso3: "FIN", flag: "🇫🇮", priority: 70 }, - { regex: uWordBoundaryGroup("(Япония|JP|JPN|JAPAN|TOKYO|OSAKA)"), iso3: "JPN", flag: "🇯🇵", priority: 210 }, - { regex: /\b(Гонконг|HK|HKG|HONG\s*KONG)\b/i, iso3: "HKG", flag: "🇭🇰", priority: 230 }, // Hong Kong - { regex: /\b(Германия|DE|DEU|GER(MANY)?|FRANKFURT|BERLIN|MUNICH)\b/i, iso3: "DEU", flag: "🇩🇪", priority: 20 }, // Germany - { regex: /\b(Франция|FR|FRA|FRANCE|PARIS|MARSEILLE)\b/i, iso3: "FRA", flag: "🇫🇷", priority: 50 }, // France - { regex: /\b(Нидерланды|NL|NLD|NETHERLANDS|HOLLAND|AMSTERDAM)\b/i, iso3: "NLD", flag: "🇳🇱", priority: 30 }, // Netherlands - { regex: /\b(Норвегия|NO|NOR|NORWAY|OSLO)\b/i, iso3: "NOR", flag: "🇳🇴", priority: 90 }, // Norway - { regex: /\b(Латвия|LV|LVA|LATVIA|RIGA)\b/i, iso3: "LVA", flag: "🇱🇻", priority: 120 }, // Latvia - { regex: /\b(Литва|LT|LTU|LITHUANIA|VILNIUS)\b/i, iso3: "LTU", flag: "🇱🇹", priority: 130 }, // Lithuania - { regex: /\b(Польша|PL|POL|POLAND|WARSAW|WARSZAWA)\b/i, iso3: "POL", flag: "🇵🇱", priority: 60 }, // Poland - { regex: /\b(Сингапур|SG|SGP|SINGAPORE)\b/i, iso3: "SGP", flag: "🇸🇬", priority: 200 }, // Singapore - { regex: /\b(South Korea|Корея|KR|KOR|KOREA|SEOUL)\b/i, iso3: "KOR", flag: "🇰🇷", priority: 220 }, // South Korea - { regex: /\b(Швеция|SE|SWE|SWEDEN|STOCKHOLM)\b/i, iso3: "SWE", flag: "🇸🇪", priority: 80 }, // Sweden - { regex: /\b(Швейцария|CH|CHE|SWITZERLAND|Switzerl)\b/i, iso3: "CHE", flag: "🇨🇭", priority: 100 }, // Switzerland - { regex: /\b(Турция|TR|TUR|TURKEY|ISTANBUL)\b/i, iso3: "TUR", flag: "🇹🇷", priority: 140 }, // Turkey - { regex: /\b(Великобритания|Англия|England|UK|GB|GBR|UNITED\s*KINGDOM)\b/i, iso3: "GBR", flag: "🇬🇧", priority: 40 }, // UK - { regex: /\b(США|USA|US|UNITED\s*STATES|AMERICA|NEW\s*YORK|NYC)\b/i, iso3: "USA", flag: "🇺🇸", priority: 10 }, // USA - { regex: /\b(Аргентина|Argentina|AR|ARG|ARGENTINA|BUENOS\s*AIRES)\b/i, iso3: "ARG", flag: "🇦🇷", priority: 240 }, // Argentina - { regex: /\b(Australia|AU|AUS|AUSTRALIA|SYDNEY)\b/i, iso3: "AUS", flag: "🇦🇺", priority: 250 }, // Australia - { regex: /\b(Austria|AT|AUT|AUSTRIA|VIENNA)\b/i, iso3: "AUT", flag: "🇦🇹", priority: 260 }, // Austria - { regex: /\b(Brazil|BR|BRA|BRAZIL|SAO\s*PAULO)\b/i, iso3: "BRA", flag: "🇧🇷", priority: 270 }, // Brazil - { regex: /\b(Bulgaria|BG|BGR|BULGARIA|SOFIA)\b/i, iso3: "BGR", flag: "🇧🇬", priority: 280 }, // Bulgaria - { regex: /\b(Canada|CA|CAN|CANADA|TORONTO)\b/i, iso3: "CAN", flag: "🇨🇦", priority: 290 }, // Canada - { regex: /\b(Czech\s*Republic|CZ|CZE|CZECH|PRAGUE)\b/i, iso3: "CZE", flag: "🇨🇿", priority: 300 }, // Czech Republic - { regex: /\b(Denmark|DK|DNK|DENMARK|COPENHAGEN)\b/i, iso3: "DNK", flag: "🇩🇰", priority: 310 }, // Denmark - { regex: /\b(Egypt|EG|EGY|EGYPT|CAIRO)\b/i, iso3: "EGY", flag: "🇪🇬", priority: 320 }, // Egypt - { regex: /\b(Georgia|GE|GEO|GEORGIA|TBILISI)\b/i, iso3: "GEO", flag: "🇬🇪", priority: 330 }, // Georgia - { regex: /\b(India|IN|IND|INDIA|MUMBAI)\b/i, iso3: "IND", flag: "🇮🇳", priority: 340 }, // India - { regex: /\b(Ireland|IE|IRL|IRELAND|DUBLIN)\b/i, iso3: "IRL", flag: "🇮🇪", priority: 350 }, // Ireland - { regex: /\b(Israel|IL|ISR|ISRAEL|TEL\s*AVIV)\b/i, iso3: "ISR", flag: "🇮🇱", priority: 360 }, // Israel - { regex: /\b(Italy|IT|ITA|ITALY|ROME)\b/i, iso3: "ITA", flag: "🇮🇹", priority: 370 }, // Italy - { regex: /\b(Kazakhstan|KZ|KAZ|KAZAKHSTAN|ALMATY)\b/i, iso3: "KAZ", flag: "🇰🇿", priority: 380 }, // Kazakhstan - { regex: /\b(Malaysia|MY|MYS|MALAYSIA|KUALA\s*LUMPUR)\b/i, iso3: "MYS", flag: "🇲🇾", priority: 390 }, // Malaysia - { regex: /\b(Moldova|MD|MDA|MOLDOVA|CHISINAU)\b/i, iso3: "MDA", flag: "🇲🇩", priority: 400 }, // Moldova - { regex: /\b(Nigeria|NG|NGA|NIGERIA|LAGOS)\b/i, iso3: "NGA", flag: "🇳🇬", priority: 410 }, // Nigeria - { regex: /\b(Philippines|PH|PHL|PHILIPPINES|MANILA)\b/i, iso3: "PHL", flag: "🇵🇭", priority: 420 }, // Philippines - { regex: /\b(Portugal|PT|PRT|PORTUGAL|LISBON)\b/i, iso3: "PRT", flag: "🇵🇹", priority: 430 }, // Portugal - { regex: /\b(Romania|RO|ROU|ROMANIA|BUCHAREST)\b/i, iso3: "ROU", flag: "🇷🇴", priority: 440 }, // Romania - { regex: /\b(Russia|RU|RUS|RUSSIA|MOSCOW)\b/i, iso3: "RUS", flag: "🇷🇺", priority: 450 }, // Russia - { regex: /\b(Spain|ES|ESP|SPAIN|MADRID)\b/i, iso3: "ESP", flag: "🇪🇸", priority: 460 }, // Spain - { regex: /\b(Taiwan|TW|TWN|TAIWAN|TAIPEI)\b/i, iso3: "TWN", flag: "🇹🇼", priority: 470 }, // Taiwan - { regex: /\b(Thailand|TH|THA|THAILAND|BANGKOK)\b/i, iso3: "THA", flag: "🇹🇭", priority: 480 }, // Thailand - { regex: /\b(UAE|United\s*Arab\s*Emirates|AE|ARE|DUBAI)\b/i, iso3: "ARE", flag: "🇦🇪", priority: 490 }, // UAE - { regex: /\b(Vietnam|VN|VNM|VIETNAM|HANOI)\b/i, iso3: "VNM", flag: "🇻🇳", priority: 500 } // Vietnam + { regex: uWordBoundaryGroup("(Аргентина|Argentina|AR|ARG|ARGENTINA|BUENOS\s*AIRES)"), iso3: "ARG", flag: "🇦🇷", priority: 100 }, // Argentina + { regex: uWordBoundaryGroup("(Australia|AU|AUS|AUSTRALIA|SYDNEY)"), iso3: "AUS", flag: "🇦🇺", priority: 110 }, // Australia + { regex: uWordBoundaryGroup("(Austria|AT|AUT|AUSTRIA|VIENNA)"), iso3: "AUT", flag: "🇦🇹", priority: 120 }, // Austria + { regex: uWordBoundaryGroup("(Беларусь|Белоруссия|BELARUS)"), iso3: "BLR", flag: "🇧🇾", priority: 130 }, // Belarus + { regex: uWordBoundaryGroup("(Brazil|BR|BRA|BRAZIL|SAO\s*PAULO)"), iso3: "BRA", flag: "🇧🇷", priority: 140 }, // Brazil + { regex: uWordBoundaryGroup("(Bulgaria|BG|BGR|BULGARIA|SOFIA)"), iso3: "BGR", flag: "🇧🇬", priority: 150 }, // Bulgaria + { regex: uWordBoundaryGroup("(Canada|CA|CAN|CANADA|TORONTO)"), iso3: "CAN", flag: "🇨🇦", priority: 160 }, // Canada + { regex: uWordBoundaryGroup("(КИТАЙ|China)"), iso3: "CHN", flag: "🇨🇳", priority: 170 }, // China + { regex: uWordBoundaryGroup("(Czech\s*Republic|CZ|CZE|CZECH|PRAGUE)"), iso3: "CZE", flag: "🇨🇿", priority: 180 }, // Czech Republic + { regex: uWordBoundaryGroup("(Denmark|DK|DNK|DENMARK|COPENHAGEN)"), iso3: "DNK", flag: "🇩🇰", priority: 190 }, // Denmark + { regex: uWordBoundaryGroup("(Egypt|EG|EGY|EGYPT|CAIRO)"), iso3: "EGY", flag: "🇪🇬", priority: 200 }, // Egypt + { regex: uWordBoundaryGroup("(Эстония|EE|EST|ESTONIA|TALLINN)"), iso3: "EST", flag: "🇪🇪", priority: 210 }, // Estonia + { regex: uWordBoundaryGroup("(Финляндия|FI|FIN|FINLAND|HELSINKI)"), iso3: "FIN", flag: "🇫🇮", priority: 220 }, // Finland + { regex: uWordBoundaryGroup("(Франция|FR|FRA|FRANCE|PARIS|MARSEILLE)"), iso3: "FRA", flag: "🇫🇷", priority: 230 }, // France + { regex: uWordBoundaryGroup("(Georgia|GE|GEO|GEORGIA|TBILISI)"), iso3: "GEO", flag: "🇬🇪", priority: 240 }, // Georgia + { regex: uWordBoundaryGroup("(Германия|DE|DEU|GER(MANY)?|FRANKFURT|BERLIN|MUNICH)"), iso3: "DEU", flag: "🇩🇪", priority: 250 }, // Germany + { regex: uWordBoundaryGroup("(Гонконг|HK|HKG|HONG\s*KONG)"), iso3: "HKG", flag: "🇭🇰", priority: 260 }, // Hong Kong + { regex: uWordBoundaryGroup("(India|IN|IND|INDIA|MUMBAI)"), iso3: "IND", flag: "🇮🇳", priority: 270 }, // India + { regex: uWordBoundaryGroup("(Ireland|IE|IRL|IRELAND|DUBLIN)"), iso3: "IRL", flag: "🇮🇪", priority: 280 }, // Ireland + { regex: uWordBoundaryGroup("(Israel|IL|ISR|ISRAEL|TEL\s*AVIV)"), iso3: "ISR", flag: "🇮🇱", priority: 290 }, // Israel + { regex: uWordBoundaryGroup("(Italy|IT|ITA|ITALY|ROME)"), iso3: "ITA", flag: "🇮🇹", priority: 300 }, // Italy + { regex: uWordBoundaryGroup("(Япония|JP|JPN|JAPAN|TOKYO|OSAKA)"), iso3: "JPN", flag: "🇯🇵", priority: 310 }, // Japan + { regex: uWordBoundaryGroup("(Kazakhstan|KZ|KAZ|KAZAKHSTAN|ALMATY)"), iso3: "KAZ", flag: "🇰🇿", priority: 320 }, // Kazakhstan + { regex: uWordBoundaryGroup("(Латвия|LV|LVA|LATVIA|RIGA)"), iso3: "LVA", flag: "🇱🇻", priority: 330 }, // Latvia + { regex: uWordBoundaryGroup("(Литва|LT|LTU|LITHUANIA|VILNIUS)"), iso3: "LTU", flag: "🇱🇹", priority: 340 }, // Lithuania + { regex: uWordBoundaryGroup("(Malaysia|MY|MYS|MALAYSIA|KUALA\s*LUMPUR)"), iso3: "MYS", flag: "🇲🇾", priority: 350 }, // Malaysia + { regex: uWordBoundaryGroup("(Moldova|MD|MDA|MOLDOVA|CHISINAU)"), iso3: "MDA", flag: "🇲🇩", priority: 360 }, // Moldova + { regex: uWordBoundaryGroup("(Нидерланды|NL|NLD|NETHERLANDS|HOLLAND|AMSTERDAM)"), iso3: "NLD", flag: "🇳🇱", priority: 370 }, // Netherlands + { regex: uWordBoundaryGroup("(Nigeria|NG|NGA|NIGERIA|LAGOS)"), iso3: "NGA", flag: "🇳🇬", priority: 380 }, // Nigeria + { regex: uWordBoundaryGroup("(Норвегия|NO|NOR|NORWAY|OSLO)"), iso3: "NOR", flag: "🇳🇴", priority: 390 }, // Norway + { regex: uWordBoundaryGroup("(Philippines|PH|PHL|PHILIPPINES|MANILA)"), iso3: "PHL", flag: "🇵🇭", priority: 400 }, // Philippines + { regex: uWordBoundaryGroup("(Польша|PL|POL|POLAND|WARSAW|WARSZAWA)"), iso3: "POL", flag: "🇵🇱", priority: 410 }, // Poland + { regex: uWordBoundaryGroup("(Portugal|PT|PRT|PORTUGAL|LISBON)"), iso3: "PRT", flag: "🇵🇹", priority: 420 }, // Portugal + { regex: uWordBoundaryGroup("(Romania|RO|ROU|ROMANIA|BUCHAREST)"), iso3: "ROU", flag: "🇷🇴", priority: 430 }, // Romania + { regex: uWordBoundaryGroup("(Russia|RU|RUS|RUSSIA|MOSCOW)"), iso3: "RUS", flag: "🇷🇺", priority: 440 }, // Russia + { regex: uWordBoundaryGroup("(Сингапур|SG|SGP|SINGAPORE)"), iso3: "SGP", flag: "🇸🇬", priority: 200 }, // Singapore + { regex: uWordBoundaryGroup("(South Korea|Корея|KR|KOR|KOREA|SEOUL)"), iso3: "KOR", flag: "🇰🇷", priority: 450 }, // South Korea + { regex: uWordBoundaryGroup("(Spain|ES|ESP|SPAIN|MADRID)"), iso3: "ESP", flag: "🇪🇸", priority: 460 }, // Spain + { regex: uWordBoundaryGroup("(Швеция|SE|SWE|SWEDEN|STOCKHOLM)"), iso3: "SWE", flag: "🇸🇪", priority: 470 }, // Sweden + { regex: uWordBoundaryGroup("(Швейцария|CH|CHE|SWITZERLAND|Switzerl)"), iso3: "CHE", flag: "🇨🇭", priority: 480 }, // Switzerland + { regex: uWordBoundaryGroup("(Taiwan|TW|TWN|TAIWAN|TAIPEI)"), iso3: "TWN", flag: "🇹🇼", priority: 490 }, // Taiwan + { regex: uWordBoundaryGroup("(Thailand|TH|THA|THAILAND|BANGKOK)"), iso3: "THA", flag: "🇹🇭", priority: 500 }, // Thailand + { regex: uWordBoundaryGroup("(Турция|TR|TUR|TURKEY|ISTANBUL)"), iso3: "TUR", flag: "🇹🇷", priority: 510 }, // Turkey + { regex: uWordBoundaryGroup("(UAE|United\s*Arab\s*Emirates|AE|ARE|DUBAI)"), iso3: "ARE", flag: "🇦🇪", priority: 520 }, // UAE + { regex: uWordBoundaryGroup("(Великобритания|Англия|England|UK|GB|GBR|UNITED\s*KINGDOM)"), iso3: "GBR", flag: "🇬🇧", priority: 530 }, // UK + { regex: uWordBoundaryGroup("(США|USA|US|UNITED\s*STATES|AMERICA|NEW\s*YORK|NYC)"), iso3: "USA", flag: "🇺🇸", priority: 540 }, // USA + { regex: uWordBoundaryGroup("(Vietnam|VN|VNM|VIETNAM|HANOI)"), iso3: "VNM", flag: "🇻🇳", priority: 500 } // Vietnam ]; // 5) GeoIP mapping (ISO2 -> ISO3 + flag) used only if utils.geoip.lookup(ip) returns ISO2 @@ -307,9 +309,11 @@ function detectCountryByName(name) { if (n.includes("🇦🇹")) return { iso3: "AUT", flag: "🇦🇹", priority: 1, source: "flag" }; if (n.includes("🇦🇺")) return { iso3: "AUS", flag: "🇦🇺", priority: 1, source: "flag" }; if (n.includes("🇧🇬")) return { iso3: "BGR", flag: "🇧🇬", priority: 1, source: "flag" }; + if (n.includes("🇧🇾")) return { iso3: "BLR", flag: "🇧🇾", priority: 1, source: "flag" }; if (n.includes("🇧🇷")) return { iso3: "BRA", flag: "🇧🇷", priority: 1, source: "flag" }; if (n.includes("🇨🇦")) return { iso3: "CAN", flag: "🇨🇦", priority: 1, source: "flag" }; if (n.includes("🇨🇭")) return { iso3: "CHE", flag: "🇨🇭", priority: 1, source: "flag" }; + if (n.includes("🇨🇳")) return { iso3: "CHN", flag: "🇨🇳", priority: 1, source: "flag" }; if (n.includes("🇨🇿")) return { iso3: "CZE", flag: "🇨🇿", priority: 1, source: "flag" }; if (n.includes("🇩🇪")) return { iso3: "DEU", flag: "🇩🇪", priority: 1, source: "flag" }; if (n.includes("🇩🇰")) return { iso3: "DNK", flag: "🇩🇰", priority: 1, source: "flag" };