其中很多都来自经验,所以如果需要一段时间才能掌握窍门,请不要气馁!我知道文档可能有点令人生畏,但我会尽力提供一些示例来提供帮助。
在制作不和谐机器人时,通常您会根据参数和ctx (context) 获取信息。
首先我将从一些一般示例开始,然后我将介绍如何在使用 d.py 时使用这些示例。
参数和参数
在python中创建函数时,可以定义参数类型:
def my_func(a: int):
return a + 5
它的作用是假设传递给my_func 的参数是整数,因此也表现得像ints:
my_func(1)
如您所料,将返回6。
但是,当您尝试传递类似这样的内容时:
my_func("1")
你会得到一个TypeError,它抱怨连接 str 和 int。此外,当您列出对象的属性时,您可以看到对象的差异,如下所示:dir(obj)
将同样的概念应用于命令时:
@bot.command()
async def cmd(ctx, member: discord.Member):
await ctx.send(f"Hello, {member.mention}!")
但是在使用命令时,它的作用是能够根据您输入的属性(例如成员的 ID 或名称)获取成员。它找到的成员具有discord.Member 对象的所有属性。
这意味着您将能够访问诸如成员的roles 之类的东西,它返回一个包含每个角色的列表作为discord.Role 对象,您可以从那里获取角色的属性,等等以此类推。
旁注:
在 d.py 中获取对象的另一种方法是使用 discord.utils。它接受一个可迭代的,例如一个列表,作为第一个参数,然后它使用关键字参数,例如 name、id、colour 或 abc 的任何属性返回一个对象。
例子:
@bot.command()
async def getrole(ctx):
role = discord.utils.get(ctx.author.roles, name="Very Special Role!", mentionable=True)
await ctx.send(f"Look at you with your {role.mention} How classy!")
这将遍历每个消息发送者的角色,寻找可提及的名称(区分大小写)Very Special Role!,它将使用角色的属性之一发送消息; mention.
上下文
对于命令,您要传入的第一个参数是Context,按照惯例,它表示为ctx。
如链接所示,它具有一系列属性,主要围绕命令的来源、作者以及有关它的所有其他详细信息等。
@bot.command()
async def hello(ctx):
await ctx.send(f"Hello, {ctx.author.name}!")
在那里的命令中,我使用来自名为send() 的上下文中的coroutine,它用于发送消息。
并且在命令的上下文中,它将把它发送到同一个频道,这就是它的工作原理。
还有一些常用的多余代码示例:
ctx.message.channel.send("some message")
ctx.message.author.send("some dm")
可以分别变成:
ctx.send("some message")
ctx.author.send("some dm")
但是你怎么知道你可以在哪里send() 发消息呢?好吧,这将我们带到下一部分:
抽象基类
这些是我假设您在定义对象时所谈论的内容。它们是对象继承的基础模板 - 例如,TextChannel 继承了 Messageable 的所有属性(connectable 除外,它仅由 discord.VoiceChannel.channel 继承。
我将以abc.Messageable 为例。在链接中,它为我们提供了一些 Messageable 对象的示例,即您可以将消息发送到的位置,这些对象包括 TextChannels、Members 等。
有时我看到有人错过了await,或者不知道何时添加它们,或者添加它们过于频繁。您会知道何时添加一个,因为文档会说明该函数是否为 couroutine,例如:
这就是您知道可以对每个对象做什么的方式 - 将这些视为您在不和谐中获得的对象的模板,而不是您定义的东西!
如果您需要进一步澄清或发现我的回答有任何错误,请告诉我。
参考资料: