从不和谐服务器中提取信息

Pull info from discord server

我将以下 cron 作业安排为每分钟 运行 以更新嵌入的时间。

cron.schedule('* * * * *', function () {
    con.query(`SELECT * FROM events WHERE closed = 'No'`, (err, rows) => {
        if (err) throw err

        rows.slice().forEach(row => {
            const channel = row.channel
            const messageID = row.messageID

            bot.channels.cache.get(channel).messages.fetch(messageID).then(message => {
                const embed = message.embeds[0]

                let now = Date.now()
                const targetDate = new Date(`${row.event_date} ${row.event_time}:00`)
                var difference = (targetDate - now) / 1000;
                var days = Math.floor(difference / (3600 * 24));
                var hours = Math.floor((difference - (days * (3600 * 24))) / 3600);
                var minutes = Math.floor((difference - (days * (3600 * 24)) - (hours * 3600)) / 60);

                let timeTill;

                if (days > 0) {
                    timeTill = `${days} Days ${hours} Hours ${minutes} Min`
                } else if (days === 0 && hours > 0) {
                    timeTill = `${hours} Hours ${minutes} Min`
                } else if (days === 0 && hours === 0) {
                    timeTill = `${minutes} Min`
                } else if (difference <= 0) {
                    timeTill = `Event Started - get with <@!${row.hostID}> to join up in-game.`
                }

                embed.fields[9] = {
                    name: 'Starts in:',
                    value: `${timeTill}`,
                    inline: false
                }
                message.edit(new Discord.MessageEmbed(embed));
            })
        })
    })
})

工作正常,但我想减轻网站服务器的工作量,让机器人搜索所需的信息。到目前为止,这是我所拥有的,但它什么也没做。没有错误,不要更新嵌入。没有什么。很确定我忽略了一些东西,只需要另一双眼睛告诉我那是什么。

cron.schedule('* * * * *', function () {
    bot.channels.cache.filter((channel) => channel.name.endsWith('events')).forEach((channel) => {
        channel.messages.cache.filter((message) => {
            const embed = message.embeds[0]
    
            let messageID;
            let event_date;
            let event_time;
    
            if (!embed) {
                return
            } else {
                if (embed.color === 65280) {
                    messageID = message.id
                    event_date = message.embeds[0].fields[0].value
                    event_time = message.embeds[0].fields[1].value
                } else {
                    return
                }
            }
            let now = Date.now()
            const targetDate = new Date(`${event_date} ${event_time}:00`)
            var difference = (targetDate - now) / 1000;
            var days = Math.floor(difference / (3600 * 24));
            var hours = Math.floor((difference - (days * (3600 * 24))) / 3600);
            var minutes = Math.floor((difference - (days * (3600 * 24)) - (hours * 3600)) / 60);
        
            let timeTill;
        
            if (days > 0) {
                timeTill = `${days} Days ${hours} Hours ${minutes} Min`
            } else if (days === 0 && hours > 0) {
                timeTill = `${hours} Hours ${minutes} Min`
            } else if (days === 0 && hours === 0) {
                timeTill = `${minutes} Min`
            } else if (difference <= 0) {
                timeTill = `Event Started - get with <@!${row.hostID}> to join up in-game.`
            }
        
            embed.fields[9] = {
                name: 'Starts in:',
                value: `${timeTill}`,
                inline: false
            }
            message.edit(new Discord.MessageEmbed(embed))
        })
    })
})

问题是您尝试查找的消息可能没有被缓存。 channel.messages.cache 将仅包含在机器人启动后发送的消息。如果您想浏览较早的消息,您将需要fetch the messages. You might want to take a look at 关于在特定日期之前获取消息。

最终代码:

cron.schedule('* * * * *', function () {
    bot.channels.cache.filter((channel) => channel.name.endsWith('events')).forEach((channel) => {
        channel.messages.fetch({
            limit: 100
        }).then(messages => {
            messages.forEach(message => {
                if (message.embeds.length > 0) {
                    const embed = message.embeds[0]

                    let messageID;
                    let event_date;
                    let event_time;

                    if (embed.color === 65280) {
                        messageID = message.id
                        event_date = message.embeds[0].fields[0].value
                        event_time = message.embeds[0].fields[1].value.slice(0, -4)

                        let now = Date.now()
                        const targetDate = new Date(`${event_date} ${event_time}:00`)
                        var difference = (targetDate - now) / 1000;
                        var days = Math.floor(difference / (3600 * 24));
                        var hours = Math.floor((difference - (days * (3600 * 24))) / 3600);
                        var minutes = Math.floor((difference - (days * (3600 * 24)) - (hours * 3600)) / 60);

                        let timeTill;

                        if (days > 0) {
                            timeTill = `${days} Days ${hours} Hours ${minutes} Min`
                        } else if (days === 0 && hours > 0) {
                            timeTill = `${hours} Hours ${minutes} Min`
                        } else if (days === 0 && hours === 0) {
                            timeTill = `${minutes} Min`
                        } else if (difference <= 0) {
                            timeTill = `Event Started - get with <@!${row.hostID}> to join up in-game.`
                        }

                        embed.fields[9] = {
                            name: 'Starts in:',
                            value: `${timeTill}`,
                            inline: false
                        }
                        message.edit(new Discord.MessageEmbed(embed)).catch(error => {
                            console.error(error);
                        })
                        console.log(`Event ${message.embeds[0].author.name} has been edited. New start time is ${timeTill}.`)
                    } else {
                        return
                    }
                } else {
                    return
                }
            })
        })
    })
})