From 8c784e2472c842052076970072fe103820792d33 Mon Sep 17 00:00:00 2001 From: mrfry Date: Sun, 1 Aug 2021 13:18:49 +0200 Subject: [PATCH] Added stat exporter to csv --- scripts/exportStats.js | 243 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 scripts/exportStats.js diff --git a/scripts/exportStats.js b/scripts/exportStats.js new file mode 100644 index 0000000..0809992 --- /dev/null +++ b/scripts/exportStats.js @@ -0,0 +1,243 @@ +const fs = require('fs') // eslint-disable-line +const dir = '../stats' + +// ------------------------------------------------------------------------------------ +// Params +// ------------------------------------------------------------------------------------ + +const pathsToAddAsCol = ['isAdding', 'ask', 'registerscript', 'hasNewMsg'] + +// ------------------------------------------------------------------------------------ +// Daily stats +// ------------------------------------------------------------------------------------ + +const result = [] +const dailyDataCount = readFile(`${dir}/dailyDataCount`) + +dailyDataCount.split('\n').forEach((line) => { + try { + const data = JSON.parse(line) + const date = new Date(data.date) + result.push({ ...data, date: date }) + } catch (e) { + // + } +}) + +// ------------------------------------------------------------------------------------ +// User ID Requests +// ------------------------------------------------------------------------------------ + +const asd = 5 +const userIdRequests = readJSON(`${dir}/uvstats`) +Object.keys(userIdRequests).forEach((key) => { + const date = new Date(key) + const ri = result.findIndex((res) => { + return dateEquals(res.date, date) + }) + if (ri !== -1) { + result[ri] = { + ...result[ri], + uniqueUserIdRequests: Object.keys(userIdRequests[key]).length, + [`uniqueUserIdRequestsMin${asd}`]: Object.keys( + userIdRequests[key] + ).reduce((acc, subKey) => { + if (userIdRequests[key][subKey] > asd) { + acc += 1 + } + return acc + }, 0), + } + } else { + result.push({ + date: date, + [`uniqueUserIdRequestsMin${asd}`]: Object.keys( + userIdRequests[key] + ).reduce((acc, subKey) => { + if (userIdRequests[key][subKey] > asd) { + acc += 1 + } + return acc + }, 0), + }) + } +}) + +// ------------------------------------------------------------------------------------ +// User ID Test solving +// ------------------------------------------------------------------------------------ + +const userIdTestSolving = readJSON(`${dir}/idvstats`) +Object.keys(userIdTestSolving).forEach((key) => { + const date = new Date(key) + const ri = result.findIndex((res) => { + return dateEquals(res.date, date) + }) + if (ri !== -1) { + result[ri] = { + ...result[ri], + uniqueUserIdTestSolving: Object.keys(userIdTestSolving[key]).length, + } + } else { + result.push({ + date: date, + uniqueUserIdTestSolving: Object.keys(userIdTestSolving[key]).length, + }) + } +}) + +// ------------------------------------------------------------------------------------ +// Website acesses +// ------------------------------------------------------------------------------------ + +const stats = readJSON(`${dir}/vstats`) +Object.keys(stats).forEach((key) => { + const date = new Date(key) + const ri = result.findIndex((res) => { + return dateEquals(res.date, date) + }) + + const toAdd = pathsToAddAsCol.reduce((acc, path) => { + return { + ...acc, + [`Path: ${path}`]: stats[key][getKeyName(path, stats[key])], + } + }, {}) + + if (ri !== -1) { + result[ri] = { + ...result[ri], + ...toAdd, + } + } else { + result.push({ + date: date, + ...toAdd, + }) + } +}) + +function getKeyName(keyName, obj) { + return Object.keys(obj).find((key) => { + return key.includes(keyName) + }) +} + +// ------------------------------------------------------------------------------------ +// Registered script count +// ------------------------------------------------------------------------------------ + +const registeredScripts = readJSON(`${dir}/registeredScripts.json`) +let total = 0 +const registeredScriptsByDay = registeredScripts + .reduce((acc, item) => { + const date = new Date(item.date) + const ri = acc.findIndex((res) => { + return dateEquals(res.date, date) + }) + if (ri !== -1) { + acc[ri] = { + ...acc[ri], + registeredScripts: acc[ri].registeredScripts + 1, + } + } else { + acc.push({ + date: date, + registeredScripts: 1, + }) + } + return acc + }, []) + .sort((a, b) => { + return a.date.getTime() - b.date.getTime() + }) + .map((item) => { + total += item.registeredScripts + return { + ...item, + registeredScripts: total, + } + }) + +registeredScriptsByDay.forEach((item) => { + const date = item.date + const ri = result.findIndex((res) => { + return dateEquals(res.date, date) + }) + + if (ri !== -1) { + result[ri] = { + ...result[ri], + registeredScripts: item.registeredScripts, + } + } else { + result.push({ + date: date, + registeredScripts: item.registeredScripts, + }) + } +}) + +// process.exit() + +// ------------------------------------------------------------------------------------ +// Exporting +// ------------------------------------------------------------------------------------ + +const csv = arrayToCsv( + result.sort((a, b) => { + return a.date.getTime() - b.date.getTime() + }) +) + +fs.writeFileSync('./res.csv', csv) + +// ------------------------------------------------------------------------------------ + +function arrayToCsv(array) { + const columns = array.reduce((acc, item) => { + const keys = Object.keys(item) + keys.forEach((key) => { + if (!acc.includes(key)) { + acc.push(key) + } + }) + + return acc + }, []) + + const res = [columns.join(';')] + array.forEach((item) => { + res.push( + columns + .map((key) => { + if (key !== 'date') { + return item[key] ? item[key] : '' + } else { + return item[key] ? item[key].toDateString() : '' + } + }) + .join(';') + ) + }) + + return res.join('\n') +} + +function readFile(name) { + if (fs.existsSync(name)) { + return fs.readFileSync(name, 'utf8') + } +} + +function readJSON(name) { + return JSON.parse(fs.readFileSync(name, 'utf8')) +} + +function dateEquals(d1, d2) { + return ( + d1.getMonth() === d2.getMonth() && + d1.getDate() === d2.getDate() && + d1.getFullYear() === d2.getFullYear() + ) +}