예제 #1
0
    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
예제 #2
0
 def first_run(self):
     self.user.update_status(User.Status.LEARNING)
     send_message(
         self.user,
         'Изучать слова это здоворо! Приступим!' +
         constants.Emogies.astronaut,
     )
     self.choice_next_word()
예제 #3
0
def stop_handler(message: telebot.types.Message):
    user = get_user(message)
    user.update_status(user.Status.FREE)
    send_message(
        user,
        'Да! Вы вольная птица). Чем Вы теперь хотите заняться?',
        get_learn_repeat_markup(),
    )
예제 #4
0
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)
예제 #5
0
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())
예제 #6
0
    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)
예제 #7
0
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()
예제 #8
0
    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',
            )
예제 #9
0
    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,
            ),
        )
예제 #10
0
    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