import { cyan, magenta } from 'colors'; import { Request, Response } from 'express'; import { Server } from 'http'; import SocketIO from 'socket.io'; import { timeMap } from './ApiManagers/UserManager'; import { WebSocket } from './websocket'; const fs = require('fs'); const csv = require('csv-parser'); export namespace DashStats { const statsCSVFilename = './src/server/stats/userLoginStats.csv'; const columns = ['USERNAME', 'ACTION', 'TIME']; interface SocketPair { socketId: string; username: string; time: string; operations: number; } interface CSVStore { USERNAME: string; ACTION: string; TIME: string; } enum ServerTraffic { NOT_BUSY, BUSY, VERY_BUSY } const BUSY_SERVER_BOUND = 2; const VERY_BUSY_SERVER_BOUND = 3; const serverTrafficMessages = [ "Not Busy", "Busy", "Very Busy" ] export function handleStats(res: Response) { let current = getCurrentConnections(); const results: CSVStore[] = []; res.json({ message: 'welcome to stats', currentConnections: current.length, socketMap: current, }); // fs.createReadStream(statsCSVFilename) // .pipe(csv()) // .on('data', (data: any) => results.push(data)) // .on('end', () => { // console.log(results); // res.json({ // message: 'welcome to stats', // currentConnections: current.length, // socketMap: current, // results: results, // }); // }); } export function handleStatsView(res: Response) { let current = getCurrentConnections(); let connectedUsers = current.map((socketPair) => { return socketPair.time + " - " + socketPair.username + " Operations: " + socketPair.operations; }) let serverTraffic = ServerTraffic.NOT_BUSY; if(current.length < BUSY_SERVER_BOUND) { serverTraffic = ServerTraffic.NOT_BUSY; } else if(current.length >= BUSY_SERVER_BOUND && current.length < VERY_BUSY_SERVER_BOUND) { serverTraffic = ServerTraffic.BUSY; } else { serverTraffic = ServerTraffic.VERY_BUSY; } res.render("stats.pug", { title: "Dash Stats", numConnections: current.length, serverTraffic: serverTraffic, serverTrafficMessage : serverTrafficMessages[serverTraffic], connectedUsers: connectedUsers }); } export function logUserLogin(username: string | undefined, socket: SocketIO.Socket) { if (!(username === undefined)) { let currentDate = new Date(); // console.log(magenta(`User ${username.split(' ')[0]} logged in at: ${currentDate.toISOString()}`)); let toWrite: CSVStore = { USERNAME : username, ACTION : "loggedIn", TIME : currentDate.toISOString() } let statsFile = fs.createWriteStream(statsCSVFilename, { flags: "a"}); statsFile.write(convertToCSV(toWrite)); statsFile.end(); console.log(cyan(convertToCSV(toWrite))); } } export function logUserLogout(username: string | undefined, socket: SocketIO.Socket) { if (!(username === undefined)) { let currentDate = new Date(); // console.log(magenta(`User ${username.split(' ')[0]} logged out at: ${currentDate.toISOString()}`)); let statsFile = fs.createWriteStream(statsCSVFilename, { flags: "a"}); let toWrite: CSVStore = { USERNAME : username, ACTION : "loggedOut", TIME : currentDate.toISOString() } statsFile.write(convertToCSV(toWrite)); statsFile.end(); } } function getCurrentConnections(): SocketPair[] { console.log("timeMap: " + timeMap); console.log("clients:" + WebSocket.clients); let socketPairs: SocketPair[] = []; for (let [key, value] of WebSocket.socketMap) { let username = value.split(' ')[0]; let connectionTime = new Date(timeMap[username]); let connectionTimeString = connectionTime.toLocaleDateString() + " " + connectionTime.toLocaleTimeString(); if (!key.disconnected) { socketPairs.push({ socketId: key.id, username: username, time: connectionTimeString.includes("Invalid Date") ? "" : connectionTimeString, operations : WebSocket.userOperations.get(username) ? WebSocket.userOperations.get(username)! : 0, }); } } console.log(socketPairs); // console.log([...WebSocket.clients.entries()]); return socketPairs; } function convertToCSV(dataObject: CSVStore): string { return `${dataObject.USERNAME},${dataObject.ACTION},${dataObject.TIME}\n`; } }