问题描述
最近几天,我一直在尝试将用 discord.py 编写的不和谐机器人的结构调整为更面向 OOP 的结构(因为周围有功能并不理想).
These last few days, I've been trying to adapt the structure of a discord bot written in discord.py to a more OOP one (because having functions lying around isn't ideal).
但我发现的问题比我想象的要多得多.问题是我想将所有命令封装到一个单个类中,但我不知道要使用哪些装饰器以及我必须继承哪些类以及如何继承.
But I have found way more problems that I could have ever expected. The thing is that I want to encapsulate all my commands into a single class, but I don't know what decorators to use and how and which classes I must inherit.
到目前为止,我所取得的成果是类似于下面的代码片段.它会运行,但在执行命令时会抛出类似
What I've achieved so far is code like the snippet down below. It runs, but at the moment of executing a command it throws errors like
discord.ext.commands.errors.CommandNotFound:命令状态"没找到
discord.ext.commands.errors.CommandNotFound: Command "status" is not found
我使用的是 Python 3.6.
I'm using Python 3.6.
from discord.ext import commands class MyBot(commands.Bot): def __init__(self, command_prefix, self_bot): commands.Bot.__init__(self, command_prefix=command_prefix, self_bot=self_bot) self.message1 = "[INFO]: Bot now online" self.message2 = "Bot still online {}" async def on_ready(self): print(self.message1) @commands.command(name="status", pass_context=True) async def status(self, ctx): print(ctx) await ctx.channel.send(self.message2 + ctx.author) bot = MyBot(command_prefix="!", self_bot=False) bot.run("token")
推荐答案
要注册命令你应该使用self.add_command(setup),但是你不能有self
To register the command you should use self.add_command(setup), but you can't have the self argument in the setup method, so you could do something like this:
from discord.ext import commands class MyBot(commands.Bot): def __init__(self, command_prefix, self_bot): commands.Bot.__init__(self, command_prefix=command_prefix, self_bot=self_bot) self.message1 = "[INFO]: Bot now online" self.message2 = "Bot still online" self.add_commands() async def on_ready(self): print(self.message1) def add_commands(self): @self.command(name="status", pass_context=True) async def status(ctx): print(ctx) await ctx.channel.send(self.message2, ctx.author.name) self.add_command(status) bot = MyBot(command_prefix="!", self_bot=False) bot.run("token")