diff --git a/proxy/tg_ws_proxy.py b/proxy/tg_ws_proxy.py index 1630c7f..51f4987 100644 --- a/proxy/tg_ws_proxy.py +++ b/proxy/tg_ws_proxy.py @@ -474,12 +474,11 @@ async def _run(stop_event: Optional[asyncio.Event] = None): ip_fail_until.clear() _client_tasks.clear() - if proxy_config.fallback_cfproxy: - user = proxy_config.cfproxy_user_domains - if user: - balancer.update_domains_list(user) - else: - start_cfproxy_domain_refresh() + user_cf_domains = proxy_config.cfproxy_user_domains + if user_cf_domains: + balancer.update_domains_list(user_cf_domains) + else: + start_cfproxy_domain_refresh() secret_bytes = bytes.fromhex(proxy_config.secret) @@ -520,7 +519,7 @@ async def _run(stop_event: Optional[asyncio.Event] = None): ip = proxy_config.dc_redirects.get(dc) log.info(" DC%d: %s", dc, ip) if proxy_config.fallback_cfproxy: - user_domain = "user" if proxy_config.cfproxy_user_domains else "auto" + user_domain = ", ".join(proxy_config.cfproxy_user_domains) if proxy_config.cfproxy_user_domains else "auto" log.info(" CF proxy: enabled (%s)", user_domain) if proxy_config.cfproxy_worker_domains: log.info(" CF worker: enabled (%s)", diff --git a/ui/ctk_tray_ui.py b/ui/ctk_tray_ui.py index 0c1f408..86f6f64 100644 --- a/ui/ctk_tray_ui.py +++ b/ui/ctk_tray_ui.py @@ -351,7 +351,9 @@ class TrayConfigFormWidgets: autostart_var: Optional[Any] check_updates_var: Optional[Any] cfproxy_var: Optional[Any] = None + cfproxy_user_domain_enabled_var: Optional[Any] = None cfproxy_user_domain_var: Optional[Any] = None + cfproxy_worker_enabled_var: Optional[Any] = None cfproxy_worker_domain_var: Optional[Any] = None appearance_var: Optional[Any] = None language_var: Optional[Any] = None @@ -591,7 +593,9 @@ def install_tray_config_form( saved_user_domains = coerce_domain_list( cfg.get("cfproxy_user_domain", default_config.get("cfproxy_user_domain", "")) ) - cf_custom_cb_var = ctk.BooleanVar(value=bool(saved_user_domains)) + cf_custom_cb_var = ctk.BooleanVar( + value=cfg.get("cfproxy_user_domain_enabled", bool(saved_user_domains)) + ) cf_custom_cb = _checkbox(ctk, cf_custom_row, theme, t("label.cf_custom_domain"), cf_custom_cb_var) cf_custom_cb.pack(side="left", padx=(0, 10)) attach_ctk_tooltip(cf_custom_cb, t("tip.cfproxy_user_domain_cb")) @@ -615,8 +619,6 @@ def install_tray_config_form( 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() @@ -626,16 +628,25 @@ def install_tray_config_form( cf_worker_row = ctk.CTkFrame(cf_worker_inner, fg_color="transparent") cf_worker_row.pack(fill="x", pady=(0, 4)) cf_worker_lbl = _label(ctk, cf_worker_row, theme, t("label.cfworker_domains"), size=11) - cf_worker_lbl.pack(anchor="w", pady=(0, 2)) + cf_worker_lbl.pack(side="left", anchor="w", pady=(0, 2)) cf_worker_input = ctk.CTkFrame(cf_worker_inner, fg_color="transparent") cf_worker_input.pack(fill="x") - cfproxy_worker_domain_var = ctk.StringVar( - value=", ".join(coerce_domain_list( - cfg.get("cfproxy_worker_domain", default_config.get("cfproxy_worker_domain", "")) - )) + saved_worker_domains = coerce_domain_list( + cfg.get("cfproxy_worker_domain", default_config.get("cfproxy_worker_domain", "")) ) + cfproxy_worker_enabled_var = ctk.BooleanVar( + value=cfg.get("cfproxy_worker_enabled", bool(saved_worker_domains)) + ) + cf_worker_cb = _checkbox( + ctk, cf_worker_input, theme, t("label.cf_custom_domain"), + cfproxy_worker_enabled_var, + ) + cf_worker_cb.pack(side="left", padx=(0, 10)) + attach_ctk_tooltip(cf_worker_cb, t("tip.cfworker_domain")) + + cfproxy_worker_domain_var = ctk.StringVar(value=", ".join(saved_worker_domains)) cf_worker_entry = _entry( ctk, cf_worker_input, theme, var=cfproxy_worker_domain_var, height=32, radius=8, @@ -649,13 +660,16 @@ def install_tray_config_form( btn = _cfworker_test_btn[0] if btn is None: return - enabled = bool(coerce_domain_list(cfproxy_worker_domain_var.get())) + enabled = ( + cfproxy_worker_enabled_var.get() + and bool(coerce_domain_list(cfproxy_worker_domain_var.get())) + ) btn.configure(state="normal" if enabled else "disabled") def _on_cfworker_test(): domains = coerce_domain_list(cfproxy_worker_domain_var.get()) btn = _cfworker_test_btn[0] - if not domains or btn is None: + if not cfproxy_worker_enabled_var.get() or not domains or btn is None: return btn.configure(text=t("button.test_loading"), state="disabled") import threading as _threading @@ -686,16 +700,23 @@ def install_tray_config_form( ).pack(side="right") _cfworker_test_widget = ctk.CTkButton( - cf_worker_input, text=t("button.test"), width=56, height=32, + cf_worker_row, text=t("button.test"), 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_cfworker_test, ) - _cfworker_test_widget.pack(side="right", padx=(0, 6)) + _cfworker_test_widget.pack(side="right") _cfworker_test_btn[0] = _cfworker_test_widget + + def _sync_cfworker_entry(*_): + state = "normal" if cfproxy_worker_enabled_var.get() else "disabled" + cf_worker_entry.configure(state=state) + _sync_cfworker_test_button() + + cfproxy_worker_enabled_var.trace_add("write", _sync_cfworker_entry) cfproxy_worker_domain_var.trace_add("write", _sync_cfworker_test_button) - _sync_cfworker_test_button() + _sync_cfworker_entry() log_inner = _config_section(ctk, frame, theme, t("section.logs")) @@ -780,7 +801,9 @@ def install_tray_config_form( adv_entries=adv_entries, adv_keys=adv_keys, autostart_var=autostart_var, check_updates_var=check_updates_var, cfproxy_var=cfproxy_var, + cfproxy_user_domain_enabled_var=cf_custom_cb_var, cfproxy_user_domain_var=cfproxy_user_domain_var, + cfproxy_worker_enabled_var=cfproxy_worker_enabled_var, cfproxy_worker_domain_var=cfproxy_worker_domain_var, appearance_var=appearance_var, language_var=language_var, @@ -872,8 +895,14 @@ def validate_config_form( new_cfg["check_updates"] = bool(widgets.check_updates_var.get()) if widgets.cfproxy_var is not None: new_cfg["cfproxy"] = bool(widgets.cfproxy_var.get()) + if widgets.cfproxy_user_domain_enabled_var is not None: + new_cfg["cfproxy_user_domain_enabled"] = bool( + widgets.cfproxy_user_domain_enabled_var.get() + ) if widgets.cfproxy_user_domain_var is not None: new_cfg["cfproxy_user_domain"] = coerce_domain_list(widgets.cfproxy_user_domain_var.get()) + if widgets.cfproxy_worker_enabled_var is not None: + new_cfg["cfproxy_worker_enabled"] = bool(widgets.cfproxy_worker_enabled_var.get()) if widgets.cfproxy_worker_domain_var is not None: new_cfg["cfproxy_worker_domain"] = coerce_domain_list(widgets.cfproxy_worker_domain_var.get()) if widgets.appearance_var is not None: diff --git a/utils/default_config.py b/utils/default_config.py index ddebdf0..4a0556f 100644 --- a/utils/default_config.py +++ b/utils/default_config.py @@ -20,7 +20,9 @@ _TRAY_DEFAULTS_COMMON: Dict[str, Any] = { "buf_kb": 256, "pool_size": 4, "cfproxy": True, + "cfproxy_user_domain_enabled": False, "cfproxy_user_domain": [], + "cfproxy_worker_enabled": False, "cfproxy_worker_domain": [], "force_test_dc": False, } diff --git a/utils/tray_common.py b/utils/tray_common.py index c6bf923..995c734 100644 --- a/utils/tray_common.py +++ b/utils/tray_common.py @@ -196,6 +196,14 @@ def load_config() -> dict: try: with open(CONFIG_FILE, "r", encoding="utf-8") as f: data = json.load(f) + if "cfproxy_user_domain_enabled" not in data: + data["cfproxy_user_domain_enabled"] = bool( + coerce_domain_list(data.get("cfproxy_user_domain")) + ) + if "cfproxy_worker_enabled" not in data: + data["cfproxy_worker_enabled"] = bool( + coerce_domain_list(data.get("cfproxy_worker_domain")) + ) for k, v in DEFAULT_CONFIG.items(): data.setdefault(k, v) cfg = data @@ -335,8 +343,22 @@ def apply_proxy_config(cfg: dict) -> bool: pc.buffer_size = max(4, cfg.get("buf_kb", DEFAULT_CONFIG["buf_kb"])) * 1024 pc.pool_size = max(0, cfg.get("pool_size", DEFAULT_CONFIG["pool_size"])) pc.fallback_cfproxy = cfg.get("cfproxy", DEFAULT_CONFIG["cfproxy"]) - pc.cfproxy_user_domains = coerce_domain_list(cfg.get("cfproxy_user_domain", DEFAULT_CONFIG["cfproxy_user_domain"])) - pc.cfproxy_worker_domains = coerce_domain_list(cfg.get("cfproxy_worker_domain", DEFAULT_CONFIG["cfproxy_worker_domain"])) + cfproxy_user_domains = coerce_domain_list( + cfg.get("cfproxy_user_domain", DEFAULT_CONFIG["cfproxy_user_domain"]) + ) + cfproxy_worker_domains = coerce_domain_list( + cfg.get("cfproxy_worker_domain", DEFAULT_CONFIG["cfproxy_worker_domain"]) + ) + pc.cfproxy_user_domains = ( + cfproxy_user_domains + if cfg.get("cfproxy_user_domain_enabled", bool(cfproxy_user_domains)) + else [] + ) + pc.cfproxy_worker_domains = ( + cfproxy_worker_domains + if cfg.get("cfproxy_worker_enabled", bool(cfproxy_worker_domains)) + else [] + ) pc.force_test_dc = cfg.get("force_test_dc", DEFAULT_CONFIG["force_test_dc"]) return True