From 558e985773082537c43c3d2857437eaa05aed935 Mon Sep 17 00:00:00 2001
From: MrFry <mrfry@airmail.cc>
Date: Sun, 26 Apr 2020 14:33:57 +0200
Subject: [PATCH] user stats logging

---
 middlewares/reqlogger.middleware.js |  2 +-
 utils/logger.js                     | 69 ++++++++++++++++++++++++++---
 2 files changed, 63 insertions(+), 8 deletions(-)

diff --git a/middlewares/reqlogger.middleware.js b/middlewares/reqlogger.middleware.js
index 00672c4..dbfbd33 100644
--- a/middlewares/reqlogger.middleware.js
+++ b/middlewares/reqlogger.middleware.js
@@ -32,7 +32,7 @@ module.exports = function (options) {
 
       logger.LogReq(req, true, res.statusCode)
       if (toLog) { logger.LogReq(req) }
-      if (res.statusCode !== 404) { logger.LogStat(req.url, ip, hostname) }
+      if (res.statusCode !== 404) { logger.LogStat(req.url, ip, hostname, req.session.user) }
     })
     next()
   }
diff --git a/utils/logger.js b/utils/logger.js
index ce13a49..3149bae 100755
--- a/utils/logger.js
+++ b/utils/logger.js
@@ -41,6 +41,8 @@ const logFile = '/nlogs/nlogs'
 const allLogFile = '/nlogs/log'
 const statFile = 'stats/stats'
 const vStatFile = 'stats/vstats'
+const uStatsFile = 'stats/ustats'
+const uvStatsFile = 'stats/uvstats'
 const nologFile = './nolog'
 
 const colors = [
@@ -56,8 +58,10 @@ const writeInterval = 10
 const debugLevel = parseInt(process.env.NS_LOGLEVEL) || 0
 Log('Loglevel is: ' + debugLevel)
 
-let data = {}
-let vData = {}
+let data = {} // visit data
+let vData = {} // visit data, but daily
+let uData = {} // visit data, but per user
+let uvData = {} // visit data, but per user and daily
 let writes = 0
 
 let noLogips = []
@@ -173,6 +177,20 @@ function setNoLogReadInterval () {
 
 function Load () {
   Log('Loading logger...')
+  try {
+    uData = JSON.parse(utils.ReadFile(uStatsFile))
+  } catch (e) {
+    Log('Error at loading logs! (@ first run its normal)', GetColor('redbg'))
+    console.log(e)
+  }
+
+  try {
+    uvData = JSON.parse(utils.ReadFile(uvStatsFile))
+  } catch (e) {
+    Log('Error at loading logs! (@ first run its normal)', GetColor('redbg'))
+    console.log(e)
+  }
+
   try {
     var prevData = utils.ReadFile(statFile)
     data = JSON.parse(prevData)
@@ -191,7 +209,7 @@ function Load () {
   setNoLogReadInterval()
 }
 
-function LogStat (url, ip, hostname) {
+function LogStat (url, ip, hostname, userId) {
   let nolog = noLogips.some((x) => {
     return x.includes(ip)
   })
@@ -201,10 +219,35 @@ function LogStat (url, ip, hostname) {
 
   url = hostname + url.split('?')[0]
   Inc(url)
+  AddUserIdStat(userId)
+  IncUserStat(userId)
   AddVisitStat(url)
   Save()
 }
 
+function IncUserStat (userId) {
+  try {
+    if (uData[userId] === undefined) { uData[userId] = 0 }
+    uData[userId]++
+  } catch (e) {
+    Log('Error at making user ID stats!', GetColor('redbg'))
+    console.error(e)
+  }
+}
+
+function AddUserIdStat (userId) {
+  try {
+    var m = new Date()
+    const now = m.getFullYear() + '/' + ('0' + (m.getMonth() + 1)).slice(-2) + '/' + ('0' + m.getDate()).slice(-2)
+    if (uvData[now] === undefined) { uvData[now] = {} }
+    if (uvData[now][userId] === undefined) { uvData[now][userId] = 0 }
+    uvData[now][userId]++
+  } catch (e) {
+    Log('Error at making user ID stats!', GetColor('redbg'))
+    console.error(e)
+  }
+}
+
 function Inc (value) {
   if (value.startsWith('/?')) { value = '/' }
   if (data[value] === undefined) { data[value] = 0 }
@@ -222,19 +265,31 @@ function AddVisitStat (name) {
 function Save () {
   writes++
   if (writes === writeInterval) {
+    try {
+      utils.WriteFile(JSON.stringify(uData), uStatsFile)
+    } catch (e) {
+      Log('Error at writing logs! (more in stderr)', GetColor('redbg'))
+      console.error(e)
+    }
+    try {
+      utils.WriteFile(JSON.stringify(uvData), uvStatsFile)
+    } catch (e) {
+      Log('Error at writing logs! (more in stderr)', GetColor('redbg'))
+      console.error(e)
+    }
     try {
       utils.WriteFile(JSON.stringify(data), statFile)
       // Log("Stats wrote.");
     } catch (e) {
-      Log('Error at writing logs!', GetColor('redbg'))
-      console.log(e)
+      Log('Error at writing logs! (more in stderr)', GetColor('redbg'))
+      console.error(e)
     }
     try {
       utils.WriteFile(JSON.stringify(vData), vStatFile)
       // Log("Stats wrote.");
     } catch (e) {
-      Log('Error at writing visit logs!', GetColor('redbg'))
-      console.log(e)
+      Log('Error at writing visit logs! (more in stderr)', GetColor('redbg'))
+      console.error(e)
     }
     writes = 0
   }