async def save_quiz(message: Message, state: FSMContext): """ Сохранение квиза и его итог. Parameters ---------- message : types.Message Текст сообщения state : FSMContext Сброс состояния """ quiz = get_quiz() quiz.save() set_quiz(quiz) await message.reply( f'Имя игры: {quiz.quiz_name}\n' f'Названия раундов: {list(quiz.rounds.keys())}\n' f'Задержка между вопросами (сек.): {list(quiz.times_between_questions.values())}\n' f'Количество раундов: {len(quiz.rounds.values())}\n', reply_markup=ReplyKeyboardRemove() ) await state.finish() await message.answer( 'Начните новый квиз или выберете из существующих.', reply_markup=menu_keyboard )
async def set_quiz_menu(message: Message, state: FSMContext): """ Показывает пользователю меню. Parameters ---------- message : Message Текст сообщения state : FSMContext Сброс состояния пользователя. """ if message.text == 'Отмена': await state.finish() await message.answer(f'Хотите создать или активировать квиз?', reply_markup=menu_keyboard) else: with open(quizes_path / f'{message.text}.pickle', 'rb') as f: set_quiz(load(f)) logging.info( f'Админ {message.from_user.full_name} стартанул квиз {message.text}' ) await state.finish() await message.answer( f'Вы выбрали квиз - {message.text}, он начинается!!!', reply_markup=menu_keyboard) await get_quiz().start_rounds()
async def delete_quiz_confirmation(message: Message, state: FSMContext): """ Подтверждение удаления пользователя Parameters ---------- message : Message Текст сообщения. Да\Нет state : FSMContext Сброс состояний пользователя. """ quiz = get_quiz() if message.text == 'Да': file_to_rem = quizes_path / f'{quiz.quiz_name}.pickle' file_to_rem.unlink() await state.finish() await message.answer(f'Вы удалили квиз - {quiz.quiz_name}', reply_markup=menu_keyboard) set_quiz(None) logging.info(f'Админ {message.from_user.full_name} удалил квиз.') elif message.text == 'Нет': await ControllQuiz.waiting_for_action.set() await message.answer( f'Выбран квиз - {quiz.quiz_name}\n. Что вы хотите с ним сделать?', reply_markup=control_quiz_keyboard) logging.info( f'Админ {message.from_user.full_name} отменил удаление квиза.')
async def quiz_action(message: Message, state: FSMContext): """ Обрабатывает команды Деактивировать и Удалить Parameters ---------- message : Message Текст сообщения. Деактивировать\Удалить state : FSMContext Сброс состояния пользователя """ quiz = get_quiz() if message.text == 'Деактивировать': await message.answer(f'Квиз {quiz.quiz_name} деактивирован.', reply_markup=menu_keyboard) await state.finish() logging.info( f'Админ {message.from_user.full_name} деактивировал квиз.') set_quiz(None) elif message.text == 'Удалить': await ControllQuiz.waiting_for_delete_confirmation.set() keyboard = ReplyKeyboardMarkup([['Да'], ['Нет']], resize_keyboard=True) await message.answer( f'Вы точно хотите удалить квиз - {quiz.quiz_name}?', reply_markup=keyboard) logging.info(f'Админ {message.from_user.full_name} удаляет квиз.')
async def set_name_for_quiz(message: Message): """ Принимает сообщение и ставит название квиза по этому сообщению. Parameters ---------- message : types.Message Текст сообщения """ set_quiz(Quiz(message.text)) await CreateQuiz.waiting_for_round_name.set() await message.reply( 'Пришлите название Вашего раунда (например, «История математики»).', reply_markup=ReplyKeyboardRemove() )
async def set_name_for_round(message: Message): """ Ставит название раунда и предлагает выбрать время между вопросами Parameters ---------- message : types.Message Текст сообщения """ set_current_round(message.text) quiz = get_quiz() quiz.add_round(message.text) set_quiz(quiz) keyboard = ReplyKeyboardMarkup(resize_keyboard=True) keyboard.add('15 сек.', '30 сек.', '1 мин.', '5 мин.', '10 мин.', 'Отмена') await CreateQuiz.waiting_for_time_between_questions.set() await message.reply('Какой промежуток будет между вопросами?', reply_markup=keyboard)
async def set_time_between_questions(message: Message): """ Устанавливает время между сообщениями и предлагает создать следующий вопрос. Parameters ---------- message : types.Message Текст сообщения """ quiz = get_quiz() quiz.set_time_between_quiestions(message.text) set_quiz(quiz) poll_keyboard = ReplyKeyboardMarkup(resize_keyboard=True) poll_keyboard.add(KeyboardButton(text='Создать вопрос', request_poll=KeyboardButtonPollType(type=PollType.QUIZ))) poll_keyboard.add(KeyboardButton(text='Отмена')) await CreateQuiz.waiting_for_question.set() await message.answer('Создайте вопрос, для этого используйте кнопку ниже.', reply_markup=poll_keyboard)
async def setup_question_for_quiz(message: Message): global media quiz = get_quiz() quiz.add_question(message.poll.question, message.poll.options, message.poll.correct_option_id, media) media = None poll_keyboard = ReplyKeyboardMarkup(resize_keyboard=True) poll_keyboard.add(KeyboardButton(text='Создать еще вопрос', request_poll=KeyboardButtonPollType(type=PollType.QUIZ))) poll_keyboard.add(KeyboardButton(text='Cоздать новый раунд.')) poll_keyboard.add(KeyboardButton(text='Cохранить квиз.')) poll_keyboard.add(KeyboardButton(text='Отмена')) await message.reply( f'Имя игры: {quiz.quiz_name}\n' f'Текущий раунд: {get_current_round()}\n' f'Задержка между вопросами (сек.): {quiz.times_between_questions[get_current_round()]}\n' f'Количество вопросов: {len(quiz.rounds[get_current_round()])}\n', reply_markup=ReplyKeyboardRemove() ) set_quiz(quiz) await message.reply(f'Был добавлен вопрос {message.poll.question}', reply_markup=poll_keyboard)