fix: resolve Discord Cloudflare voice ports #55, smart detect proxy sections #56, and UI enhancements

This commit is contained in:
Dushnilin
2026-09-15 19:15:57 +03:00
parent 046902d4e9
commit 6978601d4d
20 changed files with 385 additions and 100 deletions
+1 -1
View File
@@ -1361,7 +1361,7 @@ const dictionary = {
"Auto (cooperative with SQM/CAKE)": "Авто (кооперация с SQM/CAKE)",
"QoS Priority Engine (DSCP)": "Движок приоритета QoS (DSCP)",
"Strategy applied successfully and service reloaded!": "Стратегия успешно применена, сервис перезапущен!",
"Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19302, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct.": "Подсеть %s — диапазон Cloudflare Anycast, используемый Discord Voice. Только голосовой UDP-трафик (порты 50000-65535, 3478, 19302, 5000-5020) направляется через этот раздел; веб-трафик (TCP 80/443) идет напрямую.",
"Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19294-19344, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct.": "Подсеть %s — диапазон Cloudflare Anycast, используемый Discord Voice. Только голосовой UDP-трафик (порты 50000-65535, 3478, 19294-19344, 5000-5020) направляется через этот раздел; веб-трафик (TCP 80/443) идет напрямую.",
"Add URLs or local paths to .lst / .txt lists containing domains and subnets.": "Добавьте URL или локальные пути к спискам .lst / .txt, содержащим домены и подсети.",
"Add URLs or local paths to .lst / .txt lists containing domains. IP entries are ignored.": "Добавьте URL или локальные пути к спискам .lst / .txt, содержащим домены. IP-записи игнорируются.",
};
+2 -2
View File
@@ -12644,8 +12644,8 @@
]
},
{
"call": "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19302, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct.",
"key": "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19302, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct.",
"call": "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19294-19344, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct.",
"key": "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19294-19344, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct.",
"places": [
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:11896"
]
+3 -3
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-15 12:05+0300\n"
"PO-Revision-Date: 2026-09-15 12:05+0300\n"
"POT-Creation-Date: 2026-09-15 12:34+0300\n"
"PO-Revision-Date: 2026-09-15 12:34+0300\n"
"Last-Translator: Dushnilin <dushnilin@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -7810,7 +7810,7 @@ msgid "Subnet %s belongs to a shared Anycast/CDN range (%s). Third-party website
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:11896
msgid "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19302, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct."
msgid "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19294-19344, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:11387
+4 -4
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-15 15:05+0300\n"
"PO-Revision-Date: 2026-09-15 15:05+0300\n"
"POT-Creation-Date: 2026-09-15 15:34+0300\n"
"PO-Revision-Date: 2026-09-15 15:34+0300\n"
"Last-Translator: Dushnilin\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -4868,8 +4868,8 @@ msgstr "STUN (P2P-звонки)"
msgid "Subnet %s belongs to a shared Anycast/CDN range (%s). Third-party websites hosted on this CDN will also be routed through this section."
msgstr "Подсеть %s входит в публичный Anycast/CDN-диапазон (%s). Сторонние сайты, размещенные на этом CDN, также будут направляться через эту секцию."
msgid "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19302, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct."
msgstr "Подсеть %s — диапазон Cloudflare Anycast, используемый Discord Voice. Только голосовой UDP-трафик (порты 50000-65535, 3478, 19302, 5000-5020) направляется через этот раздел; веб-трафик (TCP 80/443) идет напрямую."
msgid "Subnet %s is a Cloudflare Anycast range used by Discord Voice. Only UDP voice traffic (ports 50000-65535, 3478, 19294-19344, 5000-5020) is routed through this section; web traffic (TCP 80/443) goes direct."
msgstr "Подсеть %s — диапазон Cloudflare Anycast, используемый Discord Voice. Только голосовой UDP-трафик (порты 50000-65535, 3478, 19294-19344, 5000-5020) направляется через этот раздел; веб-трафик (TCP 80/443) идет напрямую."
msgid "Subnet %s is a shared Anycast/CDN range (%s). Third-party websites hosted on this CDN will also be routed through this section."
msgstr "Подсеть %s является публичным Anycast/CDN-диапазоном (%s). Сторонние сайты, размещенные на этом CDN, также будут направляться через эту секцию."
@@ -125,7 +125,7 @@ interface ComponentActionButton {
interface ComponentCard {
component: Tachyon.ComponentName;
column: 0 | 1;
column: 0 | 1 | 2;
title: string;
version: string;
latestVersion?: string;
@@ -1545,7 +1545,7 @@ function getComponentCards(): ComponentCard[] {
},
{
component: 'wdtt',
column: 1,
column: 2,
title: 'WDTT',
version: systemInfoLoading
? _('Loading...')
@@ -1560,7 +1560,7 @@ function getComponentCards(): ComponentCard[] {
},
{
component: 'olcrtc',
column: 1,
column: 2,
title: 'OlcRTC',
version: systemInfoLoading
? _('Loading...')
@@ -1575,7 +1575,7 @@ function getComponentCards(): ComponentCard[] {
},
{
component: 'fptn',
column: 1,
column: 2,
title: 'FPTN',
version: systemInfoLoading
? _('Loading...')
@@ -1590,7 +1590,7 @@ function getComponentCards(): ComponentCard[] {
},
{
component: 'tailscale',
column: 1,
column: 2,
title: 'Tailscale',
version: systemInfoLoading
? _('Loading...')
@@ -2036,22 +2036,19 @@ function renderUpdatesComponents() {
return;
}
const columns = [[], []] as Node[][];
const columns: Node[][] = [[], [], []];
getComponentCards().forEach((card) => {
columns[card.column].push(renderComponentCard(card));
columns[card.column]?.push(renderComponentCard(card));
});
return preserveScrollForPage(() => {
container.replaceChildren(
E(
'div',
{ class: 'tachyon_updates-page__components-column' },
columns[0],
),
E(
'div',
{ class: 'tachyon_updates-page__components-column' },
columns[1],
...columns.map((columnNodes) =>
E(
'div',
{ class: 'tachyon_updates-page__components-column' },
columnNodes,
),
),
);
});
@@ -24,10 +24,10 @@ export const styles = `
.tachyon_updates-page__components-column {
display: flex;
flex: 1 1 auto;
flex: 1 1 0;
flex-direction: column;
gap: 10px;
min-width: max-content;
min-width: 280px;
}
@media (max-width: 760px) {
@@ -172,7 +172,7 @@ export const styles = `
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: nowrap;
flex-wrap: wrap;
gap: 6px;
}
@@ -191,7 +191,7 @@ export const styles = `
.tachyon_updates-page__component__variants-buttons {
display: flex;
flex-wrap: nowrap;
flex-wrap: wrap;
gap: 6px;
}