Как ограничить доступ к командам бота на заданое время

Как ограничить выполнение команды на несколько секунд. Если команду вызвал один пользователь то доступ для этой команды для всех пользователей ограничен на время. А если кто то пробует вызвать команду то появляеться алерт что команду нельзя использовать столько то времени. На форуме нашел решение, но там не могу написать коментарий пока.

@dp.message_handler(commands='weather')
async def command_weather(message: types.Message):
    await message.answer(weather.get_weather())    
    last_time = datetime.now()
    
    delta = datetime.now() - last_time
    if delta.second > 30:
        await message.answer(weather.get_weather())    
    else:
        Тут алерт ('Извините 30 секунд ещё не прошло')

Там было так описано... но выходит если команду вызвать то команда все таки будет использована, а потом уже сработает условие...

import datetime

current_datetime = datetime.now()

IndentationError: unexpected indent


Ответы (2 шт):

Автор решения: oleksandrigo

Пробуйте

from datetime import datetime, timedelta

last_time = datetime.now() - timedelta(seconds=30)


@dp.message_handler(commands='weather')
async def command_weather(message: types.Message):
    global last_time
    if (datetime.now() - last_time).seconds < 30:
        await message.answer("Слишком часто")
        return

    await message.answer(weather.get_weather())
    last_time = datetime.now()

Пример
введите сюда описание изображения

UPD
Пример для инлайн кнопок

last_time = datetime.now() - timedelta(seconds=30)


@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.answer("text", reply_markup=types.InlineKeyboardMarkup().add(
        types.InlineKeyboardButton(text="Погода", callback_data="weather")))


@dp.callback_query_handler(text='weather')
async def command_weather(call: types.CallbackQuery):
    global last_time
    if (datetime.now() - last_time).seconds < 30:
        await call.answer("Слишком часто")
        return

    await call.message.answer("weather.get_weather()")
    last_time = datetime.now()
→ Ссылка
Автор решения: MSerega

Как оказалось у aiogram уже есть готовое решение. Я просто не знал как правильно оно называется.

https://docs.aiogram.dev/en/latest/examples/throtling_example.html

from aiogram.utils.exceptions import Throttled


 @dp.message_handler(commands='start')
    async def cmd_start(message: types.Message):
        try:
            await dp.throttle('start', rate=10)
        except Throttled:
            await message.reply('Подождите 10 секунд. Нельзя часто использовать эту команду.')
        else:
            await message.reply("Команда выполнилась")
→ Ссылка