Python - DM пользователя Discord Bot

Я работаю над User Discord Bot на Python . Если владелец бота набирает !DM @user тогда бот будет DM пользователем, который был упомянут владельцем.

@client.event
async def on_message(message):
    if message.content.startswith('!DM'):
        msg = 'This Message is send in DM'
        await client.send_message(message.author, msg)

5 ответов

Решение

Самый простой способ сделать это с discord.ext.commands расширение. Здесь мы используем конвертер для получения целевого пользователя и аргумент только для ключевого слова в качестве необязательного сообщения для их отправки:

from discord.ext import commands
import discord

bot = commands.Bot(command_prefix='!')

@bot.command(pass_context=True)
async def DM(ctx, user: discord.User, *, message=None):
    message = message or "This Message is sent via DM"
    await bot.send_message(user, message)

bot.run("TOKEN")

После большого перехода на v1.0, send_messageболее не существует.
Вместо этого они на.send() на каждой соответствующей конечной точке (участники, гильдии и т. д.).

Пример для версии 1.0:

async def on_message(self, message):
    if message.content == '!verify':
        await message.author.send("Your message goes here")

Который будет DM отправителю !verify. Как и мудрый, вы могли бы сделать:

for guild in client.guilds:
    for channel in guild.channels:
        channel.send("Hey yall!")

Если вы хотите отправить сообщение "привет" на все ваши серверы и все каналы, в которых находится бот.

Поскольку это могло быть не совсем понятно (судя по комментарию), сложная часть могла бы получить дескриптор идентификации пользователя от клиента / сеанса. Если вам нужно отправить сообщение пользователю, который еще не отправил сообщение, и он находится за пределамиon_messageсобытие. Вам нужно будет либо:

  1. Прокрутите свои каналы и возьмите ручку на основе некоторых критериев
  2. Хранить пользовательские дескрипторы / объекты и обращаться к ним с помощью внутреннего идентификатора

Но единственный способ отправить пользователю - использовать идентификатор клиента, который в on_message проживает в message.authorили в канале, который находится в guild.channels[index].members[index]. Чтобы лучше понять это, я рекомендую прочитать официальную документацию о том, как отправить DM?.

Я заметил, что каждый код, который я помещаю в свои строки кода, не работает полностью,
поэтому я добавил к ним свой собственный бит, и бац, он работает!
добавляя это в код вашего бота, не забудьте добавить имя бота там, где указано здесь имя бота .
он будет наносить dm только тому, кто его послал,
но вы можете менять то, что он говорит каждый день, чтобы удивить всех, кто использовал эту команду.
это работает каждый раз для меня

      @client.command()
async def botdm(ctx):
  await ctx.message.author.send('hi my name is *bot name here* and i am a bot!')

Я использовал эту команду в прошлом, и, на мой взгляд, она работает лучше всего для меня:

@bot.command(pass_context=True)
async def mall(ctx, *, message):
  await ctx.message.delete()
  for user in ctx.guild.members:
    try:
      await user.send(message)
      print(f"Successfully DMed users!")
    except:
      print(f"Unsuccessfully DMed users, try again later.")
      @bot.command()
async def dm(ctx, user: discord.User, *, message=None):
    if message == None:
      message = "Hi!"
    embed = make_embed(title=f"Sent by {user}", desc=message)
    await user.send(embed=embed)
    await ctx.send("Message sent!")```
Другие вопросы по тегам