mirror of
https://gitlab.com/MrFry/mrfrys-node-server
synced 2025-04-01 20:24:18 +02:00
Added stat exporter to csv
This commit is contained in:
parent
6ea1ec3958
commit
8c784e2472
1 changed files with 243 additions and 0 deletions
243
scripts/exportStats.js
Normal file
243
scripts/exportStats.js
Normal 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()
|
||||||
|
)
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue