ayaka.config
管理插件配置,读写ayaka_setting.json文件
1''' 2 管理插件配置,读写ayaka_setting.json文件 3''' 4 5import json 6from pathlib import Path 7from pydantic import BaseModel, ValidationError, validator 8from typing import List, Literal 9from loguru import logger 10 11AYAKA_VERSION = "0.5.3" 12 13# 总文件夹 14ayaka_data_path = Path("data", "ayaka") 15if not ayaka_data_path.exists(): 16 ayaka_data_path.mkdir(parents=1) 17 18# 分文件夹 19ayaka_data_separate_path = ayaka_data_path / "separate" 20if not ayaka_data_separate_path.exists(): 21 ayaka_data_separate_path.mkdir(parents=1) 22 23# 总配置文件 24setting_filepath = ayaka_data_path / "ayaka_setting.json" 25# 总配置 26total_settings: dict = {} 27# 数据脏标志 28dirty_flag = False 29 30 31def load(): 32 global total_settings 33 if not setting_filepath.exists(): 34 with setting_filepath.open("w+", encoding="utf8") as f: 35 f.write("{}") 36 total_settings = {} 37 else: 38 logger.debug("加载配置文件") 39 with setting_filepath.open("r", encoding="utf8") as f: 40 total_settings = json.load(f) 41 42 43def save(): 44 global dirty_flag 45 if dirty_flag: 46 logger.debug("更新配置文件") 47 with setting_filepath.open("w+", encoding="utf8") as f: 48 json.dump(total_settings, f, ensure_ascii=0, indent=4) 49 dirty_flag = False 50 51 52load() 53 54 55class AyakaConfig(BaseModel): 56 '''继承时请填写`__app_name__` 57 58 该配置保存在data/ayaka/ayaka_setting.json中字典的`__app_name__`键下 59 60 当配置项较多时(超过100行),建议使用`AyakaLargeConfig` 61 62 在修改不可变成员属性时,`AyakaConfig`会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数 63 ''' 64 __app_name__ = "" 65 __separate__ = False 66 67 def __init__(self): 68 name = self.__app_name__ 69 if not name: 70 raise Exception("__app_name__不可为空") 71 72 # 默认空数据 73 data = {} 74 75 try: 76 if self.__separate__: 77 path = ayaka_data_separate_path / f"{name}.json" 78 # 存在则读取 79 if path.exists(): 80 with path.open("r", encoding="utf8") as f: 81 data = json.load(f) 82 83 # 存在则读取 84 elif name in total_settings: 85 data = total_settings[name] 86 87 # 载入数据 88 super().__init__(**data) 89 90 except ValidationError as e: 91 logger.error( 92 f"导入配置失败,请检查{name}的配置是否正确") 93 raise e 94 95 # 强制更新(更新默认值) 96 self.save() 97 98 def __setattr__(self, name, value): 99 super().__setattr__(name, value) 100 self.save() 101 102 def force_update(self): 103 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 104 self.save() 105 106 def save(self): 107 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 108 name = self.__app_name__ 109 if self.__separate__: 110 data = self.dict() 111 path = ayaka_data_separate_path / f"{name}.json" 112 with path.open("w+", encoding="utf8") as f: 113 json.dump(data, f, ensure_ascii=0, indent=4) 114 else: 115 total_settings[name] = self.dict() 116 global dirty_flag 117 dirty_flag = True 118 119 120class AyakaLargeConfig(AyakaConfig): 121 '''继承时请填写`__app_name__` 122 123 该配置保存在data/ayaka/separate/`__app_name__`.json下 124 125 在修改不可变成员属性时,`AyakaLargeConfig`会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数 126 ''' 127 __app_name__ = "" 128 __separate__ = True 129 130 131class Config(AyakaConfig): 132 __app_name__ = "__root__" 133 version: str = AYAKA_VERSION 134 # 命令抬头 135 prefix: str = "#" 136 # 参数分割符 137 separate: str = " " 138 # 是否排除go-cqhttp缓存的过期消息 139 exclude_old_msg: bool = True 140 # 是否使用playwright 141 use_playwright: bool = False 142 # ayaka插件的所有者 143 owners: List[int] = [] 144 # ayaka插件的管理者 145 admins: List[int] = [] 146 # 切换bot类型 147 bot_type: Literal["nonebot", "ayakabot"] = "nonebot" 148 # 是否处于调试模式 149 debug: bool = False 150 # 端口号 151 ayaka_port: int = 19900 152 153 @validator('separate') 154 def name_must_contain_space(cls, v): 155 if not v: 156 logger.warning("ayaka的分割符被设置为空字符串,这会使得ayaka无法正确分割参数") 157 return v 158 159 160ayaka_root_config = Config() 161ayaka_root_config.version = AYAKA_VERSION
def
load():
32def load(): 33 global total_settings 34 if not setting_filepath.exists(): 35 with setting_filepath.open("w+", encoding="utf8") as f: 36 f.write("{}") 37 total_settings = {} 38 else: 39 logger.debug("加载配置文件") 40 with setting_filepath.open("r", encoding="utf8") as f: 41 total_settings = json.load(f)
def
save():
class
AyakaConfig(pydantic.main.BaseModel):
56class AyakaConfig(BaseModel): 57 '''继承时请填写`__app_name__` 58 59 该配置保存在data/ayaka/ayaka_setting.json中字典的`__app_name__`键下 60 61 当配置项较多时(超过100行),建议使用`AyakaLargeConfig` 62 63 在修改不可变成员属性时,`AyakaConfig`会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数 64 ''' 65 __app_name__ = "" 66 __separate__ = False 67 68 def __init__(self): 69 name = self.__app_name__ 70 if not name: 71 raise Exception("__app_name__不可为空") 72 73 # 默认空数据 74 data = {} 75 76 try: 77 if self.__separate__: 78 path = ayaka_data_separate_path / f"{name}.json" 79 # 存在则读取 80 if path.exists(): 81 with path.open("r", encoding="utf8") as f: 82 data = json.load(f) 83 84 # 存在则读取 85 elif name in total_settings: 86 data = total_settings[name] 87 88 # 载入数据 89 super().__init__(**data) 90 91 except ValidationError as e: 92 logger.error( 93 f"导入配置失败,请检查{name}的配置是否正确") 94 raise e 95 96 # 强制更新(更新默认值) 97 self.save() 98 99 def __setattr__(self, name, value): 100 super().__setattr__(name, value) 101 self.save() 102 103 def force_update(self): 104 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 105 self.save() 106 107 def save(self): 108 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 109 name = self.__app_name__ 110 if self.__separate__: 111 data = self.dict() 112 path = ayaka_data_separate_path / f"{name}.json" 113 with path.open("w+", encoding="utf8") as f: 114 json.dump(data, f, ensure_ascii=0, indent=4) 115 else: 116 total_settings[name] = self.dict() 117 global dirty_flag 118 dirty_flag = True
继承时请填写__app_name__
该配置保存在data/ayaka/ayaka_setting.json中字典的__app_name__
键下
当配置项较多时(超过100行),建议使用AyakaLargeConfig
在修改不可变成员属性时,AyakaConfig
会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数
AyakaConfig()
68 def __init__(self): 69 name = self.__app_name__ 70 if not name: 71 raise Exception("__app_name__不可为空") 72 73 # 默认空数据 74 data = {} 75 76 try: 77 if self.__separate__: 78 path = ayaka_data_separate_path / f"{name}.json" 79 # 存在则读取 80 if path.exists(): 81 with path.open("r", encoding="utf8") as f: 82 data = json.load(f) 83 84 # 存在则读取 85 elif name in total_settings: 86 data = total_settings[name] 87 88 # 载入数据 89 super().__init__(**data) 90 91 except ValidationError as e: 92 logger.error( 93 f"导入配置失败,请检查{name}的配置是否正确") 94 raise e 95 96 # 强制更新(更新默认值) 97 self.save()
Create a new model by parsing and validating input data from keyword arguments.
Raises ValidationError if the input data cannot be parsed to form a valid model.
def
save(self):
107 def save(self): 108 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 109 name = self.__app_name__ 110 if self.__separate__: 111 data = self.dict() 112 path = ayaka_data_separate_path / f"{name}.json" 113 with path.open("w+", encoding="utf8") as f: 114 json.dump(data, f, ensure_ascii=0, indent=4) 115 else: 116 total_settings[name] = self.dict() 117 global dirty_flag 118 dirty_flag = True
修改可变成员变量后,需要使用该方法才能保存其值到文件
Inherited Members
- pydantic.main.BaseModel
- dict
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs
121class AyakaLargeConfig(AyakaConfig): 122 '''继承时请填写`__app_name__` 123 124 该配置保存在data/ayaka/separate/`__app_name__`.json下 125 126 在修改不可变成员属性时,`AyakaLargeConfig`会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数 127 ''' 128 __app_name__ = "" 129 __separate__ = True
继承时请填写__app_name__
该配置保存在data/ayaka/separate/__app_name__
.json下
在修改不可变成员属性时,AyakaLargeConfig
会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数
Inherited Members
- pydantic.main.BaseModel
- dict
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs
132class Config(AyakaConfig): 133 __app_name__ = "__root__" 134 version: str = AYAKA_VERSION 135 # 命令抬头 136 prefix: str = "#" 137 # 参数分割符 138 separate: str = " " 139 # 是否排除go-cqhttp缓存的过期消息 140 exclude_old_msg: bool = True 141 # 是否使用playwright 142 use_playwright: bool = False 143 # ayaka插件的所有者 144 owners: List[int] = [] 145 # ayaka插件的管理者 146 admins: List[int] = [] 147 # 切换bot类型 148 bot_type: Literal["nonebot", "ayakabot"] = "nonebot" 149 # 是否处于调试模式 150 debug: bool = False 151 # 端口号 152 ayaka_port: int = 19900 153 154 @validator('separate') 155 def name_must_contain_space(cls, v): 156 if not v: 157 logger.warning("ayaka的分割符被设置为空字符串,这会使得ayaka无法正确分割参数") 158 return v
继承时请填写__app_name__
该配置保存在data/ayaka/ayaka_setting.json中字典的__app_name__
键下
当配置项较多时(超过100行),建议使用AyakaLargeConfig
在修改不可变成员属性时,AyakaConfig
会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数
Inherited Members
- pydantic.main.BaseModel
- dict
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs