我的(非常令人震惊,虽然希望这不会成为问题)在一个运行Discord.py的discord bot上的quotebot cog的代码遇到了一些问题。我过去曾经尝试过实施团队的问题很多,而且我以前总是放弃,但是这次我想做正确的事情,因为代码刚刚变得笨重。但问题是,我真的不知道自己在做什么。到目前为止我的代码:
import discord
import asyncio
from discord.ext import commands
import json
from . import utils
import random
import math
"""Module containing all you need for a quote bot"""
data = utils.load_json("quotes")
maxID = data["maxID"]
temp = data["quotes"]
quotes = []
curPage = 0
class Quote:
def __init__(self, id, msg):
self.id = id
self.msg = msg
for i in range(0, len(temp[0])):
quotes.append(Quote(temp[1][i], temp[0][i]))
class Quotes():
def __init__(self, bot):
self.bot = bot
#All the "Quote" commands
@commands.group(pass_context=True)
async def quote(self, ctx, arg):
print(ctx.message.content)
if ctx.invoked_subcommand == None:
global quotes
global maxID
try:
if int(arg) <= maxID and int(arg) >= 1:
b = None
for s in quotes:
if int(arg) - 1 == s.id:
b = s
break
if (b == None):
await ctx.channel.send('No quote with this ID')
return
await ctx.channel.send('`Quote ' + str(int(arg)) +':` ' + str(b.msg))
else:
await ctx.channel.send('No quote with this ID')
except:
await ctx.channel.send('Invalid input')
@quote.command(pass_context=True)
async def add(self, ctx, *args):
global maxID
global quotes
quotes.append(Quote(maxID, s))
maxID += 1
await ctx.channel.send('`Added Quote ID: ' + str(maxID) + '`')
@quote.command(pass_context=True)
async def list(self, ctx):
global quotes
try:
m = []
for q in quotes:
m.append(q.msg + " | id = " + str(q.id + 1))
pages = utils.Pages(self.bot, message=ctx.message, entries=m, per_page=15)
await pages.paginate(start_page=1)
except utils.CannotPaginate as e:
print(e)
@quote.command(pass_context=True)
async def random(self, ctx):
global quotes
i = random.randint(0,len(quotes) - 1)
await ctx.channel.send('`Quote ' + str(quotes[i].id) +':` ' + str(quotes[i].msg))
@quote.command(pass_context=True)
async def remove(self, ctx, arg):
global quotes
global maxID
try:
i = int(arg) - 1
if i < maxID and i >= 0:
b = None
for s in quotes:
if i == s.id:
b = s
break
if b != None:
quotes.remove(b)
await ctx.channel.send('`Removed Quote ID: ' + str(i + 1) + '`')
else:
await ctx.channel.send('No quote with this ID')
else:
await ctx.channel.send('No quote with this ID')
except ValueError as e:
await ctx.channel.send('Invalid input')
def __unload():
global quotes
global maxID
out = [[0 for x in range(len(quotes))] for y in range(2)]
for i in range(0, len(quotes)):
out[0][i] = quotes[i].msg
out[1][i] = quotes[i].id
data["quotes"] = out
data["maxID"] = maxID
utils.save_json(data, "quotes")
utils.save_json(data, "Backups\quotes_backup")
def setup(bot):
bot.add_cog(Quotes(bot))
这个破解密码的垃圾代码是我的引用机器人。在我开始将它们移动到一个组之前,我至少可以将命令运行得很好,因此知道的很多。问题是在父函数quote()中,ctx.invoked_subcommand似乎总是返回None。我不知道我是否遗漏了什么或者我做错了什么,但我给机器人的确切输入是“ - &gt;引用列表”,据我所知,这应该是正确的。最后要注意的是,根据内置帮助,它确实将Quote识别为一个组,当我执行“ - &gt;帮助引用”时,它会提供适当的帮助结构。提前谢谢你,我确定这里的问题不是太难,我只是遗漏了一些明显的东西。
答案 0 :(得分:1)
正如Patrick Haugh所评论的那样,您的子命令将被传递到您的arg
参数中。从arg
移除async def quote(self, ctx, arg):
,它应该可以正常工作
(如果这有帮助,请给他的评论一个upvote)