Added stat exporter to csv

This commit is contained in:
mrfry 2021-08-01 13:18:49 +02:00
parent 6ea1ec3958
commit 8c784e2472

243
scripts/exportStats.js Normal file
View file

@ -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()
)
}