Download center: copy code, online/offline status; remove client offline mode.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-17 20:09:22 +08:00
parent 09c7ee0188
commit 44c54d6f80
6 changed files with 144 additions and 52 deletions
+46 -31
View File
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
"""首次激活对话框:仅第一次填写中控地址 + 激活码;之后自动读取本地配置。"""
"""首次激活:必须填写中控地址 + 激活码,不允许离线运行。"""
from __future__ import annotations
import tkinter as tk
@@ -24,32 +24,51 @@ def _bring_front(win: tk.Misc) -> None:
def ensure_activated(parent: Optional[tk.Misc] = None) -> bool:
"""
- 已激活(本地有 server + token):直接放行,不再弹窗;中控地址固定复用。
- 未激活:弹出首次激活窗,成功后写入 device.json。
- 已激活:探测中控,成功则放行;失败则提示重试/退出(不允许离线)。
- 未激活:必须激活成功才能进入。
"""
if is_activated():
# 后台轻量探测(失败也不打扰,主界面仍可用,上报会静默失败)
try:
hub_client.ping()
except Exception:
pass
return True
if hub_client.ping():
return True
return _ask_retry_or_exit(parent)
owns_root = False
if parent is not None:
root = parent
else:
root = tk.Tk()
owns_root = True
return _show_activation_form(parent)
def _ask_retry_or_exit(parent: Optional[tk.Misc]) -> bool:
owns = parent is None
root = parent or tk.Tk()
if owns:
root.withdraw()
try:
while True:
_bring_front(root)
retry = messagebox.askretrycancel(
"无法连接中控",
"客户端不允许离线运行。\n请确认中控已启动且本机网络正常后重试。\n\n点「重试」再次连接,点「取消」退出。",
parent=root,
)
if not retry:
return False
if hub_client.ping():
return True
finally:
if owns:
try:
root.destroy()
except Exception:
pass
def _show_activation_form(parent: Optional[tk.Misc]) -> bool:
owns_root = parent is None
root = parent or tk.Tk()
try:
if owns_root:
win = root
else:
win = tk.Toplevel(root)
win = root if owns_root else tk.Toplevel(root)
win.title("首次激活 · 黄金辅助")
win.minsize(520, 420)
win.geometry("520x420")
win.minsize(520, 400)
win.geometry("520x400")
win.resizable(True, True)
result = {"ok": False}
device = load_device()
@@ -62,7 +81,7 @@ def ensure_activated(parent: Optional[tk.Misc] = None) -> bool:
ttk.Label(
body,
text="首次使用:填写中控地址与激活码。激活成功后会保存在本机,以后打开无需再填。",
text="必须激活后才能使用。填写中控地址与激活码,成功后本机保存,以后自动连接。",
wraplength=470,
).pack(anchor="w")
@@ -83,9 +102,8 @@ def ensure_activated(parent: Optional[tk.Misc] = None) -> bool:
status = ttk.Label(body, text="", foreground="#888")
status.pack(anchor="w", pady=(14, 0))
def do_skip():
# 离线:不写 token,下次仍会提示首次激活
result["ok"] = True
def do_exit():
result["ok"] = False
win.destroy()
def do_ok():
@@ -103,20 +121,17 @@ def ensure_activated(parent: Optional[tk.Misc] = None) -> bool:
result["ok"] = True
messagebox.showinfo(
"激活成功",
f"已绑定中控:{server}\n以后打开将自动连接,无需再输入。",
f"已绑定中控:{server}\n以后打开将自动连接。",
parent=win,
)
win.destroy()
except hub_client.HubError as exc:
status.configure(text=str(exc), foreground="#f6465d")
ttk.Button(btn_bar, text="离线使用(下次仍会提示激活)", command=do_skip).pack(
side=tk.LEFT, ipadx=6, ipady=4
)
ttk.Button(btn_bar, text="退出", command=do_exit).pack(side=tk.LEFT, ipadx=8, ipady=4)
ttk.Button(btn_bar, text="确认激活", command=do_ok).pack(side=tk.RIGHT, ipadx=12, ipady=4)
win.bind("<Return>", lambda _e: do_ok())
win.protocol("WM_DELETE_WINDOW", do_skip)
win.protocol("WM_DELETE_WINDOW", do_exit)
_bring_front(win)
try:
win.grab_set()