discord.py способ использования бота в новой теме - PullRequest
0 голосов
/ 30 марта 2020

Я создаю своего бота discord.py и хочу, чтобы я мог отправлять собственные сообщения. Я пытался использовать on_message, но у меня постоянно возникала ошибка с многопоточностью.

@bot.event
async def on_ready():
        print(f'{bot.user.name} is now on Discord!')
        #Here I want a loop that asks for input, then, if it gets it, the bot sends it.

Я пытался использовать Thread, но не могу await в потоке.

#I want to do somthing like:
channel = bot.get_channel(my_channel_id)
while True:
    msg = input("Bot: ")
    await channel.send(msg)

Спасибо за все ваши ответы!


РЕДАКТИРОВАТЬ: У меня проблемы с получением ваших решений, и я почти уверен, что это моя вина. Есть ли способ, чтобы бот работал нормально, но пока он работает, есть все, что oop запрашивает ввод и отправляет его на дискорд как бот, когда он его получает.

Как работает версия этого?:

c = bot.get_channel(my_channel_id)
while True:
    message = input("Bot: ")
    await c.send(message)

1 Ответ

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

AFAIK В стандартной библиотеке нет асин c эквивалента input(). Есть некоторые обходные пути для этого, вот мое предложение, которое я считаю самым чистым:

Запустите поток, когда ваша программа запустится, чтобы вы могли запустить в ней блокирующий вызов input(). Я использовал исполнителя, потому что у asyncio есть удобная функция для общения с исполнителем любого рода. Затем из кода asyn c запланируйте новую работу в исполнителе и дождитесь ее.

import asyncio
from concurrent.futures.thread import ThreadPoolExecutor

async def main():
    loop = asyncio.get_event_loop()
    while True:
        line = await loop.run_in_executor(executor, input)
        print('Got text:', line)


executor = ThreadPoolExecutor(max_workers=1)
asyncio.run(main())
...