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 Literal 9from loguru import logger 10 11AYAKA_VERSION = "0.5.5" 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 if not data: 96 # 强制更新(更新默认值) 97 self.save() 98 99 def __setattr__(self, name, value): 100 if getattr(self, name) != value: 101 super().__setattr__(name, value) 102 self.save() 103 logger.debug("已自动保存配置更改") 104 105 def force_update(self): 106 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 107 self.save() 108 109 def save(self): 110 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 111 name = self.__app_name__ 112 if self.__separate__: 113 data = self.dict() 114 path = ayaka_data_separate_path / f"{name}.json" 115 with path.open("w+", encoding="utf8") as f: 116 json.dump(data, f, ensure_ascii=0, indent=4) 117 else: 118 total_settings[name] = self.dict() 119 global dirty_flag 120 dirty_flag = True 121 122 123class AyakaLargeConfig(AyakaConfig): 124 '''继承时请填写`__app_name__` 125 126 该配置保存在data/ayaka/separate/`__app_name__`.json下 127 128 在修改不可变成员属性时,`AyakaLargeConfig`会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数 129 ''' 130 __app_name__ = "" 131 __separate__ = True 132 133 134class Config(AyakaConfig): 135 __app_name__ = "__root__" 136 version: str = AYAKA_VERSION 137 # 命令抬头 138 prefix: str = "#" 139 # 参数分割符 140 separate: str = " " 141 # 是否排除go-cqhttp缓存的过期消息 142 exclude_old_msg: bool = True 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 state_separate: Literal["."] = "." 155 156 @validator('separate') 157 def name_must_contain_space(cls, v): 158 if not v: 159 logger.warning("ayaka的分割符被设置为空字符串,这会使得ayaka无法正确分割参数") 160 return v 161 162 163ayaka_root_config = Config() 164ayaka_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 if not data: 97 # 强制更新(更新默认值) 98 self.save() 99 100 def __setattr__(self, name, value): 101 if getattr(self, name) != value: 102 super().__setattr__(name, value) 103 self.save() 104 logger.debug("已自动保存配置更改") 105 106 def force_update(self): 107 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 108 self.save() 109 110 def save(self): 111 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 112 name = self.__app_name__ 113 if self.__separate__: 114 data = self.dict() 115 path = ayaka_data_separate_path / f"{name}.json" 116 with path.open("w+", encoding="utf8") as f: 117 json.dump(data, f, ensure_ascii=0, indent=4) 118 else: 119 total_settings[name] = self.dict() 120 global dirty_flag 121 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 if not data: 97 # 强制更新(更新默认值) 98 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):
110 def save(self): 111 '''修改可变成员变量后,需要使用该方法才能保存其值到文件''' 112 name = self.__app_name__ 113 if self.__separate__: 114 data = self.dict() 115 path = ayaka_data_separate_path / f"{name}.json" 116 with path.open("w+", encoding="utf8") as f: 117 json.dump(data, f, ensure_ascii=0, indent=4) 118 else: 119 total_settings[name] = self.dict() 120 global dirty_flag 121 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
124class AyakaLargeConfig(AyakaConfig): 125 '''继承时请填写`__app_name__` 126 127 该配置保存在data/ayaka/separate/`__app_name__`.json下 128 129 在修改不可变成员属性时,`AyakaLargeConfig`会自动写入到本地文件,但修改可变成员属性时,需要手动执行save函数 130 ''' 131 __app_name__ = "" 132 __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
135class Config(AyakaConfig): 136 __app_name__ = "__root__" 137 version: str = AYAKA_VERSION 138 # 命令抬头 139 prefix: str = "#" 140 # 参数分割符 141 separate: str = " " 142 # 是否排除go-cqhttp缓存的过期消息 143 exclude_old_msg: bool = True 144 # # ayaka插件的所有者 145 # owners: List[int] = [] 146 # # ayaka插件的管理者 147 # admins: List[int] = [] 148 # 切换bot类型 149 bot_type: Literal["nonebot", "ayakabot"] = "nonebot" 150 # 是否处于调试模式 151 debug: bool = False 152 # 端口号 153 ayaka_port: int = 19900 154 # 状态分割符(不可修改 155 state_separate: Literal["."] = "." 156 157 @validator('separate') 158 def name_must_contain_space(cls, v): 159 if not v: 160 logger.warning("ayaka的分割符被设置为空字符串,这会使得ayaka无法正确分割参数") 161 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