Kак остановить handler после выполнения, чтобы команда отрабатывала только 1 раз, telebot?
Пытаюсь написать бот для чата друзей:
- при команде /gif в чат прилетает рандомная гифка из коллекции
- при команде /gif_add в коллекцию можно добавить новую гифку
Проблема в том, что файл, который присылают в чат, даже без команды "gif_add" все равно отрабатывается ботом и загружает его в коллекцию.
Как сделать так, чтобы возможность загрузить гифку появлялась исключительно после команды "gif_add", а все остальное время бот не слушал чат, пока его не вызовут той или иной командой?
И еще один вопрос.
Можно ли сделать так, чтобы пользователь мог посмотреть, какие гифки уже есть в коллекции?
Спасибо!
import os, random, os.path
import telebot
bot = telebot.TeleBot('apikey')
@bot.message_handler(commands=['start'])
def start(message):
bot.send_message(message.chat.id, "Привет! Я могу присылать гифку!"
"для того, чтобы отправить в чат гифку дня напиши /gif"
"Не забывай пополнять коллекцию с помощью команды /аdd_gif")
@bot.message_handler(commands=["gif"])
def add_user_handler(message):
bot.send_message(message.chat.id, "Гифка дня!")
gif = open('gif/' + random.choice(os.listdir('gif')), 'rb')
bot.send_animation(message.chat.id, gif)
@bot.message_handler(commands=["add_gif"])
def add_user_handler(message):
msg = bot.send_message(message.chat.id, f'@{message.from_user.username}, кидай гифку!')
bot.register_next_step_handler(msg, handle_file)
@bot.message_handler(func=lambda message: True, content_types=['animation'])
def handle_file(message):
try:
chat_id = message.chat.id
file_info = bot.get_file(message.animation.file_id)
downloaded_file = bot.download_file(file_info.file_path)
src = './gif/' + message.animation.file_name;
with open(src, 'wb') as new_file:
new_file.write(downloaded_file)
DIR = './gif/'
gif_num = len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])
bot.reply_to(message, f"Спасибо! Гифка получена! Теперь в коллекции {gif_num} gif!!!")
bot.polling.abort = True
except Exception as e:
bot.reply_to(message, e)
bot.infinity_polling()
Источник: Stack Overflow на русском