|
|
@ -40,32 +40,23 @@ def start(update, context): |
|
|
|
context.bot.send_message(chat_id=update.effective_chat.id, text=start_text) |
|
|
|
|
|
|
|
|
|
|
|
def slugify(message): |
|
|
|
def slugify(message: str) -> str: |
|
|
|
""" This function adds relevant escape characters as per Telegram's markdown parsing rules """ |
|
|
|
|
|
|
|
message = message.replace(".", "\\.").replace("*", "\\*").replace("(", "\\(").replace(")", "\\)").replace("-", "\\-") |
|
|
|
return message |
|
|
|
|
|
|
|
|
|
|
|
def word_def(update, context): |
|
|
|
pgcon = connect_db() |
|
|
|
if pgcon is None: |
|
|
|
print("Db connection failed") |
|
|
|
def scrape_def(word: str) -> dict: |
|
|
|
""" This function scrapes the definition of a word from lexico.com""" |
|
|
|
|
|
|
|
word_query = 'select * from gre_words order by random() limit 1' |
|
|
|
|
|
|
|
ox_base_url = 'https://www.lexico.com/definition/{}?locale=en' |
|
|
|
while True: |
|
|
|
cur = pgcon.cursor() |
|
|
|
cur.execute(word_query) |
|
|
|
word_tup = cur.fetchall() |
|
|
|
selected_word = word_tup[0][1].lower() |
|
|
|
cur.close() |
|
|
|
def_page = requests.get(ox_base_url.format(selected_word)) |
|
|
|
#print(selected_word, def_page.status_code) |
|
|
|
if def_page.status_code != 200: |
|
|
|
print(f'Word not found: {selected_word}') |
|
|
|
else: |
|
|
|
break |
|
|
|
ox_url = f'https://www.lexico.com/definition/{word}?locale=en' |
|
|
|
def_page = requests.get(ox_url) |
|
|
|
|
|
|
|
if def_page.status_code != 200: |
|
|
|
print(f'Word not found: {selected_word}') |
|
|
|
return None |
|
|
|
|
|
|
|
def_soup = BeautifulSoup(def_page.content, 'html.parser') |
|
|
|
|
|
|
|
my_dict = {} |
|
|
@ -82,20 +73,41 @@ def word_def(update, context): |
|
|
|
my_dict['definition'] = [] |
|
|
|
for i, j in enumerate(definition): |
|
|
|
my_dict['definition'].append(j.text) |
|
|
|
|
|
|
|
return my_dict |
|
|
|
|
|
|
|
|
|
|
|
def word_def(update, context): |
|
|
|
pgcon = connect_db() |
|
|
|
if pgcon is None: |
|
|
|
print("Db connection failed") |
|
|
|
|
|
|
|
word_query = 'select * from gre_words order by random() limit 1' |
|
|
|
|
|
|
|
while True: |
|
|
|
cur = pgcon.cursor() |
|
|
|
cur.execute(word_query) |
|
|
|
row = cur.fetchall() |
|
|
|
selected_word = row[0][1].lower() |
|
|
|
cur.close() |
|
|
|
|
|
|
|
my_dict = scrape_def(selected_word) |
|
|
|
if my_dict is not None: |
|
|
|
break |
|
|
|
|
|
|
|
msg = "*{word}*\n_{type}_\n{defn}".format( |
|
|
|
word=my_dict['word'], type=slugify(my_dict['type']), |
|
|
|
defn='\n'.join([slugify(i) for i in my_dict['definition']])) |
|
|
|
|
|
|
|
button_callback_data = f"p~{my_dict['word']}~{my_dict['audio']}" |
|
|
|
print(f"{msg=}\n{my_dict=}\n{button_callback_data=}") |
|
|
|
button_callback_data_audio = f"p~{my_dict['word']}~{my_dict['audio']}" |
|
|
|
button_callback_data_synonyms = f"s~{my_dict['word']}" |
|
|
|
|
|
|
|
keyboard = [ |
|
|
|
[ |
|
|
|
InlineKeyboardButton("Pronunciation", callback_data=button_callback_data), |
|
|
|
InlineKeyboardButton("Synonyms", callback_data=button_callback_data) |
|
|
|
] |
|
|
|
[ |
|
|
|
InlineKeyboardButton("Pronunciation", callback_data=button_callback_data_audio), |
|
|
|
InlineKeyboardButton("Synonyms", callback_data=button_callback_data_synonyms) |
|
|
|
] |
|
|
|
] |
|
|
|
print(keyboard) |
|
|
|
reply_markup = InlineKeyboardMarkup(keyboard) |
|
|
|
msg_response = context.bot.send_message(update.effective_chat.id, text=msg, parse_mode=ParseMode.MARKDOWN_V2, reply_markup=reply_markup) |
|
|
@ -112,21 +124,29 @@ def get_synonyms(word): |
|
|
|
|
|
|
|
|
|
|
|
def button(update, context): |
|
|
|
""" Responds to callback buttons in the original message. |
|
|
|
|
|
|
|
If the callback type is audio, then responds with already available audio URL |
|
|
|
If the callback type is synonyms, then fetchs the synonyms and responds |
|
|
|
""" |
|
|
|
|
|
|
|
query = update.callback_query |
|
|
|
data = query.data |
|
|
|
request_type = data.split('~')[0] |
|
|
|
word = data.split('~')[1] |
|
|
|
audio = f"https://lex-audio.useremarkable.com/mp3/{data.split('~')[2]}" |
|
|
|
|
|
|
|
query.answer() |
|
|
|
if request_type == 'p': |
|
|
|
#query.edit_message_reply_markup(reply_markup=None) |
|
|
|
audio = f"https://lex-audio.useremarkable.com/mp3/{data.split('~')[2]}" |
|
|
|
context.bot.send_audio(update.effective_chat.id, audio=audio, reply_to_message_id=query.message.message_id) |
|
|
|
elif request_type == 's': |
|
|
|
#query.edit_message_reply_markup(reply_markup=None) |
|
|
|
synonyms = get_synonyms(word) |
|
|
|
print(synonyms) |
|
|
|
context.bot.send_message(update.effective_chat.id, text=synonyms, reply_to_message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
|
wordbot_token = os.getenv('WORDBOT_TOKEN') |
|
|
|
updater = Updater(token=wordbot_token, use_context=True) |
|
|
|