Si un usuario tiene la configuración de privacidad "Permitir mensajes directos de miembros del servidor" desactivada y un bot de Discord llama
await user.dm_channel.send("Hello there")Obtendrá este error:
discord.errors.Forbidden: 403 Forbidden (error code: 50007): Cannot send messages to this userMe gustaría comprobar si puedo enviar un mensaje a un usuario sin enviarle un mensaje. Intentar enviar un mensaje y detectar este error no funciona para mí, porque no quiero que se envíe un mensaje en caso de que el bot pueda enviar mensajes.
He intentado esto:
print(user.dm_channel.permissions_for(bot).send_messages)pero siempre devuelve True, incluso si el mensaje no está permitido.
También he probado esto:
channel = await user.create_dm() if channel is None: ...pero desafortunadamente, parece que "tiene permiso para enviar mensajes al usuario" y "tiene permiso para crear un canal dm" se consideran diferentes.
EDITAR
Para aclarar el uso exacto, ya que parece haber un poco de confusión, tome este ejemplo. Hay un servidor y 3 usuarios en cuestión: yo, mi bot y Steve. Steve tiene marcado "Permitir mensajes directos de miembros del servidor".
El bot tiene un comando llamado !newgame que acepta una lista de usuarios e inicia un juego entre ellos, lo que implica enviar DM a algunos de los miembros del juego. Debido a la configuración de privacidad de Steve, no puede jugar (ya que el bot deberá enviarle un mensaje). Si lo hago
!newgame @DJMcMayhem @SteveMe gustaría proporcionar una respuesta como:
> I can't start a game with that list of users because @Steve has the wrong privacy settings.Pero hasta donde yo sé ahora mismo, la única forma de averiguar si Steve puede jugar es intentar primero enviar un mensaje a cada usuario, lo cual me gustaría evitar.
Puede generar una solicitud incorrecta al dm_channel. Esto se puede lograr configurando el contenido en Ninguno, por ejemplo.
Si regresa con 400 Bad Request , puede enviarles un mensaje privado. Si regresa con 403 Forbidden , no puedes.
async def can_dm_user(user: discord.User) -> bool: ch = user.dm_channel if ch is None: ch = await user.create_dm() try: await ch.send() except discord.Forbidden: return False except discord.HTTPException: return True