asynchronous - 如何让不和谐机器人处理单独的进程/链接到另一个机器人
问题描述
我正在尝试创建一些应用程序机器人。我需要在通用渠道中触发机器人,然后在与申请人的私人 DM 渠道中继续申请流程。
我的问题是:机器人只能定义一个 on_message 函数。我发现每次检查 on_message 是否由来自 DM 通道和通用通道的消息触发非常复杂(且效率低下)。此外,很难跟踪申请人的答案。我想检查以下是否可行:让机器人像往常一样响应来自通用频道的消息。如果收到申请提示,则启动一个新的子流程(或机器人?),分别处理与申请人的 DM。
以上可能吗?如果没有,是否有更好的方法来处理这个问题?
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.channel.type==discord.ChannelType.private:
await dm_channel.send("Whats your age?") ## Question 2
elif message.channel.type == discord.ChannelType.text:
if message.content.startswith('$h'):
member = message.author
if "apply" in message.content:
await startApply(member)
else:
await message.channel.send('Hello!')
# await message.reply('Hello!', mention_author=True)
async def startApply(member):
dm_channel = await member.create_dm()
await dm_channel.send("Whats your name?") ## Question 1
我现在有上面的代码。我希望 startApply 函数触发一个新的机器人/子进程来处理与申请人的 DM。
解决方案
选项1
相对而言,像这样的单个 if 检查并没有太多开销,但是有几种不同的解决方案。首先,您可以尝试使用斜杠命令。这是作为用于斜线命令的 discord.py 库的扩展而构建的库。您可以制作一个仅适用于 DM 的设备,然后使用连续的斜杠命令从那里运行它。
选项 2
使用 webhook 启动一个新的机器人。这很可能更复杂,因为您必须获得一个域或找到某种免费服务来捕获 webhook。不过,您可以使用这样的 webhook 来“唤醒”机器人并让它与 dm 中的用户聊天。
选项 3(推荐)
创建根据频道处理文本的函数,并将其保留if - elif
在那里。正如我所说,如果不是那么糟糕。如果您的代码中调用了处理所有内容的函数,那么实际上应该很容易处理:
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.channel.type==discord.ChannelType.private:
respondToPrivate(message)
elif message.channel.type == discord.ChannelType.text:
repondToText(message)
在跟踪数据方面,如果这是一个较小的个人项目,MySQL 非常棒且易于学习。您可以让每个函数存储数据库所需的任何数据,以便在机器人崩溃时将其存储以供查看/安全,然后它也会内存不足。
推荐阅读
- java - 不使用方法返回java程序的主菜单
- mysql - 使用 NodeJS 将值插入 MySQL 数据库不起作用
- php - Wordpress 面临问题并且无法正常工作,会出现数据库连接等错误
- google-apps-script - 从超链接列表中批量复制谷歌驱动器上的文件
- c - 具有与其关联的错误值的全局变量
- python - 尝试将图像保存到 django 模型时出错
- scala - Spark,字符串到时间戳
- python - 有人可以请绘制此代码的所有递归调用。这是一棵树的前序遍历。由于这两个递归调用变得混乱
- c++ - MIDI 通道消息之间是否有优先级?
- wordpress - 为什么我的 .htaccess 重定向在测试期间返回 200 而不是 301?