Что я делаю не так в моем Discord.py Винтик экономики?

#python #mongodb #heroku #discord.py

#python #mongodb #heroku #discord.py

Вопрос:

Я использую MongoDB для запуска экономичной системы для моего бота Discord, размещенного на Heroku, в последнее время он работал нормально, пока я не попытался переместить его на собственный винтик, чтобы очистить своего бота, однако я думаю, что сделал что-то не так, поскольку получаю сообщение об ошибке follow. Я был бы очень признателен, если бы кто-нибудь мог указать, что я сделал не так в этой ситуации.

раздор.внешние команды.ошибки.Ошибка CommandInvokeError: команда вызвала исключение: ошибка имени: имя ‘open_account’ не определено

 import discord
from discord.ext import commands
import random
from datetime import datetime
from datetime import date
from datetime import timedelta
import asyncio
import time
import os
import psycopg2
import pymongo
from pymongo import MongoClient
from discord.ext import tasks

cluster = MongoClient("securelinkhere")
db = cluster["SGBot"]
collection = db["SGBot"]

class Economy(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.command()
    async def balance(self, ctx):
        await open_account(ctx.author)
        discorduserid = ctx.author.id

        document = collection.find_one({"userid":discorduserid})
        print(document)

        wallet_amt = document["points"]

        em = discord.Embed(title = f"{ctx.author.name}'s balance", colour = discord.Colour.red())
        em.add_field(name = "Wallet", value = wallet_amt)
        await ctx.send(embed = em)

    @commands.command()
    @commands.cooldown(1, 14400, commands.BucketType.user)
    async def work(self, ctx):
        await open_account(ctx.author)

        discorduserid = ctx.author.id

        earnings = random.randrange(1000)

        await ctx.send(f"You went to work and earned {earnings} coins!")
        doc = collection.find_one({"userid":discorduserid})

        total_earnings = doc["points"]   earnings


        results = collection.update_one({"userid":discorduserid}, {"$set":{"points":total_earnings}})

    @work.error
    async def work_error(self, ctx, error):
        if isinstance(error, commands.CommandOnCooldown):
            timerem = str(timedelta(error.retry_after/86400)).split(".")[0]
            msg1 = 'This command is on cooldown, please try again in '
            msg2 = msg1   timerem
            await ctx.send(msg2)
        else:
            raise error

    async def open_account(self, user: discord.User):
        discorduserid = user.id

        doc = collection.find_one({"userid": discorduserid})

        if doc != None:
            print(doc)
        else:
            print(doc)
            new_entry = ({"userid":discorduserid, "points":0})
            collection.insert_one(new_entry)

def setup(bot):
    bot.add_cog(Economy(bot))
 

Комментарии:

1. open_account есть ли метод в классе Economy — поэтому вы должны использовать self.open_account() его для его выполнения.

2. Не уверен в этой ошибке, но как только вы ее исправите, вы столкнетесь с другой проблемой, потому что вы передаете имя авторов, open_account() а не discord.User объект.

Ответ №1:

Поскольку вы создали функцию open_account в классе Economy и вызываете ее изнутри указанного класса, вам нужно выполнить self.open_account(...) where self по соглашению, если оно передается в функцию, относится к самому классу.

Комментарии:

1. Ценю помощь! Спасибо, что объяснили это тоже