• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

JSON Object wird doppelt erstellt

Kirby.exe

Kirby.exe

Top Contributor
Also ich habe für meinen Discord Bot ein Message Rank System geschrieben, jedoch wird aus irgendeinem Grund ständig ein neues JSON Object erstellt. Ich vermute dies liegt an der update_data(), jedoch verstehe ich nicht ganz wieso dies falsch ist :(

Python:
async def update_data(users, user):
    if not user.id in users:
        users[user.id] = {}
        users[user.id]['xp'] = 0
        users[user.id]['level'] = 1
 
MoxxiManagarm

MoxxiManagarm

Top Contributor
Habe nicht wirklich Ahnung von Pythong, aber für mich klingt das so als würdest du eine Objektreferenz erwarten mit users und sie es nicht ist. Versuch mal etwas in der art:

Python:
async def update_data(users, user):
    if not user.id in users:
        users[user.id] = {}   
    users[user.id]['xp'] = 0
    users[user.id]['level'] = 1
    return users

Und der Aufrufer muss dann natürlich den return Wert entgegennehmen.
 
Kirby.exe

Kirby.exe

Top Contributor
Also im Grunde soll meine update_data nur schauen ob das Object bereits existiert (Ich benutze die eindeutige User ID von Discord) und sollte dies nicht der Fall sein soll er einen User anlegen. XP und Level setze ich ja nur als Base werte einmal die 0 und die 1. Ich schicke einfach mal meinen gesamten Code, vielleicht ist das etwas hilfreicher :)

Python:
import os
import discord
import json
from dotenv import load_dotenv
from discord.ext import commands
from user import User

############## Init Variables #############

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
GUILD = os.getenv('DISCORD_GUILD')
DATA = os.getcwd() + '\\data\\'

bot = commands.Bot(command_prefix='+')
bot.remove_command('help')

rank_list = []

############## Main Code #############
@bot.event
async def on_ready():
    for guild in bot.guilds:
        if guild.name == GUILD:
            break

    print(
        f'{bot.user} is connected to the following guild:\n'
        f'{guild.name}(id: {guild.id})'
    )

    if(os.path.isfile(DATA + 'users.json')):
        print('Database File for Rank System exists and is ready for processing!')
    else:
        print('Database File doesnt exist and will be created....')
        create_file()
        print('File is created and ready for use!')

@bot.event
async def on_message(message):
    #rank_system(message)

    await bot.process_commands(message)

    if message.author.id != 747719515135017001:
        with open(os.path.join(DATA, "users.json"),'r') as tmp:
            users = json.load(tmp)
        
        await update_data(users, message.author)
        await add_xp(users, message.author, 5)
        await level_up(users, message.author, message)

        with open(os.path.join(DATA, "users.json"),'w') as tmp:
            json.dump(users, tmp)


@bot.event
async def on_member_join(member):
    with open(os.path.join(DATA, "users.json"),'r') as tmp:
        users = json.load(tmp)
    
    await update_data(users, member)

    with open(os.path.join(DATA, "users.json"),'w') as tmp:
        json.dump(users, tmp)

############## Commands ################

@bot.command(name='help')
async def help_command(ctx):
    embed = discord.Embed(
        title = "Bot Commands",
        description = "Hier werden alle Commands von diesem Bot aufgelistet. Alle nachfolgenden Commands müssen mit dem Präfix '+' aufgerufen werden.",
        color = discord.Color.blue()
    )
    embed.add_field(name="Algorithmen", value="Lexikon", inline=True)
    embed.add_field(name="Datenstrukturen", value="Lexikon", inline=True)
    embed.add_field(name="macarena", value="Fun Commands", inline=True)
    await ctx.send(embed=embed)
    

@bot.command(name='rank')
async def get_rank(message):
    id = str(message.author.id)
    with open(os.path.join(DATA, "users.json"),"r") as tmp:
        users = json.load(tmp)
    
    lvl = users[id]['level']
    experience = users[id]['xp']
    response = f"You are Rank {lvl} and you have {experience}."
    await message.channel.send(response)
    

@bot.command(name='Algorithmen')
async def algo_command(message):
    response = "Es gibt viele verschiedene Algorithmen hier eine kurze Auflistung von den bekanntesten:\n\n- Bubble Sort\n- Quick Sort\n- Merge Sort"
    await message.channel.send(response)

@bot.command(name='Datenstrukturen')
async def datenstrukturen_command(message):
    response = "Es gibt viele verschiedene Datenstrukturen hier eine kurze Auflistung von den bekanntesten:\n\n- Stack\n- Queue\n- List"
    await message.channel.send(response)


@bot.command()
async def macarena(message):
    print("Funktioniert")
    response = "Hast du ernsthaft so viel Langeweile, dass du diesen Command ausprobierst....Schäm dich ;)"
    await message.channel.send(response)

#Sound Board


############  Helper Functions #############
async def update_data(users, user):
    if not(user.id in users):
        users[user.id] = {}
        users[user.id]['xp'] = 0
        users[user.id]['level'] = 1

async def add_xp(users, user, xp):
    print("Old XP: ", users[user.id]['xp'])
    users[user.id]['xp'] += xp
    print("New XP: ", users[user.id]['xp'])

async def level_up(users, user, message):
    experience = users[user.id]['xp']
    lvl_start = users[user.id]['level']
    lvl_end = int(experience ** (1/4))

    print("Experience: ", experience)
    print("Level Start: ", lvl_start)
    print("Level End: ", lvl_end)

    if lvl_start < lvl_end:
        await message.channel.send('{} ist ein Level aufgestiegen. Er ist nun {}'.format(user.mention, lvl_end))
        users[user.id]['level'] = lvl_end

def create_file():
    open(os.path.join(DATA, "users.json"), "x")


bot.run(TOKEN)
 
Kirby.exe

Kirby.exe

Top Contributor
Hab es gelöst :) mir ist erst gestern Nacht aufgefallen, das JSON nur Strings als Key speichert xD naja und einen String mit einer Zahl zu vergleichen ist schwierig xD Jetzt läufts :)
 
Anzeige

Neue Themen


Oben