@nemolayn
Создатель бота Nemo

Как распознавать что в обьекте Event именно сообщение, не добавление в чат, не админ промоутед или демоутед?

У меня есть мидлварь:
class CommandFlood(BaseMiddleware):
    def __init__(self, time_limit: int=4) -> None:
        self.limit = TTLCache(10_000, ttl=time_limit)

    async def __call__(
            self, 
            handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], 
            event: TelegramObject, 
            data: Dict[str, Any],
        ) -> Any:
            print(event)
            #...внутренности мидлваря
            return await handler(event, data)

Если мне приходит евент от добавления в чат то все ломается ну буквально нафиг.
Пытался сделать через
if not event.new_chat_user: pass
else: return await handler(event, data)

Ошибка что атрибут не найден.

Тело валидного event'a
imports
from typing import Callable, Awaitable, Dict, Any

from aiogram import BaseMiddleware
from aiogram.types import Message, TelegramObject
from loguru import logger

from cachetools import TTLCache
from utils.another import checkForCommand, cmdnoprefandargs
from database.db import models
from handlers.chat_commands import parse_time, timetovalidstr
from datetime import datetime
from utils.helping import admin_cmds
db = models()
  • Вопрос задан
  • 37 просмотров
Решения вопроса 1
@nemolayn Автор вопроса
Создатель бота Nemo
Немного переделал по ключам, которым if ищет bad events (не те евенты)
Теперь все не нужные отсеиваются. (просто пропускаются)
считаю такой вариант хороший, но возможно есть вариант получше.

if not event.message_id or not event.text: return await handler(event, data)
else: pass


UPD: Еще можно поменять типы в __call__:
from aiogram.types import Message

async def __call__(
            self, 
            handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], 
            event: Message, 
            data: Dict[str, Any],
        ) -> Any:
            if not event.message_id or not event.text: return await handler(event, data)
            else: pass
            #...внутренности мидлваря
            return await handler(event, data) # кстати данный ретурн обязательный :)

Но это не отсеивает event'ы т.к даже то что чел исключает чела имеет message_id (структуру сообщения, не знаю зачем и почему, в вк реализованы просто апдейты chat_invite_user / chat_remove_user, в vk-io так), поэтому верхний if все равно нужен. И то не факт что где то что то может и иметь такие поля, хотя как таковым сообщением не является.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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