[feat] add settings with some example schema, initialization and run functionality

This commit is contained in:
h
2025-03-28 21:59:59 +02:00
parent 1a5fd5977e
commit 0f17c1f314
29 changed files with 891 additions and 23 deletions

View File

@@ -0,0 +1 @@
from .models import UserSettingsDocument

View File

@@ -1,4 +1,5 @@
import asyncio
from utils import env

View File

@@ -0,0 +1 @@
from .settings import UserSettingsDocument

View File

@@ -0,0 +1,53 @@
from typing import Any
from beanie import Document
from pydantic import Field
from bot.modules.settings import UserSettings
class UserSettingsDocument(Document):
user_id: int
settings: UserSettings = Field(default_factory=UserSettings)
class Settings:
name = "user_settings"
indexes = ["user_id"]
@classmethod
async def get_user_settings(cls, user_id: int) -> UserSettings:
doc = await cls.find_one(cls.user_id == user_id)
if not doc:
doc = cls(user_id=user_id)
await doc.insert()
return doc.settings
async def update_settings(self, settings: UserSettings) -> None:
self.settings = settings
await self.save()
@classmethod
async def update_section(cls, user_id: int, section: str, value: Any) -> None:
doc = await cls.find_one(cls.user_id == user_id)
if not doc:
doc = cls(user_id=user_id)
setattr(doc.settings, section, value)
await doc.insert()
else:
setattr(doc.settings, section, value)
await doc.save()
@classmethod
async def update_field(
cls, user_id: int, section: str, field: str, value: Any
) -> None:
doc = await cls.find_one(cls.user_id == user_id)
if not doc:
doc = cls(user_id=user_id)
section_obj = getattr(doc.settings, section)
setattr(section_obj, field, value)
await doc.insert()
else:
section_obj = getattr(doc.settings, section)
setattr(section_obj, field, value)
await doc.save()

View File

@@ -1,5 +1,5 @@
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict
class BotSettings(BaseSettings):

View File

@@ -5,7 +5,6 @@ from rich.logging import RichHandler
from . import env
console = Console(
width=env.log.console_width,
color_system="auto",