fix(chat): support body and content fields in world and DM chat messages; feat(audio): add sound toggle switch and mute controls
checkpoint / checkpoint (push) Successful in 6m11s

This commit is contained in:
2026-09-19 13:38:23 +00:00
parent 7b693899a7
commit 7abf37ea81
13 changed files with 558 additions and 14 deletions
+29 -2
View File
@@ -39,7 +39,7 @@ from datetime import datetime
from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, Query, status
from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, computed_field, model_validator
from sqlalchemy import and_, or_, select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import joinedload
@@ -68,9 +68,31 @@ _BODY_MAX_LEN = 4000
class SendWorldMessageRequest(BaseModel):
body: str = Field(..., min_length=1, max_length=_BODY_MAX_LEN)
body: str | None = Field(default=None, max_length=_BODY_MAX_LEN)
content: str | None = Field(default=None, max_length=_BODY_MAX_LEN)
room_id: int | None = None
@model_validator(mode="before")
@classmethod
def resolve_body_or_content(cls, data: object) -> object:
if isinstance(data, dict):
if not data.get("body") and data.get("content"):
data["body"] = data["content"]
elif not data.get("content") and data.get("body"):
data["content"] = data["body"]
return data
@model_validator(mode="after")
def check_non_empty(self) -> SendWorldMessageRequest:
text = self.body or self.content
if not text or len(text.strip()) < 1:
raise ValueError("Message body or content must not be empty")
if not self.body:
self.body = text
if not self.content:
self.content = text
return self
class AuthorInfo(BaseModel):
id: int | None
@@ -92,6 +114,11 @@ class WorldMessageResponse(BaseModel):
model_config = {"from_attributes": True}
@computed_field
@property
def content(self) -> str:
return self.body
class WorldMessageListResponse(BaseModel):
messages: list[WorldMessageResponse]