图表看起来只有灰色,不显示颜色 - Chartjs,discordjs

Umu*_*maz 8 javascript node.js chart.js discord discord.js

我正在设计一个 discord.js 代码,它将显示成员的消息和语音统计信息,根据它的排行榜可能会导致奖品。

通常,我的图表以某种方式应该看起来像这些图表:

(上图分别是discord服务器的语音和消息统计)

但是当我输入命令时,它会显示这些无色图形:(不是关于它的设计,而是关于它的颜色)

在这两个图之间,没有代码差异,没有 node.js 版本更改,没有平台更改等。

我已经在这个项目上工作了很长时间,但一个月左右后,我仍然找不到我的代码有任何错误。也许我错过了什么。有人可以帮我吗?谢谢。

一般统计命令:

const { Client, Message, MessageEmbed, MessageAttachment } = require("discord.js");
const Stat = require("../../Models/Database/Stat");
const tm = require("../../Managers/TimeManager");

const moment = require("moment");
require("moment-duration-format");

const cm = require("../../Managers/ChartManager");

/**
 * @param {Client} client 
 * @param {Message} message 
 * @param {Array<String>} args 
 */
module.exports.execute = async(client, message, args) => {
    let victim = message.mentions.users.first() || client.users.cache.get(args[0]) || message.author;

    let embed = new MessageEmbed()
        .setAuthor(victim.username, victim.avatarURL({ dynamic: true }))
        .setFooter("?statistik bilgileri");

    let data = await Stat.findOne({ Id: victim.id });
    if (!data) data = {};
    let day = await tm.getDay(message.guild.id);

    let dataMessage = new Array(day).fill(0, 0, day),
        dataVoice = new Array(day).fill(0, 0, day),
        dataColors = new Array(day).fill('rgba(0, 92, 210, 0.5)');

    if (data.Message) {
        let günlükmesaj = 0,
            haftal?kmesaj = 0,
            ayl?kmesaj = 0,
            toplammesaj = 0;
        let days = Object.keys(data.Message);
        days.forEach(_day => {
            let sum = Object.values(data.Message[_day]).reduce((x, y) => x + y, 0);
            toplammesaj += sum;
            dataMessage[_day - 1] = sum;
            if (day == Number(_day)) günlükmesaj += sum;
            if (_day <= 7) haftal?kmesaj += sum;
            if (_day <= 30) ayl?kmesaj += sum;
        });
        embed.addField(`Mesaj ?statisti?i`, `
        __Toplam:__ \`${toplammesaj} mesaj\`

        Günlük: \`${günlükmesaj} mesaj\`
        Haftal?k: \`${haftal?kmesaj} mesaj\`
        Ayl?k: \`${ayl?kmesaj} mesaj\`
        `, true)
    }
    if (data.Voice) {
        let günlükses = 0,
            haftal?kses = 0,
            ayl?kses = 0,
            toplamses = 0;
        let days = Object.keys(data.Voice);
        let max = Math.max(dataMessage);
        days.forEach(_day => {
            let sum = Object.values(data.Voice[_day]).reduce((x, y) => x + y, 0);
            if (isNaN(sum)) sum = 0;
            toplamses += sum;

            dataVoice[_day - 1] = (sum / (1000 * 60))
            if (day == Number(_day)) günlükses += sum;
            if (_day <= 7) haftal?kses += sum;
            if (_day <= 30) ayl?kses += sum;
        });
        embed.addField(`Ses ?statisti?i`, `
        __Toplam:__ \`${moment.duration(toplamses).format("H [saat, ] m [dakika]")}\`

        Günlük: \`${moment.duration(günlükses).format("H [saat, ] m [dakika]")}\`
        Haftal?k: \`${moment.duration(haftal?kses).format("H [saat, ] m [dakika]")}\`
        Ayl?k: \`${moment.duration(ayl?kses).format("H [saat, ] m [dakika]")}\`
        `, true)
    }

    let dataDate = [];
    for (let index = 0; index < day; index++) {
        let date = new Date(Date.now() - (1000 * 60 * 60 * 24 * (day - (index + 1))));
        dataDate.push(date.toTurkishFormatDate());
    }

    let buffer = await cm.ImageFromData({
        width: 600,
        height: 290,
        type: 'line',

        data: {
            labels: [].concat(dataDate),
            datasets: [{
                    label: "Toplam Mesaj ?statisti?i (Adet)",
                    data: [].concat(dataMessage),
                    backgroundColor: [
                        'rgba(0, 112, 255, 0.25)'
                    ],
                    borderColor: [].concat(dataColors),
                    borderWidth: 1
                },
                {
                    label: "Toplam Ses ?statisti?i (Dakika)",
                    data: dataVoice,
                    backgroundColor: [
                        'rgba(4, 255, 0, 0.25)'
                    ],
                    borderColor: [].concat(new Array(day).fill('rgba(4, 255, 0, 0.5)')),
                    borderWidth: 1
                }
            ]
        },
        options: {

        }
    });

    embed.setImage("attachment://Graph.png");
    let attachment = new MessageAttachment(buffer, "Graph.png");

    message.channel.csend({
        embeds: [embed],
        files: [attachment]
    });
}

module.exports.settings = {
    Commands: ["istatistikler", "istatistik"],
    Usage: "istatistik [@ki?i|ID]",
    Description: "Sunucudaki genel ses ve mesaj istatisti?inle alakal? bilgi al?rs?n.",
    Category: "istatistikler",
    Activity: true,
    cooldown: 20000
}
Run Code Online (Sandbox Code Playgroud)

消息统计命令:

const { Client, Message, MessageEmbed, MessageAttachment } = require("discord.js");
const Stat = require("../../Models/Database/Stat");

const tm = require("../../Managers/TimeManager");

const cm = require("../../Managers/ChartManager");

module.exports.execute = async(client, message, args) => {
        let victim = message.mentions.users.first() || client.users.cache.get(args[0]) || message.author;

        let embed = new MessageEmbed()
            .setAuthor(victim.username, victim.avatarURL({ dynamic: true }))
            .setFooter(`${message.guild.name} sunucusuda ${victim.username} ki?isinin bilgileri.`)

        let data = await Stat.findOne({ Id: victim.id }, { Voice: 0 });
        if (!data) data = {};
        let day = await tm.getDay(message.guild.id);
        embed.setDescription(`${victim} ki?isinin ${day} gün boyunca yapm?? oldu?u mesaj aktifli?i a?a??da detayl? olarak s?ralanm??t?r.`);
        embed.setColor("2f3136");

        let dataValue = new Array(day).fill(0);
        let dataDate = [];
        let dataColors = new Array(day).fill('rgba(0, 92, 210, 0.5)');

        if (data.Message) {
            let günlükmesaj = 0,
                haftal?kmesaj = 0,
                ayl?kmesaj = 0,
                toplammesaj = 0;
            let days = Object.keys(data.Message);

            let haftal?k = {},
                ayl?k = {},
                günlük = [];

            days.forEach(_day => {
                let sum = Object.values(data.Message[_day]).reduce((x, y) => x + y, 0);
                toplammesaj += sum;
                dataValue[_day - 1] = sum;

                if (day == Number(_day)) {
                    günlükmesaj += sum;
                    günlük = Object.keys(data.Message[_day]).map(e => Object.assign({ Channel: e, Value: data.Message[_day][e] }));
                }
                if (_day <= 7) {
                    haftal?kmesaj += sum;
                    let keys = Object.keys(data.Message[_day]);
                    keys.forEach(key => {
                        if (haftal?k[key]) haftal?k[key] += data.Message[_day][key];
                        else haftal?k[key] = data.Message[_day][key];
                    });
                }
                if (_day <= 30) {
                    ayl?kmesaj += sum;
                    let keys = Object.keys(data.Message[_day]);
                    keys.forEach(key => {
                        if (ayl?k[key]) ayl?k[key] += data.Message[_day][key];
                        else ayl?k[key] = data.Message[_day][key];
                    });
                }
            });
            embed.addField("**Günlük Mesaj ?statisti?i**", `
        __Toplam:__ ${günlükmesaj} mesaj

        ${günlük.sort((x, y) => y.Value - x.Value).splice(0, 5).map((data, index) => {
            let channel = message.guild.channels.cache.get(data.Channel);
            return `\`${index + 1}.\` ${channel ? channel : "deleted-channel"}: \`${data.Value} mesaj\``;
        }).join("\n")}\n\n** **
        `);

        embed.addField("**Haftal?k Mesaj ?statisti?i**", `
        __Toplam:__ ${haftal?kmesaj} mesaj

        ${Object.keys(haftal?k).sort((x, y) => haftal?k[y] - haftal?k[x]).splice(0, 5).map((data, index) => {
            let channel = message.guild.channels.cache.get(data);
            return `\`${index + 1}.\` ${channel ? channel : "deleted-channel"}: \`${haftal?k[data]} mesaj\``;
        }).join("\n")}\n\n** **
        `);

        embed.addField("**Ayl?k Mesaj ?statisti?i**", `
        __Toplam:__ ${haftal?kmesaj} mesaj

        ${Object.keys(ayl?k).sort((x, y) => ayl?k[y] - ayl?k[x]).splice(0, 5).map((data, index) => {
            let channel = message.guild.channels.cache.get(data);
            return `\`${index + 1}.\` ${channel ? channel : "deleted-channel"}: \`${ayl?k[data]} mesaj\``;
        }).join("\n")}\n\n** **
        `);

        embed.addField(`Genel Mesaj ?statisti?i`, `
        __Toplam:__ ${toplammesaj} mesaj

        Günlük: \`${günlükmesaj} mesaj\`
        Haftal?k: \`${haftal?kmesaj} mesaj\`
        Ayl?k: \`${ayl?kmesaj} mesaj\`
        `, true)
    }
    else {
        embed.setDescription("Herhangi bir kay?t bulunamad?.");
    }

    for (let index = 0; index < day; index++) {
        let date = new Date(Date.now() - (1000 * 60 * 60 * 24 * (day - (index + 1))));
        dataDate.push(date.toTurkishFormatDate());
    }

    let buffer = await cm.ImageFromData({
        width: 600,
        height: 290,
        type: 'line',

        data: {
            labels: [].concat(dataDate),
            datasets: [{
                label: "Toplam Mesaj ?statisti?i (Adet)",
                data: [].concat(dataValue),
                backgroundColor: [
                    'rgba(0, 112, 255, 0.25)'
                ],
                borderColor: [].concat(dataColors),
                borderWidth: 1
            }]
        },
        options: {

        }
    });

    embed.setImage("attachment://Graph.png");
    let attachment = new MessageAttachment(buffer, "Graph.png");

    message.channel.csend({
        embeds: [embed],
        files: [attachment]
    });
}
module.exports.settings = {
    Commands: ["mesajistatistikleri"],
    Usage: "mesajistatistikleri",
    Description: "Sunucudaki mesaj istatisti?inle alakal? bilgi al?rs?n.",
    Category: "istatistikler",
    Activity: true,
    cooldown: 15000
}
Run Code Online (Sandbox Code Playgroud)

语音统计命令:

const { Client, Message, MessageEmbed, MessageAttachment } = require("discord.js");
const Stat = require("../../Models/Database/Stat");

const moment = require("moment");
require("moment-duration-format");

const tm = require("../../Managers/TimeManager");

const cm = require("../../Managers/ChartManager");


/**
 * @param {Client} client 
 * @param {Message} message 
 * @param {Array<String>} args 
 */
module.exports.execute = async(client, message, args) => {
        let victim = message.mentions.users.first() || client.users.cache.get(args[0]) || message.author;

        let embed = new MessageEmbed()
            .setAuthor(victim.username, victim.avatarURL({ dynamic: true }))
            .setFooter(`${message.guild.name} sunucusuda ${victim.username} ki?isinin bilgileri.`)

        let data = await Stat.findOne({ Id: victim.id }, { Message: 0 });
        if (!data) data = {};
        let day = await tm.getDay(message.guild.id);
        embed.setDescription(`${victim} ki?isinin ${day} gün boyunca yapm?? oldu?u ses aktifli?i a?a??da detayl? olarak s?ralanm??t?r.`);
        embed.setColor("2f3136");

        let dataValue = new Array(day).fill(0);
        let dataDate = [];
        let dataColors = [];

        if (data.Voice) {
            let günlükses = 0,
                haftal?kses = 0,
                ayl?kses = 0,
                toplamses = 0;
            let days = Object.keys(data.Voice);

            let haftal?k = {},
                ayl?k = {},
                günlük = [];

            days.forEach(_day => {
                let sum = Object.values(data.Voice[_day]).reduce((x, y) => x + y, 0);
                toplamses += sum;
                dataValue[_day - 1] = convert(sum);
                dataColors.push('rgba(4, 255, 0, 0.5)');


                if (day == Number(_day)) {
                    günlükses += sum;
                    günlük = Object.keys(data.Voice[_day]).map(e => Object.assign({ Channel: e, Value: data.Voice[_day][e] }));
                }
                if (_day <= 7) {
                    haftal?kses += sum;
                    let keys = Object.keys(data.Voice[_day]);
                    keys.forEach(key => {
                        if (haftal?k[key]) haftal?k[key] += data.Voice[_day][key];
                        else haftal?k[key] = data.Voice[_day][key];
                    });
                }
                if (_day <= 30) {
                    ayl?kses += sum;
                    let keys = Object.keys(data.Voice[_day]);
                    keys.forEach(key => {
                        if (ayl?k[key]) ayl?k[key] += data.Voice[_day][key];
                        else ayl?k[key] = data.Voice[_day][key];
                    });
                }
            });
            embed.addField("**Günlük Ses ?statisti?i**", `
        __Toplam:__ ${moment.duration(günlükses).format("H [saat, ] m [dakika]")}

        ${günlük.sort((x, y) => y.Value - x.Value).splice(0, 5).map((data, index) => {
            let channel = message.guild.channels.cache.get(data.Channel);
            return `\`${index + 1}.\` #${channel ? channel.name : "deleted-channel"}: \`${moment.duration(data.Value).format("H [saat, ] m [dakika]")}\``;
        }).join("\n")}\n\n** **
        `);

        embed.addField("**Haftal?k Ses ?statisti?i**", `
        __Toplam:__ ${moment.duration(haftal?kses).format("H [saat, ] m [dakika]")}

        ${Object.keys(haftal?k).sort((x, y) => haftal?k[y] - haftal?k[x]).splice(0, 5).map((data, index) => {
            let channel = message.guild.channels.cache.get(data);
            return `\`${index + 1}.\` #${channel ? channel.name : "deleted-channel"}: \`${moment.duration(haftal?k[data]).format("H [saat, ] m [dakika]")}\``;
        }).join("\n")}\n\n** **
        `);

        embed.addField("**Ayl?k Ses ?statisti?i**", `
        __Toplam:__ ${moment.duration(ayl?kses).format("H [saat, ] m [dakika]")}

        ${Object.keys(ayl?k).sort((x, y) => ayl?k[y] - ayl?k[x]).splice(0, 5).map((data, index) => {
            let channel = message.guild.channels.cache.get(data);
            return `\`${index + 1}.\` #${channel ? channel.name : "deleted-channel"}: \`${moment.duration(ayl?k[data]).format("H [saat, ] m [dakika]")}\``;
        }).join("\n")}\n\n** **
        `);

        embed.addField(`Genel Ses ?statisti?i`, `
        __Toplam:__ ${moment.duration(toplamses).format("H [saat, ] m [dakika]")}

        Günlük: \`${moment.duration(günlükses).format("H [saat, ] m [dakika]")}\`
        Haftal?k: \`${moment.duration(haftal?kses).format("H [saat, ] m [dakika]")}\`
        Ayl?k: \`${moment.duration(ayl?kses).format("H [saat, ] m [dakika]")}\`
        `, true)
    }
    else {
        embed.setDescription("Herhangi bir kay?t bulunamad?.");
    }

    for (let index = 0; index < day; index++) {
        let date = new Date(Date.now() - (1000 * 60 * 60 * 24 * (day - (index + 1))));
        dataDate.push(date.toTurkishFormatDate());
    }

    let buffer = await cm.ImageFromData({
        width: 600,
        height: 290,
        type: 'line',

        data: {
            labels: [].concat(dataDate),
            datasets: [{
                label: "Toplam Ses ?statisti?i (Dakika)",
                data: [].concat(dataValue),
                backgroundColor: [
                    'rgba(4, 255, 0, 0.25)'
                ],
                borderColor: [].concat(dataColors),
                borderWidth: 1
            }]
        },
        options: {

        }
    });

    embed.setImage("attachment://Graph.png");
    let attachment = new MessageAttachment(buffer, "Graph.png");

    message.channel.csend({
        embeds: [embed],
        files: [attachment]
    });
}


function convert(ms) {
    return (ms / (1000 * 60)).toFixed(0);
}

module.exports.settings = {
    Commands: ["sesistatistikleri"],
    Usage: "sesistatistikleri",
    Description: "Sunucudaki kendi ses istatisti?ine bakars?n.",
    Category: "istatistikler",
    Activity: true,
    cooldown: 15000
}
Run Code Online (Sandbox Code Playgroud)

消息排行榜命令:

const { Client, Message, MessageEmbed, MessageAttachment } = require("discord.js");
const Stat = require("../../Models/Database/Stat");
const Helper = require("../../Utils/Helper");

const tm = require("../../Managers/TimeManager");

const cm = require("../../Managers/ChartManager");

/**
 * @param {Client} client 
 * @param {Message} message 
 * @param {Array<String>} args 
 */
module.exports.execute = async(client, message, args) => {
    let embed = new MessageEmbed()
        .setAuthor(message.author.username, message.author.avatarURL({ dynamic: true }))
        .setFooter(`${message.guild.name} sunucusunun mesaj istatistikleri.`)
    let day = await tm.getDay(message.guild.id);
    embed.setDescription(`${message.guild.name} sunucusunda kullan?c?lar?n **${day}** gün boyunca yapm?? oldu?u mesaj aktifli?i a?a??da detayl? olarak s?ralanm??t?r.`);
    embed.setColor("2f3136");

    Stat.aggregate([
        { $project: { Voice: 0 } },
        { $sort: { AllMessage: -1 } }
    ]).limit(10).exec(async(err, docs) => {
        if (err) return message.reply("bir hata ile kar??la??ld?.");
        let users = [],
            usersToEmbed = [];

        if (docs.length > 0) {
            for (let index = 0; index < docs.length; index++) {
                const doc = docs[index];
                let stat = doc;
                if (!stat) continue;

                if (stat.AllMessage <= 0) continue;

                if (stat.Message) {
                    let days = Object.keys(stat.Message);
                    let dataValues = new Array(day).fill(0);
                    days.forEach(_day => {
                        let sum = Object.values(stat.Message[_day]).reduce((x, y) => x + y, 0);
                        dataValues[_day - 1] = sum;
                    });
                    let user = (await Helper.GetUser(doc.Id));
                    usersToEmbed.push({
                        User: user,
                        Value: dataValues.reduce((x, y) => x + y, 0)
                    });
                    let borderColors = new Array(dataValues.length).fill(getColor(index, "0.8"));
                    let backgroundColors = new Array(dataValues.length).fill(getColor(index, "0.1"))
                    let pointBackgroundColors = new Array(dataValues.length).fill(getColor(index, "1"));
                    let data = {
                        label: `${user.username}`,
                        data: dataValues,
                        backgroundColor: backgroundColors,
                        borderColor: borderColors,
                        pointBackgroundColor: pointBackgroundColors,
                        borderWidth: 1.5,
                    };
                    users.push(data);
                }
            }

            let dataDate = [];
            for (let index = 0; index < day; index++) {
                let date = new Date(Date.now() - (1000 * 60 * 60 * 24 * (day - (index + 1))));
                dataDate.push(date.toTurkishFormatDate());
            }

            let buffer = awai

小智 1

您现在获得的颜色是库设置的默认颜色rgba(0, 0, 0, 0.1),这是因为您提供的是数组而不是字符串或画布图案/渐变对象borderColor: [].concat(dataColors)。一般统计命令行 97

欲了解更多信息,您可以在这里查看 https://www.chartjs.org/docs/latest/general/colors.html