73 lines
1.6 KiB
Python
73 lines
1.6 KiB
Python
from datetime import datetime
|
|
from typing import Any, Literal
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from app.messages.models import MessageType
|
|
|
|
|
|
RealtimeEventName = Literal[
|
|
"connect",
|
|
"disconnect",
|
|
"send_message",
|
|
"receive_message",
|
|
"message_updated",
|
|
"message_deleted",
|
|
"typing_start",
|
|
"typing_stop",
|
|
"recording_voice_start",
|
|
"recording_voice_stop",
|
|
"recording_video_start",
|
|
"recording_video_stop",
|
|
"message_read",
|
|
"message_delivered",
|
|
"user_online",
|
|
"user_offline",
|
|
"chat_updated",
|
|
"chat_deleted",
|
|
"pong",
|
|
"error",
|
|
]
|
|
|
|
|
|
class SendMessagePayload(BaseModel):
|
|
chat_id: int
|
|
type: MessageType = MessageType.TEXT
|
|
text: str | None = Field(default=None, max_length=4096)
|
|
temp_id: str | None = None
|
|
client_message_id: str | None = Field(default=None, min_length=8, max_length=64)
|
|
reply_to_message_id: int | None = None
|
|
|
|
|
|
class ChatEventPayload(BaseModel):
|
|
chat_id: int
|
|
|
|
|
|
class MessageStatusPayload(BaseModel):
|
|
chat_id: int
|
|
message_id: int
|
|
|
|
|
|
class IncomingRealtimeEvent(BaseModel):
|
|
event: Literal[
|
|
"send_message",
|
|
"typing_start",
|
|
"typing_stop",
|
|
"recording_voice_start",
|
|
"recording_voice_stop",
|
|
"recording_video_start",
|
|
"recording_video_stop",
|
|
"message_read",
|
|
"message_delivered",
|
|
"ping",
|
|
]
|
|
payload: dict[str, Any]
|
|
|
|
|
|
class OutgoingRealtimeEvent(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
event: RealtimeEventName
|
|
payload: dict[str, Any]
|
|
timestamp: datetime
|