есть админ лист, как мне сделать чтобы этот декоратор срабатывал только если юзер в админ листе? видел пример решение: from aiogram import Bot, Dispatcher, types from aiogram.types import Message class AdminChecker: def __init__(self, admins: list[int]): self.admins = admins def __call__(self, message: Message) -> bool: return message.from_user.id in self.admins async def main(): bot = Bot(token="YOUR_BOT_TOKEN") dp = Dispatcher(bot) admins = [12345678, 87654321] # Список ID администраторов admin_checker = AdminChecker(admins) @dp.message_handler(admin_checker) async def handle_admin(message: types.Message): await message.reply("Вы администратор!") Python from aiogram import Bot, Dispatcher, types from aiogram.types import Message class AdminChecker: def __init__(self, admins: list[int]): self.admins = admins def __call__(self, message: Message) -> bool: return message.from_user.id in self.admins async def main(): bot = Bot(token="YOUR_BOT_TOKEN") dp = Dispatcher(bot) admins = [12345678, 87654321] # Список ID администраторов admin_checker = AdminChecker(admins) @dp.message_handler(admin_checker) async def handle_admin(message: types.Message): await message.reply("Вы администратор!") Однако таким способом не получится сочитать параметры На данный момент юзаю: @router.message(CommandStart()) async def cmd_start(message: Message): if str(message.from_user.id) == (os.getenv('ADMIN_ID')): await message.answer('Пожалуйста, выберите действие:', reply_markup=kb.menu) Python @router.message(CommandStart()) async def cmd_start(message: Message): if str(message.from_user.id) == (os.getenv('ADMIN_ID')): await message.answer('Пожалуйста, выберите действие:', reply_markup=kb.menu) Дайте советов, как правильно это делать/как вы это делаете
Экстази, привет! Давай разберёмся, как можно улучшить проверку на админа в aiogram. Твой текущий подход с использованием декоратора `AdminChecker` выглядит неплохо, но ты упомянул, что он не позволяет сочетать параметры. Давай попробуем объединить оба подхода, чтобы сделать проверку более гибкой. Ты можешь использовать декоратор для проверки админа и при этом добавлять другие параметры, такие как команды. Вот пример, как это можно сделать: from aiogram import Bot, Dispatcher, types from aiogram.types import Message from aiogram.dispatcher.filters import CommandStart class AdminChecker: def __init__(self, admins: list[int]): self.admins = admins def __call__(self, message: Message) -> bool: return message.from_user.id in self.admins async def main(): bot = Bot(token="YOUR_BOT_TOKEN") dp = Dispatcher(bot) admins = [12345678, 87654321] # Список ID администраторов admin_checker = AdminChecker(admins) @dp.message_handler(CommandStart(), admin_checker) async def handle_admin_start(message: types.Message): await message.reply("Вы администратор и использовали команду /start!") # Другие обработчики... Python from aiogram import Bot, Dispatcher, types from aiogram.types import Message from aiogram.dispatcher.filters import CommandStart class AdminChecker: def __init__(self, admins: list[int]): self.admins = admins def __call__(self, message: Message) -> bool: return message.from_user.id in self.admins async def main(): bot = Bot(token="YOUR_BOT_TOKEN") dp = Dispatcher(bot) admins = [12345678, 87654321] # Список ID администраторов admin_checker = AdminChecker(admins) @dp.message_handler(CommandStart(), admin_checker) async def handle_admin_start(message: types.Message): await message.reply("Вы администратор и использовали команду /start!") # Другие обработчики... В этом примере мы используем `@dp.message_handler(CommandStart(), admin_checker)`, чтобы обработчик срабатывал только если пользователь является администратором и использовал команду `/start`. Таким образом, ты можешь комбинировать различные фильтры и декораторы, чтобы более гибко настраивать обработку сообщений. Если у тебя есть ещё вопросы или нужна помощь, дай знать!
class IsAdminFilter(BaseFilter): async def __call__(self, message: Message) -> bool: return message.from_user.id in admin_ids Python class IsAdminFilter(BaseFilter): async def __call__(self, message: Message) -> bool: return message.from_user.id in admin_ids юзай такой фильтр, потом ставишь его к роутеру через router.message.filter(IsAdminFilter())
class IsAdmin(BaseFilter): async def __call__(self, message: Message) -> bool: return message.from_user.id in config.ADMIN_ID Python class IsAdmin(BaseFilter): async def __call__(self, message: Message) -> bool: return message.from_user.id in config.ADMIN_ID у меня в проекте так
Окулист, у меня все функции поделены на файлы, поэтому я создаю сначала base_router тебе же можно и без него, так как если я ставлю фильтр на каждый роутер отдельно, то у меня фильтры срабатывают столько раз, сколько у меня роутер в проекте
как вариант всему роутеру сделать фильтр: from aiogram.filters import Filter from aiogram import Router ADMINS = [] class IsAdmin(Filter): async def __call__(self, message: Message) -> bool: return message.from_user.id in ADMINS adminRouter = Router() adminRouter.callback_query.filter(IsAdmin()) adminRouter.message.filter(IsAdmin()) Python from aiogram.filters import Filter from aiogram import Router ADMINS = [] class IsAdmin(Filter): async def __call__(self, message: Message) -> bool: return message.from_user.id in ADMINS adminRouter = Router() adminRouter.callback_query.filter(IsAdmin()) adminRouter.message.filter(IsAdmin())