IamNewbie
IamNewbie

Reputation: 25

Error Implementing free dictionary Api in discord.py

I am trying to implement this api but the code says error every single time.

My code so far:

@client.command()
async def mean(ctx,word):  
    response = requests.get(f"https://api.dictionaryapi.dev/api/v2/entries/en/{word}")
    if response.status_code == 404:
        await ctx.send("No such word")
        return
    else:
        wordx = response.json()
        the_dictionary = wordx[0]
        meanings = the_dictionary['meanings']
        definitions = meanings[0]
        definition = definitions['definitions']
        meaningg = definition[0]
        meaning = meaningg['definition']
        example = meaningg.get('example',['None'])
        synonymslist = meaningg.get("synonyms",['None'])
        if isinstance(synonymslist,str):
            synonymslist = [synonymslist]
            pass
        synonyms = ','.join(synonymslist)
        deffinal= discord.Embed(title=f"`{word.upper()}`")
        deffinal.add_field(name = "Definition", value=f"{meaning}")
        deffinal.add_field(name = 'Example', value = f"{example}")
        deffinal.add_field(name = "Synonyms", value = f"{synonyms}")
        await ctx.channel.send(embed = deffinal)

Here is the error message: error message

Upvotes: 2

Views: 385

Answers (2)

Abdulaziz
Abdulaziz

Reputation: 3426

Adding to itzFlubby answer, using requests will be blocking read more which means if you block for too long then your bot will freeze since it has not stopped the function’s execution at that point to do other things.

Here is the final code, also I changed the format a bit to make it easier to read.

# import aiohttp

@bot.command()
async def mean(ctx, word):
    async with aiohttp.ClientSession() as session:
        async with session.get(f"https://api.dictionaryapi.dev/api/v2/entries/en/{word}") as r:
            if r.status == 200:
                info = await r.json()
            else:
                return await ctx.reply("No such word")

    the_dictionary = info[0]['meanings'][0]['definitions'][0]

    definition = the_dictionary.get('definition')
    example = the_dictionary.get('example')
    synonymslist = the_dictionary.get("synonyms")

    # if only one synonym is avaliable
    if isinstance(synonymslist, str):
        synonymslist = [synonymslist]
    synonyms = '\n'.join(synonymslist)

    deffinal = discord.Embed(title=f"`{word.upper()}`")
    if definition:
        deffinal.add_field(name="Definition", value=f"```{definition}```")

    if example:
        deffinal.add_field(name='Example', value=f"```{example}```")

    if synonyms:
        deffinal.add_field(name="Synonyms", value=f"```{synonyms}```")

    await ctx.reply(embed=deffinal)

Upvotes: 0

itzFlubby
itzFlubby

Reputation: 2289

Your error does not come from the API call to the dictionary api, but rather from your call to the discord api.
The error message says discord.errors.HTTPException: [...] In embed.fields.2.value: This field is required.
So the error comes from an empty field in your embed! The field has index 2 so it is actually the third field (Synonyms) which is causing the problem.
You can simply check if a string is empty, before even adding the field. And if it is empty, just don't add it.


deffinal= discord.Embed(title=f"`{word.upper()}`")
if meaning:
    deffinal.add_field(name = "Definition", value=f"{meaning}")

if example:
    deffinal.add_field(name = 'Example', value = f"{example}")

if synonyms:
    deffinal.add_field(name = "Synonyms", value = f"{synonyms}")

@client.command()
async def mean(ctx,word):  
    response = requests.get(f"https://api.dictionaryapi.dev/api/v2/entries/en/{word}")
    if response.status_code == 404:
        await ctx.send("No such word")
        return
    else:
        wordx = response.json()
        the_dictionary = wordx[0]
        meanings = the_dictionary['meanings']
        definitions = meanings[0]
        definition = definitions['definitions']
        meaningg = definition[0]
        meaning = meaningg['definition']
        example = meaningg.get('example',['None'])
        synonymslist = meaningg.get("synonyms",['None'])
        if isinstance(synonymslist,str):
            synonymslist = [synonymslist]
            pass
        synonyms = ','.join(synonymslist)

        deffinal= discord.Embed(title=f"`{word.upper()}`")
        if meaning:
            deffinal.add_field(name = "Definition", value=f"{meaning}")

        if example:
            deffinal.add_field(name = 'Example', value = f"{example}")

        if synonyms:
            deffinal.add_field(name = "Synonyms", value = f"{synonyms}")

        await ctx.channel.send(embed = deffinal)

Upvotes: 1

Related Questions