# -*- coding: utf-8 -*- """修"已配对电脑地址过时" + 版本号升级到 1.5.0。 问题(用户截图): 已配对的电脑显示 DESKTOP-RN5I625 192.168.2.64:8765 但电脑现在的局域网地址早就变了。 经中转连上时,服务器**已经报回了当前地址**(lanIps + port), 但代码没拿它更新已配对记录,于是列表里一直是旧地址。 改法: 经中转成功连上之后,用服务器报的 lanIps[0] + port 更新已配对记录; 服务器没报(比如老版本)就保持原样。 这样"点一下直连"用的永远是刷新过的地址。 """ from __future__ import annotations import re import sys from pathlib import Path ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") MAIN = (ROOT / "android" / "src" / "com" / "lanremote" / "watch" / "MainActivity.java") # ---------- 1. 经中转连上后刷新已配对地址 ---------- OLD = ''' if (success) { store.setLastEndpoint(host, port); if (finalToken != null && !finalToken.isEmpty()) { store.saveDevice(key, finalName == null ? host : finalName, host, port, finalToken); refreshDeviceList(); }''' NEW = ''' if (success) { store.setLastEndpoint(host, port); if (finalToken != null && !finalToken.isEmpty()) { // 经中转连上时,服务器会报回电脑当前的局域网地址。 // 用它更新已配对记录 —— 不然列表里一直显示旧 IP // (用户截图里就是 192.168.2.64,早就变了), // 点"直连"必然失败。 String savedHost = host; int savedPort = port; if (finalFromRelay) { String freshIp = pickAnyLanIp( client.relayLanIps()); int freshPort = client.relayLanPort(); if (freshIp != null && freshPort > 0) { savedHost = freshIp; savedPort = freshPort; appendLog("已更新电脑地址为 " + freshIp + ":" + freshPort); } } store.saveDevice(key, finalName == null ? host : finalName, savedHost, savedPort, finalToken); refreshDeviceList(); }''' # 需要一个 finalFromRelay 变量 FLAG_OLD = ''' final boolean finalLanDirect = usedLan && ok;''' FLAG_NEW = ''' final boolean finalLanDirect = usedLan && ok; // 这次是不是走中转连上的(决定要不要用服务器报的地址刷新记录) final boolean finalFromRelay = !relayUrl().isEmpty() && ok;''' # 加 pickAnyLanIp 辅助方法 HELPER_ANCHOR = ''' private String pickSameSubnet(java.util.List deviceIps) {''' HELPER_NEW = ''' /** 从电脑报来的 IP 里挑一个能用的(不限网段)。 */ private String pickAnyLanIp(java.util.List deviceIps) { if (deviceIps == null) { return null; } for (String ip : deviceIps) { if (ip != null && !ip.trim().isEmpty()) { return ip.trim(); } } return null; } private String pickSameSubnet(java.util.List deviceIps) {''' # ---------- 2. 版本号 1.4.0 -> 1.5.0 ---------- VERSION_FILES = [ ROOT / "android" / "AndroidManifest.xml", ROOT / "windows" / "version_info.txt", ROOT / "windows" / "lanremote" / "version.py", ROOT / "relay" / "relay.py", ROOT / "_build" / "package_remote.py", ROOT / "android" / "res" / "values" / "strings.xml", ] def bump_versions() -> int: changed = 0 for path in VERSION_FILES: if not path.is_file(): continue text = path.read_text(encoding="utf-8") if "1.4.0" not in text and "1.4.1" not in text: continue new = text.replace("1.4.0", "1.5.0").replace("1.4.1", "1.5.0") if new != text: path.write_text(new, encoding="utf-8", newline="\n") print(f" {path.relative_to(ROOT)}: 1.4.0 -> 1.5.0") changed += 1 # 手表端 UA for path in (ROOT / "android" / "src").rglob("*.java"): text = path.read_text(encoding="utf-8") if "LanRemote-Watch/1.4" in text: path.write_text(text.replace("LanRemote-Watch/1.4", "LanRemote-Watch/1.5"), encoding="utf-8", newline="\n") print(f" {path.name}: UA 1.4 -> 1.5") changed += 1 return changed def main() -> int: ok = True text = MAIN.read_text(encoding="utf-8") if "finalFromRelay" in text: print(" 地址刷新逻辑已经加过") else: for old, new, label in ((OLD, NEW, "刷新已配对地址"), (FLAG_OLD, FLAG_NEW, "加 finalFromRelay 标记"), (HELPER_ANCHOR, HELPER_NEW, "加 pickAnyLanIp")): if old in text: text = text.replace(old, new, 1) print(f" {label}") else: print(f" [失败] {label} —— 锚点没找到") ok = False MAIN.write_text(text, encoding="utf-8", newline="\n") print() print(" 版本号升级:") n = bump_versions() print(f" 共改了 {n} 个文件") return 0 if ok else 1 if __name__ == "__main__": sys.exit(main())