【问题标题】:Discord Bot sending multiple embeds instead of one when using data from mysqlDiscord Bot在使用来自mysql的数据时发送多个嵌入而不是一个
【发布时间】:2021-07-24 14:48:42
【问题描述】:

嘿,所以我为我的世界服务器编写了一个不和谐机器人,用于显示服务器上玩家的前 10 个游戏时间。但它不是发送一个嵌入,而是发送 10 个嵌入,为我查询的 10 行中的每个玩家发送一个,任何帮助都会得到帮助!


var now = new Date();
var playtimes = '../cost of ballin/PLAYTIMES/playtime-' + now.getFullYear() + "-" + now.getMonth() + "-" + now.getDate() + '.txt'

client.on("message", (msg) => {
    if (msg.content == prefix + "pt") {
        con.query("SELECT DAYS,NAME,MINUTES,HOURS FROM playtimes ORDER BY DAYS DESC LIMIT 10",
            function(err, result) {
                if (err) throw err;
                Object.keys(result).forEach(function(key) {
                    var row = result[key];
                    fs.appendFileSync(playtimes, "Player Name: " + row.NAME + " Days: " + row.DAYS + " Hours: " + row.HOURS + " Minutes: " + row.MINUTES + "\r\n")
                    var file = fs.readFileSync(playtimes)
                    const embed = new Discord.MessageEmbed()
                        .setColor('#000000')
                        .setTitle('Playtime Leaderboard')
                        .setDescription(playtimes)
                    wait(10000)
                    channel.send(embed);
                })

            }
        );
    }
});

【问题讨论】:

    标签: mysql node.js discord.js


    【解决方案1】:

    我在这里看到的问题是,每次运行 .forEach() 循环时,您都在执行 channel.send()

    这会在您每次运行时发送一条消息。相反,您应该做的是创建某种对象来存储您从查询中获得的统计信息,然后在 .forEach() 循环完成后发送消息。例如:

    var now = new Date();
    var playtimes = '../cost of ballin/PLAYTIMES/playtime-' + now.getFullYear() + "-" + now.getMonth() + "-" + now.getDate() + '.txt'
    
    client.on("message", (msg) => {
        if (msg.content == prefix + "pt") {
    
            let playTimeStats = {} //create a dictionary for the stats
    
            con.query("SELECT DAYS,NAME,MINUTES,HOURS FROM playtimes ORDER BY DAYS DESC LIMIT 10",
                function(err, result) {
                    if (err) throw err;
                    Object.keys(result).forEach(function(key) {
                        var row = result[key];
                        fs.appendFileSync(playtimes, "Player Name: " + row.NAME + " Days: " + row.DAYS + " Hours: " + row.HOURS + " Minutes: " + row.MINUTES + "\r\n")
                        var file = fs.readFileSync(playtimes)
        
                        playTimeStats[row.NAME] = {
                            "Days": row.DAYS,
                            "Hours": row.HOURS,
                            "Minutes": row.MINUTES
                        } //add the stats to the dictionary                   
    
                    })
                }
            );
    
    //make an embed here for the stats, and then send it
    
        }
    });
    

    我还没有为你编写所有代码,但我已经添加了我认为你需要开始的内容...我已经添加了字典以及如何向其中添加元素,你只需要制作和发送嵌入。

    【讨论】:

    • 所以我遵循了编写的代码,现在遇到了一个问题,它将 [object, Object] 放在 playTimeStats 输出的区域,可能只是我误解了一些事情,因为我只是最近开始学习node,感谢您迄今为止提供的所有帮助!
    • 既然是在对象中,那么你需要做的就是解析对象。您可以在accessing object properties 下找到有关如何解析这些here 的文档。如果我是你,我可能会使用 for() 循环遍历对象,并在我看到它们时将属性添加到嵌入中。 (关于 for 循环的信息 here
    猜你喜欢
    • 2022-01-24
    • 2018-11-24
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2023-03-07
    • 2022-11-23
    • 2021-04-21
    • 2021-08-05
    相关资源
    最近更新 更多