Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

443
Visualizações
Sistema de permisos para Discord.py Bot

Estoy en el proceso de hacer un bot de discordia usando discord.py y asyncio. El bot tiene comandos como kick y ban que obviamente no deberían estar disponibles para los usuarios normales.

Quiero hacer un sistema simple que detecte qué permisos tiene el rol del usuario usando ctx.message.author para obtener al usuario que envió el comando.

No quiero que el bot detecte un nombre de rol específico, ya que estos varían según los servidores. También prefiero no tener varios archivos para el bot para mantenerlo simple.

He visto la documentación de discord.py y varias otras fuentes, pero ninguna contiene ejemplos de cómo implementar los diversos métodos de los que hablan.

Como ejemplo, aquí hay un solo comando de mi bot:

 async def kick(ctx, userName: discord.User): if True: #ctx.message.author.Permissions.administrator await BSL.kick(userName) else: permission_error = str('Sorry ' + ctx.message.author + ' you do not have permissions to do that!') await BSL.send_message(ctx.message.channel, permission_error)

Donde la declaración if else es mi intento de hacer esto por mi cuenta. El #ctx.message.author.Permissions.administrator se comenta porque no funciona y se reemplaza con True con fines de prueba.

Gracias por cualquier ayuda y sugerencias de antemano.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Permissions es el nombre de la clase. Para obtener los permisos de autor del mensaje, debe acceder a la propiedad guild_permissions del autor.

 if ctx.message.author.guild_permissions.administrator: # you could also use guild_permissions.kick_members

Actualizar:

Una mejor manera de validar los permisos de la persona que invoca los comandos es usando la función de verificación de la extensión de commands , específicamente la verificación de has_permissions . Por ejemplo, si desea abrir su comando solo para las personas que tienen el permiso de administración de manage_roles o el permiso de ban_members de miembros, puede escribir su comando de esta manera:

 from discord import Member from discord.ext.commands import has_permissions, MissingPermissions @bot.command(name="kick", pass_context=True) @has_permissions(manage_roles=True, ban_members=True) async def _kick(ctx, member: Member): await bot.kick(member) @_kick.error async def kick_error(ctx, error): if isinstance(error, MissingPermissions): text = "Sorry {}, you do not have permissions to do that!".format(ctx.message.author) await bot.send_message(ctx.message.channel, text)
over 4 years ago · Santiago Trujillo Relatório

0

También puedes usar decoradores.

 @bot.command(name = "Kick") @bot.has_permissions(kick_user = True) @bot.bot_has_permissions(kick_user = True) async def _kick(ctx, member: Member): #Do stuff...

La ventaja de verificar los permisos de usuario y bot significa que es más fácil manejar los errores al proporcionar mensajes de error útiles de "Permiso insuficiente".

over 4 years ago · Santiago Trujillo Relatório

0

Los consejos que encontraron la respuesta aceptada pueden no funcionar:

  1. Puede haber problemas de compatibilidad con la versión reescrita de la biblioteca discord.py y las versiones previas a la reescritura, que siguen sin estar obsoletas, no obsoletas y todavía en uso.

  2. El bot también debe verificar sus propios permisos para descartar un motivo del error.

  3. Si hay un error, o los permisos para el bot en sí no son válidos, el bot debería decir algo, ¿correcto?

  4. Es necesario implementar algo para evitar que el bot intente ejecutar este comando en un contexto de DM o grupo. Casi siempre dará error.

Propongo la siguiente solución para la reescritura previa (suponiendo que use la extensión de comando):

 import discord from discord.ext import commands import time @bot.command(pass_context=True,description="Kicks the given member. Please ensure both the bot and the command invoker have the permission 'Kick Members' before running this command.") async def kick(ctx, target:discord.Member): """(GUILD ONLY) Boot someone outta the server. See 's!kick' for more.""" if not str(ctx.message.channel).startswith("Direct Message with "): msg=await bot.say("Checking perms...") time.sleep(0.5) if ctx.message.server.me.server_permissions.kick_members: if ctx.message.author.server_permissions.kick_members: await bot.edit_message(msg,new_content="All permissions valid, checking issues with target...") time.sleep(0.5) if target==ctx.message.server.owner: await bot.edit_message(msg, new_content="All permissions are correct, but you're attempting to kick the server owner, whom you can't kick no matter how hard you try. Whoops!") else: if target==ctx.message.server.me: await bot.edit_message(msg, new_content="Whoops! All permissions are corrent, but you just tried to make me kick myself, which is not possible. Perhaps you meant someone else, not poor me?") else: await bot.edit_message(msg, new_content="All permissions correct, and no issues with target being self or server owner, attempting to kick.") time.sleep(2) try: await bot.kick(target) await bot.edit_message(msg, ":boom: BAM! ***kicc'd***") except Exception: await bot.edit_message(msg, new_content="I was unable to kick the passed member. The member may have a higher role than me, I may have crashed into a rate-limit, or an unknown error may have occured. In that case, try again.") else: await bot.edit_message(msg, new_content="I've the correct permissions, {}, but you do not. Perhaps ask for them?").format(ctx.message.author.mention) else: await bot.edit_message(msg, new_content="I'm just a poor bot with no permissions. Could you kindly grant me the permission `Kick Members`? Thanks! :slight_smile:") else: await bot.say("'Tis a DM! This command is for servers only... try this again in a server maybe? :slight_smile:")
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda