#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. Ценю помощь! Спасибо, что объяснили это тоже