feat(chat): complete sliences
This commit is contained in:
@@ -226,3 +226,15 @@ class SilenceUser(UTCBaseModel, SQLModel, table=True):
|
|||||||
banned_at: datetime = Field(
|
banned_at: datetime = Field(
|
||||||
sa_column=Column(DateTime, index=True), default=datetime.now(UTC)
|
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,
|
||||||
|
)
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ from app.database.chat import (
|
|||||||
ChannelType,
|
ChannelType,
|
||||||
ChatChannel,
|
ChatChannel,
|
||||||
ChatChannelResp,
|
ChatChannelResp,
|
||||||
|
ChatMessage,
|
||||||
|
SilenceUser,
|
||||||
|
UserSilenceResp,
|
||||||
)
|
)
|
||||||
from app.database.lazer_user import User, UserResp
|
from app.database.lazer_user import User, UserResp
|
||||||
from app.dependencies.database import get_db, get_redis
|
from app.dependencies.database import get_db, get_redis
|
||||||
@@ -54,6 +57,29 @@ async def get_update(
|
|||||||
else None,
|
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
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ from app.database.chat import (
|
|||||||
ChatChannelResp,
|
ChatChannelResp,
|
||||||
ChatMessage,
|
ChatMessage,
|
||||||
MessageType,
|
MessageType,
|
||||||
|
SilenceUser,
|
||||||
|
UserSilenceResp,
|
||||||
)
|
)
|
||||||
from app.database.lazer_user import User
|
from app.database.lazer_user import User
|
||||||
from app.dependencies.database import get_db, get_redis
|
from app.dependencies.database import get_db, get_redis
|
||||||
@@ -18,12 +20,16 @@ from .banchobot import bot
|
|||||||
from .server import server
|
from .server import server
|
||||||
|
|
||||||
from fastapi import Depends, HTTPException, Query, Security
|
from fastapi import Depends, HTTPException, Query, Security
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel, Field
|
||||||
from redis.asyncio import Redis
|
from redis.asyncio import Redis
|
||||||
from sqlmodel import col, select
|
from sqlmodel import col, select
|
||||||
from sqlmodel.ext.asyncio.session import AsyncSession
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
||||||
|
|
||||||
|
|
||||||
|
class KeepAliveResp(BaseModel):
|
||||||
|
silences: list[UserSilenceResp] = Field(default_factory=list)
|
||||||
|
|
||||||
|
|
||||||
@router.post("/chat/ack")
|
@router.post("/chat/ack")
|
||||||
async def keep_alive(
|
async def keep_alive(
|
||||||
history_since: int | None = Query(None),
|
history_since: int | None = Query(None),
|
||||||
@@ -31,7 +37,29 @@ async def keep_alive(
|
|||||||
current_user: User = Security(get_current_user, scopes=["chat.read"]),
|
current_user: User = Security(get_current_user, scopes=["chat.read"]),
|
||||||
session: AsyncSession = Depends(get_db),
|
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):
|
class MessageReq(BaseModel):
|
||||||
|
|||||||
Reference in New Issue
Block a user