コード例 #1
0
ファイル: delete.py プロジェクト: tezer/OppiWordsBot
async def deleting_word(message):
    session, isValid = await authorize(message.from_user.id, with_lang=True)
    if not isValid:
        return
    logger.info(
        str(session.get_user_id()) + " is deleting word " + message.text)
    data = mysql_connect.fetchall(
        "SELECT word, definition, hid FROM words "
        "WHERE user=%s and language=%s and word=%s",
        (session.get_user_id(), session.active_lang(), message.text))
    session.status = ""
    if data is None:
        await bot.send_message(session.get_user_id(),
                               'The word does not exist in you dictionary')
        return
    session.hid_cash = list(x[2] for x in data)
    k = to_one_row_keyboard(["Keep", "Delete"],
                            data=[0, 1],
                            action=["keep", "delete"])
    w = data[0][0]
    d = 'NA'
    if len(data[0]) > 1:
        d = data[0][1]
    await bot.send_message(
        session.get_user_id(),
        "Do you want to delete word *{}* with definition\n{}".format(w, d),
        reply_markup=k)
コード例 #2
0
ファイル: syntaxis.py プロジェクト: zer0nka/OppiWordsBot
async def do_unscramble(session, keys, data, sentence, revealed, message):
    logger.debug("{}: Keys = {}, revealed = {}", session.get_user_id(),
                 len(keys), revealed)
    if len(keys) == 0 and len(revealed) > 0:
        if revealed.strip() == session.unscramble_sentence[0].strip():
            add_event(session.get_user_id(), session.active_lang(), session.get_current_hid(), 'SENTENCE', 10, 1)
            await bot.send_message(session.get_user_id(), "Excellent!")
            await next_unscramble(session)
        else:
            k = bot_utils.to_one_row_keyboard(['Restart', 'Next'],
                                              [0, 1],
                                              ['restart_unscramble', 'next_unscramble'])
            res = bot_utils.compare(revealed.strip(), session.unscramble_sentence[0].strip())
            #TODO use Levenshtian distance
            add_event(session.get_user_id(), session.active_lang(), session.get_current_hid(), 'SENTENCE', 10, 0)
            await bot.send_message(session.get_user_id(), "A bit wrong.\nIt is:\n"
                                                        "{}\nyuor answer:\n{}"
                                   .format(res[1], res[0]), parse_mode=types.ParseMode.HTML,
                                   reply_markup=k)
        await message.edit_text("*" + sentence[1] + "*" + "\n" + revealed)
        return
    actions = ['unscramble'] * len(data)
    session.unscramble_keys = keys
    session.unscramble_data = data
    session.unscramble_revealed = revealed
    session.unscramble_sentence = sentence

    k = keys.copy()
    k.append("RESTART")
    a = actions.copy()
    a.append("restart_unscramble")
    d = data.copy()
    d.append('-1')
    k = bot_utils.to_vertical_keyboard(k, d, a)
    await message.edit_text("*" + sentence[1] + "*" + "\n" + revealed, reply_markup=k)
コード例 #3
0
async def wiktionary_search(message):
    logger.debug(str(message.from_user.id) + " Adding word: " + message.text)
    logger.info(str(message.from_user.id) + " Sending request to dictionaries")
    session, isValid = await authorize(message.from_user.id)
    if not isValid:
        return
    begin = time.time()
    definitions = await get_definitions(session.active_lang(),
                                        session.language_code, message.text,
                                        message.from_user.id)
    logger.info(
        str(session.get_user_id()) + " Received response from dictionaries " +
        str(time.time() - begin))
    logger.debug(
        str(session.get_user_id()) + " Received definitions: " +
        str(definitions))
    session.words_to_add = (message.text, definitions)
    if len(definitions) == 0:
        logger.info(str(session.get_user_id()) + " no definition found")
        await message.reply(
            "No definitions found. Make sure there is no typos in the word and the language you're "
            "learning exists))")
        kb = to_one_row_keyboard(
            ["Add definition", "Skip"],
            data=[0, 1],
            action=["add_user_definition", "add_user_definition"])
        await bot.send_message(message.chat.id,
                               "Or you can add your own definition",
                               reply_markup=kb)
    else:
        session.definitions = definitions
        await prepare_definition_selection(session, None)
コード例 #4
0
async def addwords_message(message):
    logger.info(str(message.from_user.id) + " started adding new words")
    command = str(message.text)
    session, isValid = await authorize(message.from_user.id, with_lang=True)
    if not isValid:
        return
    lists_to_add = mysql_connect.lists_to_add(message.from_user.id,
                                              session.active_lang())
    if len(lists_to_add) > 0:
        word_list = str(lists_to_add[0][0])
        session.list_hid_word = (word_list, None, None)
        k = to_one_row_keyboard(['Add words', 'Not now'], [0, 0],
                                ["next_word_from_list", "skip_list"])
        await bot.send_message(message.from_user.id,
                               "You have words to add from list *{}*".format(
                                   word_list.title()),
                               reply_markup=k)
    else:
        session.status = "/addwords"
        session.words_to_add = None
        if command != "/addwords":
            logger.warning(
                str(message.from_user.id) + " put words after /addwords ")
        logger.debug(str(message.from_user.id) + session.status)
        await message.reply("Type in words in *" +
                            session.active_lang().title() + "*")
コード例 #5
0
ファイル: reading.py プロジェクト: tezer/OppiWordsBot
async def callback_mc_action(query: types.CallbackQuery, callback_data: dict):
    logger.debug('Got this callback data: %r', callback_data)
    await query.answer("Wrong.")
    session, isValid = await authorize(query.from_user.id)
    if not isValid:
        return
    answer = session.get_error_answer()
    session.move_error_down()
    k = to_one_row_keyboard(["OK"], data=[1], action=["reading_errors"])
    await bot.send_message(chat_id=session.get_user_id(), text="It's " + answer, reply_markup=k)
コード例 #6
0
ファイル: speaking.py プロジェクト: zer0nka/OppiWordsBot
async def voice_message(message: types.Message):
    session, isValid = await authorize(message.from_user.id)
    if not isValid:
        return
    logger.info(str(message.from_user.id) + ' voice message received')
    if not session.subscribed:
        await bot.send_message(message.from_user.id, "You need to buy subscription "
                                                     "to be able to use voice recognition."
                                                     "\n Use command /subscribe to buy subscription")

        return
    file = await bot.get_file(message.voice.file_id)
    url = 'https://api.telegram.org/file/bot{}/'.format(TOKEN)
    url = url + file["file_path"]
    logger.debug("{} received voice at {}".format(message.from_user.id, url))
    transcript = speech2text.transcribe(url, session.active_lang())
    if session.get_current_word() is None:
        await bot.send_message(message.from_user.id, "Start /learn or /test")
        return
    word = session.get_current_word()[0]
    task_type = session.get_current_word()[2]


    if transcript.lower() != word.lower():
        word, transcript = compare(word.lower(), transcript.lower())
        logger.debug(word, transcript)
        #TODO use Levenshtain distance
        # FIXME: here can be sentence or a summary, not only lexeme
        if task_type in [2, 3]:
            add_event(message.from_user.id,
                      session.active_lang(),
                      session.get_current_hid(),
                      'LEXEME', task_type, 0)
            k = to_one_row_keyboard(['Next'], [0], ['voice_skip'])
            await bot.send_message(message.from_user.id, "Correct : {}\n"
                                                         "You said: {}".format(word, transcript),
                                   parse_mode=types.ParseMode.HTML,
                                   reply_markup=k)
        else:
            await bot.send_message(message.from_user.id, "Correct : {}\n"
                                                         "You said: {}".format(word, transcript),
                                   parse_mode=types.ParseMode.HTML)
    else:
        if task_type in [2, 3]:
            level_up(session)
            add_event(message.from_user.id, session.active_lang(), session.get_current_hid(), 'LEXEME', 2, 1)
        await bot.send_message(message.from_user.id, "Excellent!")
    await do_learning(session)
コード例 #7
0
ファイル: reading.py プロジェクト: tezer/OppiWordsBot
async def callback_show_action(query: types.CallbackQuery, callback_data: dict):
    logger.info('Got this callback data: %r', callback_data)
    await query.answer()
    session, isValid = await authorize(query.from_user.id)
    if not isValid:
        return
    session.add_error()
    kb = to_one_row_keyboard(["Yes, I knew that!", "No, I forgot it"],
                             data=[0.5, 0],
                             action=["i_knew", "forgot"])
    try:
        await bot.send_message(query.from_user.id, session.get_current_definition(), reply_markup=kb)
    except CantParseEntities as e:
        logger.warning(e)
        string = session.get_current_definition()
        string = str(string).replace('*', '')
        string = str(string).replace('_', '')
        string = str(string).replace('`', '')
        await bot.send_message(query.from_user.id, string, reply_markup=kb)
コード例 #8
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)
コード例 #9
0
async def do_learning1(session):
    if not session.has_more_words_to_learn():
        await reading.do_reading_errors1(session)
    else:
        session = await get_session(session.get_user_id())
        if session is None:
            return
        word = session.get_current_word(
        )  # 0. word, 1. definition, 2. mode, 3. hid
        if word is None:
            await bot.send_message(session.get_user_id(), RESTART)
            logger.error(str(session.get_user_id()) + " word is None")
            return
        if word[2] == 0:
            # Do reading exercises
            session.current_level = word[2]
            logger.debug("{} started level {}", session.get_user_id(), word[2])
            keyboard = to_one_row_keyboard(["I remember", "Show meaning"],
                                           data=[0, 1],
                                           action=["I_remember", "show"])
            hint = get_hint(word[1])

            word_context = await get_context(word, True)
            await bot.send_message(session.get_user_id(),
                                   word_context + "\n" + hint,
                                   reply_markup=keyboard,
                                   parse_mode=types.ParseMode.HTML)
        elif word[2] == 2:
            session.current_level = word[2]
            logger.debug("{} started level {}", session.get_user_id(), word[2])
            if session.subscribed:
                logger.debug("{} is subscribed", session.get_user_id())
                session.status = tasks[2]
                word_context = await get_context(word, False)
                word_context = re.sub(r'\b' + word[0] + r'\b',
                                      ' ... ',
                                      word_context,
                                      flags=re.I)
                await bot.send_message(session.get_user_id(),
                                       "<b>SAY</b> this word: <b>" + word[1] +
                                       "</b>\n" + word_context,
                                       parse_mode=types.ParseMode.HTML)
            else:
                level_up(session)
                await do_learning(session)
        elif word[2] == 3:
            session.current_level = word[2]
            logger.debug("{} started level {}", session.get_user_id(), word[2])
            if session.subscribed:
                logger.debug("{} is subscribed", session.get_user_id())
                session.status = tasks[2]
                await bot.send_message(
                    session.get_user_id(),
                    "*LISTEN* and *SAY* this word: *{}*\n{}".format(
                        word[0], word[1]))
                voice = text2speech.get_voice(word[0], session.active_lang())
                await bot.send_audio(chat_id=session.get_user_id(),
                                     audio=voice,
                                     performer=word[1],
                                     caption=None,
                                     title=word[0])
            else:
                level_up(session)
                await do_learning(session)

        elif word[2] == 1:
            session.current_level = word[2]
            logger.debug("{} started level {}", session.get_user_id(), word[2])
            session.status = tasks[1]
            word_context = await get_context(word, False)
            word_context = re.sub(r'\b' + word[0] + r'\b',
                                  ' ... ',
                                  word_context,
                                  flags=re.I)
            await bot.send_message(
                session.get_user_id(),
                "<b>WRITE</b> the correct word for the definition:\n"
                "<b>" + word[1] + "</b>\n" + word_context,
                parse_mode=types.ParseMode.HTML)
        # SENTENCES
        # Unscramble
        elif word[2] == 10:
            session.current_level = word[2]
            logger.debug("{} started level {}", session.get_user_id(), word[2])
            await syntaxis.unscramble(session, word)
コード例 #10
0
ファイル: control.py プロジェクト: zer0nka/OppiWordsBot
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)