Как ограничить доступ к выполнению команд?
Всех приветствую! Подскажите, как правильно или как лучше сделать ограничение по выполнению команд? Необходимо, чтобы по выполнению команды (проверка уже реализована и работает правильно) бот молчал.
def check_id(message):
id = message.from_user.id
record = cursor.execute('SELECT * FROM table_table WHERE user_id=?', (id, )).fetchone()
if record:
return True
else:
return False
@bot.message_handler(func=lambda message: check_id(message) == False, commands=['help', 'menu', 'start'])
def some(message):
bot.send_message(message.chat.id, 'Нельзя') #Необходимо заменить эту строку или сделать что-то другое.
#Пустое сообщение бот отправить не может.
Ответы (2 шт):
# Ставим обрботчик на команду /start
@bot.message_handler(commands=['start'])
def process_start(message):
if message.chat.id == "1":
bot.send_message(1, "У вас есть права на данную команду")
else:
pass
Тут можно обойтись даже без else, просто если условине не верно, то ничего не произойдет.
# Ставим обрботчик на команду /start
@bot.message_handler(commands=['start'])
def process_start(message):
if message.chat.id == "1":
bot.send_message(1, "У вас есть права на данную команду")
Для начала, тебе придется это писать во всех командах (что глупо?)
Поэтому можно обойтись фильтрами:
filters.py
from aiogram import types
from aiogram.dispatcher.filters import BoundFilter
class IsBanned(BoundFilter):
key = "is_banned"
def __init__(self, is_banned):
self.is_banned = is_banned
async def check(self, message: types.Message):
with open("db.json", "r") as file:
db = json.load(file)
user_id = message.from_user.id
if str(user_id) in db.get("banned_users", {}):
return self.is_banned
return not self.is_banned
в handlers/users
from filters import IsBanned
dp.filters_factory.bind(IsBanned)
# Пропускаем не забаненных в боте
@dp.message_handler(IsBanned(False), CommandStart())
async def handle_all_messages(message: types.Message):
... code
#что будет показывать забаненным в боте
@dp.message_handler(IsBanned(True))
async def banned_user_handler(message: types.Message):
await message.answer("Вы забанены в боте.")
В этом коде явно показано использование фильтра. В отличии от того, чтобы указывать в коде забаненных, можно воспользоваться бд.json
}
"banned_users": {
"6187889732": {
"reason": "Banned by admin",
"banned_by": 5776777607
}
}
}
Таким образом фильтр будет получать тех кто находится в словаре и не пропускать.
Проставляй IsBanned(False) в хендлеры всех команд, для того, чтобы не пропускать забаненных к использованию команд и все :)