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():
44def save():
45    global dirty_flag
46    if dirty_flag:
47        logger.debug("更新配置文件")
48        with setting_filepath.open("w+", encoding="utf8") as f:
49            json.dump(total_settings, f, ensure_ascii=0, indent=4)
50        dirty_flag = False
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 force_update(self):
103    def force_update(self):
104        '''修改可变成员变量后,需要使用该方法才能保存其值到文件'''
105        self.save()

修改可变成员变量后,需要使用该方法才能保存其值到文件

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
class AyakaLargeConfig(AyakaConfig):
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
AyakaConfig
AyakaConfig
force_update
save
pydantic.main.BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
class Config(AyakaConfig):
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函数

@validator('separate')
def name_must_contain_space(cls, v):
154    @validator('separate')
155    def name_must_contain_space(cls, v):
156        if not v:
157            logger.warning("ayaka的分割符被设置为空字符串,这会使得ayaka无法正确分割参数")
158        return v
Inherited Members
AyakaConfig
AyakaConfig
force_update
save
pydantic.main.BaseModel
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs