feat: add waveform voice messages end-to-end
All checks were successful
CI / test (push) Successful in 23s
All checks were successful
CI / test (push) Successful in 23s
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import json
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
@@ -5,6 +7,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from app.chats import repository as chats_repository
|
||||
from app.chats.models import ChatMemberRole, ChatType
|
||||
from app.chats.service import ensure_chat_membership
|
||||
from app.media import repository as media_repository
|
||||
from app.messages import repository
|
||||
from app.messages.models import Message
|
||||
from app.messages.spam_guard import enforce_message_spam_policy
|
||||
@@ -110,11 +113,32 @@ async def get_messages(
|
||||
messages = await repository.list_chat_messages(db, chat_id, user_id=user_id, limit=safe_limit, before_id=before_id)
|
||||
if not messages:
|
||||
return messages
|
||||
message_ids = [message.id for message in messages]
|
||||
attachments = await media_repository.list_attachments_by_message_ids(db, message_ids=message_ids)
|
||||
waveform_by_message_id: dict[int, list[int]] = {}
|
||||
for attachment in attachments:
|
||||
if not attachment.waveform_data:
|
||||
continue
|
||||
try:
|
||||
parsed = json.loads(attachment.waveform_data)
|
||||
except Exception:
|
||||
continue
|
||||
if not isinstance(parsed, list):
|
||||
continue
|
||||
values: list[int] = []
|
||||
for item in parsed[:256]:
|
||||
if isinstance(item, (int, float)):
|
||||
values.append(max(0, min(31, int(item))))
|
||||
if values:
|
||||
waveform_by_message_id[attachment.message_id] = values
|
||||
receipts = await repository.list_chat_receipts(db, chat_id=chat_id)
|
||||
other_receipts = [receipt for receipt in receipts if receipt.user_id != user_id]
|
||||
if not other_receipts:
|
||||
return messages
|
||||
for message in messages:
|
||||
waveform = waveform_by_message_id.get(message.id)
|
||||
if waveform:
|
||||
setattr(message, "attachment_waveform", waveform)
|
||||
if message.sender_id != user_id:
|
||||
continue
|
||||
is_read = any((receipt.last_read_message_id or 0) >= message.id for receipt in other_receipts)
|
||||
|
||||
Reference in New Issue
Block a user