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