提问人:Xenan 提问时间:11/16/2023 最后编辑:Blue RobinXenan 更新时间:11/17/2023 访问量:46
Discord 机器人不允许用户通过控制台输入而不会抛出错误 [重复]
Discord bot does not allow for user input via console without throwing error [duplicate]
问:
我和我的朋友正在做一个项目,如果你运行一个命令,作为一个设置命令,运行代码的用户可以通过从控制台发送消息,通过机器人在 Discord 聊天中交谈。
import discord
from discord.ext import commands
intents = discord.Intents.all()
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.event
async def on ready():
print("Logged in as {}".format(bot.user))
@bot.command()
async def setup(ctx):
await ctx.message.delete()
while True:
msg = input("Message to send: ")
ctx.send(msg)
这样做的问题是它会抛出一个错误,
Loop thread traceback (most recent call last):
File "C:\Users\bobot\OneDrive\Documents\projs\py\penissie.py", line 128, in <module>
bot.run(token)
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 860, in run
asyncio.run(runner())
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
return runner.run(main)
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
return self._loop.run_until_complete(task)
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 640, in run_until_complete
self.run_forever()
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\windows_events.py", line 321, in run_forever
super().run_forever()
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 607, in run_forever
self._run_once()
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1922, in _run_once
handle._run()
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\events.py", line 80, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 441, in _run_event
await coro(*args, **kwargs)
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\bot.py", line 1395, in on_message
await self.process_commands(message)
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\bot.py", line 1392, in process_commands
await self.invoke(ctx) # type: ignore
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\bot.py", line 1350, in invoke
await ctx.command.invoke(ctx)
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\core.py", line 1029, in invoke
await injected(*ctx.args, **ctx.kwargs) # type: ignore
File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\core.py", line 235, in wrapped
ret = await coro(*args, **kwargs)
File "C:\Users\bobot\OneDrive\Documents\projs\py\cool.py", line 48, in setup
msg = input("Message to send: ")
我相信这可能意味着当我在输入语句中时,机器人无法运行其循环
有什么办法解决这个问题吗?
答:
1赞
Blue Robin
11/17/2023
#1
为什么这不起作用?
该函数不是异步的。这意味着它会“暂停”程序的其余部分。由于 Discord 的工作方式,您的机器人必须每隔一段时间发送一次请求,以保持您的机器人在线。因此,由于输入不是异步的,因此它不起作用。input()
我们能做些什么来让它发挥作用?
还有其他库允许您异步从控制台获取输入。例如,在这篇文章中,他们使用库 aioconsole。该库具有实现我们想要的功能。aioconsole.ainput()
举个例子
你在这里使用一个循环。绝对不建议这样做。在异步编程中,这也会停止机器人。在下面的帖子中,他们使用异步运行循环。while True
asyncio.ensure_future(function())
在 asyncio 文档中,它说:
Future 对象用于将基于回调的低级代码与高级 async/await 代码桥接起来。
尽管您可以为此函数使用可等待对象,但对于此示例,我们不会使用它。
请注意,以下代码可能有效,也可能无效,因为我目前不在PC上测试它。当我回到家时,我会修复任何错误
import asyncio
import aioconsole
def loop(ctx):
while True:
msg = aioconsole.ainput("Message to send: ")
ctx.send(msg)
if msg.upper() == "CANCEL":
break # break loop if cancel is typed in all caps
@bot.command()
async def setup(ctx):
await ctx.message.delete()
future = asyncio.ensure_future(loop(ctx))
下面的帖子也很好地解释了这一点。
评论
0赞
Xenan
11/17/2023
谢谢,但是输入是我的主要问题,出于某种原因,而 True 循环对我的机器人没有任何作用。
0赞
Blue Robin
11/17/2023
@Xenan我在帖子中介绍了这一点
0赞
Blue Robin
11/17/2023
@Xenan事实证明,我忘了在示例代码中介绍该部分。我相应地更新了它。
评论