Skip to content

Commit

Permalink
New feature: 支持全局修改 GitHub 源
Browse files Browse the repository at this point in the history
  • Loading branch information
SuperScript-PRC committed Nov 30, 2024
1 parent cb4da86 commit 4978734
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 92 deletions.
32 changes: 1 addition & 31 deletions tooldelta/cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down Expand Up @@ -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:
"""生成默认配置文件
Expand Down
8 changes: 5 additions & 3 deletions tooldelta/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
"默认登录配置标准验证格式"
Expand Down Expand Up @@ -105,6 +105,8 @@
)
"ToolDelta镜像: github项目仓库"

PLUGIN_MARKET_SOURCE_OFFICIAL = "https://ghp.ci/https://ToolDelta-Basic/PluginMarket"

class SysStatus:
"""系统状态码
Expand Down
28 changes: 15 additions & 13 deletions tooldelta/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand All @@ -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(
Expand All @@ -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 启动配置更改):")
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
26 changes: 13 additions & 13 deletions tooldelta/neo_libs/file_download.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,26 @@
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:
"""根据系统架构和平台下载所需的库。"""
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)
Expand All @@ -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]
Expand Down Expand Up @@ -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


Expand All @@ -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

Expand Down
17 changes: 10 additions & 7 deletions tooldelta/plugin_market.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
"""
Expand All @@ -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

Expand Down
75 changes: 50 additions & 25 deletions tooldelta/urlmethod.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
"""
Expand Down Expand Up @@ -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 下载链接转换为原始链接
Expand Down Expand Up @@ -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]
Expand All @@ -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:
Expand Down

0 comments on commit 4978734

Please sign in to comment.