#multithreading #input #discord.py
Вопрос:
Я хотел создать бота, с помощью которого я мог бы общаться со своими друзьями через бота без необходимости открывать discord. Я пытался отправлять сообщения, получая ввод от пользователя, но во время ожидания ввода он не может одновременно печатать сообщения моих друзей. Я пытался использовать многопоточность, но, похоже, это не работает.
Есть ли какой-нибудь способ сделать это? ,это мой код.
import discord client = discord.Client() @client.event async def on_ready(): print('Logged in as {0.user}'.format(client)) @client.event async def on_message(message): username = str(message.author).split('#')[0] usermessage = str(message.content) channel = str(message.channel.name) while True: if message.author == client.user: return print(username,':',usermessage) answer = input('You: ') await message.channel.send(answer) if usermessage == message.content: return client.run('TOKEN')
Если кто-то отправляет сложенные сообщения до того, как я отвечу, он может получить только один ответ на каждое отправленное мной сообщение. Есть ли какой-нибудь способ, чтобы он продолжал печатать сообщения от разногласий, прежде чем я отвечу?
Ответ №1:
Попробуйте с чем-нибудь подобным:
@Bot.command() async def command(ctx): for i in range(10): await ctx.send("ping") try: message = await Bot.wait_for('message', check=lambda message: message.author == ctx.author, timeout=10.0) except asyncio.TimeoutError: continue
Если вы хотите сделать это через оболочку, вы можете попробовать это:
@Bot.command() async def chat(ctx): message = ctx.message while true: print(ctx.message.content) answer = input() await message.reply(answer) message = Bot.wait_for('message') if (message.content == 'stop'): return
Вы можете получать более одного сообщения подряд, используя это:
while True: while True: try: message = Bot.wait_for('message', timeout=20.0) # you can use a function argument instead of 20.0 except TimeoutError: pass if message != None: print(message.content) if message.content == "stop": await ctx.send("The chat has ended") return else: await ctx.send("The time is over, wait for an answer") break await message.reply(input()) del message
Комментарии:
1. Нет, не работает. Я просто хотел поболтать через оболочку. Я добавил свой код, чтобы вы могли видеть.
2. Хорошо, теперь я понимаю проблему, это хорошая идея… Я отредактирую свой ответ
3. Это работает, но не так, как я ожидал, но все равно, спасибо. Теперь я обновил свой код вместе с вашим. Ты можешь проверить это в последний раз? Я также добавил проблему.
4. Ваша проблема @KAOTU в том, что если пользователь ответит больше один раз, программа не запишет его в оболочку, верно? Я уверен, что есть решение, возможно, вы можете создать глобальную переменную, но это заставит вас общаться только с одним пользователем в течение некоторого времени, другими словами, вы потеряете преимущества асинхронной природы discord.py…
5. Я просто хочу, чтобы это было точно так же, как чат discord на канале, но в оболочке, И я отправляю свои сообщения через бота с помощью пользовательского ввода в оболочке, если это возможно.