# █ █ █ █▄▀ ▄▀█ █▀▄▀█ █▀█ █▀█ █ █
# █▀█ █ █ █ █▀█ █ ▀ █ █▄█ █▀▄ █▄█
# 🔒 Licensed under the GNU GPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
# 👤 https://t.me/hikamoru
# requires: bs4 aiohttp
# meta developer: @hikamorumods
import aiohttp
from bs4 import BeautifulSoup as bs
from .. import utils, loader
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
class English:
async def definition_get(self, word: str):
async with aiohttp.ClientSession() as session:
headers = {"User-Agent": user_agent}
async with session.get(
f"https://dictionary.cambridge.org/us/dictionary/english/{word}/",
headers=headers,
) as resp:
if resp.status != 200:
return f"Failed to retrieve data. Status code: {resp.status}"
soup = bs(await resp.text(), "html.parser")
if not (div_element := soup.find("div", class_="def ddef_d db")):
return "Definition not found"
text = div_element.get_text()
example_spans = soup.find_all("span", class_="eg deg")
examples = []
for ex in example_spans:
example_text = ex.get_text()
examples.append(example_text)
return {"definition": text.replace(":", ""), "examples": examples}
async def get_word_pronunciation_uk(self, word: str):
async with aiohttp.ClientSession() as session:
async with session.get(
f"https://dictionary.cambridge.org/dictionary/english/{word}",
headers={"User-Agent": user_agent},
) as resp:
if resp.status == 200:
soup = bs(await resp.text(), "html.parser")
try:
audio_tag = soup.find_all("audio", class_="hdn")[0]
pron_tag = soup.find_all("span", class_="ipa dipa lpr-2 lpl-1")[
0
]
audio_src = audio_tag.find("source", type="audio/mpeg")["src"]
return {
"audio": f"https://dictionary.cambridge.org/us{audio_src}",
"pron": pron_tag.get_text(),
}
except IndexError:
return False
async def get_word_pronunciation_us(self, word: str):
async with aiohttp.ClientSession() as session:
async with session.get(
f"https://dictionary.cambridge.org/dictionary/english/{word}",
headers={"User-Agent": user_agent},
) as resp:
if resp.status == 200:
soup = bs(await resp.text(), "html.parser")
try:
audio_tag = soup.find_all("audio", class_="hdn")[1]
audio_src = audio_tag.find("source")["src"]
pron_tag = soup.find_all("span", class_="ipa dipa lpr-2 lpl-1")[
1
]
return {
"audio": f"https://dictionary.cambridge.org{audio_src}",
"pron": pron_tag.get_text(),
}
except IndexError:
return False
async def thesaurus_synonyms(self, word: str):
url = f"https://thesaurus.plus/thesaurus/{word}"
async with aiohttp.ClientSession() as session:
async with session.get(url, headers={"User-Agent": user_agent}) as resp:
if resp.status == 200:
soup = bs(await resp.text(), "html.parser")
synonyms_list = []
synonyms_ul = soup.find_all("ul", class_="list")[1]
list_terms = synonyms_ul.find_all("li", class_="list_term")
for term in list_terms:
synonym = term.find("div", class_="p-2").get_text(strip=True)
synonyms_list.append(synonym)
return synonyms_list
async def thesaurus_antonyms(self, word: str):
url = f"https://thesaurus.plus/thesaurus/{word}"
async with aiohttp.ClientSession() as session:
async with session.get(url, headers={"User-Agent": user_agent}) as resp:
if resp.status == 200:
soup = bs(await resp.text(), "html.parser")
antonyms_list = []
antonyms_ul = soup.find_all("ul", class_="list")[0]
list_terms = antonyms_ul.find_all("li", class_="list_term")
for term in list_terms:
antonym = term.find("div", class_="p-2").get_text(strip=True)
antonyms_list.append(antonym)
return antonyms_list
@loader.tds
class LexiwizMod(loader.Module, English):
"""Lexical wizard - your english companion"""
strings = {
"name": "Lexiwiz",
"no_word": "🤷♂️ No word provided",
"no_definition": "😖 Unfortunately, I couldn't find the definition of this word.",
"definition": "📝 Word: {}\n\n🔆 Definition: {}\n\n📦 Examples:\n{}",
"Pronunciation": "{} {} Pronunciation: {}\n🔊 Listen",
"no_synonyms": "😓 Sorry, I couldn't find synonyms for this word.",
"synonyms": "📝 Synonyms for the word: {}\n\n🔆 Synonyms: {}",
"no_antonyms": "😓 Sorry, I couldn't find antonyms for this word.",
"antonyms": "📝 Antonyms for the word: {}\n\n🔆 Antonyms: {}",
}
@loader.command()
async def getdef(self, message):
"""Get definition of a word"""
word = utils.get_args_raw(message)
if not word:
await utils.answer(message, self.strings("no_word"))
return
definition = await self.definition_get(word)
if definition == "Definition not found":
await utils.answer(message, self.strings("no_definition"))
if isinstance(definition, dict):
text = ""
_definition = definition["definition"]
_examples = definition["examples"]
for index, example in enumerate(_examples):
text += f"{index}. {example}\n"
await utils.answer(
message, self.strings("definition").format(word, _definition, text)
)
else:
await utils.answer(
message, self.strings("definiotion").format(word, definition, " ")
)
@loader.command()
async def getpron(self, message):
"""Get pronunciation of a word"""
word = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not word:
await utils.answer(message, self.strings("no_word"))
return
uk = await self.get_word_pronunciation_uk(word)
us = await self.get_word_pronunciation_us(word)
if uk:
await message.delete()
await message.client.send_file(
message.to_id,
uk["audio"],
caption=self.strings("Pronunciation").format(
"🇬🇧",
"UK",
uk["pron"],
uk["audio"],
),
voice_note=True,
reply_to=reply.id if reply else None,
)
if us:
await message.delete()
await message.client.send_file(
message.to_id,
us["audio"],
caption=self.strings("Pronunciation").format(
"🇺🇸",
"US",
us["pron"],
us["audio"],
),
voice_note=True,
reply_to=reply.id if reply else None,
)
@loader.command()
async def getsyn(self, message):
"""Get synonyms of a word"""
word = utils.get_args_raw(message)
if not word:
await utils.answer(message, self.strings("no_word"))
return
synonyms = await self.thesaurus_synonyms(word)
if not synonyms:
await utils.answer(message, self.strings("no_synonyms"))
return
await utils.answer(
message, self.strings("synonyms").format(word, ", ".join(synonyms))
)
@loader.command()
async def getant(self, message):
"""Get antonyms of a word"""
word = utils.get_args_raw(message)
if not word:
await utils.answer(message, self.strings("no_word"))
return
antonyms = await self.thesaurus_antonyms(word)
if not antonyms:
await utils.answer(message, self.strings("no_antonyms"))
return
await utils.answer(
message, self.strings("antonyms").format(word, ", ".join(antonyms))
)