我尝试阅读文档,但我不明白这里发生了什么以及如何修复它。我正在尝试将提及映射到其正确的 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']
时,它会提供我期望的列表。
有人可以帮忙吗?
答案 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].name
和 mentions[0].discriminator
见:https://discordpy.readthedocs.io/en/latest/api.html#discord.Message.mentions