【问题标题】:Pull info from discord server从不和谐服务器中提取信息
【发布时间】:2021-07-17 03:37:20
【问题描述】:

我已安排以下 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))
        })
    })
})

【问题讨论】:

    标签: cron discord.js


    【解决方案1】:

    问题是您尝试查找的消息可能没有被缓存。 channel.messages.cache 将仅包含机器人启动后发送的消息。如果您想查看较旧的消息,则需要fetch the messages。您可能想看看 my post 关于在特定日期之前获取消息的信息。

    【讨论】:

    • 这让我走上了正确的道路,我现在发布我完成的代码。虽然我确实稍微调整了一下。
    • 所以 cron 作业现在自行停止运行。它将运行几个小时,然后不会抛出任何我可以找到记录的错误,只需停止即可。想法?
    • 你认为 cron 作业为什么停止了?
    • 我不知道,机器人没有崩溃或任何事情,我不知道是否有一些我不知道的 DIScord API 规则会阻止 cronjob 每分钟运行一次。 IDK
    • 您可以尝试记录每次运行的 cron 作业,例如,您可以确定它已停止。如果您确定 cron 作业停止而没有任何痕迹或错误或任何东西。此外,为了进行双重检查,您可以将整个 cron 作业函数体包装在 try/catch 中。所以你确定没有发生错误。那么我可能会在 SO 上提出另一个问题,关于为什么 cron 作业意外停止。
    【解决方案2】:

    最终代码:

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

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多