我想在命令功能下使用return,我该如何将其用作变量?

时间:2020-07-09 11:37:13

标签: python bots discord discord.py discord.py-rewrite

我想阻止我的机器人自行回答,因此我试图建立一个if语句,显然这不是正确的语句。在这种情况下,我用message.author替换了什么?

@client.command()
async def amy(ctx):
    if message.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)

我知道如何处理事件,我只是不确定在命令下使用什么...

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)

4 个答案:

答案 0 :(得分:1)

Y!我发现您拼错了ctx和消息!命令没有消息变量!

@client.command()
async def amy(ctx):
    if message.author == client.user: # <-- RIGHT HERE
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif) 

所以基本上您只需要将代码更改为:

@client.command()
async def amy(ctx):
    if ctx.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)

希望有帮助!

答案 1 :(得分:1)

到目前为止,我只看到答案说明了您需要做什么。但不是为什么您需要执行他们告诉您的操作。该答案将为您提供策略和解决方案,因此您无需再次提出这些问题。 (并不是说它是错误的,但是您可以自己轻松地找到它,从而节省大量时间)。

步骤1:在文档中搜索事件(或在这种情况下,如何创建命令)

我们想了解如何制作命令。我们首先搜索如何制作命令。例如,this链接可帮助您执行命令。可以通过输入“如何在不和谐的py中进行命令”并获取来自官方文档https://discordpy.readthedocs.io/的第一个链接来获得此链接。

步骤2:查看从事件中获得的参数(对象)

阅读文档时,您会在第一部分中看到它使用了context对象。并且您可以通过功能(变量ctx)的输入来使用它。现在,我们想研究如何使用ctx/context object

步骤3:了解对象的用途

如前所述,我们想了解如何使用对象。在这种情况下,我们将重点放在“ ctx”对象上。描述上下文对象的页面告诉ctx对象包含的所有内容。如您所见,出现的第一个参数是message object。这就是您想要的一部分。因此访问它的方式可能只是:ctx.message.author。但是其他人怎么说:ctx.author?好吧,如果您进一步阅读上下文页面,我们还会看到一个Author成员。它还指出这是Message.Author的简写。意味着我们还可以使用:ctx.author,以获得完全相同的结果。

第4步:将对象集成到代码中

现在,我们知道上下文对象是什么,以及我们可以使用它做什么。但是我们如何整合它呢?

首先,让我们想起我们想要实现的目标很有用。我们希望阻止机器人对其自身做出响应。因此,只需忽略可能来自您的机器人的消息即可。我们需要比较传入消息的作者是否是该机器人,如果它来自该机器人,则需要忽略它。

如步骤3所述。我们可以使用ctx.message.authorctx.author来获取作者。如果它等于漫游器(client.user),那么我们应该早点回来。

这将导致一个if语句检查两个值:

@client.command()
async def amy(ctx):
    if ctx.author == client.user:
        return
    else:
        # the rest of your code.

@client.command()
async def amy(ctx):
    if ctx.message.author == client.user:
        return
    else:
        # the rest of your code.

_________________________________________________________________

我建议阅读文档。因为它很有帮助。通常,从事件/命令获得的输入只是完成工作所需的全部。如果您确切地知道自己需要什么,也很方便。例如,您可能已经搜索了从函数中获得的所有对象,并在其中搜索了特定的变量和描述,在这种情况下,您需要使用“作者”。这样可以使搜索更快。

无论如何,知道可以使用哪些通用对象很有用。因为这有助于为您的机器人编写代码。

答案 2 :(得分:0)

@client.event
async def on_message(message):
    if message.author == client.user:
        return

您已经做对了。 if是否需要放在函数顶部。似乎还有其他问题。

答案 3 :(得分:0)

如果我理解正确,则您不希望您的程序响应自身的命令。 在这种情况下,请使用ctx.author而不是message.author

尝试使用此代码:

@client.command()
async def amy(ctx):
    if ctx.author == client.user:
        return
    else:
        gif = discord.Embed(color = 0x83B5E3)
        gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif')
        await ctx.channel.send(embed=gif)