Здравствуйте! Чтобы реализовать команду `/obtain`, которая может быть выполнена пользователем только раз в 4 часа, вам нужно отслеживать время последнего использования этой команды каждым пользователем. Для этого вы можете использовать базу данных или просто хранить данные в памяти, если ваш бот не планирует долго функционировать без перезапусков.
Вот общий подход:
1. **Хранение времени последнего получения валюты**:
Можно использовать словарь, где ключом будет идентификатор пользователя, а значением — время последнего получения валюты.
2. **Проверка времени при выполнении команды**:
При получении команды `/obtain` вы проверяете, прошло ли 4 часа с последнего использования этой команды.
3. **Ответ пользователю**:
Если прошло 4 часа — вы начисляете валюту и обновляете время, если нет — вы сообщаете, сколько времени осталось до следующей попытки.
Ниже приведен простой пример реализации такой логики на Python с использованием библиотеки `python-telegram-bot`:
```python
from telegram import Update
from telegram.ext import Updater, CommandHandler, CallbackContext
import time
# Словарь для хранения времени последнего получения валюты
last_obtain_time = {}
# Константы
COOLDOWN_TIME = 4 * 60 * 60 # 4 часа в секундах
def obtain(update: Update, context: CallbackContext):
user_id = update.message.from_user.id
current_time = time.time()
# Если пользователь в словаре, проверяем время
if user_id in last_obtain_time:
elapsed_time = current_time - last_obtain_time[user_id]
if elapsed_time < COOLDOWN_TIME:
remaining_time = COOLDOWN_TIME - elapsed_time
update.message.reply_text(f"Вы можете получить валюту снова через {remaining_time:.0f} секунд.")
return
# Если прошло достаточно времени, начисляем валюту и обновляем время
update.message.reply_text("Вы получили 100 виртуальных монет!")
last_obtain_time[user_id] = current_time
def main():
# Укажите токен вашего бота
updater = Updater("YOUR_BOT_TOKEN")
dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler("obtain", obtain))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
```
### Объяснение:
1. **Словарь `last_obtain_time`**: Хранит время последнего запроса каждой команды пользователем.
2. **Константа `COOLDOWN_TIME`**: Устанавливает 4-часовой таймер в секундах.
3. **Команда `obtain`**: Проверяет, не истек ли таймер, и начисляет валюту, если прошло 4 часа.
### Важно:
- Если ваш бот будет перезапущен, все данные в памяти будут потеряны. Для долгосрочного хранения можно использовать базу данных (например, SQLite, PostgreSQL и т.д.), чтобы сохранять время последнего запроса пользователей.
Надеюсь, этот пример будет вам полезен! Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.