Как использовать бота Discord для печати сообщений во время ожидания ввода пользователем

#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 на канале, но в оболочке, И я отправляю свои сообщения через бота с помощью пользовательского ввода в оболочке, если это возможно.