【问题标题】:Get user object from nearest matching username in discord.py从 discord.py 中最近的匹配用户名获取用户对象
【发布时间】:2020-12-16 10:33:15
【问题描述】:

我正在尝试让不和谐机器人向服务器中具有最近匹配用户名的用户发送 DM。通过最接近的匹配用户名,我的意思是,如果给机器人一个用户名的一部分,比如“shin”,它会找到最接近的匹配用户名,比如 “新拉面。”我提供的此代码仅适用于用户的提及或确切用户名。我曾尝试使用 difflib,但不幸的是无法让它工作。我还缺少什么更简单的解决方案吗?

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

【问题讨论】:

  • 只是一个注释你不需要create_dm()你可以await member.send('Text here')

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


【解决方案1】:

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

PS: 最接近的匹配用户名是什么意思?您必须提供更多详细信息,因为我认为这没有意义。 Discord 已经为您自动 做 那个。只需在您要在不和谐中提及的用户上按 Enter 键。他们会自动向您显示建议。我很确定您别无选择,只能提及一个成员以使该命令起作用。

【讨论】:

    【解决方案2】:

    我不知道你为什么需要这个,但你可以得到这样的名字,然后你可以随心所欲。我做了更多检查,看看成员是否在公会中有昵称。

    请记住,这是给作者的,您可以随意更改。

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

    【讨论】:

      【解决方案3】:

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

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-18
        • 2019-06-27
        • 2021-04-28
        • 1970-01-01
        • 2021-05-07
        • 2021-05-10
        • 2014-07-26
        • 1970-01-01
        相关资源
        最近更新 更多