Как мне его добавить, чтобы он добавлял exp каждый раз, когда сообщение отправляется на бот Discord, созданный в python - PullRequest
0 голосов
/ 21 февраля 2020

код (показанный ниже) должен добавлять очки опыта пользователю, находящемуся в раздоре. Проблема в том, что он добавляет опыт 1 раз, но никогда не добавляет снова. значение exp этого пользователя остается равным 10.

import discord
import json
import os
from discord.ext import commands

token = ""
client = commands.Bot(command_prefix="-")
os.chdir(r'C:\Users\aryaa\Desktop\testing')


@client.event
async def on_ready():
    print('Bot Is Ready')
    print('------')


@client.event
async def on_member_join(member):
    with open('users.json', 'r') as f:
        users = json.load(f)
    await update_data(users, member)
    with open('users.json', 'w') as f:
        json.dump(users, f)


@client.event
async def on_message(message):
    with open('users.json', 'r') as f:
        users = json.load(f)

    await update_data(users, message.author)
    await add_experience(users, message.author, 10)
    await level_up(users, message.author, message.channel)

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

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

async def add_experience(users, user, exp):
    users[user.id]['experience'] += exp

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

    if lvl_start < lvl_end:
        await client.send(channel, '{} has leveled up to level {}'.format(user.mention, lvl_end))
        users[user.id]['level'] = lvl_end

client.run(token)

. Вот файл. json, который содержит информацию о пользователе. Как вы можете видеть это показывает 10 expr. Я отправил около 15 сообщений, но это значение никогда не меняется, поэтому я понятия не имею, в чем причина этого обновления.

{"431524570131070988": {"experience": 10, "level": 1}}

1 Ответ

0 голосов
/ 21 февраля 2020

Я нашел вашу проблему. Так что в основном ваш users словарь имеет целые числа в качестве ключей. Проблема в том, что JSON не поддерживает целочисленные ключи , поэтому при использовании json.dump все ваши целочисленные ключи преобразуются в строки. Очевидно, что целочисленный ключ не совпадает со строковым ключом, поэтому вы всегда перезаписываете данные своего пользователя, как если бы они были новым пользователем.

Это решается созданием новой функции, которая после json.load, снова делает все ключи целыми числами:

def int_keys(users):
    new_users = {}
    for key, value in users.items():
        new_users[int(key)] = value
    return new_users

@client.event
async def on_message(message):
    print(message)
    with open('users.json', 'r') as f:
        users = json.load(f)

    users = int_keys(users)

    await update_data(users, message.author)
    await add_experience(users, message.author, 10)
    await level_up(users, message.author, message.channel)

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

Кроме того, я бы действительно рекомендовал использовать перезапись discord.py, если вы можете. Это упрощает многие вещи.

Редактирование: также добавьте его в скрипт member_join:

@client.event
async def on_member_join(member):
    with open('users.json', 'r') as f:
        users = json.load(f)
    users = int_keys(users)
    await update_data(users, member)
    with open('users.json', 'w') as f:
        json.dump(users, f)
...