(discord.py) 在 cog 中运行

时间:2021-01-20 03:36:03

标签: python discord.py

我一直在尝试用 python 开发一个不和谐的机器人,我想制作一堆没有出现在帮助中的“隐藏”命令。我想让它每当有人激活隐藏命令时,机器人都会向他们发送 pm。我试图制作一个函数来做到这一点,但到目前为止它不起作用。这是 cog 文件中的代码:

import discord
from discord.ext import commands

class Hidden(commands.Cog):
  def __init__(self, client):
    self.client = client
  
  def hidden_message(ctx):
    ctx.author.send('You have found one of several hidden commands! :shushing_face:\nCan you find them all? :thinking:')

  @commands.command()
  async def example(self, ctx):
        
    await ctx.send('yes')

    hidden_message(ctx)

def setup(client):
  client.add_cog(Hidden(client))

运行示例命令时,机器人会正常响应,但不会调用该函数。控制台中没有错误消息。我对 python 还是很陌生,所以有人能告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分:3)

在调用 await 等异步函数时需要使用 ctx.author.send,因此您包装的函数也需要异步

async def hidden_message(self, ctx):
    await ctx.author.send('You have found one of several hidden commands! :shushing_face:\nCan you find them all? :thinking:')

然后

@commands.command()
async def example(self, ctx):
    await ctx.send('yes')
    await self.hidden_message(ctx)

最后,要使命令从默认帮助命令中隐藏,您可以这样做

@commands.command(hidden=True)

答案 1 :(得分:2)

为了发送消息,hidden_message 必须是一个 courotine,即它使用 async def 而不仅仅是 def

然而,由于 hidden_message 的调用方式,会出现第二个问题。将 hidden_message 调用为 hidden_message(ctx) 需要在全局范围内定义该函数。由于它是 class Hidden 的方法,因此需要这样调用。

突出显示编辑:

class Hidden(commands.Cog):
    ...
    async def hidden_message(self, ctx):
        ...

    @commands.command()
    async def example(self, ctx):
        await ctx.send("yes")
        await self.hidden_message(ctx)