从discord.py中最接近的匹配用户名获取用户对象

2024-06-02 12:12:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让discord bot向服务器中具有最接近匹配用户名的用户发送DM。通过最近匹配的用户名,我的意思是,如果给机器人一个用户名的一部分,比如“shin”,它会找到最近匹配的用户名,比如 “shinramen.”我提供的这段代码只适用于提及用户或用户的确切用户名。我曾尝试使用difflib,但不幸的是,它无法工作。有没有我遗漏的更简单的解决方案

async def dm(ctx, member: discord.Member):
  user = await member.create_dm()
  await user.send('message goes here')

Tags: 代码用户服务器bot机器人dmawait用户名
3条回答

以防您仍然需要它,或者其他人正在寻找它。

使用discord.utils.find查找最近的成员对象。以下是it的成员转换器示例:

class Member(commands.Converter):
    async def convert(self, ctx, argument):
        try:
            member_converter = commands.MemberConverter()
            member = await member_converter.convert(ctx, argument)
        except commands.MemberNotFound:
            member = discord.utils.find(
                lambda m: m.name.lower().startswith(argument),
                ctx.guild.members
            )
        
        if member is None:
            raise commands.MemberNotFound(argument)

        return member

您不再需要创建dm频道。只需使用await member.send("Whatever msg")

PS: 最接近的匹配用户名是什么意思?你必须提供更多的细节,因为我看不出这有什么意义不和谐已经自动为您做了。只需在discord中按enter键即可。他们会自动向您显示建议。我敢肯定,您别无选择,只能提到一个成员,以便命令正常工作

我不知道你为什么需要这个,但你可以得到像这样的名字,然后你可以随便你想要什么。我做了更多的检查,看看会员是否在公会中有缺口

请记住,这是为作者准备的,您可以根据自己的需要进行更改

import difflib


@bot.command()
async def nearest(ctx):
    all_names = []
    for member in ctx.guild.members:
        if ctx.author == member:
            continue  # skip the author

        if member.nick:
            all_names.append(member.nick)
        else:
            all_names.append(member.name)

    if ctx.author.nick:
        close_names = difflib.get_close_matches(ctx.author.nick, all_names)
    else:
        close_names = difflib.get_close_matches(ctx.author.name, all_names)

    if close_names:
        await ctx.send(" - ".join(close_names))
    else:
        await ctx.send("You are unique")

您可以使用此命令获取dm的用户

user = bot.get_member_named('Name here')
user.send("Found your brother")

相关问题 更多 >