(discord.py ) Client.send_message() не отправляет сообщение

#python #python-3.x

#python #python-3.x

Вопрос:

Я использую discord.py создать чат-бота. На данный момент это всего лишь тест, и весь код находится в 1 файле.

Бот подключается к серверу и прослушивает сообщения, начинающиеся с восклицательного знака «!».

В зависимости от команды затем вызывается одна из 2 функций. До этого момента бот работает так, как задумано.

 client = discord.Client()

@client.async_event
def on_message(message):
    author = message.author
    if message.content.startswith('!test'):
        print('on_message !test')
        test(author, message)
    if message.content.startswith('!quit'):
        print('on_message !quit')
        quit(author, message)
  

И вот тут это становится странным. При вызове завершающей функции программа завершается. Когда вызывается тестовая функция, она ничего не делает. Он даже не печатает строку.

 def test(author, message):
    print('in test function')
    yield from client.send_message(message.channel, 'Hi %s, i heard you.' % author)

def quit(author, message):
    sys.exit()
  

Что я упускаю? Любая помощь приветствуется.

Ответ №1:

У меня была именно эта проблема, и это, казалось, решило ее. Если вы используете python 3.5:

 @client.async_event
def on_message(message):
  

должно быть изменено на:

 @client.event
async def on_message(message):
  

и yield from должно быть изменено на await . Если вы не используете python 3.5, я предлагаю перейти на него. Надеюсь, это должно сработать.

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

1. OMG всего наилучшего вам. Я не разбираюсь в python, но я пытался использовать более старый бот github, написанный ранее discord.py предполагаемая переписка. Это исправило мои ошибки командной строки и позволило запустить бота. Еще раз большое вам спасибо!!!

Ответ №2:

Я заставил ваш скрипт функционировать, сделав некоторые функции асинхронными, а send_message — совместной процедурой. Конечно, я использую python 3.5, поэтому, если вы используете python 3.4, вам, возможно, придется сделать что-то немного другое.

Я думаю, что причина, по которой ваше сообщение не было отправлено, заключалась в том, что ни одна из ваших программ не блокировала различные функции (не используя await), что может привести к зависанию вашего бота. Вы можете прочитать больше об этом в разделе «Что такое сопрограмма?»раздел discord.py документы.

 client = discord.Client()

@client.async_event
async def on_message(message):
    author = message.author
    if message.content.startswith('!test'):
        print('on_message !test')
        await test(author, message)
    if message.content.startswith('!quit'):
        print('on_message !quit')
        quit(author, message)
async def test(author, message):
    print('in test function')
    await client.send_message(message.channel, 'Hi %s, i heard you.' % author)

def quit(author, message):
    sys.exit()