Проблема с переносом бота на aiogram
Как и многие, я написал своего первого бота на pyTelegramBotAPI, но вот с публикацией бота я понял, что допустил ошибку в самом начале при выборе библиотеки. О преимуществах aiogram говорить нет смысла.
Но при переносе кода на новую библиотеку я столкнулся с проблемой: один из моих методов я не смог сделать async.
В данном примере я сократил код до минимума, чтобы акцентировать внимание именно на проблемном методе. Вкратце расскажу, что он делает: у пользователя есть возможность поставить таймер на 10 секунд, и по окончании таймера бот сообщает пользователю об этом (ну и может выполнить некоторые действия). У пользователя же есть возможность прервать таймер, завершив его принудительно (при этом действия после таймера все равно будут выполнены). При этом у пользователя есть возможность включать этот таймер потом бесконечное количество раз.
Как это все перенести на aiogram, я так и не смог придумать. Если сможете дать пример кода, буду очень благодарен.
Сам метод таймера взял отсюда
API_TOKEN = '--'
bot = TeleBot(API_TOKEN)
def setinterval(interval): #сам таймер
def decorator(function):
def wrapper(*args, **kwargs):
stopped = threading.Event()
def loop(): # executed in another thread
while not stopped.wait(interval):
function(*args, **kwargs)
t = threading.Thread(target=loop)
t.daemon = True
t.start()
return stopped
return wrapper
return decorator
@setinterval(10)
def tim(chat_id): # метод, который выполняется после таймера
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
key = types.KeyboardButton(text="Запустить таймер")
keyboard.add(key)
bot.send_message(chat_id, 'Таймер закончился!', reply_markup=keyboard)
obj.timer.set()
@bot.message_handler(commands=['start'])
def start_command_handler(message: types.Message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
key = types.KeyboardButton(text="Запустить таймер")
keyboard.add(key)
bot.send_message(message.chat.id, 'Это старт, нажми на кнопку, чтобы запустить таймер', reply_markup=keyboard)
@bot.message_handler()
def start_timer(message: types.Message):
if (message.text == 'Запустить таймер'):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
key = types.KeyboardButton(text="Остановить таймер")
keyboard.add(key)
obj.timer = tim(message.chat.id)
bot.send_message(message.chat.id, 'Таймер запущен. Нажми на кнопку, чтобы остановить', reply_markup=keyboard)
if (message.text == 'Остановить таймер'):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
key = types.KeyboardButton(text="Запустить таймер")
keyboard.add(key)
obj.timer.set()
bot.send_message(message.chat.id, 'Таймер остановлен. Нажми на кнопку, чтобы запустить его снова',
reply_markup=keyboard)
Ответы (1 шт):
Пример того как бы я сделал это
@dp.message_handler(commands="start")
async def task(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True).add("Запустить таймер")
await message.answer('Это старт, нажми на кнопку, чтобы запустить таймер на 5 минут', reply_markup=markup)
@dp.message_handler(text='Запустить таймер')
def start_timer(message: types.Message, state: FSMContext):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True).add("Остановить таймер")
async with state.proxy() as data:
data["start_timer"] = time()
await message.answer('Таймер запущен. Нажми на кнопку, чтобы остановить', reply_markup=markup)
await asyncio.sleep(5*60)
async with state.proxy() as data:
if data.get("start_timer"):
await message.answer("Время вышло!")
@dp.message_handler(text='Остановить таймер')
def start_timer(message: types.Message, state: FSMContext):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True).add("Запустить таймер")
async with state.proxy() as data:
del data["start_timer"]
await message.answer('Таймер остановлен. Нажми на кнопку, чтобы запустить его снова'
'Прошло времени', reply_markup=markup)