【问题标题】:Positional error when trying to specify member尝试指定成员时出现位置错误
【发布时间】:2019-03-02 19:22:46
【问题描述】:

您好,我正在尝试获取会员姓名而不是作者姓名

我尝试了一些方法,例如 for member is message.server.members:,它返回了服务器中每个成员的多个结果,并尝试了 member: discord.Member 作为产生错误的签名:

这是我正在使用的:

async def on_message_delete(self, message):
    server = message.server
    author = message.author
    role =  get(server.roles, name="Powerbot")
    channel = get(message.server.channels, name="mod-log")
    time = datetime.utcnow()
    cleanmsg = message.content
    for i in message.mentions:
        cleanmsg = cleanmsg.replace(i.mention, str(i))
    fmt = '%H:%M:%S'
    name = author
    name = " ~ ".join((name.name, name.nick)) if name.nick else name.name
    if role not in author.roles:
        infomessage = "A message by {}, was deleted in {} by {}".format(message.author.mention, message.channel.mention, member,mention)
        delmessage = discord.Embed(description=infomessage, colour=discord.Color.purple(), timestamp=time)
        delmessage.add_field(name="Message:", value=cleanmsg)
        delmessage.set_footer(text="User ID: {}".format(message.author.id))
        delmessage.set_author(name=name + " message deleted.", icon_url=message.author.avatar_url)
        delmessage.set_thumbnail(url="http://i.imgur.com/fJpAFgN.png")
        try:
            await self.bot.send_message(channel, embed=delmessage)
        except:
            pass

member.mention 所在的行。

infomessage = "A message by {}, was deleted in {} by {}".format(message.author.mention, message.channel.mention, member.mention)

示例输出:作者的消息在频道中被会员删除。

如果有人可以提供帮助,将不胜感激。

【问题讨论】:

  • 错误是什么?
  • TypeError: on_message_delete() missing 1 required positional argument: 'member' 这是我在协程签名中添加member: discord.Member 时收到的消息。

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


【解决方案1】:

我很确定客户不会被告知谁删除了该消息,只是知道它已被删除。 message 对象本身不包含该信息,而来自 rewrite 分支的 RawMessageDeleteEvent 也没有。

我对底层的 Discord API 不是很熟悉,但 Message Delete 网关事件看起来是 discord.py 在删除消息时收到的,它没有提及删除者的身份。

【讨论】:

    【解决方案2】:

    无法从您使用的 discord 版本中查看删除消息的人,因为稳定的 discord.py 不包含对审计日志的支持。 您将需要 discord.py 重写才能使用以下解决方案:

    @bot.event()
    async def on_message_delete(msg):
        audits = await msg.guild.audit_logs(limit=10, action=discord.AuditLogAction.message_delete)
        async for audit in audits:
            try:
                await audit.target.get_message(msg.id)
            except discord.NotFound:
                continue      
            print(audit.user)
            break
    

    这是假设消息即使在被删除后仍会保留。如果上述方法不起作用,我想我们能做的最好的就是:

    @bot.event()
    async def on_message_delete(msg):
        audits = await msg.guild.audit_logs(limit=10, action=discord.AuditLogAction.message_delete)
        audit = await audits.get(extra__channel=msg.channel)
        print(audit.user)
    

    有关详细信息,请参阅:

    https://discordapp.com/developers/docs/resources/audit-log

    https://discordpy.readthedocs.io/en/rewrite/api.html#discord.AuditLogAction

    【讨论】:

    • 我可能在代码示例中输入了一两个错字,因为我在移动设备上(无法验证)。如果有人能指出代码有什么问题或者它是否有效,那就太好了。谢谢!
    • According to the docs, target 是删除邮件的UserMember,而不是邮件本身。
    • @PatrickHaugh 我错误地认为这是消息,这样会更有意义。不知道他们为什么将目标设置为会员。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多