Add support for sending stats to Matrix, split out some code into more generic classes. #1

Open
rory.gay wants to merge 35 commits from rory.gay/freepbx-stats:main into main
Showing only changes of commit 27bcc4ecc1 - Show all commits

142
index.js
View file

@ -22,54 +22,105 @@ function getYesterday() {
);
}
/**
* @param {string} query
* @param {any} params
* @returns {Promise<int>}
*/
async function queryScalarAsync(query, ...params) {
const connection = await mysql.createConnection({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME
});
await connection.connect();
return new Promise((resolve, reject) => {
connection.query(query, params, (err, results) => {
if (err) {
reject(err);
} else {
resolve(results[0]);
}
connection.end();
});
});
}
/**
* Fetch call statistics
* @returns {Promise<CallStats>}
*/
async function getPreviousDayData() {
return new Promise(async (resolve, reject) => {
const yesterday = getYesterday();
const connection = await mysql.createConnection({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
multipleStatements: true
});
await connection.connect();
await connection.query(`
const [ callsYesterday, callsThisMonth, callsTotal ] = Promise.all([
queryScalarAsync(`
SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr
WHERE calldate BETWEEN ? AND ?;
`, getYesterday().startDate, getYesterday().endDate),
queryScalarAsync(`
SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr
WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?);
`, getYesterday().startDate, getYesterday().startDate),
queryScalarAsync(`
SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr;
`, [ yesterday.start, yesterday.end, yesterday.start, yesterday.start ], (err, res) => {
if (err) {
reject(err);
}
connection.end();
// let output = {
// "Calls Made": res[0][0].call_count,
// "Monthly Total": res[1][0].call_count,
// "Total Calls Ever Placed": res[2][0].call_count,
// "System Uptime": getSystemUptime().toString(false, false),
// "All Time Record": null, // Placeholder
// }
`)
]);
const stats = new CallStats({
callsMadeToday: res[0][0].call_count,
totalCallsThisMonth: res[1][0].call_count,
totalCallsEverPlaced: res[2][0].call_count,
allTimeRecord: null // Placeholder
});
console.log(stats);
resolve(stats);
});
totalCallsMade: callsYesterday,
totalCallsThisMonth: callsThisMonth,
totalCallsEverPlaced: callsTotal
});
console.log("Got stats:", stats);
return stats;
// return new Promise(async (resolve, reject) => {
// const yesterday = getYesterday();
// const connection = await mysql.createConnection({
// host: process.env.DATABASE_HOST,
// user: process.env.DATABASE_USER,
// password: process.env.DATABASE_PASSWORD,
// database: process.env.DATABASE_NAME,
// multipleStatements: true
// });
// await connection.connect();
// await connection.query(`
// SELECT COUNT(DISTINCT uniqueid) AS call_count
// FROM cdr
// WHERE calldate BETWEEN ? AND ?;
//
// SELECT COUNT(DISTINCT uniqueid) AS call_count
// FROM cdr
// WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?);
//
// SELECT COUNT(DISTINCT uniqueid) AS call_count
// FROM cdr;
// `, [ yesterday.start, yesterday.end, yesterday.start, yesterday.start ], (err, res) => {
// if (err) {
// reject(err);
// }
// connection.end();
// // let output = {
// // "Calls Made": res[0][0].call_count,
// // "Monthly Total": res[1][0].call_count,
// // "Total Calls Ever Placed": res[2][0].call_count,
// // "System Uptime": getSystemUptime().toString(false, false),
// // "All Time Record": null, // Placeholder
// // }
//
// const stats = new CallStats({
// callsMadeToday: res[0][0].call_count,
// totalCallsThisMonth: res[1][0].call_count,
// totalCallsEverPlaced: res[2][0].call_count,
// allTimeRecord: null // Placeholder
// });
//
// console.log(stats);
// resolve(stats);
// });
// });
}
function getSystemUptime() {
@ -118,30 +169,39 @@ async function sendSummary() {
console.log("Preparing summary.");
const data = await getPreviousDayData();
console.log("Updating records...");
const updatedData = await updateRecords(data, records);
const stats = await updateRecords(data, records);
console.log("Saving.");
await records.toJSONFile(JSON_FILE);
const yesterday = getYesterday();
const makeField = (name, value) => ({ name, value: value === undefined ? "***ERR: UNDEFINED***" : value.toString(), inline: false });
await sendSummaryDiscord(yesterday, stats)
}
async function sendSummaryDiscord(yesterday, stats) {
const makeField = (name, value) => ({
name,
value: value === undefined ? "***ERR: UNDEFINED***" : value.toString(),
inline: false
});
let embed = {
title: `Summary from <t:${Math.floor(yesterday.start / 1000)}:f> to <t:${Math.floor(yesterday.end / 1000)}:f>`,
color: 0x1E90FF,
fields: [
makeField("Calls Made", updatedData.totalCallsMade),
makeField("Monthly Total", updatedData.totalCallsThisMonth),
makeField("Total Calls Ever Placed", updatedData.totalCallsEverPlaced),
makeField("Calls Made", stats.totalCallsMade),
makeField("Monthly Total", stats.totalCallsThisMonth),
makeField("Total Calls Ever Placed", stats.totalCallsEverPlaced),
makeField("System Uptime", getSystemUptime().toString(false, false)),
makeField("All Time Record", updatedData.allTimeRecord)
makeField("All Time Record", stats.allTimeRecord)
],
timestamp: new Date(),
footer: {}
}
if (updatedData.isNewRecord) {
if (stats.isNewRecord) {
embed.color = 0xFFD700; // Gold color for new record
embed.fields.push(makeField("🎉 NEW RECORD! 🎉", `A new record has been set, at ${updatedData.totalCallsMade}!`));
embed.fields.push(makeField("🎉 NEW RECORD! 🎉", `A new record has been set, at ${stats.totalCallsMade}!`));
}
const payload = { embeds: [ embed ] };