使用tempmute命令时BOT取消成员静音
问题描述
我创建了tempmute
命令、mute
命令和unmute
命令。我的问题是,当我用mute
命令将一个成员静音,并试图让他静音时,机器人正在取消对该成员的静音。
以下是我的完整代码:
@bot.command()
async def tempmute(ctx, member:discord.Member, czas:int, *, reason = "Brak powodu"):
if ctx.message.author.guild_permissions.administrator or ctx.message.author.guild_permissions.manage_roles:
muted = discord.utils.get(ctx.guild.roles, name="Muted")
if muted in member.roles:
await ctx.send("Nie możesz wyciszyć kogoś, kto już jest wyciszony!")
else:
await member.add_roles(muted)
await ctx.send(f"Wyciszono użytkownika {member.mention} na {czas} minut(-ę/-y) z powodu: {reason}")
await asyncio.sleep(czas*60)
if muted in member.roles:
await member.remove_roles(muted)
await ctx.send(f"Odciszono użytkownika {member.mention}, ponieważ jego czas wyciszenia ({czas} minut(-a/-y)) minął")
else:
pass
else:
await ctx.send("Nie posiadasz permisji!")
@tempmute.error
async def tempmute_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
if ctx.message.author.guild_permissions.administrator or ctx.message.author.guild_permissions.manage_roles:
await ctx.send("Poprawne użycie (przykład):
,tempmute <@839076078651441204> 1 (czas w minutach) powód")
else:
await ctx.send("Nie posiadasz permisji!")
@bot.command()
async def unmute(ctx, *, member:discord.Member):
if ctx.message.author.guild_permissions.administrator or ctx.message.author.guild_permissions.manage_roles:
muted = discord.utils.get(ctx.guild.roles, name="Muted")
if muted in member.roles:
await member.remove_roles(muted)
await ctx.send(f"Odciszono {member.mention}")
else:
await ctx.send(f"{member.mention} nie jest wyciszony/a!")
@unmute.error
async def unmute_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
if ctx.message.author.guild_permissions.administrator or ctx.message.author.guild_permissions.manage_roles:
await ctx.send("Poprawne użycie (przykład):
,unmute <@839076078651441204>")
else:
await ctx.send("Nie posiadasz permisji!")
@bot.command()
async def mute(ctx, member:discord.Member, *, reason="Brak powodu"):
if ctx.message.author.guild_permissions.administrator or ctx.message.author.guild_permissions.manage_roles:
muted = discord.utils.get(ctx.guild.roles, name="Muted")
if muted in member.roles:
await ctx.send(f"{member.mention} jest już wyciszony/a!")
else:
await member.add_roles(muted)
await ctx.send(f"Wyciszono {member.mention} z powodu: {reason}")
@mute.error
async def mute_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
if ctx.message.author.guild_permissions.administrator or ctx.message.author.guild_permissions.manage_roles:
await ctx.send("Poprawne użycie (przykład):
,mute <@839076078651441204> powód")
else:
await ctx.send("Nie posiadasz permisji!")
Works just like in this picture,有人能帮我吗?
解决方案
我真的认为您尝试编写命令的方式不可行。
我将逐一解释为该命令编写代码的过程。
TEMPMUTE命令。
第一步:定义功能和权限
我们将使用一些使用权限限制来定义该函数。具有权限的人员指定的权限。
在使用此功能之前,您的代码中需要包含以下内容:
from discord.ext import commands
(如果有则忽略)
操作方法如下:
@bot.command()
@commands.has_permissions(manage_roles=True)
async def tempmute(ctx, member: discord.Member, time, *, reason=None):
您可以根据需要添加更多权限,并使用True或False来允许或拒绝。
第二步:创建角色查找条件。如果该角色不存在,则创建一个禁用角色,如果存在,则使用它。
因此,我正在为角色是否存在创建一个条件。它将检查该角色是否存在。如果它存在,我们将简单地使用它,但如果它不存在,我们将创建一个具有特定权限的文件。
操作方法如下:
if discord.utils.get(ctx.guild.roles, name="Muted"):
mute_role = discord.utils.get(ctx.guild.roles, name="Muted")
else:
perms = discord.Permissions(send_messages=False, add_reactions=False, connect=False, speak=False)
await bot.create_role(name="Muted", permissions=perms)
mute_role = discord.utils.get(ctx.guild.roles, name="Muted")
第3步:检查某人是否静音。
现在,我正在为成员是否静音创建一个条件。我们将仔细检查该成员的角色并对其进行检查。操作方法如下:
if mute_roles in member.roles:
await ctx.channel.send(f"{member.mention} is already muted!")
else:
# code here (more steps will explain how)
第4步:添加条件并将成员设置为静音。
现在,我们将为此命令添加限制权限。所有人都不能静音的人,以及所有人都可以成为静音的人。 首先,我们添加第一个条件,即管理员不能静音。 以下是操作方法:if member.guild_permissions.administrator:
isadminembed=discord.Embed(title="Tempmute", description=f"Hi {ctx.author.mention}, you can't mute {member.mention} as they are a Server Administrator.", color=discord.Colour.red())
isadminembed.set_author(name="Bot")
await ctx.channel.send(embed=isadminembed)
现在我们将添加else
条件,即除管理员外的所有其他成员都可以静音。
以下是操作方法:
else:
time_conversion = {"s": 1, "m": 60, "h": 3600, "d": 86400, "w": 604800, "M": 2419200, "y": 29030400}
mute_time = int(time[:-1]) * time_conversion[time[-1]]
await member.add_roles(mute_role)
mutedembed=discord.Embed(title="Tempmute", description=f"The member, {member.mention} has been muted by the moderator {ctx.author.mention}.
Time: {mute_time} seconds
Reason: {reason}", color=discord.Colour.random())
mutedembed.set_author(name="Bot")
await ctx.channel.send(embed=mutedembed)
await asyncio.sleep(mute_time)
await member.remove_roles(mute_role)
await ctx.channel.send(f"{member.mention} has been unmuted!")
我在这里添加了时间转换。时间输入必须为:
1s
1秒、1m
1分钟等,years
也可以使用。
临时静音命令已编译
这是作为命令一起编译的所有代码。
@bot.command()
@commands.has_permissions(manage_roles=True)
async def tempmute(ctx, member: discord.Member, time, *, reason=None):
if discord.utils.get(ctx.guild.roles, name="Muted"):
mute_role = discord.utils.get(ctx.guild.roles, name="Muted")
else:
perms = discord.Permissions(send_messages=False, add_reactions=False, connect=False, speak=False)
await bot.create_role(name="Muted", permissions=perms)
mute_role = discord.utils.get(ctx.guild.roles, name="Muted")
if mute_roles in member.roles:
await ctx.channel.send(f"{member.mention} is already muted!")
else:
if member.guild_permissions.administrator:
isadminembed=discord.Embed(title="Tempmute", description=f"Hi {ctx.author.mention}, you can't mute {member.mention} as they are a Server Administrator.", color=discord.Colour.red())
isadminembed.set_author(name="Bot")
await ctx.channel.send(embed=isadminembed)
else:
time_conversion = {"s": 1, "m": 60, "h": 3600, "d": 86400, "w": 604800, "M": 2419200, "y": 29030400}
mute_time = int(time[:-1]) * time_conversion[time[-1]]
await member.add_roles(mute_role)
mutedembed=discord.Embed(title="Tempmute", description=f"The member, {member.mention} has been muted by the moderator {ctx.author.mention}.
Time: {mute_time} seconds
Reason: {reason}", color=discord.Colour.random())
mutedembed.set_author(name="Bot")
await ctx.channel.send(embed=mutedembed)
await asyncio.sleep(mute_time)
await member.remove_roles(mute_role)
await ctx.channel.send(f"{member.mention} has been unmuted!")
TEMPMUTE命令错误处理
第1步:将函数定义为事件。
我们将脚本中的函数定义为tempmute命令的错误,并将其声明为错误。
操作方法如下:
@bot.error
async def tempmute_error(ctx, error):
第2步:添加错误实例。
我们现在将为错误添加一个条件。我们的错误将是:MissingRequiredArgument
错误,因为该命令可能缺少必要的参数。
因此isinstance
将检查错误,然后执行操作。
操作方法如下:
if isinstance(error, discord.ext.commands.MissingRequiredArgument):
tempmuteerrorembed=discord.Embed(title=f"Missing Argument! {error}", description=f"Hello {ctx.author.mention}! You have not entered the needed argument.
Either you forgot to **mention the member** or you forgot to **enter the time of the mute** you want.
Please check this again and add the necessary argument in the command.
This is the syntax:
```!tempmute <mention member> <time: 1s, 2h, 4y etc..> <reason (optional)>```", color=discord.Colour.red())
tempmuteerrorembed.set_author(name="Bot")
await ctx.send(embed=tempmuteerrorembed)
这将适用于MissingRequiredArguement
,并显示其中的语法错误,以便命令的正确用法。
TEMPMUTE命令错误处理编译
以下是TEMPMUTE命令错误处理的编译代码。
@bot.error
async def tempmute_error(ctx, error):
if isinstance(error, discord.ext.commands.MissingRequiredArgument):
tempmuteerrorembed=discord.Embed(title=f"Missing Argument! {error}", description=f"Hello {ctx.author.mention}! You have not entered the needed argument.
Either you forgot to **mention the member** or you forgot to **enter the time of the mute** you want.
Please check this again and add the necessary argument in the command.
This is the syntax:
```!tempmute <mention member> <time: 1s, 2h, 4y etc..> <reason (optional)>```", color=discord.Colour.red())
tempmuteerrorembed.set_author(name="Bot")
await ctx.send(embed=tempmuteerrorembed)
命令中的文本不是您编写的内容,因为这是我为我的bot创建的命令。您可以自己相应地更改它们。
这将为您工作,我希望您能理解它。请在评论中询问任何问题。:)
谢谢!:d
相关文章