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
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
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
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
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')
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)
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)