如何使用 Discord.py 在侦听器/事件中调用另一个命令?

时间:2021-04-22 18:22:02

标签: python discord discord.py bots

所以我想在机器人加入公会时调用一个命令。在其他 StackOverflows 的帮助下,我尝试了以下方法:

@commands.Cog.listener()
    async def on_guild_join(self, guild):
        setup_cmd = self.bot.get_command('setup')
        await self.bot.invoke(setup_cmd)

我怀疑的问题之一是 invoke() 方法需要一个 ctx,而 on_guild_join 没有提供 Context 对象。无论如何,当我尝试这样做时,我收到此错误:

Traceback (most recent call last):
  File "C:\Users\brian\.virtualenvs\ComBot-l9j8wB-A\lib\site-packages\discord\client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "D:\Documents\c0de_box\projects\Bots\ComBot\cogs\setup_tasks.py", line 14, in on_ready
    await self.bot.invoke(setup_cmd)
  File "C:\Users\brian\.virtualenvs\ComBot-l9j8wB-A\lib\site-packages\discord\ext\commands\bot.py", line 935, in invoke
    if ctx.command is not None:
AttributeError: 'Command' object has no attribute 'command'

那么在这种情况下我将如何调用另一个命令?

1 个答案:

答案 0 :(得分:1)

Bot.invokeContext 作为参数,而不是 Command 实例,虽然不可能在 Context 事件中获得 on_guild_join,但您应该创建一个函数并在命令和事件中调用它

async def setup_func(self, *args, **kwargs):
    ...

@commands.Cog.listener()
async def on_guild_join(self, guild):
    await self.setup_func(...)

@commands.command()
async def setup(self, ctx, ...):
    await self.setup_func(...)