Python Discord Bot Command with Json Database

So I'm making a command that is !command When you type that in a chat it will update the member(s) score in the database. The database will look something like this

{
  "person": "epikUbuntu"
  "score": "22"
}

How would I go on doing that?

edit: If I wasn't clear I meant ho would I go on doing the python part of it?

1 Answer

JSON objects in python work like dictionaries.

You can write a new dictionary and save it:

data = {"foo": "bar"}

with open("file.json", "w+") as fp:
    json.dump(data, fp, sort_keys=True, indent=4) # kwargs for beautification

And you can load data from a file (this will be for updating the file):

with open("file.json", "r") as fp:
    data = json.load(fp) # loading json contents into data variable - this will be a dict

data["foo"] = "baz" # updating values
data["bar"] = "foo" # writing new values

with open("file.json", "w+") as fp:
    json.dump(data, fp, sort_keys=True, indent=4)

Discord.py example:

import os # for checking the file exists

def add_score(member: discord.Member, amount: int):
    if os.path.isfile("file.json"):
        with open("file.json", "r") as fp:
            data = json.load(fp)
        try:
            data[f"{member.id}"]["score"] += amount
        except KeyError: # if the user isn't in the file, do the following
            data[f"{member.id}"] = {"score": amount} # add other things you want to store
    else:
        data = {f"{member.id}": {"score": amount}}
    # saving the file outside of the if statements saves us having to write it twice
    with open("file.json", "w+") as fp:
        json.dump(data, fp, sort_keys=True, indent=4) # kwargs for beautification
   # you can also return the new/updated score here if you want

def get_score(member: discord.Member):
    with open("file.json", "r") as fp:
        data = json.load(fp)
    return data[f"{member.id}"]["score"]

@bot.command()
async def cmd(ctx):
    # some code here
    add_score(ctx.author, 10)
    # 10 is just an example
    # you can use the random module if you want - random.randint(x, y)
    await ctx.send(f"You now have {get_score(ctx.author)} score!")

References:

2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sophia Al-Mansoor

Sophia Al-Mansoor

Global Business & E-Commerce Reporter

Sophia analyzes international trade, startup ecosystems, retail transformation, and supply chain logistics for modern digital publications.

Share this article
Twitter Facebook Pinterest