我无法使用 discord.py 向我的 discord 机器人添加命令

Posted

技术标签:

【中文标题】我无法使用 discord.py 向我的 discord 机器人添加命令【英文标题】:I can't add commands to my discord bot with discord.py 【发布时间】:2018-12-01 12:36:54 【问题描述】:

这是我的代码:

from discord.ext import commands
import discord
import config

class Bot(commands.AutoShardedBot):

    def __init__(self):
        super().__init__(command_prefix="~")

    @commands.command()
    async def test(self, ctx):
        await ctx.send("some random text")

    def run(self):
        super().run(config.TOKEN)


if __name__ == "__main__":
    bot = Bot()
    bot.run()

所以现在,当我输入~test 时,它应该以some random text 响应,但终端中却弹出了这条错误消息:

Ignoring exception in command None:
discord.ext.commands.errors.CommandNotFound: Command "test" is not found

我看不出我做错了什么。

【问题讨论】:

【参考方案1】:

Discord.py 目前无法自动注册来自Client 子类的命令,这些子类由@commands.command() 修饰。但是,您仍然可以手动将它们添加到 __init__ 或任何将要运行的位置:

class Bot(commands.AutoShardedBot):

    def __init__(self):
        super().__init__(command_prefix="~")
        self.add_command(commands.Command("test", self.test))
        # or uglier:
        self.command()(self.test)

    async def test(self, ctx):
        await ctx.send("some random text")

如果你愿意,你仍然可以使用装饰器(我更喜欢这种方式,因为它更简单):

class Bot(commands.AutoShardedBot):

    def __init__(self):
        super().__init__(command_prefix="~")
        self.add_command(self.test)

    @commands.command()
    async def test(self, ctx):
        await ctx.send("some random text")

如果您将有很多初始命令并且懒得为每个命令调用add_command,您可以执行以下操作:

import inspect

class Bot(commands.AutoShardedBot):
    def __init__(self):
        super().__init__(command_prefix="~")

        members = inspect.getmembers(self)
        for name, member in members:
            if isinstance(member, commands.Command):
                if member.parent is None:
                    self.add_command(member)

    @commands.command()
    async def test(self, ctx):
        await ctx.send("some random text")

    @commands.command()
    async def test2(self, ctx):
        await ctx.send("some random text2")

    @commands.command()
    async def test3(self, ctx):
        await ctx.send("some random text3")

【讨论】:

api 可能会发生变化,因为 Command.__init__ 的答案现在只使用一个参数:func 和 kwargs。所以在第一个例子中是self.add_command(commands.Command(self.test, name="test")) 而不是self.add_command(commands.Command("test", self.test))【参考方案2】:

尝试做:

ma​​in.py

import discord
import os

client = discord.Client

@client.event
async def on_message(message):
if message.content.startswith("!hello")
await message.channel.send("hello!")

client.run(os.getenv("TOKEN"))

.env

TOKEN=paste your token here

【讨论】:

以上是关于我无法使用 discord.py 向我的 discord 机器人添加命令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 discord.py 使用我的不和谐机器人编辑嵌入颜色

Discord.py 机器人:如何让我的不和谐机器人向我发送对用户在 DM 中使用的命令的响应,例如进行调查?

Discord.py bot - 如何让机器人在 DM 中向我发送用户的消息?

discord.py 后台任务循环的问题

Discord Bot 不播放声音 - Discord.py

运行一个函数会阻止机器人 - discord.py