diff --git a/README.md b/README.md index 1ef90ea0..c8799a65 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -
@@ -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