我怎么能让它在每次用python制作的Discord机器人发送消息时都添加exp呢

2024-04-19 05:12:23 发布

您现在位置:Python中文网/ 问答频道 /正文

代码(如下所示)应该在discord上为用户添加exp点。问题是,它将exp添加了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个表达式。我已经发送了大约15条消息,但这个值从未改变,所以我不知道这不更新的原因是什么

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

Tags: importclientidjsonmessageasyncdefwith
1条回答
网友
1楼 · 发布于 2024-04-19 05:12:23

我发现了你的问题。所以基本上你的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重写。它使很多事情变得简单

编辑:还将其添加到成员加入脚本:

@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)

相关问题 更多 >