diff options
Diffstat (limited to 'hydro_roll/cli.py')
| -rw-r--r-- | hydro_roll/cli.py | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/hydro_roll/cli.py b/hydro_roll/cli.py new file mode 100644 index 0000000..d3404ad --- /dev/null +++ b/hydro_roll/cli.py @@ -0,0 +1,180 @@ +import argparse +import os +import aiohttp +import asyncio +import json +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .typing import * + +class Cli(object): + parser = argparse.ArgumentParser(description="水系终端脚手架") + + def __init__(self): + self.parser.add_argument( + "-i", + "--install", + dest="command", + help="安装规则包、插件与模型", + action="store_const", + const="install_package", + ) + self.parser.add_argument( + "-T", + "--template", + dest="command", + help="选择模板快速创建Bot实例", + action="store_const", + const="build_template", + ) + self.parser.add_argument( + "-S", + "--search", + dest="command", + help="在指定镜像源查找规则包、插件与模型", + action="store_const", + const="search_package", + ) + self.parser.add_argument( + "-c", + "--config", + dest="command", + help="配置管理", + action="store_const", + const="config", + ) + self.args = self.parser.parse_args() + + def get_args(self): + return self.args + + def get_help(self): + return self.parser.format_help() + + async def install_packages(self): + package_name = input("请输入要安装的包名:") + url = f"https://pypi.org/pypi/{package_name}/json" + + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + data = await response.json() + await self._extract_package(data, package_name) + else: + print(f"找不到包:{package_name}") + + async def _extract_package(self, data, package_name): + latest_version = data["info"]["version"] + download_url = data["releases"][latest_version][0]["url"] + + plugins_dir = "plugins" + if not os.path.exists(plugins_dir): + os.mkdir(plugins_dir) + + file_name = download_url.split("/")[-1] + file_path = os.path.join(plugins_dir, file_name) + + async with aiohttp.ClientSession() as session: + async with session.get(download_url) as response: + if response.status == 200: + with open(file_path, "wb") as file: + file.write(await response.read()) + print(f"成功安装包:{package_name}") + else: + print(f"下载包时出错:{package_name}") + + def build_template(self): + template = input("请选择应用模板(输入数字):\n" "1. 创建轻量应用\n" "2. 创建标准应用\n" "3. 创建开发应用\n") + + if template == "1": + print("选择了轻量应用模板") + elif template == "2": + print("选择了标准应用模板") + elif template == "3": + print("选择了开发应用模板") + else: + print("无效的模板选择") + + async def search_package(self): + search_term = input("请输入要搜索的包名关键字:") + url = f"https://pypi.org/search/?q={search_term}" + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + data: dict = response.json() # type: ignore[dict] + packages = data.get("results", []) + + for package in packages: + name = package["name"] + topics = package.get("topics", []) + + if ( + search_term.lower() in name.lower() + and "HydroRoll" in topics + ): + print(f"包名:{name}") + else: + print("搜索失败") + + def config(self): + config_dir = os.path.expanduser("~/.hydroroll") + if not os.path.exists(config_dir): + os.makedirs(config_dir) + + config_file = os.path.join(config_dir, "config.json") + + subcommand = input("请输入子命令(add/delete):") + + if subcommand == "add": + key = input("请输入要添加的键名:") + value = input("请输入要添加的键值:") + + with open(config_file, "r+") as file: + try: + config_data = json.load(file) + except json.JSONDecodeError: + config_data = {} + + config_data[key] = value + self._extracted_from_config_21(file, config_data) + print(f"成功添加配置项:{key}={value}") + + elif subcommand == "delete": + key = input("请输入要删除的键名:") + + with open(config_file, "r+") as file: + try: + config_data = json.load(file) + except json.JSONDecodeError: + config_data = {} + + if key in config_data: + del config_data[key] + self._extracted_from_config_21(file, config_data) + print(f"成功删除配置项:{key}") + else: + print(f"配置项不存在:{key}") + + else: + print("无效的子命令选择") + + # TODO Rename this here and in `config` + def _extracted_from_config_21(self, file, config_data): + file.seek(0) + json.dump(config_data, file, indent=4) + file.truncate() + + +cli = Cli() + +if cli.get_args().command == "install_package": + asyncio.run(cli.install_packages()) +elif cli.get_args().command == "build_template": + cli.build_template() +elif cli.get_args().command == "search_package": + asyncio.run(cli.search_package()) +elif cli.get_args().command == "config": + cli.config() +else: + print(cli.get_help()) |
