提问者:小点点

nodejs不和谐从用户ID获取昵称


我的目标是通过使用用户的ID获得用户的昵称。

它们的ID作为从反应收集器收集的变量存储。我尝试过几个方法都失败了,其中大多数要么什么都不返回,要么是错误。

下面的代码不返回任何内容,getnames()函数为空。这个方法被推荐给我从nodejs discord服务器购买两个人,目的是帮助解决问题,类似于这里。

    // returns player ID's
    function getPlayers() {
            let players = [];
            players.push(queue.tank[0]);        // First (1) in TANK queue
            players.push(queue.heal[0]);        // First (1) in HEAL queue
            players.push(queue.dps[0]);         // First (2) in DPS queue
            players.push(queue.dps[1]);
            return players;
        }

    // get nick names from ID's
        function getnames() {
            let players = getPlayers();
            let playerNicks = [];
            let newPlayer = "";
            players.forEach(async player => {
            newPlayer = await message.guild.members.fetch(player).then(function (user) {return user.displayName });
            playerNicks.push(newPlayer)
            return playerNicks;
        })}

    //formats nicknames into string
        function formatnicknames() {
            let formatted_string2 = '';
            let playerNicks = getnames();

            if (playerNicks)
                formatted_string2 = `${playerNicks[0]} \n${playerNicks[1]} \n${playerNicks[2]} \n${playerNicks[3]}`;
            return formatted_string2;
        }

我还尝试了下面代码的一些变体,仍然无法获得昵称。

message.guild.members.cache.get(user.id)

编辑#1

现在尝试了以下代码,但没有成功。(boost1ID包含1个用户的ID)

var mem1 = message.guild.members.fetch(boost1ID).nickname

编辑#2

尝试了从ID获取displayname的新方法。

                    var guild = client.guilds.cache.get('guildid');
                    var mem1 = guild.member(boost1ID);
                    var mem2 = guild.member(boost2ID);
                    var mem3 = guild.member(boost3ID);
                    var mem4 = guild.member(boost4ID);
                    var nickname1 = mem1 ? mem1.displayName : null;
                    var nickname2 = mem2 ? mem2.displayName : null;
                    var nickname3 = mem3 ? mem3.displayName : null;
                    var nickname4 = mem4 ? mem4.displayName : null;

                    var Allnicknames = `${nickname1} ${nickname2} ${nickname3} ${nickname4}`
                    message.channel.send(`testing nicknames: ${Allnicknames}`)

我只返回了我自己的名字,因为我在这个服务器上没有昵称,但是其他三个有昵称的用户返回了null。


共2个答案

匿名用户

这是最简单的解决方案:

// your users ids
const IDs = [ '84847448498748974', '48477847847844' ];

const promises = IDs.map((userID) => {
         return new Promise(async (resolve) => {
              const member = message.guild.member(userID) || await message.guild.members.fetch(userID);
              resolve(member.displayName || member.user.username);
         });
});

const nicknames = await Promise.all(promises);
// you now have access to ALL the nicknames, even if the members were not cached!

您试图获取昵称的成员不一定缓存,这解决了这个问题。

匿名用户

我举了一个可以帮助你的例子。

let testUsers = [];

module.exports = class extends Command {
  constructor(...args) {
      super(...args, {
         description: 'Testing.',
         category: "Information",
     });
 }

async run(message) {
    
    function getNicknames(userArr, guild) {
        let playerNicks = [];
        for(var i = 0; i < userArr.length; i++) {
            playerNicks.push(guild.member(userArr[i]).displayName);
        }
        return playerNicks;
    }
    let testUser = message.guild.members.cache.get(message.author.id);
    testUsers.push(testUser);
    let guild = message.guild;
    console.log(getNicknames(testUsers, guild));
    
    

 }
}

我创建了一个接受两个参数的函数。第一个是用户数组(从函数getPlayers()中得到一个),第二个是您正在玩的公会。你需要提供公会,因为每个用户都应该是公会成员,因为你想使用. displayName。我在命令代码之外创建了一个用户数组,否则每次使用命令时数组中只会有一个用户。在函数的内部,我创建了一个新的数组,我基本上用我们从提供的用户数组中获得的用户昵称填充。


调用函数getNickname(),因为你的代码应该是这样的:

getNicknames(getPlayers(), message.guild);