diff --git a/tooldelta/cfg.py b/tooldelta/cfg.py index 1877277..fcc1e9c 100755 --- a/tooldelta/cfg.py +++ b/tooldelta/cfg.py @@ -3,8 +3,7 @@ import os import json from typing import Any -import requests -from .color_print import Print + NoneType = type(None) PLUGINCFG_DEFAULT = {"配置版本": "0.0.1", "配置项": None} @@ -151,35 +150,6 @@ def get_cfg(self, path: str, standard_type: Any): self.check_dict(standard_type, obj) return obj - def geturl(self): - """自动选择最佳镜像地址""" - if self.url: - return self.url - url_list = ["https://github.dqyt.online"] - try: - if not Cfg().get_cfg( - "ToolDelta基本配置.json", {"是否使用github镜像": bool} - )["是否使用github镜像"]: - self.url = "https://raw.githubusercontent.com" - return self.url - if url := Cfg().get_cfg( - "ToolDelta基本配置.json", {"插件市场源": str} - )["插件市场源"]: - self.url = f"{url}/https://raw.githubusercontent.com" - return self.url - except: # noqa: E722 - Print.clean_print("§c未发现配置文件,将选择内置镜像地址") - for url in url_list: - try: - response = requests.get(url) - if response.status_code == 200: - self.url = f"{url}/https://raw.githubusercontent.com" - return self.url - except requests.RequestException: - continue - self.url = "https://github.dqyt.online/https://raw.githubusercontent.com" - return self.url - @staticmethod def default_cfg(path: str, default: dict, force: bool = False) -> None: """生成默认配置文件 diff --git a/tooldelta/constants.py b/tooldelta/constants.py index 02ad735..89b8e84 100644 --- a/tooldelta/constants.py +++ b/tooldelta/constants.py @@ -14,15 +14,15 @@ LAUNCH_CFG: dict = { "启动器启动模式(请不要手动更改此项, 改为0可重置)": 0, "是否记录日志": True, - "是否使用github镜像": True, - "插件市场源": '', + "全局GitHub镜像": "", + "插件市场源": "", } "默认登录配置" LAUNCH_CFG_STD: dict = { "启动器启动模式(请不要手动更改此项, 改为0可重置)": int, "是否记录日志": bool, - "是否使用github镜像": bool, + "全局GitHub镜像": str, "插件市场源": str, } "默认登录配置标准验证格式" @@ -105,6 +105,8 @@ ) "ToolDelta镜像: github项目仓库" +PLUGIN_MARKET_SOURCE_OFFICIAL = "https://ghp.ci/https://ToolDelta-Basic/PluginMarket" + class SysStatus: """系统状态码 diff --git a/tooldelta/frame.py b/tooldelta/frame.py index d51fd01..438f89b 100755 --- a/tooldelta/frame.py +++ b/tooldelta/frame.py @@ -18,7 +18,7 @@ import json from typing import TYPE_CHECKING, Callable # noqa: UP035 -from . import auths, constants, plugin_market, game_utils, utils +from . import auths, constants, plugin_market, game_utils, utils, urlmethod from .cfg import Config from .color_print import Print from .constants import PacketIDS, SysStatus @@ -94,7 +94,6 @@ def __init__(self) -> None: lambda name, _, err: Print.print_err(f"插件 <{name}> 出现问题:\n{err}") ) self.launcher: LAUNCHERS - self.is_mir: bool self.plugin_market_url: str self.link_game_ctrl: "GameCtrl" self.link_plugin_group: "PluginGroup" @@ -106,7 +105,6 @@ def load_tooldelta_cfg(self) -> None: # 读取配置文件 cfgs = Config.get_cfg("ToolDelta基本配置.json", constants.LAUNCH_CFG_STD) self.launchMode = cfgs["启动器启动模式(请不要手动更改此项, 改为0可重置)"] - self.is_mir = cfgs["是否使用github镜像"] self.plugin_market_url = cfgs["插件市场源"] publicLogger.switch_logger(cfgs["是否记录日志"]) if self.launchMode != 0 and self.launchMode not in range( @@ -123,6 +121,16 @@ def load_tooldelta_cfg(self) -> None: else: Print.print_err(f"ToolDelta 基本配置有误,需要更正:{err}") raise SystemExit from err + # 配置全局 GitHub 镜像 URL + if cfgs["全局GitHub镜像"] == "": + cfgs["全局GitHub镜像"] = urlmethod.get_fastest_github_mirror() + if cfgs["插件市场源"] == "": + cfgs["插件市场源"] = ( + cfgs["全局GitHub镜像"] + + "/https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/main" + ) + Config.default_cfg("ToolDelta基本配置.json", cfgs, True) + urlmethod.set_global_github_src_url(cfgs["全局GitHub镜像"]) # 每个启动器框架的单独启动配置之前 if self.launchMode == 0: Print.print_inf("请选择启动器启动模式 (之后可在 ToolDelta 启动配置更改):") @@ -306,7 +314,7 @@ def change_config(): "NeOmega 框架 (NeOmega 模式,租赁服适应性强,推荐)", "NeOmega 框架 (NeOmega 连接模式,需要先启动对应的 neOmega 接入点)", "混合启动模式 (同一个机器人同时启动 ToolDelta 和 NeOmega)", - "Eulogist 框架 (赞颂者和 ToolDelta 并行运行)" + "Eulogist 框架 (赞颂者和 ToolDelta 并行运行)", ) Print.clean_print("§b现有配置项如下:") Print.clean_print( @@ -361,14 +369,6 @@ def upgrade_cfg() -> bool: old_cfg: dict = Config.get_cfg("ToolDelta基本配置.json", {}) old_cfg_keys = old_cfg.keys() need_upgrade_cfg = False - if "NeOmega接入点启动模式" in old_cfg: - if isinstance(old_cfg["NeOmega接入点启动模式"]["密码"], int): - old_cfg["NeOmega接入点启动模式"]["密码"] = str( - old_cfg["NeOmega接入点启动模式"]["密码"] - ) - if old_cfg["NeOmega接入点启动模式"]["密码"] == "0": - old_cfg["NeOmega接入点启动模式"]["密码"] = "" - need_upgrade_cfg = True for k, v in constants.LAUNCH_CFG.items(): if k not in old_cfg_keys: old_cfg[k] = v @@ -778,7 +778,9 @@ def packet_handler(self, pkt_type: int, pkt: dict) -> None: pkt_type (int): 数据包类型 pkt (dict): 数据包内容 """ - is_skiped = self.linked_frame.link_plugin_group.processPacketFunc(pkt_type, pkt, self.linked_frame.on_plugin_err) + is_skiped = self.linked_frame.link_plugin_group.processPacketFunc( + pkt_type, pkt, self.linked_frame.on_plugin_err + ) if is_skiped: return if pkt_type == PacketIDS.IDPlayerList: diff --git a/tooldelta/neo_libs/file_download.py b/tooldelta/neo_libs/file_download.py index 7d819da..d03675d 100644 --- a/tooldelta/neo_libs/file_download.py +++ b/tooldelta/neo_libs/file_download.py @@ -6,9 +6,9 @@ import requests from tooldelta import urlmethod -from tooldelta.cfg import Config from tooldelta.color_print import Print from tooldelta.sys_args import sys_args_to_dict +from tooldelta.urlmethod import get_global_github_src_url def download_libs() -> bool: @@ -16,12 +16,16 @@ def download_libs() -> bool: if "no-download-libs" in sys_args_to_dict(): Print.print_war("将不会进行依赖库的下载和检测更新。") return True - mirror_src, depen_url = get_github_content_url(Config.geturl()) + mirror_src, depen_url = get_github_content_url( + get_global_github_src_url() + "/https://raw.githubusercontent.com" + ) require_depen = get_required_dependencies(mirror_src)[0] sys_info_fmt = get_system_info() source_dict = require_depen.get(sys_info_fmt) if source_dict is None: - raise ValueError(f"未知的系统架构版本: {sys_info_fmt} (目前支持: {', '.join(require_depen.keys())})") + raise ValueError( + f"未知的系统架构版本: {sys_info_fmt} (目前支持: {', '.join(require_depen.keys())})" + ) commit_remote = get_remote_commit(depen_url) commit_file_path = os.path.join(os.getcwd(), "tooldelta", "neo_libs", "commit") replace_file = check_commit_file(commit_file_path, commit_remote) @@ -41,7 +45,9 @@ def download_neomg() -> bool: Print.print_war("将不会进行NeOmega的下载和检测更新。") return True download_libs() - mirror_src, _ = get_github_content_url(Config.geturl()) + mirror_src, _ = get_github_content_url( + get_global_github_src_url() + "/https://raw.githubusercontent.com" + ) require_depen = get_required_dependencies(mirror_src)[1] sys_info_fmt = get_system_info() source_dict = require_depen[sys_info_fmt][0] @@ -86,14 +92,8 @@ def download_neomg() -> bool: def get_github_content_url(url) -> tuple[str, str]: - mirror_src = ( - url - + "/ToolDelta-Basic/ToolDelta/main" - ) - depen_url = ( - url - + "/ToolDelta-Basic/DependencyLibrary/main" - ) + mirror_src = url + "/ToolDelta-Basic/ToolDelta/main" + depen_url = url + "/ToolDelta-Basic/DependencyLibrary/main" return mirror_src, depen_url @@ -106,7 +106,7 @@ def get_required_dependencies(mirror_src: str) -> tuple[dict, dict]: resp2.raise_for_status() require_neomega = resp2.json() except Exception as err: - Print.print_err(f"获取依赖库表出现问题:{err} (链接:{mirror_src})") + Print.print_err(f"获取依赖库表出现问题:{err} (镜像: {mirror_src})") raise return require_depen, require_neomega diff --git a/tooldelta/plugin_market.py b/tooldelta/plugin_market.py index 5c73ac4..decdc7f 100755 --- a/tooldelta/plugin_market.py +++ b/tooldelta/plugin_market.py @@ -18,6 +18,7 @@ TOOLDELTA_INJECTED_PLUGIN, TOOLDELTA_PLUGIN_CFG_DIR, TOOLDELTA_PLUGIN_DATA_DIR, + PLUGIN_MARKET_SOURCE_OFFICIAL ) from .plugin_load import PluginRegData, PluginsPackage from .utils import Utils @@ -79,13 +80,13 @@ class PluginMarket: def __init__(self): self._plugin_id_name_map: dict | None = None - self.plugins_download_url = f"{Cfg().geturl()}/ToolDelta-Basic/PluginMarket/main" - # try: - # self.plugins_download_url = Cfg().get_cfg( - # "ToolDelta基本配置.json", {"插件市场源": str} - # )["插件市场源"] - # except Exception: - # self.plugins_download_url = PLUGIN_MARKET_SOURCE_OFFICIAL + #self.plugins_download_url = f"{Cfg().geturl()}/ToolDelta-Basic/PluginMarket/main" + try: + self.plugins_download_url = Cfg().get_cfg( + "ToolDelta基本配置.json", {"插件市场源": str} + )["插件市场源"] + except Exception: + self.plugins_download_url = PLUGIN_MARKET_SOURCE_OFFICIAL def enter_plugin_market(self, source_url: str | None = None, in_game=False) -> None: """ @@ -95,6 +96,8 @@ def enter_plugin_market(self, source_url: str | None = None, in_game=False) -> N source_url (str | None, optional): 插件市场源 in_game (bool, optional): 是否在游戏内调用的插件市场命令 """ + if source_url: + self.plugins_download_url = source_url Print.clean_print("§6正在连接到插件市场..") CONTENT_LENGTH = 12 diff --git a/tooldelta/urlmethod.py b/tooldelta/urlmethod.py index 696c835..a13e08e 100755 --- a/tooldelta/urlmethod.py +++ b/tooldelta/urlmethod.py @@ -19,16 +19,56 @@ from .color_print import Print from .get_tool_delta_version import get_tool_delta_version -# 使用方法 mirror_github[value: int].format(url: str) -mirror_github = [ - "https://mirror.ghproxy.com/{}", - "https://hub.gitmirror.com/{}", - "https://gh.con.sh/{}", -] +GGithubSrcURL = "" +GPluginMarketURL = "" # Initialize colorama init(autoreset=True) +# def get_avali_github_url(self): +# """自动选择最佳镜像地址""" +# url_list = ["https://ghp.ci", "https://github.dqyt.online"] +# try: +# if not Config.get_cfg( +# "ToolDelta基本配置.json", {"是否使用github镜像": bool} +# )["是否使用github镜像"]: +# self.url = "https://raw.githubusercontent.com" +# return self.url +# if url := Config.get_cfg( +# "ToolDelta基本配置.json", {"插件市场源": str} +# )["插件市场源"]: +# self.url = f"{url}/https://raw.githubusercontent.com" +# return self.url +# except Exception: +# Print.clean_print("§c未发现配置文件,将选择内置镜像地址") +# for url in url_list: +# try: +# response = requests.get(url) +# if response.status_code == 200: +# self.url = f"{url}/https://raw.githubusercontent.com" +# return self.url +# except requests.RequestException: +# continue +# self.url = "https://github.dqyt.online/https://raw.githubusercontent.com" +# return self.url + +def set_global_github_src_url(url: str): + global GGithubSrcURL + GGithubSrcURL = url + +def get_global_github_src_url(): + return GGithubSrcURL or "https://mirror.ghproxy.com" + +def get_fastest_github_mirror(): + Print.print_inf("正在对各 GitHub 镜像进行测速 (这需要 5s) ...") + res = test_site_latency([ + "https://ghp.ci", + "https://mirror.ghproxy.com", + "https://github.dqyt.online", + ]) + Print.print_suc(f"检测完成: 将使用 {(site := res[0][0])}") + return site + async def download_file_urls(download_url2dst: list[tuple[str, str]]) -> None: """ @@ -126,20 +166,6 @@ async def download_file( progress_bar.close() -def format_mirror_url(url: str) -> list: - """填充 url 到镜像 url 列表 - - Args: - url (str): 原始 URL - - Returns: - list: 填充原始 url 后的镜像列表 - """ - mir_url: list = [] - for mirror in mirror_github: - mir_url.append(mirror.format(url)) - return mir_url - def githubdownloadurl_to_rawurl(url: str) -> str: """将 GitHub 下载链接转换为原始链接 @@ -336,17 +362,16 @@ def download_unknown_file(url: str, save_dir: str) -> None: download_file_singlethreaded(url, save_dir) -def test_site_latency(Da: dict) -> list: +def test_site_latency(urls: list[str]) -> list[tuple[str, float]]: """测试网站延迟 Args: - Da (dict): 包含 URL 和镜像 URL 的字典 + Da (dict): 包含 URL 和镜像 URL 的字典: {"url": ..., "m} Returns: list: 按延迟排序的 URL 和延迟时间的元组列表 """ - tmp_speed = {} - urls = [Da["url"]] + Da["mirror_url"] + tmp_speed: dict[str, float] = {} with ThreadPoolExecutor() as executor: futures = [executor.submit(measure_latencyt, url) for url in urls] @@ -359,7 +384,7 @@ def test_site_latency(Da: dict) -> list: except Exception as e: Print.print_war(f"Error measuring latency for {url}: {e}") - return sorted(tmp_speed.items(), key=lambda x: x[1], reverse=True) + return sorted(tmp_speed.items(), key=lambda x: x[1]) def measure_latencyt(url: str) -> float: