你如何让 Discord 机器人响应 DM 中的命令? (Python)

Posted

技术标签:

【中文标题】你如何让 Discord 机器人响应 DM 中的命令? (Python)【英文标题】:How do you make a Discord bot respond to commands in DMs? (Python) 【发布时间】:2021-03-17 05:41:32 【问题描述】:

我刚刚开始编写 Discord 机器人。我目前正在开发一个帮助龙与地下城游戏的机器人(骰子滚动和主动跟踪目前正在工作)。我已经让我的机器人与在服务器中调用命令的用户一起将私人卷发送给 DM,但在实际的 DM 中,机器人只响应 help 命令。

我已经阅读了this 的解释,但它对我来说似乎仍然没有用,因为我希望它响应 DM 中的命令,而不是获取 DM 中发送给它的消息的内容。例如,假设我在带有机器人的服务器中,并且我使用whisperRoll 命令,这会导致机器人向我发送包含我的掷骰结果的 DM。现在我已经和机器人私聊了,我想再为自己做一次,让其他玩家看不到,所以我尝试在 DM 频道中使用roll 命令。我希望它像在服务器中响应一样响应 DM 中的命令。

我想知道是否有一组默认命令被注册为“有效”,以便机器人在我丢失的 DM 中响应?我真的无法在任何地方找到答案,我什至不知道从哪里开始。

非常感谢您的帮助!

编辑:我当前的代码,给我一个CommandInvokeError

def _prefix_callable(bot, msg):
    prefix = '!'
    guild = msg.guild
    if p.prefixInfo == []:
        pass
    else:
        prefix = p.getPrefix(guild)
    
    if not guild:
        return commands.when_mentioned_or(prefix)(bot, msg)
    return commands.when_mentioned_or(prefix)(bot, msg)

bot = commands.Bot(command_prefix=_prefix_callable, description=description, help_command = None)

p.getPrefix(guild) 调用此代码:

def getPrefix(self, guild):
        for data in self.prefixInfo:
            if data[0] == str(hash(guild)):
                return data[1]
        return "!"

我目前正在通过 csv 搜索给定公会的正确前缀。

【问题讨论】:

据我所知,您当前的代码并未尝试在 DM 频道中执行任何操作。您是否添加了导致错误的实际部分?回溯应该向您显示它来自哪一行。 @stijndcl 在我正在 DM 通道中测试的普通命令 roll 中,我有 await ctx.message.delete()。正是那条线给了我一个错误。我不能删除 DM 频道中的消息吗? roll 的代码不在您的帖子中,您应该添加导致错误的部分,以便我们帮助您修复它...是的,您不能 删除 DM 中的消息。 【参考方案1】:

用于带前缀的 dms

def get_prefix(message):
    prefix = "?"  # default prefix
    if not message.guild:  # if in dms
        return commands.when_mentioned_or(prefix)(bot, message)
    #you can set a guild/server specific one here
    return commands.when_mentioned_or(prefix)(bot, message)


bot = commands.Bot(command_prefix=get_prefix, case_insensitive=True) #bot allows you to make commands 

那么对于命令,你需要这样做:

@bot.command()
async def whisperroll(ctx):
    await ctx.author.send("some random thing")

【讨论】:

感谢您的回复!我试过这个,但我仍然有问题。它给了我以下错误:CommandInvokeError: Command raised an exception: Forbidden: 403 Forbidden (error code: 50003): Cannot execute action on a DM channel. @DanaHarris 没有看到您的代码,我们无法知道是什么原因造成的...... 我会将我当前的代码添加到主帖中,以便您查看。但是我将你的代码行添加到我已经存在的 _prefix_callable 函数中,我正在传递给机器人。 @DanaHarris 您的机器人无法 dm 该人,因为这是不允许的【参考方案2】:

您可以使用discord.channel.DMChannel 对象

例如:

async def check(ctx, arg):
    if isinstance(ctx.channel, discord.channel.DMChannel):
        await ctx.send(arg)

【讨论】:

以上是关于你如何让 Discord 机器人响应 DM 中的命令? (Python)的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js:如何让机器人 DM 成为服务器中的所有成员?

Discord.py bot - 如何让机器人在 DM 中向我发送用户的消息?

如何让 Discord 机器人向我 ping 的人发送 DM?

discord.js 发送 DM 以响应用户的斜杠命令

是否可以让一个 Discord 机器人 DM 另一个机器人?

如何使用 JDA 在 Discord 服务器(不是用户/机器人 DM)中创建私人频道:Java Discord API