在 discord.py 中通过标签命令搜索用户
Search user by tag command in discord.py
我正在尝试执行一个命令来搜索与作者具有相同标签的用户,我正在尝试很好地列出它们,但我 运行 通过 TypeError
.
我的代码是:
@bot.command()
async def tag(ctx, tag):
tag1 = tag[1:]
counter = 0
guild = ctx.guild
for member in guild.members:
if tag == member.discriminator or tag1 == member.discriminator:
found = "\n".join([member.name for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
found2 = "\n".join([member.id for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
counter += 1
await ctx.send(f"{found} - {found2}")
return
错误是:Command raised an exception: TypeError: sequence item 0: expected str instance, int found
我知道导致错误的部分,但我不知道如何修复它,导致此错误的部分是:found2 = "\n".join([member.id for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
如有任何帮助,我们将不胜感激。
将 member.id
更改为 str
:
found2 = "\n".join([str(member.id) for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
您的代码存在不止 1 个问题,即使您达到了 运行,您也不会得到您想要的结果。
函数参数
Discord 将以下参数传递给命令函数:
async def command(Context, *Message)
第一个参数始终是 Discord 上下文,第二个(及后续)参数是在命令之后写入的每个单词:
如果你写 .command This is a Test
,Discord 将按以下方式传递参数:
Context, This, is, a, Test
在定义中的参数前添加 * 表示该参数包含所有剩余参数。因此,在此示例中,*Message 将收集 (This, is, a, Test)
话虽如此,您的 tag
参数除了捕获命令调用后写入的第一个单词外不会做任何其他事情。
如何获取作者标签:
authorTag = ctx.author.discriminator
Return声明
在您的代码中,一旦匹配到 1 个人,您就会调用 return 语句。这会将函数停止到 运行,这意味着您只匹配具有相同标签的第一个人,之后的其他人将不会被检查。
码长
尝试编写代码,每一行都不要超过 80-100 个字母。
这使它对您和其他人更具可读性。您不应该被迫向侧面滚动。当然,如果你觉得没有别的办法,那就去吧,但要尽量避免。
您的代码没有按照您的要求执行
仔细检查您的代码:
- 你制作了一个检查每个成员的 for 循环。
- 如果该成员具有与作者相同的标签,则继续。
- 现在,制作一个包含公会每个成员姓名的列表
- 并制作一个列表,其中包含公会的每个成员 ID
- 合并两个列表并发送,现在停止代码
我重写了代码以实际匹配您想要执行的操作(至少我希望如此):
@client.command()
async def tag(ctx):
authorTag = ctx.author.discriminator
guild = ctx.guild
sameTag = []
for member in guild.members:
if authorTag == member.discriminator and member != ctx.author:
sameTag.append(f"{member.name} - {str(member.discriminator)}")
if len(sameTag) == 0:
sameTag.append("No matches found")
await ctx.send("\n".join(sameTag))
我正在尝试执行一个命令来搜索与作者具有相同标签的用户,我正在尝试很好地列出它们,但我 运行 通过 TypeError
.
我的代码是:
@bot.command()
async def tag(ctx, tag):
tag1 = tag[1:]
counter = 0
guild = ctx.guild
for member in guild.members:
if tag == member.discriminator or tag1 == member.discriminator:
found = "\n".join([member.name for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
found2 = "\n".join([member.id for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
counter += 1
await ctx.send(f"{found} - {found2}")
return
错误是:Command raised an exception: TypeError: sequence item 0: expected str instance, int found
我知道导致错误的部分,但我不知道如何修复它,导致此错误的部分是:found2 = "\n".join([member.id for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
如有任何帮助,我们将不胜感激。
将 member.id
更改为 str
:
found2 = "\n".join([str(member.id) for member in guild.members if tag1 == member.discriminator or tag == member.discriminator])
您的代码存在不止 1 个问题,即使您达到了 运行,您也不会得到您想要的结果。
函数参数
Discord 将以下参数传递给命令函数:
async def command(Context, *Message)
第一个参数始终是 Discord 上下文,第二个(及后续)参数是在命令之后写入的每个单词:
如果你写 .command This is a Test
,Discord 将按以下方式传递参数:
Context, This, is, a, Test
在定义中的参数前添加 * 表示该参数包含所有剩余参数。因此,在此示例中,*Message 将收集 (This, is, a, Test)
话虽如此,您的 tag
参数除了捕获命令调用后写入的第一个单词外不会做任何其他事情。
如何获取作者标签:
authorTag = ctx.author.discriminator
Return声明
在您的代码中,一旦匹配到 1 个人,您就会调用 return 语句。这会将函数停止到 运行,这意味着您只匹配具有相同标签的第一个人,之后的其他人将不会被检查。
码长
尝试编写代码,每一行都不要超过 80-100 个字母。 这使它对您和其他人更具可读性。您不应该被迫向侧面滚动。当然,如果你觉得没有别的办法,那就去吧,但要尽量避免。
您的代码没有按照您的要求执行
仔细检查您的代码:
- 你制作了一个检查每个成员的 for 循环。
- 如果该成员具有与作者相同的标签,则继续。
- 现在,制作一个包含公会每个成员姓名的列表
- 并制作一个列表,其中包含公会的每个成员 ID
- 合并两个列表并发送,现在停止代码
我重写了代码以实际匹配您想要执行的操作(至少我希望如此):
@client.command()
async def tag(ctx):
authorTag = ctx.author.discriminator
guild = ctx.guild
sameTag = []
for member in guild.members:
if authorTag == member.discriminator and member != ctx.author:
sameTag.append(f"{member.name} - {str(member.discriminator)}")
if len(sameTag) == 0:
sameTag.append("No matches found")
await ctx.send("\n".join(sameTag))