Skip to content

Commit

Permalink
测试: 自动寻找文件目录结构
Browse files Browse the repository at this point in the history
  • Loading branch information
SuperScript-PRC committed Feb 14, 2024
1 parent 61b21e5 commit 2a40808
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 29 deletions.
18 changes: 8 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<h1 align="center">ToolDelta - Linux/Windows Edition</h1>
<h1 align="center">ToolDelta - Multi Platform Edition</h1>
<p align="center">
<a href="https://github.com/SuperScript-PRC/ToolDelta/releases"><img src="https://img.shields.io/github/v/release/SuperScript-PRC/ToolDelta?display_name=tag&sort=semver" alt="Releases"></a>
<img src="https://img.shields.io/github/stars/SuperScript-PRC/ToolDelta.svg?style=falt" alt="Stars">
Expand All @@ -18,22 +18,15 @@






# 目录
- [目录](#目录)
- [注意事项](#注意事项)
- [更新日志](#更新日志)





# 注意事项
- 项目目前可完全在 `Ubuntu` 平台上流畅部署, 可在 `Ubuntu / Windows / MacOS / Termux` 上运行, 遇到平台不兼容的情况请尽快提交 `Issue`


- 遇到平台不兼容的情况请尽快提交 `Issue`
- 由于环境问题, ToolDelta 无法在 `Termux` 平台上部署, 见谅.

# 更新日志
- `0.1.6`
Expand All @@ -47,3 +40,8 @@
* 新增缺失部分文件自动补全功能
* Beta - 重写了 `cfg.py` 的代码使之更具人类可读性
* Sigma - 兼容了 `NeOmega` 系统, 可在其上运行
- `0.2.8`
* 由于 `FastBuilder External` 停止更新, ToolDelta 不再对其进行进一步的支持.
* 更新了 `插件市场` 功能
* 新增 `注入式插件` 加载方法
* 重整文件目录结构 并上传到 `PyPi` 使 ToolDelta 可以作为一个库运行
3 changes: 2 additions & 1 deletion plugin_market/market_tree.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion tooldelta/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
54 changes: 37 additions & 17 deletions tooldelta/plugin_market.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 控制台.")
Expand All @@ -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组合式插件")
Expand All @@ -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()

0 comments on commit 2a40808

Please sign in to comment.