You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

143 lines
3.9 KiB

const { createCanvas, registerFont } = require('canvas');
const Chart = require('chart.js/auto');
const {testData} = require("./trash/testData");
const {formatSeconds} = require("./utils");
const moment = require('moment');
const fs = require("fs");
function prepareData(data) {
const result = [];
const grabFirstValue = (container) => {
if (!container) return 0;
for (const mapName of Object.keys(container)) {
return container[mapName];
}
return 0;
}
const grabMapName = (container) => {
if (!container) return "";
for (const mapName of Object.keys(container)) {
return mapName;
}
return "";
}
//console.log(data)
for (const srvId of Object.keys(data.lastplay)) {
const obj = {}
obj["srv_id"] = srvId;
obj["server_name"] = data.servers[srvId].name;
obj["lastplay"] = grabFirstValue(data.lastplay[srvId])
obj["lastplay_moment"] = moment.unix(obj["lastplay"]).format("DD-MM-YYYY HH:mm")
obj["gametime"] = grabFirstValue(data.gametime[srvId])
obj["map_name"] = grabMapName(data.lastplay[srvId])
result.push(obj);
}
return result;
}
function generateChartData(d) {
const maxGametime = d.sort((a, b) => a.gametime - b.gametime).at(d.length - 1)["gametime"]
console.log(maxGametime)
let gametimeDelimiter = 1;
for (const delimiter of [60, 3600, 3600 * 24]) {
if (maxGametime > delimiter)
gametimeDelimiter = delimiter;
}
console.log(gametimeDelimiter)
const chartData = {
labels: [],
datasets: []
}
const data = []
d.sort((a, b) => b.gametime - a.gametime).forEach(
(val) => {
chartData.labels.push(`${val['server_name']}\n${val['lastplay_moment']}\nНаиграно: ${formatSeconds(val['gametime'])}`)
data.push(val['gametime'] / gametimeDelimiter)
}
)
chartData.datasets.push({
label: "Наиграно времени",
data: data,
})
const chartConfig = {
type: 'radar',
data: chartData,
options: {
responsive: false,
maintainAspectRatio: false,
borderColor: '#bd3b3b',
//backgroundColor: '#FFFFFF',
plugins: {
legend: {
position: 'top',
display: false
},
title: {
display: false,
text: 'Chart.js Polar Area Chart With Centered Point Labels'
}
},
scales: {
r: {
grid: {
color: '#ef9849'
},
angleLines: {
color: '#f08149'
},
pointLabels: {
display: true,
//centerPointLabels: true,
padding: 44,
font: {
size: 16
},
backdropColor: "#395c78",
backdropPadding: "1",
color: "#f5e7de"
},
}
}
},
};
return chartConfig;
}
function createChartOnData(testData) {
// Create a canvas and chart
const width = 800;
const height = 800;
const canvas = createCanvas(width, height);
const ctx = canvas.getContext('2d');
const d = prepareData(testData);
const chartConfig = generateChartData(d);
new Chart(ctx, chartConfig);
return canvas.createPNGStream();
}
module.exports = {createChartOnData}
function test() {
const stream = createChartOnData(testData);
// Save the chart image as a file
const fs = require('fs');
const out = fs.createWriteStream('chart.png');
stream.pipe(out);
out.on('finish', () => console.log('The chart image was saved.'));
}