如何在带有 discord.js 的消息中提及用户?

dic*_*eGD 4 javascript discord.js

我正在执行一个让用户静音的命令。例如,以下命令将使用户静音@anon5 秒钟:

!mute @anon 5
Run Code Online (Sandbox Code Playgroud)

我的程序侦听message事件,使用户静音并发送如下确认消息:

@anon#1234 has now been muted for 5 s
Run Code Online (Sandbox Code Playgroud)

不幸的是,Discord 无法将此消息中的用户名识别为提及。如何使用该msg.channel.send功能提及特定用户?此示例包含发送确认消息的代码:

!mute @anon 5
Run Code Online (Sandbox Code Playgroud)

此示例中不包含静音,它有效。消息已正确发送,但未提及用户,这意味着用户名不可点击且未突出显示。

Zim*_*jen 14

您还可以通过以下方式标记用户

`<@${id}>` // users
`<@&${id}>` // roles
Run Code Online (Sandbox Code Playgroud)

当然,您需要知道用户 ID 或角色 ID 才能执行此操作。

  • 这很有帮助,谢谢。就我而言,当需要创建消息来回复用户的命令时,我手头没有用户对象。因此,在我的例子中,通过从客户端获取用户来重新构建用户对象是不必要的额外工作。 (7认同)
  • 这是不必要的额外工作。`role.toString()` 和 `user.toString()` 以及 `member.toString()` 都会为您处理这个问题。或者,如果您在模板文字中使用它们,您甚至可以更懒,只使用 `${role}`、`${user}` 或 `${member}` 等。这也适用于通道。 (2认同)

Max*_*Max 7

文档建议以这种方式提及用户:

const message = `${user} has been muted`;
Run Code Online (Sandbox Code Playgroud)

上面的例子使用模板字符串,因此对象的toString方法User被自动调用。虽然可以手动调用它:

const message = user.toString() + "has been muted";
Run Code Online (Sandbox Code Playgroud)

该文件指出:

当与字符串连接时,这个 [用户对象] 会自动返回用户的提及而不是用户对象。

这意味着每次toString调用时,无论是通过模板、字符串连接还是通过手动调用toString,用户对象都将转换为提及。Discord 将正确解释输出,突出显示并使其可点击。


在你的情况下,你会像这样使用上面的例子:

msg.channel.send(`${person.user} has now been muted for ${time} s`)
setTimeout(() => {
    ...
    msg.channel.send(`${person.user} has been unmuted.`)
}, time * 1000)
Run Code Online (Sandbox Code Playgroud)