feat(bot): add basic in-db message storage (no attachments yet)
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
from aiogram import Router
|
from aiogram import Router
|
||||||
|
|
||||||
|
from bot.middlewares import MessageSaverMiddleware
|
||||||
|
|
||||||
from . import (
|
from . import (
|
||||||
initialize,
|
initialize,
|
||||||
message,
|
message,
|
||||||
@@ -9,6 +11,9 @@ from . import (
|
|||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
|
|
||||||
|
router.message.outer_middleware(MessageSaverMiddleware())
|
||||||
|
|
||||||
|
|
||||||
router.include_routers(
|
router.include_routers(
|
||||||
start.router,
|
start.router,
|
||||||
initialize.router,
|
initialize.router,
|
||||||
|
|||||||
1
src/bot/middlewares/__init__.py
Normal file
1
src/bot/middlewares/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .saver import MessageSaverMiddleware
|
||||||
46
src/bot/middlewares/saver.py
Normal file
46
src/bot/middlewares/saver.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
from typing import Any, Awaitable, Callable, Dict, TypeVar
|
||||||
|
|
||||||
|
from aiogram import BaseMiddleware, types
|
||||||
|
|
||||||
|
from utils.db.models.message_log import MessageAttachment, MessageLog
|
||||||
|
|
||||||
|
|
||||||
|
class MessageSaverMiddleware(BaseMiddleware):
|
||||||
|
async def __call__(
|
||||||
|
self,
|
||||||
|
handler: Callable[[types.TelegramObject, Dict[str, Any]], Awaitable[Any]],
|
||||||
|
event: types.Message,
|
||||||
|
data: Dict[str, Any],
|
||||||
|
):
|
||||||
|
await MessageLog(
|
||||||
|
chat_id=event.chat.id,
|
||||||
|
message_id=event.message_id,
|
||||||
|
user_id=event.from_user.id,
|
||||||
|
username=event.from_user.username,
|
||||||
|
first_name=event.from_user.first_name,
|
||||||
|
last_name=event.from_user.last_name,
|
||||||
|
text=event.text or event.caption,
|
||||||
|
timestamp=event.date,
|
||||||
|
reply_to_message_id=(
|
||||||
|
event.reply_to_message.message_id if event.reply_to_message else None
|
||||||
|
),
|
||||||
|
forward_from_type=(
|
||||||
|
event.forward_origin.type if event.forward_origin else None
|
||||||
|
),
|
||||||
|
original_message_date=(
|
||||||
|
event.forward_origin.date if event.forward_origin else None
|
||||||
|
),
|
||||||
|
original_message_author=(
|
||||||
|
event.forward_origin.sender_user.full_name
|
||||||
|
if (event.forward_origin and event.forward_origin.sender_user)
|
||||||
|
else None
|
||||||
|
),
|
||||||
|
original_message_author_id=(
|
||||||
|
event.forward_origin.sender_user.id
|
||||||
|
if (event.forward_origin and event.forward_origin.sender_user)
|
||||||
|
else None
|
||||||
|
),
|
||||||
|
# attachment_file_ids=sum([] for attachment in [event.photo])
|
||||||
|
).insert()
|
||||||
|
|
||||||
|
return await handler(event, data)
|
||||||
@@ -9,6 +9,7 @@ client = AsyncMongoClient(env.db.connection_url)
|
|||||||
async def init_db():
|
async def init_db():
|
||||||
from .models import (
|
from .models import (
|
||||||
DynamicConfig,
|
DynamicConfig,
|
||||||
|
MessageLog,
|
||||||
RespondSession,
|
RespondSession,
|
||||||
ReviewSession,
|
ReviewSession,
|
||||||
)
|
)
|
||||||
@@ -19,5 +20,6 @@ async def init_db():
|
|||||||
DynamicConfig,
|
DynamicConfig,
|
||||||
RespondSession,
|
RespondSession,
|
||||||
ReviewSession,
|
ReviewSession,
|
||||||
|
MessageLog,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
from .config import DynamicConfig
|
from .config import DynamicConfig
|
||||||
|
from .message_log import MessageLog
|
||||||
from .session import RespondSession, ReviewSession
|
from .session import RespondSession, ReviewSession
|
||||||
|
|||||||
44
src/utils/db/models/message_log.py
Normal file
44
src/utils/db/models/message_log.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import datetime
|
||||||
|
from typing import Annotated, Optional
|
||||||
|
|
||||||
|
from aiogram.enums.message_origin_type import MessageOriginType
|
||||||
|
from beanie import Document, Indexed
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
|
||||||
|
class MessageAttachment(BaseModel):
|
||||||
|
file_id: str
|
||||||
|
file_size: int
|
||||||
|
file_name: str
|
||||||
|
mime_type: str
|
||||||
|
|
||||||
|
|
||||||
|
class MessageLogBase(BaseModel):
|
||||||
|
chat_id: Annotated[int, Indexed()]
|
||||||
|
message_id: Annotated[int, Indexed()]
|
||||||
|
|
||||||
|
user_id: Annotated[int, Indexed()]
|
||||||
|
username: Optional[str] = None
|
||||||
|
first_name: str
|
||||||
|
last_name: Optional[str] = None
|
||||||
|
|
||||||
|
text: Optional[str]
|
||||||
|
timestamp: datetime.datetime
|
||||||
|
reply_to_message_id: Optional[int] = None
|
||||||
|
|
||||||
|
forward_from_type: Optional[MessageOriginType] = None
|
||||||
|
original_message_date: Optional[datetime.datetime] = None
|
||||||
|
original_message_author: Optional[str] = None
|
||||||
|
original_message_author_id: Optional[int] = None
|
||||||
|
|
||||||
|
attachment_file_ids: list[str] = Field(default_factory=list)
|
||||||
|
|
||||||
|
|
||||||
|
class MessageLog(MessageLogBase, Document):
|
||||||
|
class Settings:
|
||||||
|
name = "message_logs"
|
||||||
|
indexes = [[("chat_id", 1), ("timestamp", -1)]]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_n_messages(cls, chat_id: int, n: int):
|
||||||
|
return cls.find(cls.chat_id == chat_id).sort("timestamp", "-").limit(n)
|
||||||
Reference in New Issue
Block a user