from abc import ABCMeta, abstractmethod from pathlib import Path from aiocache import cached, Cache # type: ignore from server.infra.db import AsyncDB from server.modules.descriptions.domain import Breed class ACharactersRepository(metaclass=ABCMeta): @abstractmethod async def get_characters(self) -> list[Breed]: pass async def get_character(self, alias: str) -> Breed | None: pass class CharactersRepository(ACharactersRepository): def __init__(self): pass @cached(ttl=60, cache=Cache.MEMORY) async def get_characters(self) -> list[Breed]: breed_dir = Path("server/modules/descriptions/repository/breed_descriptions") breeds: list[Breed] = [] # Идем по каждому текстовому файлу с описанием породы for breed_file in breed_dir.glob("*.txt"): breed_name = breed_file.stem # имя файла без расширения - название породы description = breed_file.read_text( encoding="utf-8" ) # читаем описание из файла breeds.append( Breed( name=breed_name.replace("_", " "), alias=breed_file.stem, description=description.strip(), ) ) breeds.sort(key=lambda b: b.name) return breeds async def get_character(self, alias: str) -> Breed | None: breeds = await self.get_characters() data = [b for b in breeds if b.alias == alias] if len(data) == 0: return None return data[0] class PGCharactersRepository(ACharactersRepository): _db: AsyncDB def __init__(self, db: AsyncDB): self._db = db @cached(ttl=60, cache=Cache.MEMORY) async def get_characters(self) -> list[Breed]: breed_dir = Path("server/modules/descriptions/repository/breed_descriptions") breeds: list[Breed] = [] # Идем по каждому текстовому файлу с описанием породы for breed_file in breed_dir.glob("*.txt"): breed_name = breed_file.stem # имя файла без расширения - название породы description = breed_file.read_text( encoding="utf-8" ) # читаем описание из файла breeds.append( Breed( name=breed_name.replace("_", " "), alias=breed_file.stem, description=description.strip(), ) ) breeds.sort(key=lambda b: b.name) return breeds async def get_character(self, alias: str) -> Breed | None: breeds = await self.get_characters() data = [b for b in breeds if b.alias == alias] if len(data) == 0: return None return data[0]