Search code examples
jsondiscord.pynextcord

Trying to make a command to store and retreat info from a json file


Im trying to make a command that will store name,description and image of a character and another command to retrieve that data in an embed,but i have trouble working with json files

this is my code to add them:

    @client.command()
    async def addskillset(ctx):
        await ctx.send("Let's add this skillset!")

        questions = ["What is the monster name?","What is the monster description?","what is the monster image link?"]

        answers = []

        #code checking the questions results

        embedkra = nextcord.Embed(title = f"{answers[0]}", description = f"{answers[1]}",color=ctx.author.color)
        embedkra.set_image(url = f"{answers[2]}")
        mess = await ctx.reply(embed=embedkra,mention_author=False)
        
        await mess.add_reaction('✅')
        await mess.add_reaction('❌')

        
        def check(reaction, user):
          return user == ctx.author and (str(reaction.emoji) == "✅" or "❌")
        try:
          reaction, user = await client.wait_for('reaction_add', timeout=1000.0, check=check)
        except asyncio.TimeoutError:
           #giving a message that the time is over
        else:
          if reaction.emoji == "✅":
            monsters = await get_skillsets_data() #this data is added at the end

            if str(monster_name) in monsters:
                await ctx.reply("the monster is already added")
            else:
                monsters[str(monster_name)]["monster_name"] = {}
                monsters[str(monster_name)]["monster_name"] = answers[0]
                monsters[str(monster_name)]["monster_description"] = answers[1]
                monsters[str(monster_name)]["monster_image"] = answers[2]

                with open('skillsets.json','w') as f:
                    json.dump(monsters,f)

                await mess.delete()
                await ctx.reply(f"{answers[0]} successfully added to the list")

Code to get the embed with the asked info:

            
    @client.command()
    async def skilltest(ctx,*,monster_name):
        data = open('skillsets.json').read()
        data = json.loads(data)
        if str(monster_name) in data:
          name = data["monster_name"]
          description = data["monster_description"]
          link = data["monster_image"]


          embedkra = nextcord.Embed(title = f"{name}", description = f"{description}",color=ctx.author.color)
          embedkra.set_image(url = f"{link}")
          await ctx.reply(embed=embedkra,mention_author=False)        

        else:
          # otherwise, it is still None meaning we didn't find it
          await ctx.reply("monster not found",mention_author=False)

and my json should look like this:

{"katufo": {"monster_name": "Katufo","Monster_description":"Katufo is the best","Monster_image":"#image_link"},
"armor claw":{"monster_name": "Armor Claw","Monster_description":"Armor claw is the best","Monster_image":#image_link}}

The get_skillsets_data used in first command:

async def get_skillsets_data():
    with open('skillsets.json','r') as f:
        monsters = json.load(f)

    return monsters

Solution

  • Well, When you are trying to retrieve data from your json file try using name = data["katufo"]["monster_name"] now here it will only retrieve monster_name of key katufo. If You want to retrieve data for armor claw code must go like this name = data["armor claw"]["monster_name"]. So try this code :

    @client.command()
    async def skilltest(ctx,*,monster):
        data = open('skillsets.json').read()
        data = json.loads(data)
        if str(monster) in data:
          name = data[f"monster"]["monster_name"]
          description = data[f"monster"]["Monster_description"]
          link = data[f"monster"]["Monster_image"]
          embedkra = nextcord.Embed(title = f"{name}", description = f"{description}",color=ctx.author.color)
          embedkra.set_image(url = f"{link}")
          await ctx.reply(embed=embedkra,mention_author=False)
    
        
    
         else:
          # otherwise, it is still None meaning we didn't find it
          await ctx.reply("monster not found",mention_author=False)
    

    Hope this works for you :)