Сообщение не отправляется пользователю при проблеме с on_message

#python #python-3.x #discord.py #discord.py-rewrite

#python #python-3.x #discord.py

Вопрос:

Привет, у меня возникла проблема при отправке сообщения из канала в прямые сообщения пользователей. Сообщение при использовании @user, за которым следует сообщение, должно указывать пользователя, я не уверен, почему это не работает.

Упоминание в сообщении должно содержать пользовательский объект.

Вот код:

 @commands.Cog.listener()
async def on_message(self, message):
    """Send a message thread reply to user."""
    for member in message.mentions: #get user object from mention in message?
        if not member.dm_channel: 
            await member.create_dm()
        try:
            time = datetime.utcnow()
            embed = discord.Embed(title=f"Reply", timestamp=time, colour=discord.Colour(0xff8100))
            embed.add_field(name="Message:", value="test message")
            await member.dm_channel.send(embed=embed)
        except discord.Forbidden:
            await message.channel.send(f"Reply cannot be sent because {member.name}'s direct messages are set to private.")
        except discord.HTTPException:
            await message.channel.send('I failed in sending the message.')
        except Exception as e:
            await message.channel.send(f'There's been a problem while sending the message that's not of type "Forbidden" or'
                       f' "HTTPException", but {e}.')
        else:
            await message.channel.send(f'Reply sent to {member.name}')
  

Комментарии:

1. В чем проблема, с которой ты столкнулся?

2. Отправка сообщения из текстового канала пользователю направляет сообщения с использованием упоминания пользователя. Ошибки нет, но проблема в коде, препятствующая отправке сообщения в DM пользователя.

3. Возможно, вы захотите попробовать изменить @commands.Cog.listener() на @client.event или что бы вы ни настроили для своего экземпляра бота.

4. Это винтик, поэтому, чтобы зарегистрировать событие из винтика нового стиля, я должен использовать декоратор commands.Cog.listener для прослушивания событий. @client.event у меня не сработало бы.

Ответ №1:

В discord.py на самом деле вам больше не нужно создавать каналы dm. Просто выполните await ctx.author.send(# whatever message you want) Если вы пытаетесь создать команду, которая отправляет ОПРЕДЕЛЕННЫЙ DM автору сообщения, вы можете попробовать это

 @client.command()
async def dm(ctx, *, message):
    await ctx.author.send(f"This is your dm {message}")
  

Это чрезвычайно просто. Дайте мне знать в комментариях, если у вас есть какие-либо вопросы или я неправильно понял вашу проблему.

РЕДАКТИРОВАТЬ: Если вы хотите отправить dm ОПРЕДЕЛЕННОМУ УЧАСТНИКУ, вы можете попробовать это.

 @client.command()
async def dm(ctx, member: discord.Member, *, message):
    await member.send(message)
  

Надеюсь, ваша проблема была решена.

PS: В будущем, пожалуйста, объясните ваши вопросы / проблемы более подробно.