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