Пример #1
0
async def create_user_session(user):
    user_data = mysql_connect.fetchone("SELECT language_code, learning_language, first_name, last_name "
                                       "FROM users WHERE user_id = %s",
                                       (user,))
    if user_data is None:
        logger.info("{} has no session in db", user)
        await onboarding.onboarding_start(user)
        return
    else:
        if user_data[0] is None:
            user_data = ('english', user_data[1], user_data[2], user_data[3])
            await bot.send_message(user, 'Please, run /settings to specify your language')

        elif user_data[1] is None:
            await bot.send_message(user, 'Please, run /setlanguage to specify the language you want to learn')
            user_data = (user_data[0], 'english', user_data[2], user_data[3])
    logger.info("{} has data {}", user, user_data)
    s = UserSession(user, user_data[2],
                    user_data[3],
                    user_data[0])
    s.subscribed = mysql_connect.check_subscribed(user)
    s.set_active_language(user_data[1])
    logger.info("{} session is ready, subscription status is {}", user, s.subscribed)
    sessions[user] = s
    await bot.send_message(user, "OK, now you can /addwords to get exercises.\n"
                                 "Or you can add many words with /wordlist command.\n"
                                 "Use /addtext to work with texts\n"
                                 "Then type /learn to start training.\n\n"
                                 "/subscribe to activate *premium features* "
                                 "(voice recognition, automatic translations and text-to-speech)\n\n"
                                 "Use /help if you need help")
    return s
Пример #2
0
async def create_user_session(user):
    user_data = mysql_connect.fetchone(
        "SELECT language_code, learning_language, first_name, last_name "
        "FROM users WHERE user_id = %s", (user, ))
    if user_data is None:
        logger.info("{} has now session in db")
        await bot.send_message(user,
                               "You should /start the bot before learning")
        return

    if user_data[0] is None:
        user_data = ('english', user_data[1])
        await bot.send_message(
            user, 'Please, run /settings to specify your language')

    if user_data[1] is None:
        await bot.send_message(
            user,
            'Please, run /setlanguage to specify the language you want to learn'
        )
        user_data = (user_data[0], 'english')

    s = UserSession(user, user_data[2], user_data[3], user_data[0])
    s.subscribed = mysql_connect.check_subscribed(user)
    s.set_active_language(user_data[1])
    logger.info("{} session is ready, subscription status is {}", user,
                s.subscribed)
    sessions[user] = s
    return s
Пример #3
0
def update_item(hid, result):
    time_passed = 0.1
    word = db.fetchone("SELECT model, last_date FROM spaced_repetition WHERE hid=%s", (hid,))
    if word[1] is not None:
        lastTest = datetime.strptime(word[1], "%Y-%m-%dT%H:%M:%S.%f")
        time_passed = (datetime.now() - lastTest) / oneHour
    model = tuple(json.loads(word[0]))
    recall = ebisu.predictRecall(model, time_passed, exact=True)
    print(str(hid), str(recall))
    new_model = ebisu.updateRecall(model, result, time_passed)
    print(hid, result)
    print(model)
    print(new_model)
    db.update_sr_item(hid, json.dumps(new_model), datetime.now().isoformat())
    return True
Пример #4
0
def get_objects(hids, period, user, language, object_type, task_type):
    logger.debug('{} checking objects', user)
    res = list()
    for hid in hids:
        query = 'SELECT hid, result FROM study_log WHERE' \
                ' created_at > date_sub(now(), interval {})' \
                ' AND hid = %s' \
                ' AND user = %s' \
                ' AND language = %s' \
                ' AND object_type = %s' \
                ' AND task_type = %s' \
                ' ORDER BY created_at DESC LIMIT 1'.format(period)
        args = (hid, user, language, object_type, task_type)
        obj = db.fetchone(query, args)
        if obj is None:
            res.append(hid)
        elif obj[1] < 1.0:
            res.append(obj[0])
    return res
Пример #5
0
async def check_summary(session):
    summary = ''
    for para in session.words_to_learn:
        t = para[1]
        if len(t) < 2:
            continue
        summary += para[1] + '\n'
    session.words_to_learn = list()
    session.current_word = 0
    session.status = str()
    await bot.send_message(session.get_user_id(), "All done! Here is your summary:\n{}"
                           .format(summary))
    text_hid = mysql_connect.fetchone('SELECT text_hid FROM user_texts WHERE user=%s AND list_name=%s',
                                      (session.get_user_id(), session.list_name))
    args = (session.get_user_id(), text_hid[0], summary)
    mysql_connect.insertone('INSERT INTO text_summary (user, hid, summary)'
                            ' VALUES(%s,%s,%s)', args)
    voice = text2speech.get_voice(summary, session.active_lang())
    await bot.send_audio(chat_id=session.get_user_id(),
                                     audio=voice,
                                     performer='Listen and repeat', caption=None,
                                     title='Summary')
Пример #6
0
async def learn_words_from_list(query: types.CallbackQuery,
                                callback_data: dict):
    logger.debug(
        str(query.from_user.id) + " learn_all_words  " + str(callback_data))
    session, isValid = await authorize(query.from_user.id, with_lang=True)
    if not isValid:
        return
    lists = mysql_connect.get_list_names(query.from_user.id,
                                         session.active_lang())
    list_name = lists[int(callback_data['data'])]
    logger.info("{} learns {}", query.from_user.id, list_name)
    text_hid = mysql_connect.fetchone(
        'SELECT text_hid FROM user_texts WHERE user=%s AND list_name=%s',
        (session.get_user_id(), list_name))
    if text_hid is not None:
        summary = mysql_connect.fetchone(
            'SELECT summary FROM text_summary WHERE user=%s AND hid=%s',
            (session.get_user_id(), text_hid[0]))
        if summary is not None:
            # (word, definition, mode, hid)]
            session.words_to_learn = list()
            session.words_to_learn.append(
                (summary[0], list_name, 20, text_hid[0]))
            k = to_one_row_keyboard(['Words', 'Summary'], [0, 1],
                                    ['text_words', 'text_summary'])
            await bot.send_message(
                session.get_user_id(),
                'You created a summary for text _{}_.\n'
                'Would you like to learn words or continue with your summary?'.
                format(list_name),
                reply_markup=k)
            return
    hids = mysql_connect.get_hids_for_list(query.from_user.id, list_name)
    logger.info("{} has {} tasks from list {}", query.from_user.id, len(hids),
                list_name)
    hids_all = sr.get_items_to_learn(
        (session.get_user_id(), session.active_lang()), upper_recall_limit=0.5)
    logger.info("{} has {} tasks to learn", query.from_user.id, len(hids_all))
    hids = list(set(hids) & set(hids_all))
    logger.info("{} has {} tasks from list {} to learn", query.from_user.id,
                len(hids), list_name)
    # hids = list() #FIXME NOW delete after testing!!!
    if len(hids) == 0:
        sentence_hids = mysql_connect.get_sentence_hids(
            query.from_user.id, list_name)
        sentence_hids = ilt.get_objects(sentence_hids, '1 day',
                                        session.get_user_id(),
                                        session.active_lang(), "SENTENCE", 10)
        logger.info("{} has {} sentences from list {} to learn",
                    query.from_user.id, len(sentence_hids), list_name)
        await bot.send_message(
            query.from_user.id,
            "You have {} sentences from list {} to learn".format(
                len(sentence_hids), list_name))
        if len(sentence_hids) > 0:
            session.current_level = 10  # Syntax learning
            await learn_sentences(query.from_user.id, list_name, session,
                                  sentence_hids)
        else:
            session.current_level = 20  # Text learning
            await texts.text_summarization(query.from_user.id, list_name,
                                           session)
    else:
        words = mysql_connect.fetch_by_hids(session.get_user_id(), hids)
        logger.debug("{}, fetched {} tasks to do", session.get_user_id(),
                     len(words))
        session.words_to_learn = words
        session.current_word = 0
        await start_learning(session)
Пример #7
0
async def learning(query: types.CallbackQuery, callback_data: dict):
    await query.answer("Let's learn!")
    logger.debug(query)
    logger.debug(str(query.from_user.id)
                 + "start_learning  " + str(callback_data))
    n = int(callback_data['data'])
    session, isValid = await authorize(query.from_user.id, with_lang=True)
    if not isValid:
        return
    upper_recall_limit = 0.5
    if session.status == '/test':
        upper_recall_limit = 1.0
    if n == -1:  # General vocabulary selected
        hids = sr.get_items_to_learn(
            (session.get_user_id(), session.active_lang()),
            upper_recall_limit=upper_recall_limit)
        if len(hids) == 0:
            if session.status == '/test':
                await bot.send_message(session.get_user_id(),
                                       'You should add at least one word with /addwords command to start training')
            else:
                await bot.send_message(session.get_user_id(), 'You don\'t have words for training.')
                await bot.send_message(session.get_user_id(), 'Add more words with /addwords command or')
                await bot.send_message(session.get_user_id(), 'or /test words you learned before.')
            return True
    sentences = False
    if n >= 0:  # One of the lists selected
        lists = mysql_connect.get_list_names(query.from_user.id)
        list_name = lists[int(callback_data['data'])]
        logger.info("{} learns {}", query.from_user.id, list_name)
        text_hid = mysql_connect.fetchone('SELECT text_hid FROM user_texts WHERE user=%s AND list_name=%s',
                                      (session.get_user_id(), list_name))
        if text_hid is not None:

            summary = mysql_connect.fetchone('SELECT summary FROM text_summary WHERE user=%s AND hid=%s',
                                          (session.get_user_id(), text_hid[0]))
            if summary is not None:
                # (word, definition, mode, hid)]
                session.words_to_learn = list()
                session.words_to_learn.append((summary[0], list_name, 20, text_hid[0]))
                k = to_one_row_keyboard(['Words', 'Summary'], [0, 1],
                                        ['text_words', 'text_summary'])
                await bot.send_message(session.get_user_id(),
                                 'You created a summary for text _{}_.\n'
                                 'Would you like to learn words or continue with your summary?'
                                 .format(list_name),
                                 reply_markup=k)
                return

        hids = mysql_connect.get_hids_for_list(query.from_user.id, list_name)
        logger.info("{} has {} words from list {}", query.from_user.id, len(hids), list_name)
        hids_all = sr.get_items_to_learn(
            (session.get_user_id(), session.active_lang()),
            upper_recall_limit=upper_recall_limit)
        logger.info("{} has {} words to learn", query.from_user.id, len(hids_all))
        hids = list(set(hids) & set(hids_all))
        logger.info("{} has {} words from list {} to learn", query.from_user.id, len(hids), list_name)
        # hids = list() #FIXME NOW delete after testing!!!
        if len(hids) == 0:
            sentence_hids = mysql_connect.get_sentence_hids(query.from_user.id, list_name)
            sentence_hids = ilt.get_objects(sentence_hids, '1 day', session.get_user_id(),
                                            session.active_lang(), "SENTENCE", 10)
            logger.info("{} has {} sentences from list {} to learn", query.from_user.id, len(sentence_hids), list_name)
            await bot.send_message(query.from_user.id, "You have {} sentences from list {} to learn"
                                   .format(len(sentence_hids), list_name))
            sentences = True
            if len(sentence_hids) > 0:
                session.current_level = 10 #Syntax learning
                await learn_sentences(query.from_user.id, list_name, session, sentence_hids)
            else:
                session.current_level = 20 #Text learning
                await texts.text_summarization(query.from_user.id, list_name, session)

    if not sentences:
        words = mysql_connect.fetch_by_hids(session.get_user_id(), hids)
        session.words_to_learn = words
        session.current_word = 0

        if not session.has_more_words_to_learn():
            # Case 2: doing reading errors
            await bot.send_message(session.get_user_id(), "Let's revise some words")
            await reading.do_reading_errors(query, callback_data)
        else:
            # Case 1: reading exercises
            await start_learning(session)