(discord.py) Как мне заставить моего бота читать DM, которые ему отправляют, и либо распечатывать их, либо отправлять на указанный c канал? - PullRequest
1 голос
/ 19 марта 2020

Итак, я недавно создал бот-диск с различными мем-командами и модерирующими командами. Я относительно новичок в python, но я понимаю суть этого. Я уже создал команду, которая позволяет мне (только мне) DM пользователю через бота. Теперь я хочу попытаться сделать так, чтобы бот мог читать сообщения, которые отправлялись обратно ему, и отправлять их мне, независимо от того, напечатаны ли они в оболочке или отправлены на указанный c канал / мне. Мне все равно, я просто хочу быть в состоянии увидеть, что отправлено на него. Я немного почитал и нашел это , и из этого я собрал это:

@bot.event
async def on_message(message):
    channel = bot.get_channel('channel ID')
    if message.server is None and message.author != bot.user:
        await bot.send_message(channel, message.content)
    await bot.process_commands(message)

Это само по себе не сработало, я получаю сообщение об ошибке "AttributeError: 'Message «У объекта нет атрибута« сервер »», когда я управлял ботом. Мне сказали, что для перезаписи discord.py используется не «сервер», а «гильдия». Поэтому я изменил это, чтобы сказать message.guild. Оттуда он дал мне ошибку «AttributeError: объект« Bot »не имеет атрибута« send_message »», и это примерно, насколько я там оказался. Я возился с этим и изменил кое-что здесь и добился небольшого прогресса ... Я думаю. Мой новый код:

@bot.event
async def on_message(ctx, message):
    channel = bot.get_channel('channel ID')
    if message.guild is None and message.author != bot.user:
        await ctx.send(channel, message.content)
    await bot.process_commands(message)

Это дает мне ошибку "TypeError: on_message () отсутствует 1 обязательный позиционный аргумент: 'message'". Это так далеко, как я получил сейчас. Буду признателен за любую помощь, как я уже сказал, я все еще немного новичок в python, я начал пользоваться ею только около 2 месяцев go.

Ответы [ 3 ]

0 голосов
/ 19 марта 2020

Вы используете параметр ctx, который является уникальным для команд.

'ctx' это commands.Context, который предоставляет информацию о выполняемых командах. Поскольку это не команда, а скорее событие, вы не должны предоставлять ее.

Не проверено, но это должно сработать:

(я сделал это так, что он игнорирует сообщения от ВСЕ боты, чтобы избежать спама)

для печати сообщений на консоль

@bot.event
async def on_message(message: discord.Message):
    if message.guild is None and not message.author.bot:
        print(message.content)
    await bot.process_commands(message)

для вывода содержимого сообщений на канал

msg_dump_channel = 1234
@bot.event
async def on_message(message: discord.Message):
    channel = bot.get_channel(msg_dump_channel)
    if message.guild is None and not message.author.bot:
        # if the channel is public at all, make sure to sanitize this first
        await channel.send(message.content)
    await bot.process_commands(message)
0 голосов
/ 19 марта 2020

Ваш первый код использует древнюю, устаревшую и неподдерживаемую версию dpy.

Вы в основном корректно обновили его во втором коде, за исключением нескольких ошибок, таких как on_message .

Это не работает, потому что принимает только один аргумент message, в этом событии нет ctx.

Таким образом, событие передает один аргумент, но ваша функция принимает 2, таким образом, ошибку. Правильный код будет: async def on_message(message):

Но теперь вы будете озадачены тем, что делать с этой строкой, которую вы написали: await ctx.send(channel, message.content)

Даже если бы существовал ctx, этого бы не было работать, потому что отправка больше не занимает пункт назначения, вместо этого вы вызываете send по назначению destination.send("Hello"), так что перевод в ваш код, если channel - это место, куда вы хотите отправить, будет await channel.send(message.content)

Также один последний Заметьте, я заметил, что вы использовали здесь строку: bot.get_channel('channel ID') это может быть вы просто приводите пример, но помните, что идентификаторы являются целыми числами , если вы передадите строку, она никогда не найдет этот канал.

Например, это неверно : bot.get_channel('123456789111315178')

И это будет действительно: bot.get_channel(123456789111315178)

0 голосов
/ 19 марта 2020

Исходя из этой ошибки, я бы сказал, что в какой-то момент вы, скорее всего, вызываете on_message () и не задаете параметр message. Просмотрите свой код и посмотрите, возможно ли это так.

В качестве альтернативы, если какой-то другой код, который вы не написали, вызывает вашу функцию, то он может вызывать только on_message () с одним аргументом, и в этом случае аргумент ctx может быть несовместим с этой функцией.

...