【问题标题】:How do I make a mute command? Discord.py如何发出静音命令?不和谐.py
【发布时间】:2021-02-24 22:00:40
【问题描述】:

我今天在这里问一个关于静音命令的问题。我一直在寻找教程,但找不到。大多数视频或文章都声明您需要一个角色 ID,但是我想这样做,如果它在服务器中创建一个静音角色,然后它会继续使用它创建的角色。有点像 Dyno 的静音命令。有没有办法做到这一点?请告诉我。谢谢!

【问题讨论】:

    标签: discord discord.py


    【解决方案1】:

    这里我做了一个简单的方法来在你每次使用静音命令时创建一个角色。在设置之前,您需要创建一个名为 Mute 的角色或任何您希望它具有角色权限的角色。否则,但更广泛的方法是将来自服务器的角色 ID 存储在数据库中,这样您就不必创建角色并且机器人只会创建一次,然后应用角色,但这是您可以找到的出去。

    @client.command()
    async def mute(ctx, member: discord.Member = None, *, reason=None):
    
        guild = ctx.guild
        mute_role = discord.utils.get(ctx.guild.roles, name='Mute')
       
        await member.add_roles(mute_role)
        await member.send("You were muted for reason: " + reason)
    
        await ctx.send(f'{member} has been muted! With reasoning: ' + reason)
    

    您可以添加额外的预防措施,让机器人在用户使用该命令或谁可以使用该命令时进行检查;下面的机器人可以检查用户是否具有他们试图静音的较低角色,并检查是否提供了一个成员来静音。

    @client.command()
    @commands.has_permissions(manage_roles=True)
    async def mute(ctx, member: discord.Member = None, *, reason=None):
    
        if member.top_role >= ctx.author.top_role:
            await ctx.send(f"You can only use this moderation on a member below you")
            return
    
        if member == None:
            await ctx.send(f'You must provide a member to mute')
            return
    
        guild = ctx.guild
        mute_role = discord.utils.get(ctx.guild.roles, name='Mute')
    
        await member.add_roles(mute_role)
        await member.send("You were muted for reason: " + reason)
    
        await ctx.send(f'{member} has been muted! With reasoning: ' + reason)
    

    这是一个非常基本的示例,但尝试或留下您在问题中尝试过的一些代码也很好。因为这有助于了解你想要什么,更具体地说,或者你至少有证据。

    【讨论】:

      【解决方案2】:

      所以我让每次 bot 加入服务器时,它都会创建一个“静音”角色并将其存储在数据库中,即 JSON 文件,您可以根据需要将其更改为更好的存储系统。
      所以对于数据库系统,你需要json 模块。首先在您要导入其他模块的地方导入它,例如 discorddiscord.ext 等。

      import json
      

      然后我们将创建一个on_guild_join 事件,该事件将在机器人添加到公会时触发。在这种情况下,我们将创建一个名为“静音”的角色,对于该角色,我们将禁用 send_messagesadd_reactions 权限,这样任何拥有该角色的人都无法发送消息或添加反应。
      一旦我们创建了角色,我们就可以使用来自discord 模块的utils 使用它的名称来获取角色。

      @client.event
      async def on_guild_join(guild):
          permissions= discord.Permissions(send_messages=False, add_reactions=False)
          await guild.create_role(name="Muted", permissions=permissions, color=discord.Color("red")
      

      创建角色后,我们可以使用来自discord 模块的utils 使用其名称获取角色。

      role= discord.utils.get(guild.roles, name="Muted")
      

      现在,我们已经设置了静音角色,我们需要将其存储在我们的数据库中,以便在某些调用 mute 命令时可以获取它,因此在您的工作目录中创建一个名为 muted_roles.json 的新文件并在该文件中像这样放置花括号:{}。我们为什么这样做?好吧,JSON 文件需要花括号,而 JSON 模块无法操作那些没有花括号的文件。

      然后回到代码,这里是 json 模块。

      with open("muted_roles.json", "r") as f:
          muted_roles = json.load(f)
      muted_roles[str(guild.id)] = str(role.id)
      
      with open("muted_roles.json", "w") as f:
          json.dump(muted_roles, f, indent=4)
      

      现在当机器人获得一个新的公会时,您会在 Json 文件中注意到公会 ID 和角色 ID。就像一个 Python 字典。有点像这样:

      {
          "GUILD ID" : "ROLE ID"
      }
      

      现在让我们进入下一步的命令;

      @client.command()
      
      async def mute(ctx, member : discord.Member = None, reason = "Unspecified"):
          if member == None:
              await ctx.send("Please do mention the person you want to mute!")
              return
          
          elif member.top_role >= ctx.author.top_role: # credits for this to @Cohen
              await ctx.send(f"You can only use this moderation on a member below you")
              return
         
         else:
              with open("muted_roles.json", "r") as f:
                  muted_roles = json.load(f)
              
              role = ctx.guild.get_role(int(muted_roles))
              await member.add_roles(role)
      
              await member.send(f"You have been muted.\nReason: {reason}")
              await ctx.send(f"{member.name} has been muted.\nReason: {reason}")
      

      最终代码:

      import json
      import discord
      from discord.ext import commands
      
      client= commands.Bot(command_prefix="!")
      
      @client.event
      async def on_guild_join(guild):
          permissions= discord.Permissions(send_messages=False, add_reactions=False)
          await guild.create_role(name="Muted", permissions=permissions, color=discord.Color("red")
          role= discord.utils.get(guild.roles, name="Muted")
      
          with open("muted_roles.json", "r") as f:
              muted_roles = json.load(f)
          muted_roles[str(guild.id)] = str(role.id)
      
          with open("muted_roles.json", "w") as f:
              json.dump(muted_roles, f, indent=4)
      
          
          @client.command()
      
          async def mute(ctx, member : discord.Member = None, reason = "Unspecified"):
              if member == None:
                  await ctx.send("Please do mention the person you want to mute!")
                  return
          
              elif member.top_role >= ctx.author.top_role: # credits for this to @Cohen
                  await ctx.send(f"You can only use this moderation on a member below you")
                  return
         
              else:
                  with open("muted_roles.json", "r") as f:
                      muted_roles = json.load(f)
              
                  role = ctx.guild.get_role(int(muted_roles))
                  await member.add_roles(role)
      
                  await member.send(f"You have been muted.\nReason: {reason}")
                  await ctx.send(f"{member.name} has been muted.\nReason: {reason}")
      
      
      client.run("TOKEN")
      

      ...静音命令完成!请从给定的参考资料中阅读有关所有提到的模块和其他方法的更多信息,这将有助于更好地理解。

      json Module
      discord.Permissions

      【讨论】:

      • 嗨!感谢您的回复,但我无法正常工作。您能否详细说明或附上所有内容的图片?
      • @CollinFong 您收到任何错误消息吗?不工作有很多意思,你能解释一下问题是什么吗?
      • 由于某种原因,每当我将代码放入其中时,它下面的命令(它之前正在运行)只是说语法无效。
      • @CollinFong 我放在那里的代码只是为了了解事物的工作原理。您应该检查实际代码中是否缺少括号或其他内容。另外,错误在哪一行?
      • 我已经解决了错误,缺少括号。但是现在我在“with open”代码中的代码中有错误说:[undefined name "guild"]。
      猜你喜欢
      • 2019-07-08
      • 2020-07-13
      • 2021-07-04
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2021-04-21
      • 2018-06-07
      • 2022-01-26
      相关资源
      最近更新 更多