From 4eace3f84e77d52a741d2dacd603fefbed09499b Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Sat, 16 Aug 2025 15:21:11 +0000 Subject: [PATCH] feat(chat): complete sliences --- app/database/chat.py | 12 ++++++++++++ app/router/chat/channel.py | 26 ++++++++++++++++++++++++++ app/router/chat/message.py | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/app/database/chat.py b/app/database/chat.py index 777e2ac..29334d6 100644 --- a/app/database/chat.py +++ b/app/database/chat.py @@ -226,3 +226,15 @@ class SilenceUser(UTCBaseModel, SQLModel, table=True): banned_at: datetime = Field( sa_column=Column(DateTime, index=True), default=datetime.now(UTC) ) + + +class UserSilenceResp(SQLModel): + id: int + user_id: int + + @classmethod + def from_db(cls, db_silence: SilenceUser) -> "UserSilenceResp": + return cls( + id=db_silence.id, + user_id=db_silence.user_id, + ) diff --git a/app/router/chat/channel.py b/app/router/chat/channel.py index ceb7b66..2b42dfe 100644 --- a/app/router/chat/channel.py +++ b/app/router/chat/channel.py @@ -6,6 +6,9 @@ from app.database.chat import ( ChannelType, ChatChannel, ChatChannelResp, + ChatMessage, + SilenceUser, + UserSilenceResp, ) from app.database.lazer_user import User, UserResp from app.dependencies.database import get_db, get_redis @@ -54,6 +57,29 @@ async def get_update( else None, ) ) + if "sliences" in includes: + if history_since: + silences = ( + await session.exec( + select(SilenceUser).where(col(SilenceUser.id) > history_since) + ) + ).all() + resp.silences.extend( + [UserSilenceResp.from_db(silence) for silence in silences] + ) + elif since: + msg = await session.get(ChatMessage, since) + if msg: + silences = ( + await session.exec( + select(SilenceUser).where( + col(SilenceUser.banned_at) > msg.timestamp + ) + ) + ).all() + resp.silences.extend( + [UserSilenceResp.from_db(silence) for silence in silences] + ) return resp diff --git a/app/router/chat/message.py b/app/router/chat/message.py index 5c7c1bd..6a4a2e4 100644 --- a/app/router/chat/message.py +++ b/app/router/chat/message.py @@ -7,6 +7,8 @@ from app.database.chat import ( ChatChannelResp, ChatMessage, MessageType, + SilenceUser, + UserSilenceResp, ) from app.database.lazer_user import User from app.dependencies.database import get_db, get_redis @@ -18,12 +20,16 @@ from .banchobot import bot from .server import server from fastapi import Depends, HTTPException, Query, Security -from pydantic import BaseModel +from pydantic import BaseModel, Field from redis.asyncio import Redis from sqlmodel import col, select from sqlmodel.ext.asyncio.session import AsyncSession +class KeepAliveResp(BaseModel): + silences: list[UserSilenceResp] = Field(default_factory=list) + + @router.post("/chat/ack") async def keep_alive( history_since: int | None = Query(None), @@ -31,7 +37,29 @@ async def keep_alive( current_user: User = Security(get_current_user, scopes=["chat.read"]), session: AsyncSession = Depends(get_db), ): - return {"silences": []} + resp = KeepAliveResp() + if history_since: + silences = ( + await session.exec( + select(SilenceUser).where(col(SilenceUser.id) > history_since) + ) + ).all() + resp.silences.extend([UserSilenceResp.from_db(silence) for silence in silences]) + elif since: + msg = await session.get(ChatMessage, since) + if msg: + silences = ( + await session.exec( + select(SilenceUser).where( + col(SilenceUser.banned_at) > msg.timestamp + ) + ) + ).all() + resp.silences.extend( + [UserSilenceResp.from_db(silence) for silence in silences] + ) + + return resp class MessageReq(BaseModel):