aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/hydro_roll/cli.py
diff options
context:
space:
mode:
Diffstat (limited to 'hydro_roll/cli.py')
-rw-r--r--hydro_roll/cli.py180
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())