首页 > 解决方案 > 使用 presentUpdate 侦听器选择退出 Discord.JS 机器人的问候的命令

问题描述

我有一个 Discord.js 机器人,它被编程为在用户状态变为在线时发送问候消息。一些用户不喜欢这个功能,我没有删除这个功能,而是发出一个命令来选择退出它。

client.on('presenceUpdate', (oldPresence, newPresence) => {
    let member = newPresence.member;
    Object.assign(member, {"ignoreStatuses": false})
    console.log(member)
    let guild = newPresence.guild;
    const newGame = newPresence.member.presence.activities.find(activity => activity.type)
    console.log(newGame)
    let channelId = "884295684814151680"
    let greetChannel = client.channels.cache.get(channelId)
});
client.on('message', async message => {
    if (message.content.startsWith(`!greetings`)) {
        var args = message.content.split(' ').slice(1).join(' ');
        if (args === "on") {
            member.ignoreStatuses = false
        };
        if (args === "off") {
            member.ignoreStatuses = true
        };
    }
});

问题是,每当用户执行 !greetings on/off 时,程序member都会抛出一个错误,说未定义。不过,成员是在 presentUpdate 侦听器中定义的。我确信问题在于它们是两个不同的侦听器,并且对象在它们之间并没有完全转移。有谁知道对此有任何聪明的解决方案?

标签: discord.js

解决方案


是的!您对问题的见解是绝对正确的,变量成员不可访问,因为它是您的presenceUpdate侦听器的参数,而您尝试在事件侦听器中使用它,您可以通过在其中任何一个message之外定义它来简单地克服这个问题和每次使用它时重新分配它的值,如下所示:

let member;
client.on('presenceUpdate', (oldPresence, newPresence) => {
    member = newPresence.member;
    if(member.ignoreStatuses) {
    let guild = newPresence.guild;
    const newGame = newPresence.member.presence.activities.find(activity => activity.type)
    console.log(newGame)
    let channelId = "884295684814151680"
    let greetChannel = client.channels.cache.get(channelId)
}
});
client.on('message', async message => {
    if (message.content.startsWith(`!greetings`)) {
        var args = message.content.split(' ').slice(1).join(' ');
        if (args === "on") {
            member.ignoreStatuses = false
        };
        if (args === "off") {
            member.ignoreStatuses = true
        };
    }
});


推荐阅读