feat(chat): complete sliences

This commit is contained in:
MingxuanGame
2025-08-16 15:21:11 +00:00
parent 3f3afab480
commit 4eace3f84e
3 changed files with 68 additions and 2 deletions

View File

@@ -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,
)

View File

@@ -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

View File

@@ -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):