我正在尝试创建某种应用程序机器人。我需要在通用渠道中触发机器人,然后在私人 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。
答案 0 :(得分:0)
相比之下,像这样的单个 if 检查并没有太多开销,但是有几种不同的解决方案。首先,您可以尝试使用斜杠命令。 This 是作为斜线命令的 discord.py 库的扩展而构建的库。您可以制作一个仅适用于 DM 的程序,然后使用连续的斜杠命令从那里运行它。
使用 webhook 启动新机器人。这很可能更复杂,因为您必须获得一个域或找到某种免费服务来捕获 webhooks。您可以使用这样的 webhook 来“唤醒”机器人并让它与 dm 中的用户聊天。
创建根据通道处理文本的函数,并将 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 很棒且易于学习。您可以让每个函数存储数据库所需的任何数据,以便您可以将其存储以供查看/安全,以防机器人崩溃,然后它也会内存不足。