Как организовать функцию мута в Telegram чате через упомнание юзеров в Aiogram 3?

Это мог бы быть неплохой код:
Код предпологаемой функции
import asyncio
from aiogram import Router, types, F
from aiogram.filters import Command
from datetime import datetime, timedelta

router = Router()
router.message.filter(F.chat.id == '1234567890')

MUTE_P = {
    'can_send_messages': False,
    'can_send_documents': False,
    'can_send_photos': False,
    'can_send_videos': False,
    'can_send_video_notes': False,
    'can_send_voice_notes': False,
    'can_send_polls': False,
    'can_send_other_messages': False,
    'can_add_web_page_preview': False,
}


@router.message(Command("mute"))
async def c_mute(message: types.Message):
    if message.entities:
        # Собираем юзеров для бана
        users_to_mute = [e.user for e in message.entities if e.type == 'text_mention']
        
        # Если список не пуст
        if users_to_mute:
            arg = message.text.rsplit(maxsplit=1)[-1]  # в конце сообщения время мута
            mute_min = int(arg) if arg.isdigit() else 120  # определяем есть ли цифра
            mute_time = datetime.now() + timedelta(minutes=mute_min)  # определяем время

            targets = []

            # Проходим циклом по списку и даём ограничения
            for usr in users_to_mute:
                await message.chat.restrict(usr.id, types.ChatPermissions(**MUTE_P), until_date=mute_time)
                targets.append(f'<b>{usr.full_name}</b> id:<code>{usr.id}</code>')

            # Собираем и отправляем отчёт в чат
            targets_str = '\n'.join(targets)
            text = f" Юзеры:\n{targets_str}\nВ муте на <b>{mute_min}</b> минут"
            await message.answer(text, parse_mode='html')
        # Если список пуст
        else:
            tmp = await message.reply(' Нет упоминания юзеров')
            await asyncio.sleep(5)
            await tmp.delete()

Но, к сожалению, при упоминании пользователей в чате через собачку @, то имеющие юзернейм пользователи упоминаются не текстовой ссылкой, а так @_username . Это уже другой тип message_entities - mention , в отличие от text_mention не содержит объекта user внутри. Сначала думал выйти из положения тем, чтобы вытащить юзернейм из сообщения, но бот Aiogram (и скорее всего любой бот) работает только с user_id. Метот get_chat_member() тоже работает только с user_id.

Подскажите какие есть варианты выйти из ситуации, чтобы обработать юзернеймы @_username из сообщения?
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Варианты:
1 веди базу данных всех юзеров чата, тогда сопоставишь username и id
2. сделай команду mute как ответ на сообщения юзера, которого хочешь замутить, тогда у тебя будет ссылка на это сообщение, откуда ты достанешь id юзера
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы