首页 > 解决方案 > 如何让不和谐机器人处理单独的进程/链接到另一个机器人

问题描述

我正在尝试创建一些应用程序机器人。我需要在通用渠道中触发机器人,然后在与申请人的私人 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。

标签: asynchronousdiscorddiscord.py

解决方案


选项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 非常棒且易于学习。您可以让每个函数存储数据库所需的任何数据,以便在机器人崩溃时将其存储以供查看/安全,然后它也会内存不足。


推荐阅读