| import argparse |
| import asyncio |
| import mimetypes |
| import os |
| import sys |
| from pathlib import Path |
|
|
| import runtime_bootstrap |
|
|
| runtime_bootstrap.initialize_runtime_bootstrap() |
|
|
| from astrbot.core import LogBroker, LogManager, db_helper, logger |
| from astrbot.core.config.default import VERSION |
| from astrbot.core.initial_loader import InitialLoader |
| from astrbot.core.utils.astrbot_path import ( |
| get_astrbot_config_path, |
| get_astrbot_data_path, |
| get_astrbot_knowledge_base_path, |
| get_astrbot_plugin_path, |
| get_astrbot_root, |
| get_astrbot_site_packages_path, |
| get_astrbot_temp_path, |
| ) |
| from astrbot.core.utils.io import ( |
| download_dashboard, |
| get_dashboard_version, |
| ) |
|
|
| |
| sys.path.append(Path(__file__).parent.as_posix()) |
|
|
| logo_tmpl = r""" |
| ___ _______.___________..______ .______ ______ .___________. |
| / \ / | || _ \ | _ \ / __ \ | | |
| / ^ \ | (----`---| |----`| |_) | | |_) | | | | | `---| |----` |
| / /_\ \ \ \ | | | / | _ < | | | | | | |
| / _____ \ .----) | | | | |\ \----.| |_) | | `--' | | | |
| /__/ \__\ |_______/ |__| | _| `._____||______/ \______/ |__| |
| |
| """ |
|
|
|
|
| def check_env() -> None: |
| if not (sys.version_info.major == 3 and sys.version_info.minor >= 10): |
| logger.error("请使用 Python3.10+ 运行本项目。") |
| exit() |
|
|
| astrbot_root = get_astrbot_root() |
| if astrbot_root not in sys.path: |
| sys.path.insert(0, astrbot_root) |
|
|
| site_packages_path = get_astrbot_site_packages_path() |
| if site_packages_path not in sys.path: |
| sys.path.insert(0, site_packages_path) |
|
|
| os.makedirs(get_astrbot_config_path(), exist_ok=True) |
| os.makedirs(get_astrbot_plugin_path(), exist_ok=True) |
| os.makedirs(get_astrbot_temp_path(), exist_ok=True) |
| os.makedirs(get_astrbot_knowledge_base_path(), exist_ok=True) |
| os.makedirs(site_packages_path, exist_ok=True) |
|
|
| |
| mimetypes.add_type("text/javascript", ".js") |
| mimetypes.add_type("text/javascript", ".mjs") |
| mimetypes.add_type("application/json", ".json") |
|
|
|
|
| async def check_dashboard_files(webui_dir: str | None = None): |
| """下载管理面板文件""" |
| |
| if webui_dir: |
| if os.path.exists(webui_dir): |
| logger.info(f"使用指定的 WebUI 目录: {webui_dir}") |
| return webui_dir |
| logger.warning(f"指定的 WebUI 目录 {webui_dir} 不存在,将使用默认逻辑。") |
|
|
| data_dist_path = os.path.join(get_astrbot_data_path(), "dist") |
| if os.path.exists(data_dist_path): |
| v = await get_dashboard_version() |
| if v is not None: |
| |
| if v == f"v{VERSION}": |
| logger.info("WebUI 版本已是最新。") |
| else: |
| logger.warning( |
| f"检测到 WebUI 版本 ({v}) 与当前 AstrBot 版本 (v{VERSION}) 不符。", |
| ) |
| return data_dist_path |
|
|
| logger.info( |
| "开始下载管理面板文件...高峰期(晚上)可能导致较慢的速度。如多次下载失败,请前往 https://github.com/AstrBotDevs/AstrBot/releases/latest 下载 dist.zip,并将其中的 dist 文件夹解压至 data 目录下。", |
| ) |
|
|
| try: |
| await download_dashboard(version=f"v{VERSION}", latest=False) |
| except Exception as e: |
| logger.critical(f"下载管理面板文件失败: {e}。") |
| return None |
|
|
| logger.info("管理面板下载完成。") |
| return data_dist_path |
|
|
|
|
| async def main_async(webui_dir_arg: str | None) -> None: |
| """主异步入口""" |
| |
| webui_dir = await check_dashboard_files(webui_dir_arg) |
| if webui_dir is None: |
| logger.warning( |
| "管理面板文件检查失败,WebUI 功能将不可用。" |
| "请检查网络连接或手动指定 --webui-dir 参数。" |
| ) |
|
|
| db = db_helper |
|
|
| |
| logger.info(logo_tmpl) |
|
|
| core_lifecycle = InitialLoader(db, log_broker) |
| core_lifecycle.webui_dir = webui_dir |
| await core_lifecycle.start() |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(description="AstrBot") |
| parser.add_argument( |
| "--webui-dir", |
| type=str, |
| help="指定 WebUI 静态文件目录路径", |
| default=None, |
| ) |
| args = parser.parse_args() |
|
|
| check_env() |
|
|
| |
| log_broker = LogBroker() |
| LogManager.set_queue_handler(logger, log_broker) |
|
|
| |
| asyncio.run(main_async(args.webui_dir)) |
|
|