【发布时间】:2021-02-24 22:00:40
【问题描述】:
我今天在这里问一个关于静音命令的问题。我一直在寻找教程,但找不到。大多数视频或文章都声明您需要一个角色 ID,但是我想这样做,如果它在服务器中创建一个静音角色,然后它会继续使用它创建的角色。有点像 Dyno 的静音命令。有没有办法做到这一点?请告诉我。谢谢!
【问题讨论】:
标签: discord discord.py
我今天在这里问一个关于静音命令的问题。我一直在寻找教程,但找不到。大多数视频或文章都声明您需要一个角色 ID,但是我想这样做,如果它在服务器中创建一个静音角色,然后它会继续使用它创建的角色。有点像 Dyno 的静音命令。有没有办法做到这一点?请告诉我。谢谢!
【问题讨论】:
标签: discord discord.py
这里我做了一个简单的方法来在你每次使用静音命令时创建一个角色。在设置之前,您需要创建一个名为 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)
这是一个非常基本的示例,但尝试或留下您在问题中尝试过的一些代码也很好。因为这有助于了解你想要什么,更具体地说,或者你至少有证据。
【讨论】:
所以我让每次 bot 加入服务器时,它都会创建一个“静音”角色并将其存储在数据库中,即 JSON 文件,您可以根据需要将其更改为更好的存储系统。
所以对于数据库系统,你需要json 模块。首先在您要导入其他模块的地方导入它,例如 discord、discord.ext 等。
import json
然后我们将创建一个on_guild_join 事件,该事件将在机器人添加到公会时触发。在这种情况下,我们将创建一个名为“静音”的角色,对于该角色,我们将禁用 send_messages 和 add_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")
...静音命令完成!请从给定的参考资料中阅读有关所有提到的模块和其他方法的更多信息,这将有助于更好地理解。
【讨论】: