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():
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        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 force_update(self):
106    def force_update(self):
107        '''修改可变成员变量后,需要使用该方法才能保存其值到文件'''
108        self.save()

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

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
class AyakaLargeConfig(AyakaConfig):
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
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):
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函数

@validator('separate')
def name_must_contain_space(cls, v):
157    @validator('separate')
158    def name_must_contain_space(cls, v):
159        if not v:
160            logger.warning("ayaka的分割符被设置为空字符串,这会使得ayaka无法正确分割参数")
161        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