async def get_words_and_phrases(text, text_language, user_language, user): sentences = list() processor = TextPreprocessor(CODES[text_language]) # TODO save to cache the processors t = Text(text) subscribed = mysql_connect.check_subscribed(user) if not subscribed: await bot.send_message(user, "/subscribe to get translations for your text sentences") for s in t.sentences: sent = BotSentence(s.start, s.end) # TODO paid feature translation = await bot_utils.get_definitions(text_language, user_language, s.string, user) sent.translation = translation key_words = processor.key_words(s.string) for kw in key_words: w = kw[0] if ' ' in w: sent.words.append(w) for word in s.words: word = str(word) if re.match(r"[^\w]+", word) is not None: continue sent.words.append(word) sentences.append(sent) return sentences
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
async def get_definitions(language, user_lang, word, user): result = list() sources = mysql_connect.fetchall('SELECT source FROM def_sources WHERE user=%s', (user, )) sources = set(x[0] for x in sources) if user_lang is None: user_lang = 'english' # See list of available sources in generic.py if 'Yandex Dictionary' in sources: if 'Yandex Dictionary_' + user_lang + language + '_' + word in MEM_CACHE.keys(): result = MEM_CACHE['Yandex Dictionary_' + user_lang + language + '_' + word] else: try: response = ya_dict.lookup(word, CODES[language], get_lang_code(user_lang)) result = to_list(json.loads(response)) MEM_CACHE['Yandex Dictionary_' + user_lang + language + '_' + word] = result except Exception as e: logger.warning("Yandex dictionary exception: " + str(e)) if 'Wiktionary' in sources: if 'Wiktionary_' + language + '_' + word in MEM_CACHE.keys(): result.extend(MEM_CACHE['Wiktionary_' + language + '_' + word]) else: try: w = parser.fetch(word.lower(), language=language) except Exception as e: logger.warning("Wiktionary exception: " + str(e)) if w is not None and len(w) > 0: res = process_wiktionary(w) if len(res) > 0: result.extend(res) MEM_CACHE['Wiktionary_' + language + '_' + word] = res if 'Google Translate' in sources or ' ' in word: if 'Google Translate_' + user_lang + language + '_' + word in MEM_CACHE.keys(): result.extend(MEM_CACHE['Google Translate_' + user_lang + language + '_' + word]) else: subscribed = mysql_connect.check_subscribed(user) limit = 50 if subscribed: limit = 500 if len(word) <= limit : try: tr = translate_client.translate( word, target_language=get_lang_code(user_lang)) result.append(tr['translatedText']) MEM_CACHE['Google Translate_' + user_lang + language + '_' + word] = tr['translatedText'] except Exception as e: logger.error(e) return result