【问题标题】:Why is the following code not adding a role to the user?为什么以下代码没有向用户添加角色?
【发布时间】:2020-12-03 07:10:59
【问题描述】:

在以下代码中,每当用户将“A”表情符号对特定消息做出反应时,我都会尝试向用户添加角色。但是,当我对消息做出反应时,我只看到控制台日志Role Added1,这意味着线程卡在尝试为用户分配角色的行中。我在以下代码中做错了什么导致错误?

bot.on("raw", event => {
    const eventName = event.t;

    if(eventName == "MESSAGE_REACTION_ADD"){

        var roles = JSON.parse(fs.readFileSync("roles.json"));
        var info = JSON.parse(fs.readFileSync("info.json"))

        if(event.d.message_id == info["Class Message"]){//class selection
            switch(event.d.emoji.name){
                case "????":
                    console.log("Role Added1");
                    event.d.member.roles.add(bot.guilds.cache.get("721695624613068830")
                    .roles.cache.get(roles["myrole"]));
                    console.log("Role Added2");
                    break;
            }
        }
    }
}

【问题讨论】:

    标签: discord discord.js


    【解决方案1】:

    您没有收到来自raw 事件的GuildMember 类实例。它是一个简单的 json 对象,与 discordjs 无关。这里有一些工作:

    bot.on("raw", async event => {
        const eventName = event.t;
    
        if(eventName == "MESSAGE_REACTION_ADD"){
    
            var roles = JSON.parse(fs.readFileSync("roles.json"));
            var info = JSON.parse(fs.readFileSync("info.json"))
    
            if(event.d.message_id == info["Class Message"]){//class selection
                switch(event.d.emoji.name){
                    case "?":
                        console.log("Role Added1");
                        const guild = bot.guilds.cache.get("721695624613068830");
                        const memberID = event.d.user_id;
                        const member = await guild.members.fetch(memberID);
                        member.roles.add(roles["myrole"]);
                        console.log("Role Added2");
                        break;
                }
            }
        }
    }
    

    您还可以使用以下方法使您的事件函数同步:

    bot.on("raw", event => {
        const eventName = event.t;
    
        if(eventName == "MESSAGE_REACTION_ADD"){
    
            var roles = JSON.parse(fs.readFileSync("roles.json"));
            var info = JSON.parse(fs.readFileSync("info.json"))
    
            if(event.d.message_id == info["Class Message"]){//class selection
                switch(event.d.emoji.name){
                    case "?":
                        console.log("Role Added1");
                        const guild = bot.guilds.cache.get("721695624613068830");
                        const memberID = event.d.user_id;
                        guild.members.fetch(memberID).then((member) => {
                                member.roles.add(roles["myrole"]);
                                console.log("Role Added2");
                        });
                        break;
                }
            }
        }
    }
    

    【讨论】:

    • 为什么事件需要异步?
    • 因为我使用了“await guild.members.fetch”。 await 关键字只能用在异步函数中。
    • 但是如果函数不是异步的,则不需要 await 关键字来使 fetch 函数阻塞
    • 是的,你需要它。获取用户需要时间并返回一个承诺,因此您需要解决它。我将用另一种解决方案更新我的答案以向您展示。
    • 谢谢你的帮助,我只是将其他语言的知识应用到js xD中
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2018-09-10
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多