es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo bloquear un comando que no tiene permiso en el servidor en Pycord?

Antes usaba discord.py, pero debido a la finalización del desarrollo de discord.py, cambié todo el código a pycord. Además, cambié los comandos del bot de tipo texto a tipo slash.

Pero me di cuenta de que ‘has_permission’ no se proporcionaba en el comando slash. Pero quiero bloquear el uso del comando en caso de que no tenga suficientes permisos en el servidor. (por ejemplo: un usuario sin permisos ejecuta un comando de prohibición)
¿Hay alguna forma de limitar el comando de acuerdo con los permisos del usuario del servidor?

Código antes de la reescritura (que no tiene errores)

@commands.has_permissions(ban_members=True)
@commands.command(name=”ban”, usage=”//ban @ aaa#0000″)
async def ban_command(self, ctx, user_name: discord.Member, *, reason=None):
if await Permission.check_permission(ctx, 1):
return None
await user_name.ban(reason=reason)
if(reason != None):
await ctx.reply(str(user_name) + “fue baneado.” + “\n Razón : ” + str(reason), mention_author=False)
else:
await ctx.reply(str(user_name) + “fue baneado.”, mention_author=False)

Código después de la reescritura (que tiene errores)

@slash_command.has_permissions(ban_members=True)
@slash_command(name=”ban”)
async def ban_command(self, ctx, user_name: discord.Member, *, reason=None):
if await Permission.check_permission(ctx, 1):
return None
await user_name.ban(reason=reason)
if(reason != None):
await ctx.reply(str(user_name) + “fue baneado.” + “\n Razón : ” + str(reason), mention_author=False)
else:
await ctx.reply(str(user_name) + “fue baneado.”, mention_author=False)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, actualmente no hay una forma directa de verificar los permisos de los comandos de barra en pycord. Una solución alternativa para este problema es recuperar un objeto de miembro del servidor usando el objeto de interacción proporcionado por el comando de barra, y luego comprobar los permisos de ese miembro usando el atributo guild_permissions del miembro. Aquí hay un ejemplo de cómo se puede lograr esto:

    `python
    @slash_command(name="ban")
    async def ban_command(self, ctx, user_name: discord.Member, *, reason=None):
    member = ctx.guild.get_member(ctx.author.id)
    if not member.guild_permissions.ban_members:
    await ctx.respond("¡No tienes permiso para usar este comando!")
    return
    await user_name.ban(reason=reason)
    if reason:
    await ctx.respond(f"{user_name} fue baneado.\nMotivo: {razón}")
    else:
    await ctx.respond(f"{user_name} fue baneado.")
    `

    Este código recupera el objeto de miembro del usuario que inició el comando de barra usando ctx.author.id, y comprueba si este miembro tiene el permiso ban_members usando guild_permissions. Si el miembro no tiene el permiso requerido, se bloqueará el comando y se enviará una respuesta al usuario. De lo contrario, el comando de ban será ejecutado normalmente. Tenga en cuenta que este código asume que el comando de barra se está ejecutando en un contexto de gremio; si desea hacer que funcione también para los comandos de DM, deberá manejar la ausencia de un atributo guild en el objeto ctx.

Comments are closed.