如何检查机器人是否可以私信用户

DJM*_*hem 10 python discord discord.py

如果用户关闭了隐私设置“允许来自服务器成员的直接消息”并且不和谐机器人调用

await user.dm_channel.send("Hello there")
Run Code Online (Sandbox Code Playgroud)

你会得到这个错误:

discord.errors.Forbidden: 403 Forbidden (error code: 50007): Cannot send messages to this user
Run Code Online (Sandbox Code Playgroud)

我想检查是否可以在不发送消息的情况下向用户发送消息。尝试发送消息并捕获此错误对我来说不起作用,因为我不希望在允许机器人发送消息的情况下发送消息

我已经尝试过这个:

print(user.dm_channel.permissions_for(bot).send_messages)
Run Code Online (Sandbox Code Playgroud)

但它总是返回 True,即使该消息是不允许的。

我也尝试过这个:

channel = await user.create_dm()
if channel is None:
    ...
Run Code Online (Sandbox Code Playgroud)

但不幸的是,似乎“有权向用户发送消息”和“有权创建DM频道”被认为是不同的。

编辑

由于似乎有点混乱,为了澄清确切的用法,请看这个例子。有一台服务器和 3 个有问题的用户:我、我的机器人和史蒂夫。Steve 已勾选“允许来自服务器成员的直接消息”。

该机器人有一个名为 的命令!newgame,它接受用户列表并在他们之间启动游戏,其中涉及对游戏中的一些成员进行私聊。由于史蒂夫的隐私设置,他无法玩游戏(因为机器人需要向他发送消息)。如果我做

!newgame @DJMcMayhem @Steve
Run Code Online (Sandbox Code Playgroud)

我想提供这样的回应:

await user.dm_channel.send("Hello there")
Run Code Online (Sandbox Code Playgroud)

但据我目前所知,确定史蒂夫是否可以玩游戏的唯一方法是首先尝试向每个用户发送消息,我想避免这种情况。

The*_*gUs 10

解释

400 Bad Request您可以向 dm_channel发送无效消息,这会引发异常。None例如,这可以通过将内容设置为 来实现。

如果出现400 Bad Request,您可以通过 DM 联系他们。如果它升高403 Forbidden,你就不能。

代码

async def can_dm_user(user: discord.User) -> bool:
    try:
        await user.send()
    except discord.Forbidden:
        return False
    except discord.HTTPException:
        return True
Run Code Online (Sandbox Code Playgroud)