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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
23 960
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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")

Для более новых версий discord.py 1.0+ следует использовать send вместо send_message.

from discord.ext import commands
import discord

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

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

bot.run("TOKEN")

Больше бесполезно с момента перехода на v1.0, как было предложено @Torxed

Pieter Helsen 02.08.2020 16:04

После большого перехода на версию 1.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?.

Вы правы насчет send, но это не совсем ответ на вопрос.

Patrick Haugh 02.08.2020 19:54

@PatrickHaugh каким образом он не отвечает, как отправить сообщение пользователю? Именно это и делает мой первый фрагмент кода. Вы должны найти объект дескриптора пользователя и вызвать .send() для этого объекта. Либо путем зацикливания канала, либо с помощью запроса on_message.

Torxed 02.08.2020 23:36

". Если владелец бота наберет !DM @user, бот отправит DM пользователю, упомянутому владельцем."

Patrick Haugh 03.08.2020 04:05

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

@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!")```

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

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

Другие вопросы по теме