discord.py 如何显示包括新成员在内的用户等级系统
discord.py How to show user level system including new members
我已经编写了一个代码来显示级别,它工作得很好,除了当新成员加入时代码不起作用,因为它只获取 .json 文件中已有的信息。我想做的是,当新成员加入时,他们的等级也会出现。
#THE LEVEL SYSTEM ITSELF
@client.event
async def on_member_join(member):
with open(r"C:\Users\Frank\Desktop\BOTZS\test.py", 'r') as f:
users = json.load(f)
await update_data(users, member)
with open('LvlUP.json', 'w') as f:
json.dump(users, f)
@client.event
async def on_message(message):
if message.author.bot == False:
with open('LvlUP.json', 'r') as f:
users = json.load(f)
await update_data(users, message.author)
await add_experience(users, message.author, 5)
await level_up(users, message.author, message)
with open('LvlUP.json', 'w') as f:
json.dump(users, f)
async def update_data(users, user):
if not f'{user.id}' in users:
users[f'{user.id}'] = {}
users[f'{user.id}']['experience'] = 0
users[f'{user.id}']['level'] = 1
async def add_experience(users, user, exp):
users[f'{user.id}']['experience'] += exp
async def level_up(users, user, message):
experience = users[f'{user.id}']['experience']
lvl_start = users[f'{user.id}']['level']
lvl_end = int(experience ** (1 / 4))
if lvl_start < lvl_end:
embed = discord.Embed(title="**LEVEL UP!**",description=f'{user.mention} has leveled up to level {lvl_end}! :fire: 'f'\n Soundwave Superior,{user.mention} Inferior ',color=discord.Color.dark_red())
embed.set_thumbnail(url=user.avatar_url)
users[f'{user.id}']['level'] = lvl_end
await message.channel.send(embed=embed)
#MY CODE
@client.event
async def on_message(message):
global m
with open(r"C:\Users\Frank\Desktop\BOTZS\LvlUP.json", 'r') as f:
m = json.load(f)
if message.content == "Level":
embed=discord.Embed(title="**Current Level**", description=(str(m[str(message.author.id)]["level"])),color=discord.Color.dark_red())
await message.channel.send(embed=embed)
非常感谢!
我注意到您没有使用 on_member_remove
事件。它允许您在用户离开您的不和谐服务器时删除他们。另外,我认为你的代码可以更轻一些,更容易理解。
这是为您的机器人制作一个非常简单的关卡系统的方法:
import discord
from discord.ext import commands
from json import dumps, loads
from random import randint
def get_data():
with open('members.json', 'r') as file:
return loads(file.read())
def set_data(members):
with open('members.json', 'w') as file:
file.write(dumps(members, indent=2))
@client.event
async def on_member_join(member):
members = self.get_data()
members.append({'name': member.name, 'id': member.id, 'level': 0,'xp': 0})
set_data(members)
@client.event
async def on_member_remove(self, member):
members = self.get_data()
members.remove({'name': member.name, 'id': member.id, 'level': member.level, 'xp': member.xp})
set_data(members)
@client.event
async def on_message(message):
members = self.get_data()
member = members[message.author.id]
member['xp'] += 5
if member['xp'] > member['xp']**(1 / 4):
member['level'] += 1
await message.channel.send(f" {message.author.mention} leveled up! He's now level {member['level']}")
set_data(members)
@commands.command()
async def xp(self, ctx):
members = self.get_data()
for member in members:
if ctx.author.id == member['id']:
await ctx.send(f"️ You're level {member['level']} ({member['xp']}/{self.base_xp * (member['level']+1 * self.factor)})")
我已经编写了一个代码来显示级别,它工作得很好,除了当新成员加入时代码不起作用,因为它只获取 .json 文件中已有的信息。我想做的是,当新成员加入时,他们的等级也会出现。
#THE LEVEL SYSTEM ITSELF
@client.event
async def on_member_join(member):
with open(r"C:\Users\Frank\Desktop\BOTZS\test.py", 'r') as f:
users = json.load(f)
await update_data(users, member)
with open('LvlUP.json', 'w') as f:
json.dump(users, f)
@client.event
async def on_message(message):
if message.author.bot == False:
with open('LvlUP.json', 'r') as f:
users = json.load(f)
await update_data(users, message.author)
await add_experience(users, message.author, 5)
await level_up(users, message.author, message)
with open('LvlUP.json', 'w') as f:
json.dump(users, f)
async def update_data(users, user):
if not f'{user.id}' in users:
users[f'{user.id}'] = {}
users[f'{user.id}']['experience'] = 0
users[f'{user.id}']['level'] = 1
async def add_experience(users, user, exp):
users[f'{user.id}']['experience'] += exp
async def level_up(users, user, message):
experience = users[f'{user.id}']['experience']
lvl_start = users[f'{user.id}']['level']
lvl_end = int(experience ** (1 / 4))
if lvl_start < lvl_end:
embed = discord.Embed(title="**LEVEL UP!**",description=f'{user.mention} has leveled up to level {lvl_end}! :fire: 'f'\n Soundwave Superior,{user.mention} Inferior ',color=discord.Color.dark_red())
embed.set_thumbnail(url=user.avatar_url)
users[f'{user.id}']['level'] = lvl_end
await message.channel.send(embed=embed)
#MY CODE
@client.event
async def on_message(message):
global m
with open(r"C:\Users\Frank\Desktop\BOTZS\LvlUP.json", 'r') as f:
m = json.load(f)
if message.content == "Level":
embed=discord.Embed(title="**Current Level**", description=(str(m[str(message.author.id)]["level"])),color=discord.Color.dark_red())
await message.channel.send(embed=embed)
非常感谢!
我注意到您没有使用 on_member_remove
事件。它允许您在用户离开您的不和谐服务器时删除他们。另外,我认为你的代码可以更轻一些,更容易理解。
这是为您的机器人制作一个非常简单的关卡系统的方法:
import discord
from discord.ext import commands
from json import dumps, loads
from random import randint
def get_data():
with open('members.json', 'r') as file:
return loads(file.read())
def set_data(members):
with open('members.json', 'w') as file:
file.write(dumps(members, indent=2))
@client.event
async def on_member_join(member):
members = self.get_data()
members.append({'name': member.name, 'id': member.id, 'level': 0,'xp': 0})
set_data(members)
@client.event
async def on_member_remove(self, member):
members = self.get_data()
members.remove({'name': member.name, 'id': member.id, 'level': member.level, 'xp': member.xp})
set_data(members)
@client.event
async def on_message(message):
members = self.get_data()
member = members[message.author.id]
member['xp'] += 5
if member['xp'] > member['xp']**(1 / 4):
member['level'] += 1
await message.channel.send(f" {message.author.mention} leveled up! He's now level {member['level']}")
set_data(members)
@commands.command()
async def xp(self, ctx):
members = self.get_data()
for member in members:
if ctx.author.id == member['id']:
await ctx.send(f"️ You're level {member['level']} ({member['xp']}/{self.base_xp * (member['level']+1 * self.factor)})")