Source code for quackamollie.core.bot.command.message_by_id

# -*- coding: utf-8 -*-
__all__ = ["message_by_id_router", "command_message_by_id_handler"]
__author__ = "QuacktorAI"
__copyright__ = "Copyright 2024, Forge of Absurd Ducks"
__credits__ = ["QuacktorAI"]

from aiogram import Router
from aiogram.enums import ParseMode
from aiogram.filters.command import Command
from aiogram.types import Message
from ast import literal_eval
from sqlalchemy import select
from sqlalchemy.orm import selectinload
from typing import Optional

from quackamollie.core.bot.decorator.permissions import permission_authorized
from quackamollie.core.cli.settings import pass_quackamollie_settings, QuackamollieSettings
from quackamollie.core.bot.decorator.acknowledge_with_reactions import acknowledge_with_reactions
from quackamollie.core.database.model import ChatMessage

message_by_id_router = Router()


[docs] @message_by_id_router.message(Command("message_by_id")) @permission_authorized @acknowledge_with_reactions @pass_quackamollie_settings async def command_message_by_id_handler(quackamollie_settings: QuackamollieSettings, message: Message): """ Handler for the `/message_by_id` command in Telegram chat, show a message content from its ID :param quackamollie_settings: The application settings initialized from click context :type quackamollie_settings: QuackamollieSettings :param message: The message as given by aiogram router :type message: Message """ # Get database session from settings async_session = quackamollie_settings.session # Get chat info from message chat_id: int = message.chat.id try: print(message.text) msg_id: int = literal_eval(str(message.text).replace("/message_by_id ", "")) except Exception: await message.answer("Bad formatting of identifier. Please use the command with" " <code>/message_by_id MESSAGE_ID</code> where <code>MESSAGE_ID</code> is the ID of the" " message you want to retrieve content from as given in brackets, i.e. '[]', by" " the command /history", parse_mode=ParseMode.HTML, disable_web_page_preview=True) return async with async_session() as session: chat_setting_result = await session.execute(select(ChatMessage).where( ChatMessage.id == msg_id ).where( ChatMessage.chat_id == chat_id ).options( selectinload(ChatMessage.user) )) chat_msg: Optional[ChatMessage] = chat_setting_result.scalars().first() if chat_msg: answer = f"[<code>{chat_msg.id}</code>] <code>{chat_msg.user.full_name}</code>: {chat_msg.content}" await message.answer(text=answer, parse_mode=ParseMode.HTML, disable_web_page_preview=True) else: await message.answer(text=f"No message found in current chat with the ID '{msg_id}'")