diff --git a/README.md b/README.md index 1ef90ea0..c8799a65 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

ToolDelta - Linux/Windows Edition

+

ToolDelta - Multi Platform Edition

Releases Stars @@ -18,22 +18,15 @@ - - - # 目录 - [目录](#目录) - [注意事项](#注意事项) - [更新日志](#更新日志) - - - # 注意事项 -- 项目目前可完全在 `Ubuntu` 平台上流畅部署, 可在 `Ubuntu / Windows / MacOS / Termux` 上运行, 遇到平台不兼容的情况请尽快提交 `Issue` - - +- 遇到平台不兼容的情况请尽快提交 `Issue` +- 由于环境问题, ToolDelta 无法在 `Termux` 平台上部署, 见谅. # 更新日志 - `0.1.6` @@ -47,3 +40,8 @@ * 新增缺失部分文件自动补全功能 * Beta - 重写了 `cfg.py` 的代码使之更具人类可读性 * Sigma - 兼容了 `NeOmega` 系统, 可在其上运行 +- `0.2.8` + * 由于 `FastBuilder External` 停止更新, ToolDelta 不再对其进行进一步的支持. + * 更新了 `插件市场` 功能 + * 新增 `注入式插件` 加载方法 + * 重整文件目录结构 并上传到 `PyPi` 使 ToolDelta 可以作为一个库运行 \ No newline at end of file diff --git a/plugin_market/market_tree.json b/plugin_market/market_tree.json index 5c745631..e8f81d6a 100644 --- a/plugin_market/market_tree.json +++ b/plugin_market/market_tree.json @@ -2,7 +2,8 @@ "MarketVersion": "0.0.1", "SourceName": "ToolDelta插件市场 Official", "Greetings": "§a欢迎使用 §bToolDelta 插件市场.", - "DownloadRefURL": "https://mirror.ghproxy.com/raw.githubusercontent.com/ToolDelta/ToolDelta/main/plugin_market/", + "DownloadRefURL": "https://mirror.ghproxy.com/raw.githubusercontent.com/ToolDelta/ToolDelta/main/plugin_market", + "DirectoryFileURL": "https://mirror.ghproxy.com/raw.githubusercontent.com/ToolDelta/ToolDelta/main/plugin_market/directory.json", "MarketPlugins": { "聊天栏菜单": { "author": "SuperScript", diff --git a/tooldelta/__init__.py b/tooldelta/__init__.py index e3d126df..e7833054 100644 --- a/tooldelta/__init__.py +++ b/tooldelta/__init__.py @@ -87,7 +87,7 @@ def read_cfg(self): "启动器启动模式(请不要手动更改此项, 改为0可重置)": 0, "验证服务器地址(更换时记得更改fbtoken)": "https://api.fastbuilder.pro", "是否记录日志": True, - "插件市场源": "https://mirror.ghproxy.com/raw.githubusercontent.com/ToolDelta/ToolDelta/main/plugin_market/market_tree.json", + "插件市场源": "https://mirror.ghproxy.com/raw.githubusercontent.com/ToolDelta/ToolDelta/main/plugin_market", } CFG_STD = { "服务器号": int, diff --git a/tooldelta/plugin_market.py b/tooldelta/plugin_market.py index 5e4fc8a9..676d3f51 100644 --- a/tooldelta/plugin_market.py +++ b/tooldelta/plugin_market.py @@ -14,6 +14,18 @@ def _path_dir(path: str): else: return "/".join(path.split("/")[:-1]) +def _url_join(*urls): + return "/".join(urls) + +def _get_json_from_url(url: str): + try: + resp = requests.get(_url_join(url, "market_tree.json")).text + except requests.RequestException: + raise Exception("URL请求失败") + try: + return json.loads(resp) + except json.JSONDecodeError: + raise Exception(f"服务器返回了不正确的答复: {resp}") class PluginMaketPluginData: def __init__(self, name: str, plugin_data: dict): @@ -44,14 +56,7 @@ def enter_plugin_market(self, source_url: str): Print.print_inf("正在连接到插件市场..") try: if not test_mode: - try: - resp = requests.get(source_url).text - except requests.RequestException: - raise Exception("请求失败, 无法从插件市场源获取信息") - try: - market_datas = json.loads(resp) - except json.JSONDecodeError: - raise Exception(f"插件市场源返回了不正确的答复: {resp}") + market_datas = _get_json_from_url(source_url) else: with open("plugin_market/market_tree.json", "r", encoding="utf-8") as f: market_datas = json.load(f) @@ -96,7 +101,6 @@ def enter_plugin_market(self, source_url: str): Print.print_err(f"获取插件市场插件出现问题: 键值对错误: {err}") except Exception as err: Print.print_err(f"获取插件市场插件出现问题: {err}") - Print.print_err(err) return os.system(CLS_CMD) Print.print_suc("已从插件市场返回 ToolDelta 控制台.") @@ -116,19 +120,16 @@ def choice_plugin(self, plugin_data: PluginMaketPluginData, all_plugins_dict: di return False def download_plugin(self, plugin_data: PluginMaketPluginData, all_plugins_dict): - if plugin_data.plugin_type != "dotcs": - download_paths = plugin_data.dirs + ["__init__.py"] - else: - download_paths = plugin_data.dirs + [plugin_data.name + ".py"] + download_paths = self.find_dirs(plugin_data) for plugin_name, _ in plugin_data.pre_plugins.items(): Print.print_inf(f"插件 {plugin_data.name} 需要下载前置插件: {plugin_name}") self.download_plugin(PluginMaketPluginData(plugin_name, all_plugins_dict[plugin_name]), all_plugins_dict) - for path in download_paths: + for path in download_paths: if not path.strip(): # 不可能出现的状况, 出现了证明是你的问题 Print.print_war("下载路径为空, 跳过") continue - url = self.plugins_download_url + plugin_data.name + "/" + path + url = _url_join(self.plugins_download_url, plugin_data.name, path) match plugin_data.plugin_type: case "classic": download_path = os.path.join(os.getcwd(), "插件文件", "ToolDelta组合式插件") @@ -144,7 +145,26 @@ def download_plugin(self, plugin_data: PluginMaketPluginData, all_plugins_dict): folder_path = os.path.join(download_path, plugin_data.name, path_last) os.makedirs(folder_path, exist_ok=True) urlmethod.download_file(url, os.path.join(download_path, plugin_data.name, path), True) - Print.print_suc(f"成功下载插件 §f{plugin_data.name}§a 至插件文件夹 ") - + Print.print_suc(f"成功下载插件 §f{plugin_data.name}§a 至插件文件夹 ") + def find_dirs(self, plugin_data: PluginMaketPluginData): + def unfold_url_dirs(parent_dir: str, val): + # 展开文件目录 + if not isinstance(val, dict): + super_dirs.append(_url_join(parent_dir, val)) + else: + for k, v in val: + unfold_url_dirs(_url_join(parent_dir, k), v) + try: + super_dirs = [] + dirs = _get_json_from_url(_url_join(self.plugins_download_url, "directory.json"))[plugin_data.name] + unfold_url_dirs(dirs) + return super_dirs + except KeyError as err: + Print.print_err(f"获取插件市场插件目录结构出现问题: 无法找到 {err}, 有可能是未来得及更新目录") + return + except Exception as err: + Print.print_err(f"获取插件市场插件目录结构出现问题: {err}") + return + market = PluginMarket() \ No newline at end of file