❇️ Телеграм-боти. Власний клас-фільтр.
Ми має код обробника у якому є if-else для визначення логіки звичайний користувач/адміністратор.
Але це не дуже добре:
1️⃣ Якщо в нас таких обробників буде багато, то if-else буде дублюватися і ускладнювати читання коду.
2️⃣ Ми не зможемо розділити логіку звич.користувачів і адміністраторів на різні файли-модулі.
Написання власного фільтра дозволить розбити логіку на два обробника.
Ми вже ознайомились з використанням готового бібліотечного фільтра Command та магічних фільтрів,
давайте напишемо тепер свій клас-фільтр:
from aiogram.filters import BaseFilter
class BotAdminFilter(BaseFilter):
async def __call__(
self,
message: Message,
settings: Settings
) -> bool | dict[str, Any]:
if message.from_user and message.from_user.id in settings.bot.admins:
return {"from_user": message.from_user}
return False
Як бачимо фільтр це клас який містить метод __call__ , отже об'єкти цього класу можуть викликатись як функції.
⚠️ Тип першого параметру __call__ буде залежати від типу події на яку підписуємось.
При виклику фільтр вертає:
▪️ вертає False якщо при цьому оновленні не треба викликати обробник — воно не підходить
▪️ вертає dict якщо треба викликати обробник і підставити у нього додатковий аргумент from_user
🔗 aiogram documentation: Writing own filters
@router.message(Command("start"), BotAdminFilter())
async def start_admin_handler(message: Message, from_user: User):
await message.answer(
f"<i>Hello admin</i> {html.unparse(from_user.first_name)}!",
parse_mode=ParseMode.HTML
)
@router.message(Command("start"), F.from_user.as_("from_user"))
async def start_handler(message: Message, from_user: User):
await message.answer(
f"<i>Hello</i> {html.unparse(from_user.first_name)}!",
parse_mode=ParseMode.HTML
)
👉Фільтр у aiogram:
1️⃣ Визначає чи буде викликаний вказаний обробник подій
2️⃣ Може додавати параметри у обробник, вертаючи їх у словнику
#tg_bots
❤1👍1
311 ·