Aiogram bot . Quiz
пишу бота для телеграм . Возникла проблема с обработкой опросника
@dp.message_handler(commands=['test']) # обработка команды1
async def process_command_1(message: types.Message):
quiz = get_quiz(1)
for question in quiz:
correct_option_id = get_question_correct_answer(question['options'])
options = [option['text'] for option in question['options']]
await bot.send_poll(chat_id=message.chat.id, question=question['task_text'], type='quiz', is_anonymous=False, cprrect_option_id=correct_option_id, options=options)
await sleep(10)
Хочу, чтобы
когда пользователь ответил на тест, сразу же выкидывался следующий вопрос, на данный момент реализовано с помощью функции sleep(). Помогите , пожалуйста, заранее спасибо!
Ответы (2 шт):
Делал подобное, но на pytelegrambotapi, думаю проблем не возникнет переписать на aiogram. При этом не обязательно использовать задержку.
Если вам нужно именно отслеживать количество верных ответов, то сделайте такую логику - первая функция pre_poll вызывает первую викторину, в ней обновляются данные в базе (в основном чтобы обнулить счетчики), при этом нужно записать куда-то верный ответ викторины, чтоб потом можно было сверить с выбором во второй функции с ответом юзера и уже инкрементировать по надобности счетчик. Так должно будет происходить до тех пор, пока не инкрементируется счетчик отправленных викторин, к примеру до 5 (не забывайте учитывать счетчик от 1, а не 0, так как первую викторину мы отправляем в функции pre_poll)
Пример ниже:
import random
# как только нужно отправить юзеру викторину - обращаемся к функции `pre_poll`
...
def pre_poll(message):
# подключение к бд, обнуление счетчиков и выбор ответов
# предположим, что res[0] - это вопрос, res[1] - верный ответ
# все остальные ответы - неверные
# также записываем верный ответ для последующей проверки
# к примеру это будет записано в переменную ans
data = [res[1], res[2], res[3], res[4]]
random.shuffle(data)
return bot.send_poll(chat_id=message.chat.id, question=res[0],
is_anonymous=False, options=data, type="quiz",
correct_option_id=data.index(res[1]))
# этот хендлер будет срабатывать каждый раз, когда юзер делает выбор в викторине
@bot.poll_answer_handler(func=lambda message: True)
def my_poll(message):
# подключение к бд
# предположим, что res[0] - это вопрос, res[1] - верный ответ
# все остальные ответы - неверные
data = [res[1], res[2], res[3], res[4]]
random.shuffle(data)
if [ans] == message.options_ids:
# если ответ, который мы записали совпадает с тем, который выбрал юзер
# тогда инкрементируем счетчик на +1
correct_count += 1
# инкрементируем счетчик отправленных викторин
# если счетчик не равен 5, тогда отправляем следующую викторину
if count != 5:
# перезаписываем верный ответ для следующей проверки викторины
bot.send_poll(chat_id=message.user.id, question=res[0],
is_anonymous=False, options=data, type="quiz",
correct_option_id=data.index(res[1]))
else:
bot.send_message(message.user.id,
f'Тестирование завершено.\nВерных ответов {correct_count} из 5.')
Вы можете сначала просто отправить викторину и записать её в переменную
my_quiz = await bot.send_poll(message.chat.id, 'Мессенджер, автор которого Павел Дуров', ['Telegram', 'Viber', 'WhatsApp', 'Messenger'], type='quiz', correct_option_id=0, is_anonymous=False)
(И обязательно, ещё раз - ОБЯЗАТЕЛЬНО не забудьте указать параметр is_anonymous=False)
Потом сделать хэндлер получения ответа
@dp.poll_answer_handler()
async def handle_poll_answer(quiz_answer: PollAnswer):
# проверяем ответ
if my_quiz.poll.correct_option_id == quiz_answer.option_ids[0]:
await bot.send_message(quiz_answer.user.id, 'Правильно! Идём дальше')
else:
await bot.sned_message(quiz_answer.user.id, 'Жаль, но это неправильный ответ. Двигаемся дальше - может потом повезёт')
# отправляем следующую викторину
await bot.send_poll(message.chat.id, 'Мессенджер, автор которого Павел Дуров', ['Telegram', 'Viber', 'WhatsApp', 'Messenger'], type='quiz', correct_option_id=0, is_anonymous=False)
И тогда новая викторина будет отправляться сразу после получения ответа на предыдущую
И ещё, убедительная просьба: Не отправляйте код скриншотом. Всем будет легче, если вы его просто скопируете, а для вас это на пару кликов больше