不和谐 <@!userid> 与 <@userid>

a p*_*son 5 userid points node.js discord

所以我正在使用 Node.JS/Discord.JS 创建一个机器人,我有一个问题。

在某些服务器上,当您提到用户时,它会在控制台中<@!userid>返回为,而在其他服务器上则返回为<@userid>。我的机器人有一个简单的积分/等级系统,它保存在一个 JSON 文件中<@!userid>,所以在一些服务器上,当试图通过提及用户积分来查看用户积分时,它们会起作用,而在其他服务器上则不会。

有谁知道如何解决这个问题?我已经多次尝试找到答案,但我不想保存两次,一次<@!userid>然后<@userid>。如果这是解决它的唯一方法,那么我理解。

谢谢你的帮助!

Wri*_*ght 12

感叹号<@!userID>表示他们在该服务器中设置了昵称。不带感叹号使用它更可靠,因为它可以在任何地方工作。此外,您应该使用他们的 id 保存用户,而不是整个提及(“<@userid>”)。使用正则表达式解析出额外的符号。

var user = "<@!123456789>" //Just assuming that's their user id.
var userID = user.replace(/[<@!>]/g, '');
Run Code Online (Sandbox Code Playgroud)

这会给我们123456789。他们的用户 ID。当然,您可以通过两种方式轻松获取用户对象(您很可能会获取他们的用户名),如果他们在您使用命令的服务器中,您可以

var member = message.guild.member(userID);
Run Code Online (Sandbox Code Playgroud)

或者,如果他们不在服务器中,而您仍想访问他们的用户对象,则;

client.fetchUser(userID)
    .then(user => {
        //Do some stuff with the user object.
    }, rejection => {
        //Handle the error in case one happens (that is, it could not find the user.)
    });
Run Code Online (Sandbox Code Playgroud)

您可以ALSO简单地直接从标签访问该成员对象(如果他们在邮件中标记它们)。

var member = message.mentions.members.first();
Run Code Online (Sandbox Code Playgroud)

就像那样,无需任何正则表达式,您就可以获得完整的成员对象并保存它们的 id。

var memberID = member.id;
Run Code Online (Sandbox Code Playgroud)