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 * Fetch call statistics
* @returns {Promise<CallStats>} * @returns {Promise<CallStats>}
*/ */
async function getPreviousDayData() { async function getPreviousDayData() {
return new Promise(async (resolve, reject) => { const [ callsYesterday, callsThisMonth, callsTotal ] = Promise.all([
const yesterday = getYesterday(); queryScalarAsync(`
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 SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr FROM cdr
WHERE calldate BETWEEN ? AND ?; WHERE calldate BETWEEN ? AND ?;
`, getYesterday().startDate, getYesterday().endDate),
queryScalarAsync(`
SELECT COUNT(DISTINCT uniqueid) AS call_count SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr FROM cdr
WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?); WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?);
`, getYesterday().startDate, getYesterday().startDate),
queryScalarAsync(`
SELECT COUNT(DISTINCT uniqueid) AS call_count SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr; 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({ const stats = new CallStats({
callsMadeToday: res[0][0].call_count, totalCallsMade: callsYesterday,
totalCallsThisMonth: res[1][0].call_count, totalCallsThisMonth: callsThisMonth,
totalCallsEverPlaced: res[2][0].call_count, totalCallsEverPlaced: callsTotal
allTimeRecord: null // Placeholder
});
console.log(stats);
resolve(stats);
});
}); });
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() { function getSystemUptime() {
@ -118,30 +169,39 @@ async function sendSummary() {
console.log("Preparing summary."); console.log("Preparing summary.");
const data = await getPreviousDayData(); const data = await getPreviousDayData();
console.log("Updating records..."); console.log("Updating records...");
const updatedData = await updateRecords(data, records); const stats = await updateRecords(data, records);
console.log("Saving."); console.log("Saving.");
await records.toJSONFile(JSON_FILE); await records.toJSONFile(JSON_FILE);
const yesterday = getYesterday(); 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 = { let embed = {
title: `Summary from <t:${Math.floor(yesterday.start / 1000)}:f> to <t:${Math.floor(yesterday.end / 1000)}:f>`, title: `Summary from <t:${Math.floor(yesterday.start / 1000)}:f> to <t:${Math.floor(yesterday.end / 1000)}:f>`,
color: 0x1E90FF, color: 0x1E90FF,
fields: [ fields: [
makeField("Calls Made", updatedData.totalCallsMade), makeField("Calls Made", stats.totalCallsMade),
makeField("Monthly Total", updatedData.totalCallsThisMonth), makeField("Monthly Total", stats.totalCallsThisMonth),
makeField("Total Calls Ever Placed", updatedData.totalCallsEverPlaced), makeField("Total Calls Ever Placed", stats.totalCallsEverPlaced),
makeField("System Uptime", getSystemUptime().toString(false, false)), makeField("System Uptime", getSystemUptime().toString(false, false)),
makeField("All Time Record", updatedData.allTimeRecord) makeField("All Time Record", stats.allTimeRecord)
], ],
timestamp: new Date(), timestamp: new Date(),
footer: {} footer: {}
} }
if (updatedData.isNewRecord) { if (stats.isNewRecord) {
embed.color = 0xFFD700; // Gold color for new record 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 ] }; const payload = { embeds: [ embed ] };