【问题标题】:Discord.py Sending attachments for 'say' commandDiscord.py 发送“say”命令的附件
【发布时间】:2021-10-19 09:26:03
【问题描述】:

我的机器人有一个“说”命令,它重复用户在命令消息中写的内容:

  @commands.command(name = "say",
                    aliases = ['s'],
                    brief = "Repeats <message>",
                    help = "Repeats <message> passed in after the command."
                    )
  @commands.cooldown(1, cmd_cd, commands.BucketType.user)
  async def say(self, ctx, *, message):
      if ctx.message.attachments:
          await ctx.send(content=message, files=ctx.message.attachments)
      await ctx.send(message)

如果用户包含附件,我希望它也包含附件,但我似乎无法让它工作。我不断收到错误:

Command raised an exception: InvalidArgument: files parameter must be a list of File

我做错了什么?在discord.py docs 中,它说 ctx.message.attachments 属性返回一个列表,那么为什么会出现此错误? 我只是希望它以与用户发送附件完全相同的方式发送附件。不使用嵌入是否可以做到这一点?

【问题讨论】:

    标签: python python-3.x discord.py


    【解决方案1】:

    错误告诉您,它需要 List 类型为 File 的变量,但 attachments 检索类型为 attachment 的列表。

    如果您查看attachment 的文档,您可以看到使用to_file() 方法可以轻松地将其转换为File

    因此,要使您的功能正常工作,您需要将包含文件的新列表传递给files

    async def say(self, ctx, *, message):
      if ctx.message.attachments:
         new_list = list(map(lambda x:x.to_file(), ctx.message.attachments))
         await ctx.send(content=message, files=new_list)
      await ctx.send(message)
    

    【讨论】:

    • 非常感谢!在尝试您的方法时,它实际上给了我an idea,这(在我看来)更简单。
    【解决方案2】:

    感谢@Shunya 的帮助。在尝试他们的方法时,我发现了一种更简单(在我看来)的方法:

    async def say(self, ctx, *, message):
      if ctx.message.attachments:
         await ctx.send(content=message, files=[await f.to_file() for f in ctx.message.attachments])
      await ctx.send(message)
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 2023-04-06
      • 2023-03-11
      • 2023-01-09
      • 2021-10-20
      • 2021-11-07
      • 2021-07-09
      • 2021-03-24
      • 2019-12-18
      相关资源
      最近更新 更多