【问题标题】:Get Discord username and discriminator through a mention通过提及获取 Discord 用户名和鉴别器
【发布时间】:2021-04-25 12:52:19
【问题描述】:

我已尝试阅读文档,但我不明白这里发生了什么以及如何修复它。我正在尝试将提及映射到其正确的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'] 时,它会给出我期望的列表。

有人可以帮忙吗?

【问题讨论】:

  • 你应该试试print(message.mentions[0].mention)。结果可能会让你大吃一惊:)我在@effprime 的回答中解释了为什么。
  • 你不应该使用 on_message 命令。
  • @FluxedScript 对不起,这对我来说是全新的,我一时兴起。 discordpy.readthedocs.io/en/latest/… 我只是像我在这里看到的例子那样做。我应该如何正确地重写这个?
  • 那将是另一个问题@andru

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


【解决方案1】:

只需将成员对象转换为字符串即可获得名称和鉴别器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,则您根本没有传递参数

【讨论】:

  • Member.mention 返回与f'<@{member.id}>' 相同的字符串。
【解决方案2】:

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

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

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

【讨论】:

  • 这是正确的。 Member.mention 将返回一个适合提及该成员的字符串,但它看起来不像 MyName#1234;相反,它将是类似于:<@80351110224678912> 的内部表示。 Relevant documentation.
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 2021-12-03
  • 2018-08-17
  • 2021-01-21
  • 2016-12-20
  • 2019-12-30
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多