показать систему уровня пользователя Discord.py - PullRequest
0 голосов
/ 27 февраля 2019

Я работаю над системой добавления уровня

import discord
from discord.ext.commands import Bot
from discord.ext import commands
import json
import os
import asyncio
import time
import random
from discord import Game
import math, time

Client = discord.client
client = commands.Bot(command_prefix = '!')
Clientdiscord = discord.Client()

os.chdir(r'C:\Users\Hema\Desktop\Level')

@client.event
async def on_ready():
print('lvl ready')

@client.event
async def on_message(message):

with open('users.json', 'r') as f:
    users = json.load(f)

    #code
    await update_data(users, message.author)
    await add_experience(users, message.author, 5)
    await level_up(users, message.author, message.channel)



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


if message.content == 'system lvl':
    await client.send_message(message.channel, '{} level up {}'.format(message.author.mention, lvl_end))
    users[message.author.id]['level'] = lvl_end

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

#code

await update_data(users, member)

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(users[message.author.id]["experience"] ** (1/4))

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


client.run("Token")

работает отлично ^)

, но проблема отображается, когда я хочу узнать уровень пользователя, введя "system lvl", показывая эту ошибку

=========== RESTART: C:\Users\Darzy\Desktop\Level\Bot_lvl.py ===========

lvl ready
Ignoring exception in on_message
Traceback (most recent call last):
File "C:\Users\Darzy\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\discord\client.py", line 307, in _run_event
yield from getattr(self, event)(*args, **kwargs)
File "C:\Users\Darzy\Desktop\Level\Bot_lvl.py", line 31, in on_message
await level_up(users, message.author, message.channel)
File "C:\Users\Darzy\Desktop\Level\Bot_lvl.py", line 67, in level_up
lvl_end = int(users[message.author.id]["experience"] ** (1/4))
NameError: name 'message' is not defined.

Я просто удивляюсь, если это возможно, чтобы решить эту проблему, я пробовал много методов, но не работал: кроме того, просто изменил автора для пользователя и все еще та же проблема.я верю в stackoverflow.сообщество разработчиков ^)

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Ответ из другой темы.

Опыт (XP) не работает для всех пользователей JSON Discord.PY

import json
import discord

client = discord.Client()

try:
with open("users.json") as fp:
    users = json.load(fp)
except Exception:
users = {}

def save_users():
with open("users.json", "w+") as fp:
    json.dump(users, fp, sort_keys=True, indent=4)

def add_points(user: discord.User, points: int):
id = user.id
if id not in users:
    users[id] = {}
users[id]["level"] = users[id].get("level", 0) + points
#  print("{} now has {} level".format(user.name, users[id]["level"]))
save_users()

def get_points(user: discord.User):
id = user.id
if id in users:
    return users[id].get("level", 0)
return 0

@client.event
async def on_message(message):
if message.author == client.user:
    return
# print("{} sent a message".format(message.author.name))
# if message.content.lower().startswith("!points"):
#     msg = "You have {} points!".format(get_points(message.author))
#     await client.send_message(message.channel, msg)
add_points(message.author, 0.01)

if message.content == '!Lvl':
    msg = "Your Lvl {}!".format(get_points(message.author))
    await client.send_message(message.channel, msg)        


client.run("token")

`

0 голосов
/ 27 февраля 2019

Насколько я вижу из вашего кода, канал не определен в этой функции.Сейчас я не знаком с библиотекой разногласий Python, но кажется, что вы можете использовать message.channel для ответа на канал, с которого было отправлено сообщение.

...