将消息嵌入代码迁移到1.0版本

前一段时间,我制作了一个不和谐的bot,目的是涉及我和我的朋友所需要的消息嵌入。长话短说,由于主机(树莓派)死亡,该机器人下线了大约一年。今天是快速转发,我们再次需要它,因此我尝试将其启动,但是注意到我的大多数代码不再起作用,因为discord.py的异步分支已更新为v1.0,这带来了重大更改和要求迁移代码以符合新库。通过查看文档,我能够弄清楚所有内容,除了我的机器人的嵌入部分。哪个是最重要的。

这是我将重点关注的代码,后面会有更多内容,但这与本部分无关,因为如果我可以在字符串中成功存储我想要的值,那么其余的应该起作用。

async def on_message(message):
    serverid = message.guild.id
    channel = message.channel
    messagecontent = message.content
    if message.embeds:
        try:
            charaname = message.embeds[0]['author']['name']
            charaseries = message.embeds[0]['description']
        except AttributeError:
            return

我基本上想做的是,如果一条消息有一个嵌入,那么我需要将名称和描述值存储在单独的字符串中,以供以后在代码中使用。但是我试图这样做:

Ignoring exception in on_message
Traceback (most recent call last):
  File "C:\discord\client.py",line 270,in _run_event
    await coro(*args,**kwargs)
  File "C:\path_to_script",line 35,in on_message
    charaseries = message.embeds[0]['description']
TypeError: 'Embed' object is not subscriptable

一些研究告诉我,“可下标”是指一个对象可以包含多个其他对象(例如列表)的时间。 here的解释更好。如果它不是可下标的,那么我想新库将具有全新的处理方式,我似乎无法弄清楚。因此,我需要帮助来了解这里到底发生了什么,以便我可以修改代码并使这部分再次工作。

非常感谢您的帮助,谢谢!

lyp6197 回答:将消息嵌入代码迁移到1.0版本

TypeError: 'Embed' object is not subscriptable,如您所见,Embed是object,它是not subscriptable

可下标对象的示例之一是标准字典。这意味着可以使用["key_name"]来访问它的属性。

要使其他对象可被下标,它们需要实现__getitem__() dunder方法。由于出现object not subscriptable错误,这意味着您的Embed对象未实现此方法。

您曾经能够以这种方式访问​​它们,但是如果您查看d.py migrating page,则会看到它们指出:

  

Message.embeds现在是Embed列表,而不是dict对象。

这是Embed对象的列表,如果您查看current Embed documentation,将看到如何访问它的属性-对于您的情况:

charaname = message.embeds[0].author.name
charaseries = message.embeds[0].description

为澄清起见,message.embeds是一个Embed对象的列表,因此,使用[0],我们从该列表中获得第一个元素,即Embed object

您可以看到from the documentation,我们可以使用description属性访问它的描述,不是吗?

如果我们执行.author,如从documentation所见,我们将访问其作者EmbedProxy object。现在我们可以从中访问什么?如果您查找前一个documentation link,它将显示See set_author() for possible values you can access.

因此,我们来看看set_author()的文档,因为我们看到它的参数是

name (str)
url (str)
icon_url (str)

因此,按照文档中的上一个语句,我们知道我们可以访问那些3。

所以这都是有效的:

message.embeds[0].author.name
message.embeds[0].author.url 
message.embeds[0].author.icon_url 

如果未设置任何一个,它将返回Embed.Empty,如the docs所示

因此,如果未设置它们,您将得到Embed.Empty,这种嵌入的一个示例是:

embed = discord.Embed(title="Test embed #1",description="Some description")
await ctx.send(embed=embed)

您看到未设置作者,因此如果获取message.embeds[0].author.name会得到Embed.Empty,而对于message.embeds[0].description会得到Some description,因为它已被设置。

在嵌入中设置作者的一个示例:

embed = discord.Embed(title="Test embed #2",description="Some description").set_author(name=ctx.author.name)
await ctx.send(embed=embed)

(我们使用了set_author())-由于我们是在Embed初始化期间设置的,因此将获得作者姓名的字符串。

本文链接:https://www.f2er.com/3004779.html

大家都在问