如何发出静音命令?不和谐.py

时间:2021-02-16 01:32:23

标签: discord discord.py

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

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

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

import json

然后我们将创建一个 on_guild_join 事件,当机器人被添加到公会时会触发该事件。在此事件中,我们将创建一个名为“静音”的角色,并为该角色禁用 send_messagesadd_reactions 权限,以便拥有该角色的任何人都无法发送消息或添加反应。
创建角色后,我们可以使用 utils 模块中的 discord 使用其名称获取角色。

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

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

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