通过提及获取 Discord 用户名和鉴别器

时间:2021-01-21 05:36:58

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

我尝试阅读文档,但我不明白这里发生了什么以及如何修复它。我正在尝试将提及映射到其正确的 Name#NNNN 形式,但遗憾的是,事实证明这对我来说是徒劳的。

import discord
from discord.ext import commands
from collections import defaultdict

client = commands.Bot(command_prefix=">")

@client.event
async def on_ready():
     print('Ready!')


jobz = {}
'''PART 1 v v v'''

@client.event
if message.content.startswith('>jobsched'):
        author = message.author
        jobz[author].append(...)
        await channel.send(jobz[author])


'''PART 2 v v v'''

if message.content.startswith('>when '):
        channel = message.channel
        worker = list(filter(None, message.content[6:].split(' ')))[0]
        uname = message.mentions[0].mention
        await channel.send(jobz[uname])

第 1 部分: 我先运行它,发送按预期工作,如下所示:

>jobsched 'a'
>jobsched 'b'

如最后一行所示,这会吐出 ['1a', '2b']

第 2 部分: 这是我的问题所在。

>when @Name 

期望这会吐出['1a', '2b'],因为我希望它查找或翻译提到的名称,找到其各自的名称和鉴别器。我认为这应该发生,因为在上面的文章中,这就是将名称写入字典的方式,即 Name#1234: ['1a','2b']

打印出 .keys() 表明该键具有名称和鉴别器,即 'jobz' 字典中的 Name#1234

但是,我似乎无法提及给我名称和鉴别器。我已经尝试根据我在 stackoverflow 上看到的内容来执行 mentions[0].mention,但它不会为我生成 Member class,只是一个字符串,大概只是“@Name”。如果我不理会它,如我的 'worker' 变量所示,它会传递一个空列表。它应该拉出列表,因为当我将其覆盖为 jobz['Name#1234'] 时,它会提供我期望的列表。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

只需将成员对象强制转换为字符串即可获取名称和鉴别符 as it says in the discord.py docs. 提及某人,将内部表示如下:f'<@{member.id}>'。要阻止此类问题,请使用 client.command() 更容易输入参数,也更容易访问信息。所以,这里是代码:

@client.command()
async def when(ctx, member: discord.Member):
    await ctx.send(jobz[str(member)])

此外,如果您的工作变量返回 None,则您根本没有传递参数

答案 1 :(得分:1)

mentions 是 Member 对象的列表,因此当您执行 mentions[0] 时,您正在引用一个 Member。因此,mentions[0].mention 是第一个提及(元素 0)成员的格式化提及字符串。

您可能想要 mentions[0].namementions[0].discriminator

见:https://discordpy.readthedocs.io/en/latest/api.html#discord.Message.mentions