mirror of
https://github.com/Flowseal/tg-ws-proxy.git
synced 2026-05-22 23:41:44 +03:00
multiple domains handling
This commit is contained in:
@@ -6,8 +6,10 @@ from dataclasses import dataclass
|
||||
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
||||
|
||||
from proxy import __version__, get_link_host, parse_dc_ip_list
|
||||
from proxy.config import CFPROXY_DEFAULT_DOMAINS
|
||||
from utils.update_check import RELEASES_PAGE_URL, get_status
|
||||
|
||||
|
||||
from ui.ctk_theme import (
|
||||
FIRST_RUN_FRAME_PAD,
|
||||
CtkTheme,
|
||||
@@ -57,7 +59,11 @@ _TIP_CFPROXY_PRIORITY = (
|
||||
"Пробовать CF-прокси раньше прямого TCP-подключения"
|
||||
)
|
||||
_TIP_CFPROXY_DOMAIN = (
|
||||
"Домен, проксируемый через Cloudflare, для WS-подключения"
|
||||
"Ваш собственный домен, проксируемый через Cloudflare, для WS-подключения.\n"
|
||||
"Если не указан — выбирается автоматически из поддерживаемых доменов"
|
||||
)
|
||||
_TIP_CFPROXY_USER_DOMAIN_CB = (
|
||||
"Указать свой домен вместо автоматического выбора"
|
||||
)
|
||||
_TIP_SAVE = "Сохранить настройки"
|
||||
_TIP_CANCEL = "Закрыть окно без сохранения изменений"
|
||||
@@ -114,6 +120,16 @@ def _run_cfproxy_connectivity_test(domain: str) -> dict:
|
||||
return results
|
||||
|
||||
|
||||
def _run_cfproxy_auto_test(domains: list) -> tuple:
|
||||
last: dict = {}
|
||||
for domain in domains:
|
||||
res = _run_cfproxy_connectivity_test(domain)
|
||||
last = res
|
||||
if any(v is True for v in res.values()):
|
||||
return domain, res
|
||||
return None, last
|
||||
|
||||
|
||||
def _cfproxy_show_test_results(domain: str, results: dict) -> None:
|
||||
import tkinter as _tk
|
||||
from tkinter import messagebox as _mb
|
||||
@@ -144,6 +160,28 @@ def _cfproxy_show_test_results(domain: str, results: dict) -> None:
|
||||
_mb.showinfo(title, msg, parent=root)
|
||||
root.destroy()
|
||||
|
||||
|
||||
def _cfproxy_show_auto_test_results(ok_domain, results: dict) -> None:
|
||||
import tkinter as _tk
|
||||
from tkinter import messagebox as _mb
|
||||
|
||||
if ok_domain is not None:
|
||||
title = "CF-прокси: доступен"
|
||||
ok = [dc for dc, v in results.items() if v is True]
|
||||
msg = f"\u2713 CF-прокси работает. {len(ok)} из {len(_CFPROXY_TEST_DCS)} серверов доступны."
|
||||
else:
|
||||
title = "CF-прокси: недоступен"
|
||||
msg = "\u2717 Ни один из автоматических CF-доменов не отвечает.\n"
|
||||
msg += "Возможно, блокировка или проблемы с сетью."
|
||||
root = _tk.Tk()
|
||||
root.withdraw()
|
||||
try:
|
||||
root.attributes("-topmost", True)
|
||||
except Exception:
|
||||
pass
|
||||
_mb.showinfo(title, msg, parent=root)
|
||||
root.destroy()
|
||||
|
||||
_INNER_W = 396
|
||||
|
||||
_APPEARANCE_OPTIONS = ["Авто", "Светлая", "Тёмная"]
|
||||
@@ -253,7 +291,7 @@ class TrayConfigFormWidgets:
|
||||
check_updates_var: Optional[Any]
|
||||
cfproxy_var: Optional[Any] = None
|
||||
cfproxy_priority_var: Optional[Any] = None
|
||||
cfproxy_domain_var: Optional[Any] = None
|
||||
cfproxy_user_domain_var: Optional[Any] = None
|
||||
appearance_var: Optional[Any] = None
|
||||
|
||||
|
||||
@@ -363,7 +401,7 @@ def install_tray_config_form(
|
||||
cf_inner = _config_section(ctk, frame, theme, "Cloudflare Proxy")
|
||||
|
||||
cf_row = ctk.CTkFrame(cf_inner, fg_color="transparent")
|
||||
cf_row.pack(fill="x", pady=(0, 6))
|
||||
cf_row.pack(fill="x", pady=(0, 4))
|
||||
|
||||
cfproxy_var = ctk.BooleanVar(
|
||||
value=cfg.get("cfproxy", default_config.get("cfproxy", True))
|
||||
@@ -375,60 +413,76 @@ def install_tray_config_form(
|
||||
cfproxy_priority_var = ctk.BooleanVar(
|
||||
value=cfg.get("cfproxy_priority", default_config.get("cfproxy_priority", True))
|
||||
)
|
||||
cf_prio_cb = _checkbox(ctk, cf_row, theme, "Приоритет CF-прокси", cfproxy_priority_var)
|
||||
cf_prio_cb = _checkbox(ctk, cf_row, theme, "Приоритет", cfproxy_priority_var)
|
||||
cf_prio_cb.pack(side="left")
|
||||
attach_ctk_tooltip(cf_prio_cb, _TIP_CFPROXY_PRIORITY)
|
||||
|
||||
cf_domain_row = ctk.CTkFrame(cf_inner, fg_color="transparent")
|
||||
cf_domain_row.pack(fill="x")
|
||||
|
||||
cf_domain_col, cfproxy_domain_var = _labeled_entry(
|
||||
ctk, cf_domain_row, theme, "Домен",
|
||||
cfg.get("cfproxy_domain", default_config.get("cfproxy_domain", "pclead.co.uk")),
|
||||
tip=_TIP_CFPROXY_DOMAIN, width=160, pack_fill=True,
|
||||
)
|
||||
cf_domain_col.pack(side="left", fill="x", expand=True, padx=(0, 10))
|
||||
|
||||
_cf_test_btn = [None]
|
||||
|
||||
def _on_cf_test():
|
||||
domain = cfproxy_domain_var.get().strip()
|
||||
if not domain:
|
||||
return
|
||||
user_domain = cfproxy_user_domain_var.get().strip() if cf_custom_cb_var.get() else ""
|
||||
btn = _cf_test_btn[0]
|
||||
if btn:
|
||||
btn.configure(text="...", state="disabled")
|
||||
import threading as _threading
|
||||
def _worker():
|
||||
res = _run_cfproxy_connectivity_test(domain)
|
||||
if btn:
|
||||
btn.after(0, lambda: btn.configure(text="Тест", state="normal"))
|
||||
btn.after(0, lambda: _cfproxy_show_test_results(domain, res))
|
||||
_threading.Thread(target=_worker, daemon=True).start()
|
||||
if user_domain:
|
||||
def _worker():
|
||||
res = _run_cfproxy_connectivity_test(user_domain)
|
||||
if btn:
|
||||
btn.after(0, lambda: btn.configure(text="Тест", state="normal"))
|
||||
btn.after(0, lambda: _cfproxy_show_test_results(user_domain, res))
|
||||
_threading.Thread(target=_worker, daemon=True).start()
|
||||
else:
|
||||
def _worker_auto():
|
||||
ok_domain, res = _run_cfproxy_auto_test(CFPROXY_DEFAULT_DOMAINS)
|
||||
if btn:
|
||||
btn.after(0, lambda: btn.configure(text="Тест", state="normal"))
|
||||
btn.after(0, lambda: _cfproxy_show_auto_test_results(ok_domain, res))
|
||||
_threading.Thread(target=_worker_auto, daemon=True).start()
|
||||
|
||||
cf_test_col = ctk.CTkFrame(cf_domain_row, fg_color="transparent")
|
||||
cf_test_col.pack(side="left", anchor="s", padx=(0, 6))
|
||||
ctk.CTkLabel(cf_test_col, text="", font=(theme.ui_font_family, 12)).pack(pady=(0, 2))
|
||||
_cf_test_widget = ctk.CTkButton(
|
||||
cf_test_col, text="Тест", width=56, height=36,
|
||||
font=(theme.ui_font_family, 13), corner_radius=10,
|
||||
cf_row, text="Тест", width=56, height=28,
|
||||
font=(theme.ui_font_family, 13), corner_radius=8,
|
||||
fg_color=theme.tg_blue, hover_color=theme.tg_blue_hover,
|
||||
text_color="#ffffff", border_width=1, border_color=theme.field_border,
|
||||
command=_on_cf_test,
|
||||
)
|
||||
_cf_test_widget.pack()
|
||||
_cf_test_widget.pack(side="right")
|
||||
_cf_test_btn[0] = _cf_test_widget
|
||||
|
||||
cf_help_col = ctk.CTkFrame(cf_domain_row, fg_color="transparent")
|
||||
cf_help_col.pack(side="left", anchor="s")
|
||||
ctk.CTkLabel(cf_help_col, text="", font=(theme.ui_font_family, 12)).pack(pady=(0, 2))
|
||||
cf_custom_row = ctk.CTkFrame(cf_inner, fg_color="transparent")
|
||||
cf_custom_row.pack(fill="x")
|
||||
|
||||
saved_user_domain = cfg.get("cfproxy_user_domain", default_config.get("cfproxy_user_domain", ""))
|
||||
cf_custom_cb_var = ctk.BooleanVar(value=bool(saved_user_domain))
|
||||
cf_custom_cb = _checkbox(ctk, cf_custom_row, theme, "Свой домен", cf_custom_cb_var)
|
||||
cf_custom_cb.pack(side="left", padx=(0, 10))
|
||||
attach_ctk_tooltip(cf_custom_cb, _TIP_CFPROXY_USER_DOMAIN_CB)
|
||||
|
||||
ctk.CTkButton(
|
||||
cf_help_col, text="?", width=36, height=36,
|
||||
font=(theme.ui_font_family, 18), corner_radius=10,
|
||||
cf_custom_row, text="?", width=28, height=32,
|
||||
font=(theme.ui_font_family, 14), corner_radius=8,
|
||||
fg_color=theme.tg_blue, hover_color=theme.tg_blue_hover,
|
||||
text_color="#ffffff", border_width=1, border_color=theme.field_border,
|
||||
command=lambda: webbrowser.open(_CFPROXY_HELP_URL),
|
||||
).pack()
|
||||
).pack(side="right")
|
||||
|
||||
cfproxy_user_domain_var = ctk.StringVar(value=saved_user_domain)
|
||||
cf_domain_entry = _entry(
|
||||
ctk, cf_custom_row, theme, var=cfproxy_user_domain_var,
|
||||
height=32, radius=8,
|
||||
)
|
||||
cf_domain_entry.pack(side="left", fill="x", expand=True, padx=(0, 6))
|
||||
attach_ctk_tooltip(cf_domain_entry, _TIP_CFPROXY_DOMAIN)
|
||||
|
||||
def _sync_domain_entry(*_):
|
||||
state = "normal" if cf_custom_cb_var.get() else "disabled"
|
||||
cf_domain_entry.configure(state=state)
|
||||
if not cf_custom_cb_var.get():
|
||||
cfproxy_user_domain_var.set("")
|
||||
|
||||
cf_custom_cb_var.trace_add("write", _sync_domain_entry)
|
||||
_sync_domain_entry()
|
||||
|
||||
log_inner = _config_section(ctk, frame, theme, "Логи и производительность")
|
||||
|
||||
@@ -520,7 +574,7 @@ def install_tray_config_form(
|
||||
autostart_var=autostart_var, check_updates_var=check_updates_var,
|
||||
cfproxy_var=cfproxy_var,
|
||||
cfproxy_priority_var=cfproxy_priority_var,
|
||||
cfproxy_domain_var=cfproxy_domain_var,
|
||||
cfproxy_user_domain_var=cfproxy_user_domain_var,
|
||||
appearance_var=appearance_var,
|
||||
)
|
||||
|
||||
@@ -602,10 +656,8 @@ def validate_config_form(
|
||||
new_cfg["cfproxy"] = bool(widgets.cfproxy_var.get())
|
||||
if widgets.cfproxy_priority_var is not None:
|
||||
new_cfg["cfproxy_priority"] = bool(widgets.cfproxy_priority_var.get())
|
||||
if widgets.cfproxy_domain_var is not None:
|
||||
domain = widgets.cfproxy_domain_var.get().strip()
|
||||
if domain:
|
||||
new_cfg["cfproxy_domain"] = domain
|
||||
if widgets.cfproxy_user_domain_var is not None:
|
||||
new_cfg["cfproxy_user_domain"] = widgets.cfproxy_user_domain_var.get().strip()
|
||||
if widgets.appearance_var is not None:
|
||||
new_cfg["appearance"] = _APPEARANCE_TO_CFG.get(widgets.appearance_var.get(), "auto")
|
||||
return new_cfg
|
||||
|
||||
Reference in New Issue
Block a user