ayaka.storage
读写本地文件
1'''读写本地文件''' 2import json 3from pathlib import Path 4from typing import TYPE_CHECKING 5from .json_ctrl import AbstractJsonCtrl 6 7if TYPE_CHECKING: 8 from .ayaka import AyakaApp 9 10 11class AyakaStorage: 12 def __init__(self, app: "AyakaApp") -> None: 13 self.app = app 14 15 def plugin_path(self, *names): 16 '''获取路径 <create_app_file>/../*names''' 17 names = [str(name) for name in names] 18 path = Path(self.app.path.parent, *names) 19 return AyakaPath(path) 20 21 def group_path(self, *names): 22 '''获取路径 data/groups/<bod_id>/<group_id>/<app.name>/*names''' 23 names = [ 24 "data", "groups", 25 self.app.bot_id, 26 self.app.group_id, 27 self.app.name, 28 *names 29 ] 30 names = [str(name) for name in names] 31 path = Path(*names) 32 return AyakaPath(path) 33 34 35class AyakaPath: 36 '''文件夹路径''' 37 38 def __init__(self, path=Path("test")) -> None: 39 self.path = path 40 if not path.exists(): 41 path.mkdir(parents=True) 42 43 def iterdir(self): 44 return self.path.iterdir() 45 46 def file(self, name, default=None): 47 path = self.path / str(name) 48 file = AyakaFile(path) 49 if not path.exists() and default is not None: 50 file.save(default) 51 return file 52 53 def json(self, name, default={}): 54 path = self.path / str(name) 55 path = path.with_suffix(".json") 56 file = AyakaJsonFile(path) 57 if not path.exists(): 58 file.save(default) 59 return file 60 61 62class AyakaFile: 63 '''文件''' 64 65 def __init__(self, path: Path): 66 self.path = path 67 68 def load(self): 69 with self.path.open("r", encoding="utf8") as f: 70 data = f.read() 71 return data 72 73 def save(self, data): 74 with self.path.open("w+", encoding="utf8") as f: 75 f.write(str(data)) 76 77 78class AyakaJsonFile: 79 '''JSON文件''' 80 81 def __init__(self, path: Path) -> None: 82 self.path = path 83 84 def chain(self, *keys): 85 return AyakaJsonFileCtrl(self.path, *keys) 86 87 def load(self): 88 with self.path.open("r", encoding="utf8") as f: 89 data = json.load(f) 90 return data 91 92 def save(self, data): 93 with self.path.open("w+", encoding="utf8") as f: 94 json.dump(data, f, ensure_ascii=False) 95 96 97class AyakaJsonFileCtrl(AbstractJsonCtrl): 98 '''AyakaJsonFileCtrl实际上可兼容替代AyakaJsonFile,但是为了避免语义上的混乱,仍分作两个类''' 99 100 def __init__(self, path: Path, *keys) -> None: 101 self._path = path 102 self._keys = [str(k) for k in keys] 103 104 def _load(self): 105 with self._path.open("r", encoding="utf8") as f: 106 data = json.load(f) 107 return data 108 109 def _save(self, data): 110 with self._path.open("w+", encoding="utf8") as f: 111 json.dump(data, f, ensure_ascii=False) 112 113 def chain(self, *keys): 114 return AyakaJsonFileCtrl(self._path, *self._keys, *keys)
class
AyakaStorage:
12class AyakaStorage: 13 def __init__(self, app: "AyakaApp") -> None: 14 self.app = app 15 16 def plugin_path(self, *names): 17 '''获取路径 <create_app_file>/../*names''' 18 names = [str(name) for name in names] 19 path = Path(self.app.path.parent, *names) 20 return AyakaPath(path) 21 22 def group_path(self, *names): 23 '''获取路径 data/groups/<bod_id>/<group_id>/<app.name>/*names''' 24 names = [ 25 "data", "groups", 26 self.app.bot_id, 27 self.app.group_id, 28 self.app.name, 29 *names 30 ] 31 names = [str(name) for name in names] 32 path = Path(*names) 33 return AyakaPath(path)
AyakaStorage(app: ayaka.ayaka.AyakaApp)
def
plugin_path(self, *names):
16 def plugin_path(self, *names): 17 '''获取路径 <create_app_file>/../*names''' 18 names = [str(name) for name in names] 19 path = Path(self.app.path.parent, *names) 20 return AyakaPath(path)
获取路径
def
group_path(self, *names):
22 def group_path(self, *names): 23 '''获取路径 data/groups/<bod_id>/<group_id>/<app.name>/*names''' 24 names = [ 25 "data", "groups", 26 self.app.bot_id, 27 self.app.group_id, 28 self.app.name, 29 *names 30 ] 31 names = [str(name) for name in names] 32 path = Path(*names) 33 return AyakaPath(path)
获取路径 data/groups/
class
AyakaPath:
36class AyakaPath: 37 '''文件夹路径''' 38 39 def __init__(self, path=Path("test")) -> None: 40 self.path = path 41 if not path.exists(): 42 path.mkdir(parents=True) 43 44 def iterdir(self): 45 return self.path.iterdir() 46 47 def file(self, name, default=None): 48 path = self.path / str(name) 49 file = AyakaFile(path) 50 if not path.exists() and default is not None: 51 file.save(default) 52 return file 53 54 def json(self, name, default={}): 55 path = self.path / str(name) 56 path = path.with_suffix(".json") 57 file = AyakaJsonFile(path) 58 if not path.exists(): 59 file.save(default) 60 return file
文件夹路径
class
AyakaFile:
63class AyakaFile: 64 '''文件''' 65 66 def __init__(self, path: Path): 67 self.path = path 68 69 def load(self): 70 with self.path.open("r", encoding="utf8") as f: 71 data = f.read() 72 return data 73 74 def save(self, data): 75 with self.path.open("w+", encoding="utf8") as f: 76 f.write(str(data))
文件
class
AyakaJsonFile:
79class AyakaJsonFile: 80 '''JSON文件''' 81 82 def __init__(self, path: Path) -> None: 83 self.path = path 84 85 def chain(self, *keys): 86 return AyakaJsonFileCtrl(self.path, *keys) 87 88 def load(self): 89 with self.path.open("r", encoding="utf8") as f: 90 data = json.load(f) 91 return data 92 93 def save(self, data): 94 with self.path.open("w+", encoding="utf8") as f: 95 json.dump(data, f, ensure_ascii=False)
JSON文件
98class AyakaJsonFileCtrl(AbstractJsonCtrl): 99 '''AyakaJsonFileCtrl实际上可兼容替代AyakaJsonFile,但是为了避免语义上的混乱,仍分作两个类''' 100 101 def __init__(self, path: Path, *keys) -> None: 102 self._path = path 103 self._keys = [str(k) for k in keys] 104 105 def _load(self): 106 with self._path.open("r", encoding="utf8") as f: 107 data = json.load(f) 108 return data 109 110 def _save(self, data): 111 with self._path.open("w+", encoding="utf8") as f: 112 json.dump(data, f, ensure_ascii=False) 113 114 def chain(self, *keys): 115 return AyakaJsonFileCtrl(self._path, *self._keys, *keys)
AyakaJsonFileCtrl实际上可兼容替代AyakaJsonFile,但是为了避免语义上的混乱,仍分作两个类