name "update_data" is not defined

Пытаюсь написать ког для уровня, выходить вот такая вот ошибка: ошибка

import discord
from discord.ext import commands
from discord.ext.commands import Bot
import asyncio
import math
import json

class Leveling(commands.Cog):
    def __init__(self, Bot):
        self.Bot = Bot


async def on_member_join(self, 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)


@commands.Cog.listener()
async def on_message(self, message):
    if message.author.bot == False:
        with open('users.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('users.json', 'w') as f:
            json.dump(users, f)

    await Bot.process_commands(message)


async def update_data(self, 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(self, users, user, exp):
    users[f'{user.id}']['experience'] += exp


async def level_up(self, users, user, message):
    with open('levels.json', 'r') as g:
        levels = json.load(g)
    experience = users[f'{user.id}']['experience']
    lvl_start = users[f'{user.id}']['level']
    lvl_end = int(experience ** (1 / 4))
    if lvl_start < lvl_end:
        await message.channel.send(f'{user.mention} has leveled up to level {lvl_end}')
        users[f'{user.id}']['level'] = lvl_end

@commands.command()
async def level(self, ctx, member: discord.Member = None):
    if not member:
        id = ctx.message.author.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'You are at level {lvl}!')
    else:
        id = member.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'{member} is at level {lvl}!')

def setup(Bot):
    Bot.add_cog(Leveling(Bot))

Ответы (1 шт):

Автор решения: Roman Konoval

У вас в update_data лишний параметр self. Либо передавайте его в местах вызова, либо удалите из определения функции:

async def update_data(users, user):
    ...

В других функциях типа level_up, add_experience, кстати, то же.

→ Ссылка