def set_learn_word(self, message_text: str) -> bool: word = self.user.learning_status.next_learn_word if not word: logger.info('for user %s, end words', self.user.username) return True if message_text == constants.Commands.learn: # Устанавливаем слово ws = WordStatus.objects.create( user_id=self.user.id, word=word, start_repetition_time=get_datetime_now(), ) self.user.learning_status.repeat_words.add(ws) self.user.learning_status.set_next_learn_word() return True elif message_text == constants.Commands.miss: self.user.learning_status.set_next_learn_word() return True else: send_message( self.user, 'Не понятное сообщение. Вы хотите выучить слово?', markup=generate_markup( constants.Commands.learn, constants.Commands.miss, constants.Handlers.stop.path, ), ) return False
def first_run(self): self.user.update_status(User.Status.LEARNING) send_message( self.user, 'Изучать слова это здоворо! Приступим!' + constants.Emogies.astronaut, ) self.choice_next_word()
def stop_handler(message: telebot.types.Message): user = get_user(message) user.update_status(user.Status.FREE) send_message( user, 'Да! Вы вольная птица). Чем Вы теперь хотите заняться?', get_learn_repeat_markup(), )
def text_handler(message: telebot.types.Message): user = get_user(message) if user.is_free: send_message( user, 'Не понятна :( что Вы хотите? ' + constants.Handlers.help.path) elif user.is_learning: LearnWordRunner(message=message, user=user).run() elif user.is_repetition: RepeatWord(message=message, user=user).run() else: raise Exception('User status not found: %s', user.status)
def start_handler(message: telebot.types.Message): message_resp = 'Добро пожаловать! Для изучения английских слов вам поможет бот {} {}'.format( settings.TELEGRAM_BOT_NAME, constants.Emogies.wink) user = get_user(message) if user.status == User.Status.LEARNING: message_resp += '\n Сейчас Вы находитесь в стадии заучивания новых слов :)' elif user.status == User.Status.REPETITION: message_resp += '\n Сейчас Вы находитесь в стадии повторения слов :)' message_resp += ('\n Вы можете добавить слова которые хотите изучать ' f'на сайте {settings.BOT_SITE_URL}') send_message(user, message_resp, markup=get_learn_repeat_markup())
def choice_next_word(self): learning_status = self.user.learning_status # набрали слов. Пора заканчивать if learning_status.count_words <= len( learning_status.repeat_words.all()): self.user.update_status(User.Status.FREE) message = '%s Отлично! Самое время повторить слова! %s' % ( constants.Emogies.rocket, constants.Emogies.rocket, ) send_message(self.user, message, generate_markup(constants.Handlers.repetition.path)) return word = learning_status.next_learn_word if not word: send_message( self.user, '%s Вы изучили все слова! Можно добавить еще слова для изучения! %s %s ' % ( get_success_text(), constants.Emogies.fearful, constants.Emogies.astonished, ), ) send_message( self.user, f'Вы можете добавить слова на сайте {settings.BOT_SITE_URL}') self.user.update_status(User.Status.FREE) send_message( self.user, 'Не хотите повторить изученное? %s' % constants.Emogies.astronaut, markup=generate_markup(constants.Handlers.learn_words.path, constants.Handlers.repetition.path), ) return commands = ( constants.Commands.learn, constants.Commands.miss, constants.Handlers.stop.path, ) send_message( self.user, word.learning_text_markdown, markup=generate_markup(*commands), parse_mode='markdown', ) self.send_word_sound_data(word, commands)
def stop_learning_word_handler(message: telebot.types.Message): user = get_user(message) if not user.is_repetition: send_message( user, 'Не понятна :( что Вы хотите? ' + constants.Handlers.help.path) word_status = user.learning_status.repetition_word_status if word_status: user.update_status(User.Status.FREE) send_message(user, ' Прощай "%s".' % word_status.word) word_status.stop_learning() logger.info(f'word_status=%s was stopped learning', word_status) RepeatWord(message=message, user=user).first_run()
def send_word_sound_data(self, word, commands): word_data = word.find_word_in_skyeng_dict() if not word_data: return audio_message = (f'<a href="{word_data.get_sound_url()}"><i>' f'{constants.Emogies.headphones}: {word_data.text}' f'</i></a>') send_message( self.user, audio_message, markup=generate_markup(*commands), parse_mode='html', ) image_url = word_data.get_image_url() if image_url: send_message( self.user, f'<a href="{image_url}"><i>{constants.Emogies.picture}</i></a>', markup=generate_markup(*commands), parse_mode='html', )
def repeat(self, start_repetition=False): """ Repeat word (send message to telegram) :param start_repetition: если мы только начинаем повторять слова, то ставим в True если есть слово для повторения: устанавливаем это слово как то, которое начали повторять отправляем пользователю сообщение с этим словом если нету слова для повторения: указываем, что можно пинговать пользователя о повторении слов обновляем время следующего повторения для повторенных слов и удаляем их из тех которые сейчас нужно повторять указываем, что нету следующего слова для повторения (ставим ему None) переводим пользователя в статус: FREE """ learning_status = self.user.learning_status next_word_status = learning_status.get_next_repeat_word_status( start_repetition) if not next_word_status: send_message( self.user, 'My congratulations! Вы повторили все слова ' + constants.Emogies.fearful, markup=get_learn_repeat_markup(), ) self.user.update_status(User.Status.FREE) return if start_repetition: send_message( self.user, 'Повторять слова это здоворо! *Приступим*! Введите перевод:', parse_mode='markdown') learning_status.set_repetition_word_status_id(next_word_status.id) word_for_translating = next_word_status.get_word_for_translating() send_message( self.user, f'> {word_for_translating}', generate_markup( constants.Handlers.stop_learning_word.path, constants.Handlers.stop.path, constants.Handlers.help.path, ), )
def guess(self) -> bool: guess_translated = self.message.text repetition_word_status = self.user.learning_status.repetition_word_status if repetition_word_status is None: return True if repetition_word_status.is_word_guessed(guess_translated): send_message(self.user, get_success_text()) return True repetition_word_status.increase_not_guess() text = (f'{repetition_word_status.word.learning_text_markdown}\n' f' Пожалуйста, напишите translate слова: ' f'"`{repetition_word_status.get_word_for_translating()}`"\n') send_message(self.user, text, parse_mode='markdown') send_message( self.user, f' Вы можете удалить это слово: {constants.Handlers.stop_learning_word.path}', ) return False