在 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))