discord.py - discord.py 如何显示包含新成员的用户级别系统
问题描述
我已经制作了一个显示级别的代码,它工作得非常好,除了当新成员加入时代码不起作用,因为它只需要 .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)})")
推荐阅读
- rust - Rust 结构的 JS 样式静态属性
- python-3.x - 第3行是什么意思?
- html - 对为什么 p 标签显示在 div 旁边感到困惑,如果有人愿意接受它
- vue.js - 如何使用 Vue CLI 和 Yarn Workspaces 启用 HMR?
- reportbuilder - Reporting Services 本地找不到程序集
- swift - RealityKit – transform.rotate() 使对象的规模更大
- python - 基于多列更新 NaN 列(带字符串)
- java - 如何将文本文件的内容转换为单个变量?(爪哇)
- oop - Common Lisp 对象系统中的通用调度与经典 OOP 中的动态调度相同吗?
- fortran - 在其他语言中是否有类似的“COMMON”(来自 Fortran 的引用环境)的实现?