This commit is contained in:
commit
46af290db3
100 files changed
+16663
No files matched your search
@@ -0,0 +1,135 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from config.settings import settings
|
||||
from models.bible import Character, Event, Location, StoryBible, StoryThread
|
||||
|
||||
from services.project_service import project_service
|
||||
|
||||
|
||||
class BibleService:
|
||||
def __init__(self):
|
||||
from config.settings import settings
|
||||
|
||||
self.data_dir = Path(settings.DATA_DIR)
|
||||
self.project_service = project_service
|
||||
|
||||
def _get_bible_file(self, project_id: str, user_id: str) -> Path:
|
||||
"""Получить путь к файлу Story Bible проекта"""
|
||||
project_dir = self.project_service.get_project_dir(project_id, user_id)
|
||||
return project_dir / "story_bible.json"
|
||||
|
||||
def _load_bible(self, project_id: str, user_id: str) -> StoryBible:
|
||||
"""Загрузить Story Bible проекта"""
|
||||
bible_file = self._get_bible_file(project_id, user_id)
|
||||
if bible_file.exists():
|
||||
with open(bible_file, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
return StoryBible(**data)
|
||||
else:
|
||||
# Инициализация с примером данных
|
||||
return self._create_sample_bible()
|
||||
|
||||
def _create_sample_bible(self) -> StoryBible:
|
||||
"""Создать пример Story Bible для тестирования"""
|
||||
return StoryBible(
|
||||
characters=[
|
||||
Character(
|
||||
name="Алекс",
|
||||
description="Главный герой, бывший архитектор",
|
||||
traits=["Циничный", "Справедливый", "Наблюдательный"],
|
||||
appearance="Высокий, темные волосы, шрам на левой руке",
|
||||
role="protagonist",
|
||||
),
|
||||
Character(
|
||||
name="Лира",
|
||||
description="Таинственная проводница",
|
||||
traits=["Загадочная", "Решительная"],
|
||||
appearance="Носит красный плащ, зеленые глаза",
|
||||
role="supporting",
|
||||
),
|
||||
],
|
||||
locations=[
|
||||
Location(
|
||||
name="Нижний Город",
|
||||
description="Старая часть города с узкими улочками",
|
||||
atmosphere="Вечный туман, запах озона и мокрого камня",
|
||||
type="city",
|
||||
)
|
||||
],
|
||||
events=[
|
||||
Event(
|
||||
title="Встреча с Лирой",
|
||||
description="Алекс встречает Лиру в тумане Нижнего Города",
|
||||
chapter="Глава 1",
|
||||
importance="major",
|
||||
)
|
||||
],
|
||||
threads=[
|
||||
StoryThread(
|
||||
title="Тайна хранилища",
|
||||
description="Поиск древнего хранилища знаний",
|
||||
status="active",
|
||||
related_characters=[],
|
||||
related_events=[],
|
||||
)
|
||||
],
|
||||
last_updated=datetime.now().isoformat(),
|
||||
)
|
||||
|
||||
def _save_bible(self, project_id: str, bible: StoryBible, user_id: str):
|
||||
"""Сохранить Story Bible проекта"""
|
||||
bible_file = self._get_bible_file(project_id, user_id)
|
||||
bible.last_updated = datetime.now().isoformat()
|
||||
with open(bible_file, "w", encoding="utf-8") as f:
|
||||
json.dump(bible.model_dump(), f, ensure_ascii=False, indent=2)
|
||||
|
||||
def get_bible(self, project_id: str, user_id: str) -> StoryBible:
|
||||
"""Получить Story Bible проекта"""
|
||||
return self._load_bible(project_id, user_id)
|
||||
|
||||
def update_bible(
|
||||
self, project_id: str, new_bible: StoryBible, user_id: str
|
||||
) -> StoryBible:
|
||||
"""Обновить Story Bible проекта"""
|
||||
self._save_bible(project_id, new_bible, user_id)
|
||||
return new_bible
|
||||
|
||||
def add_character(
|
||||
self, project_id: str, character: Character, user_id: str
|
||||
) -> Character:
|
||||
"""Добавить персонажа в проект"""
|
||||
bible = self._load_bible(project_id, user_id)
|
||||
bible.characters.append(character)
|
||||
self._save_bible(project_id, bible, user_id)
|
||||
return character
|
||||
|
||||
def add_location(
|
||||
self, project_id: str, location: Location, user_id: str
|
||||
) -> Location:
|
||||
"""Добавить локацию в проект"""
|
||||
bible = self._load_bible(project_id, user_id)
|
||||
bible.locations.append(location)
|
||||
self._save_bible(project_id, bible, user_id)
|
||||
return location
|
||||
|
||||
def add_event(self, project_id: str, event: Event, user_id: str) -> Event:
|
||||
"""Добавить событие в проект"""
|
||||
bible = self._load_bible(project_id, user_id)
|
||||
bible.events.append(event)
|
||||
self._save_bible(project_id, bible, user_id)
|
||||
return event
|
||||
|
||||
def add_thread(
|
||||
self, project_id: str, thread: StoryThread, user_id: str
|
||||
) -> StoryThread:
|
||||
"""Добавить сюжетную нить в проект"""
|
||||
bible = self._load_bible(project_id, user_id)
|
||||
bible.threads.append(thread)
|
||||
self._save_bible(project_id, bible, user_id)
|
||||
return thread
|
||||
|
||||
|
||||
# Singleton instance
|
||||
bible_service = BibleService()
|
||||
Reference in new issue
Block a user