如何检查我的机器人是否在多个同名公会中 discord.py

时间:2021-07-20 07:10:20

标签: python discord discord.py bots

我想为我的机器人发出离开命令。到目前为止,这是我的代码。

  @commands.command()
  async def leave(self, ctx):
      """Remove me from the server. ;("""
      guild = discord.utils.get(client.guilds, name=ctx.guild.name) # Get the guild by name
      if guild is None:
          print("No guild with that name found.") # No guild found
          return
      await guild.leave() # Guild found
      await ctx.send(f"I left: {guild.name}!")

是的,我在齿轮上,齿轮工作得很好。 问题 - 它使用公会名称来删除机器人。任何人都可以创建同名的公会,使用此命令,并将我的机器人从原始公会中删除。 我想让我的机器人检查是否有多个同名的公会,如果有,它会返回“找到多个同名公会!请手动踢机器人。” 如果这不可能,请提出其他解决方案。

2 个答案:

答案 0 :(得分:3)

您可以通过简单的计数机制检查机器人是否在多个与执行命令的公会名称相同的公会中。

guildsWithName = [guild.name for guild in client.guilds].count(ctx.guild.name)

然后检查,如果 guildsWithName > 1

if guildsWithName > 1:
    print("Multiple guilds with same name found. Please remove manually.")
    return

但是您的代码似乎有点过于复杂。您的 leave() 函数所做的是保留执行命令的公会,但如果有多个同名公会,则会失败,因为 discord.utils.get() 总是返回

<块引用>

iterable 中满足所有通过的 trait 的第一个元素

引用自 docs。 您可以使用 ctx.guild.leave() 代替。


但是这是您要求的:

  @commands.command()
  async def leave(self, ctx):
      """Remove me from the server. ;("""
      guildsWithName = [guild.name for guild in client.guilds].count(ctx.guild.name)
      if guildsWithName > 1:
          print("Multiple guilds with same name found. Please remove manually.")
          return
      guild = discord.utils.get(client.guilds, name=ctx.guild.name) # Get the guild by name
      if guild is None:
          print("No guild with that name found.") # No guild found
          return
      await guild.leave() # Guild found
      await ctx.send(f"I left: {guild.name}!")

使用起来更简单、更高效、更安全:

  @commands.command()
  async def leave(self, ctx):
      """Remove me from the server. ;("""
      await ctx.guild.leave()

不妨试一试,看看它是否符合您的要求。

答案 1 :(得分:0)

您可以使用 ctx.guild.id 代替,因为所有公会都有一个唯一的 id