1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
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`;
}
}
|