**已解决** discord.js guildMemberAdd() 未向对象添加正确的值

Posted

技术标签:

【中文标题】**已解决** discord.js guildMemberAdd() 未向对象添加正确的值【英文标题】:**SOLVED** discord.js guildMemberAdd() not adding correct value to Object 【发布时间】:2021-08-02 22:37:51 【问题描述】:

我被要求创建一个 Discord 机器人,显示公会成员用户名列表和他们最后一次在 Discord 中发布的日期,它还应该显示一个单独的成员列表,这些成员根本没有发布任何内容。为了实现这一点,从 Discord API 中提取信息并保存在 JSON 文件中。如果有新成员加入,则消息日期设置为 00/00/0000,因此我可以使用 if 语句将这些成员拉入单独的列表。

bot.on("ready", async () => 
    console.log(`$bot.user.username is online!`);

    const guild = bot.guilds.cache.get('SERVER ID NUMBER');
        guild.members.fetch().then(member => 
            member.forEach(member => 
                let memberArray = JSON.parse(fs.readFileSync("./messages.json", "utf8"));
                    if(!member.user.bot) 
                        if(!memberArray[member.user.id]) 
                        memberArray[member.user.id] = name: member.user.username, date: "00/00/0000"
                        
                     
                        
    fs.writeFileSync("./messages.json", JSON.stringify(memberArray), (err) => 
        if (err) console.log(err)
    )   
            )
        )
);

bot.on("guildMemberAdd", (member) => 

    let memberArray = JSON.parse(fs.readFileSync("./messages.json", "utf8"));

    if(!member.user.bot) 
        if(!memberArray[member.user.id]) 
            memberArray[member.user.id] = name: member.user.username, date: "00/00/0000"
            
        
                        
    fs.writeFileSync("./messages.json", JSON.stringify(memberArray), (err) => 
        if (err) console.log(err)
    )
);

bot.on("guildMemberRemove", (member) => 
    let memberArray = JSON.parse(fs.readFileSync("./messages.json", "utf8"));

    if(member.user.bot) 
        return;
     else 
        delete memberArray[member.user.id]
    
                        
    fs.writeFileSync("./messages.json", JSON.stringify(memberArray), (err) => 
        if (err) console.log(err)
    )
);

bot.on("message", async message => 
    if (message.author.bot) return; 

    const guild = bot.guilds.cache.get('SERVER ID NUMBER')

        guild.members.fetch().then(member => 

            let memberArray = JSON.parse(fs.readFileSync("./messages.json", "utf8"));

                member.forEach(member => 
                    if(member.user.bot) 
                        return;
                    
                    
                var d = new Date(message.author.lastMessage.createdTimestamp);
                    day = d.getDate();
                    month = d.getMonth() + 1;
                    date = ("0" + d.getDate()).slice(-2) + "/" 
                    + ("0" + (d.getMonth() + 1)).slice(-2) + "/" 
                    + d.getFullYear();
                    if (message.author.username == memberArray[member.user.id].name) 
            memberArray[member.user.id].date = date;
                    
    )
    fs.writeFile("./messages.json", JSON.stringify(memberArray),(err) => 
    if (err) console.log(err)   
     )
)

    let prefix = botconfig.prefix;
    let messageArray = message.content.split(" ");
    let cmd = messageArray[0].toLowerCase();
    let args = messageArray.slice(1);

    let commandfile = bot.commands.get(cmd.slice(prefix.length));
    if (commandfile) commandfile.run(bot, message, args, tools);
);

bot.login(botconfig.token)

在我的测试服务器中一切正常,但是当我将机器人添加到实时服务器时,任何新成员的日期都设置为他们加入的日期,而不是 00/00/0000。

我已经运行了各种测试,将相同的机器人添加到我的测试服务器中,以防它们引起某种问题,我无法弄清楚为什么它在一台服务器上运行而在另一台服务器上运行。

如果有人对它可能是什么或我可以尝试的任何其他测试有任何想法,我将非常感激。

【问题讨论】:

这段代码运行良好。然而,由于我们没有剩下的代码,我们不能排除另一个函数的间接影响。您是否尝试一一隔离函数以检查是否没有其他任何东西影响您的文件或变量?您是否在每个步骤中检查了文件的内容以查看日期是否更改以及何时更改? @JackRed 经过更多测试后,我意识到如果我使用我的测试服务器 ID 号,它可以正常工作,但是,一旦我将其更改为其他服务器 ID 号,它就会开始添加错误的日期跨度> ` const guild = bot.guilds.cache.get('SERVER ID NUMBER');` 【参考方案1】:

当有人加入服务器时,会弹出一条系统消息(如果启用):

问题是,在discord.js方面,系统消息的作者是加入的用户。 因此,当用户加入服务器并且您将时间分配给“00/00/0000”时,它会立即被系统消息的日期覆盖。

您实际上可以通过检查消息的类型来忽略这些系统消息。您在这里有不同类型的列表:discord.js.org。普通消息的类型等于DEFAULT,而用户加入时的系统消息类型为GUILD_MEMBER_JOIN


小改进备注:

当你收到用户的消息时,你可以直接向message.guild请求公会,而不是每次都用id来获取。如果您的机器人接受 dm,您可以使用 message.channel.type(discord.js.org 上列出了不同的值) 您可以使用toLocaleDateString 格式化日期。详情请见https://***.com/a/34015511/8040287。

【讨论】:

以上是关于**已解决** discord.js guildMemberAdd() 未向对象添加正确的值的主要内容,如果未能解决你的问题,请参考以下文章

discord.js 如何在不提及已记录用户的情况下记录用户名以供将来使用?

DISCORD.JS |我将如何执行升级和降级命令

discord.js EvaluatedPermissions 其他解决方案

Discord.js 机器人命令不起作用。怎么解决?

Discord js中的messageDelete问题

当我尝试创建一个角色时,它给了我一个错误(discord.js)