【问题标题】:nodejs discord get nickname from a users IDnodejs不和谐从用户ID获取昵称
【发布时间】:2021-04-05 19:04:35
【问题描述】:

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

他们的 ID 存储为从反应收集器收集的变量。 我尝试了一些方法,但都失败了,其中大多数要么什么都不返回,要么返回错误。

下面的代码什么都不返回,getnames() 函数是空的。向我推荐了这种方法,从一个旨在帮助解决问题的 nodejs discord 服务器上购买 2 个人,类似于这里。

    // 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 获取显示名称的新方法。

                    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。

【问题讨论】:

    标签: node.js discord discord.js


    【解决方案1】:

    这是最简单的解决方案:

    // 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!
    

    您尝试获取昵称的成员不一定会被缓存,这可以解决这个问题。

    【讨论】:

    • 如果我输入member.nickname而不是member.displayName似乎也很好用
    【解决方案2】:

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

    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));
        
        
    
     }
    }
    

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

    现在您必须在代码中实现它。
    函数getNicknames() 的调用,您的代码应如下所示:

    getNicknames(getPlayers(), message.guild);
    

    【讨论】:

    • 感谢您的回复,我尝试将其添加到我的代码中,但它给我留下了一些无法访问的代码。它也不允许我在 getNicknames 函数中使用 getPlayers 函数。 (总的来说,我对编码相当陌生,我理解的足够多,但在这里完全迷失了哈哈)。我尝试了其他一些从 ID 获取 displayName 的方法。我会编辑我的原始帖子给你看你是否愿意。
    • @Ben 如果您将编辑#2 中的所有昵称变量更改为var nickname1 = mem1.displayName; 等等,会怎样?
    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2019-05-09
    • 2021-03-20
    • 2018-08-21
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多