Update icon for IPv6 and add country detection rules for Belarus and China

This commit is contained in:
2026-01-05 16:57:55 +03:00
parent 0ae3f1100c
commit 6525bbab11

View File

@@ -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" };