From f5f325208a7373c1d9113098c2ebec3d99ef3f3f Mon Sep 17 00:00:00 2001 From: Rikki Date: Sat, 8 Mar 2025 17:05:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=8A=A0=E8=BD=BD=E5=99=A8=20=E5=B9=B6=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=90=E4=BE=9B=E5=95=86=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E7=AE=80=E5=8C=96=E5=90=8E=E7=BB=AD?= =?UTF-8?q?=20config=20=E5=8A=A0=E8=BD=BD=E5=90=8E=E7=9A=84=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 171 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 105 insertions(+), 66 deletions(-) diff --git a/bot.py b/bot.py index 922a2328c..716d0f4ba 100644 --- a/bot.py +++ b/bot.py @@ -5,65 +5,6 @@ from nonebot.adapters.onebot.v11 import Adapter from dotenv import load_dotenv from loguru import logger -'''彩蛋''' -from colorama import init, Fore - -init() -text = "多年以后,面对AI行刑队,张三将会回想起他2023年在会议上讨论人工智能的那个下午" -rainbow_colors = [Fore.RED, Fore.YELLOW, Fore.GREEN, Fore.CYAN, Fore.BLUE, Fore.MAGENTA] -rainbow_text = "" -for i, char in enumerate(text): - rainbow_text += rainbow_colors[i % len(rainbow_colors)] + char -print(rainbow_text) -'''彩蛋''' - -# 初次启动检测 -if not os.path.exists("config/bot_config.toml"): - logger.warning("检测到bot_config.toml不存在,正在从模板复制") - - # 检查config目录是否存在 - if not os.path.exists("config"): - os.makedirs("config") - logger.info("创建config目录") - - shutil.copy("template/bot_config_template.toml", "config/bot_config.toml") - logger.info("复制完成,请修改config/bot_config.toml和.env.prod中的配置后重新启动") - -# 初始化.env 默认ENVIRONMENT=prod -if not os.path.exists(".env"): - with open(".env", "w") as f: - f.write("ENVIRONMENT=prod") - - # 检测.env.prod文件是否存在 - if not os.path.exists(".env.prod"): - logger.error("检测到.env.prod文件不存在") - shutil.copy("template.env", "./.env.prod") - -# 首先加载基础环境变量.env -if os.path.exists(".env"): - load_dotenv(".env") - logger.success("成功加载基础环境变量配置") - -# 根据 ENVIRONMENT 加载对应的环境配置 -if os.getenv("ENVIRONMENT") == "prod": - logger.success("加载生产环境变量配置") - load_dotenv(".env.prod", override=True) # override=True 允许覆盖已存在的环境变量 -elif os.getenv("ENVIRONMENT") == "dev": - logger.success("加载开发环境变量配置") - load_dotenv(".env.dev", override=True) # override=True 允许覆盖已存在的环境变量 -elif os.path.exists(f".env.{os.getenv('ENVIRONMENT')}"): - logger.success(f"加载{os.getenv('ENVIRONMENT')}环境变量配置") - load_dotenv(f".env.{os.getenv('ENVIRONMENT')}", override=True) # override=True 允许覆盖已存在的环境变量 -else: - logger.error(f"ENVIRONMENT配置错误,请检查.env文件中的ENVIRONMENT变量对应的.env.{os.getenv('ENVIRONMENT')}是否存在") - exit(1) - -# 检测Key是否存在 -if not os.getenv("SILICONFLOW_KEY"): - logger.error("缺失必要的API KEY") - logger.error(f"请至少在.env.{os.getenv('ENVIRONMENT')}文件中填写SILICONFLOW_KEY后重新启动") - exit(1) - # 获取所有环境变量 env_config = {key: os.getenv(key) for key in os.environ} @@ -74,15 +15,113 @@ base_config = { "log_level": "INFO", } -# 合并配置 -nonebot.init(**base_config, **env_config) +def easter_egg(): + # 彩蛋 + from colorama import init, Fore -# 注册适配器 -driver = nonebot.get_driver() -driver.register_adapter(Adapter) + init() + text = "多年以后,面对AI行刑队,张三将会回想起他2023年在会议上讨论人工智能的那个下午" + rainbow_colors = [Fore.RED, Fore.YELLOW, Fore.GREEN, Fore.CYAN, Fore.BLUE, Fore.MAGENTA] + rainbow_text = "" + for i, char in enumerate(text): + rainbow_text += rainbow_colors[i % len(rainbow_colors)] + char + print(rainbow_text) -# 加载插件 -nonebot.load_plugins("src/plugins") +def init_config(): + # 初次启动检测 + if not os.path.exists("config/bot_config.toml"): + logger.warning("检测到bot_config.toml不存在,正在从模板复制") + + # 检查config目录是否存在 + if not os.path.exists("config"): + os.makedirs("config") + logger.info("创建config目录") + + shutil.copy("template/bot_config_template.toml", "config/bot_config.toml") + logger.info("复制完成,请修改config/bot_config.toml和.env.prod中的配置后重新启动") + +def init_env(): + # 初始化.env 默认ENVIRONMENT=prod + if not os.path.exists(".env"): + with open(".env", "w") as f: + f.write("ENVIRONMENT=prod") + + # 检测.env.prod文件是否存在 + if not os.path.exists(".env.prod"): + logger.error("检测到.env.prod文件不存在") + shutil.copy("template.env", "./.env.prod") + + else: + # 首先加载基础环境变量.env + load_dotenv(".env") + logger.success("成功加载基础环境变量配置") + +def load_env(): + # 使用闭包实现对加载器的横向扩展,避免大量重复判断 + def prod(): + logger.success("加载生产环境变量配置") + load_dotenv(".env.prod", override=True) # override=True 允许覆盖已存在的环境变量 + + def dev(): + logger.success("加载开发环境变量配置") + load_dotenv(".env.dev", override=True) # override=True 允许覆盖已存在的环境变量 + + fn_map = { + "prod": prod, + "dev": dev + } + + env = os.getenv("ENVIRONMENT") + if env in fn_map: + fn_map[env]() # 根据映射执行闭包函数 + + elif os.path.exists(f".env.{env}"): + logger.success(f"加载{env}环境变量配置") + load_dotenv(f".env.{env}", override=True) # override=True 允许覆盖已存在的环境变量 + + else: + logger.error(f"ENVIRONMENT 配置错误,请检查 .env 文件中的 ENVIRONMENT 变量及对应 .env.{env} 是否存在") + exit(1) + +provider = {} + +def scan_provider(): + # 遍历 env_config 的所有键 + for key in env_config: + # 检查键是否符合 {provider}_BASE_URL 或 {provider}_KEY 的格式 + if key.endswith("_BASE_URL") or key.endswith("_KEY"): + # 提取 provider 名称 + provider_name = key.rsplit("_", 1)[0] # 从右边分割一次,取第一部分 + + # 初始化 provider 的字典(如果尚未初始化) + if provider_name not in provider: + provider[provider_name] = {"url": None, "key": None} + + # 根据键的类型填充 url 或 key + if key.endswith("_BASE_URL"): + provider[provider_name]["url"] = env_config[key] + elif key.endswith("_KEY"): + provider[provider_name]["key"] = env_config[key] + + # 检查每个 provider 是否同时存在 url 和 key + for provider_name, config in provider.items(): + if config["url"] is None or config["key"] is None: + raise ValueError(f"请检查 '{provider_name}' 提供商配置是否丢失 BASE_URL 或 KEY 环境变量") if __name__ == "__main__": + easter_egg() + init_config() + init_env() + scan_provider() + + # 合并配置 + nonebot.init(**base_config, **env_config) + + # 注册适配器 + driver = nonebot.get_driver() + driver.register_adapter(Adapter) + + # 加载插件 + nonebot.load_plugins("src/plugins") + nonebot.run()