如何让不和谐机器人处理单独的进程/链接到另一个机器人

时间:2021-07-10 01:06:55

标签: asynchronous discord discord.py

我正在尝试创建某种应用程序机器人。我需要在通用渠道中触发机器人,然后在私人 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 个答案:

答案 0 :(得分:0)

选项 1

相比之下,像这样的单个 if 检查并没有太多开销,但是有几种不同的解决方案。首先,您可以尝试使用斜杠命令。 This 是作为斜线命令的 discord.py 库的扩展而构建的库。您可以制作一个仅适用于 DM 的程序,然后使用连续的斜杠命令从那里运行它。

选项 2

使用 webhook 启动新机器人。这很可能更复杂,因为您必须获得一个域或找到某种免费服务来捕获 webhooks。您可以使用这样的 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 很棒且易于学习。您可以让每个函数存储数据库所需的任何数据,以便您可以将其存储以供查看/安全,以防机器人崩溃,然后它也会内存不足。