93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
import os
|
|
import json
|
|
from type.config import DEFAULT_CONFIG
|
|
|
|
cpath = "data/cmd_config.json"
|
|
|
|
def check_exist():
|
|
if not os.path.exists(cpath):
|
|
with open(cpath, "w", encoding="utf-8-sig") as f:
|
|
json.dump({}, f, ensure_ascii=False)
|
|
f.flush()
|
|
|
|
class CmdConfig():
|
|
def __init__(self) -> None:
|
|
self.cached_config: dict = {}
|
|
self.init_configs()
|
|
|
|
def init_configs(self):
|
|
'''
|
|
初始化必需的配置项
|
|
'''
|
|
self.init_config_items(DEFAULT_CONFIG)
|
|
|
|
@staticmethod
|
|
def get(key, default=None):
|
|
'''
|
|
从文件系统中直接获取配置
|
|
'''
|
|
check_exist()
|
|
with open(cpath, "r", encoding="utf-8-sig") as f:
|
|
d = json.load(f)
|
|
if key in d:
|
|
return d[key]
|
|
else:
|
|
return default
|
|
|
|
def get_all(self):
|
|
'''
|
|
从文件系统中获取所有配置
|
|
'''
|
|
check_exist()
|
|
with open(cpath, "r", encoding="utf-8-sig") as f:
|
|
conf_str = f.read()
|
|
if conf_str.startswith(u'/ufeff'): # remove BOM
|
|
conf_str = conf_str.encode('utf8')[3:].decode('utf8')
|
|
conf = json.loads(conf_str)
|
|
return conf
|
|
|
|
def put(self, key, value):
|
|
with open(cpath, "r", encoding="utf-8-sig") as f:
|
|
d = json.load(f)
|
|
d[key] = value
|
|
with open(cpath, "w", encoding="utf-8-sig") as f:
|
|
json.dump(d, f, indent=2, ensure_ascii=False)
|
|
f.flush()
|
|
|
|
self.cached_config[key] = value
|
|
|
|
@staticmethod
|
|
def put_by_dot_str(key: str, value):
|
|
'''
|
|
根据点分割的字符串,将值写入配置文件
|
|
'''
|
|
with open(cpath, "r", encoding="utf-8-sig") as f:
|
|
d = json.load(f)
|
|
_d = d
|
|
_ks = key.split(".")
|
|
for i in range(len(_ks)):
|
|
if i == len(_ks) - 1:
|
|
_d[_ks[i]] = value
|
|
else:
|
|
_d = _d[_ks[i]]
|
|
with open(cpath, "w", encoding="utf-8-sig") as f:
|
|
json.dump(d, f, indent=2, ensure_ascii=False)
|
|
f.flush()
|
|
|
|
def init_config_items(self, d: dict):
|
|
conf = self.get_all()
|
|
|
|
if not self.cached_config:
|
|
self.cached_config = conf
|
|
|
|
_tag = False
|
|
|
|
for key, val in d.items():
|
|
if key not in conf:
|
|
conf[key] = val
|
|
_tag = True
|
|
if _tag:
|
|
with open(cpath, "w", encoding="utf-8-sig") as f:
|
|
json.dump(conf, f, indent=2, ensure_ascii=False)
|
|
f.flush()
|