async def cmd_start(message: types.Message): """ Обработчик кнопки старт. Определяет от кого пришло сообщение. Parameters ---------- message : types.Message Текст сообщения """ if message.from_user.id in admin_id: await message.answer('Хотите создать или активировать квиз?', reply_markup=menu_keyboard) else: quiz_game = get_quiz() if isinstance(quiz_game, Quiz): logging.info( f'Пользователь {message.from_user.full_name} опоздал.') await message.answer(f'Вы опоздали.') else: all_users = get_all_users() all_users[message.from_user.id] = User(message.from_user.full_name) set_all_users(all_users) for id in admin_id: await bot.send_message( id, f'Пользователь {message.from_user.full_name} ждет начала квиза.' f'Всего пользователей {len(all_users)}') logging.info( f'Пользователь {message.from_user.full_name} ждет начала квиза.' ) await message.answer(f'Ждите начала квиза.')
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 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_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 select_quiz_actions(message: Message): """ Меню взаимодействия с квизом. Parameters ---------- message : Message Текст сообщения """ quiz = get_quiz() if quiz: await ControllQuiz.waiting_for_action.set() await message.answer( f'Выбран квиз - {quiz.quiz_name}\n. Что вы хотите с ним сделать?', reply_markup=control_quiz_keyboard) else: await message.answer('Квиз не выбран.')
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)