如何让discord机器人处理单独的流程/链接到另一个机器人



我正在尝试创建一个应用程序bot。我需要在通用通道中触发bot,然后在与申请人的专用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检查并没有太大的开销,但有一些不同的解决方案。首先,您可以尝试使用斜杠命令。这是一个库,它是作为slash命令的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非常好学。你可以让每个函数存储数据库所需的任何数据,这样你就可以将其存储起来,以便在机器人崩溃的情况下查看/安全;那么它也将超出内存。

最新更新