-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
112 lines (100 loc) · 3.31 KB
/
server.js
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
import express from 'express';
import bodyParser from 'body-parser';
import { readFileSync, writeFile, writeFileSync } from 'fs'
import { calculateTime } from './calculator.js'
import { getDormParameters } from './dorms.js'
import { dmUsers, sendDM, sendEmail, emailUsers } from './bot.js'
import { config } from "dotenv"
config()
// Initialize express
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// API endpoint for testing
app.get('/', (req, res) => {
res.json({ 'hello': 'world' })
})
/**
* Parses college name to enum
*
* @param {string} college The college name
* @return
*/
function collegeToEnum(college) {
switch (college) {
case 'Cowell':
return 0;
case 'Stevenson':
return 1;
case 'Crown':
return 2;
case 'Merrill':
return 3;
case 'College Nine':
return 4;
case 'John R. Lewis':
return 5;
case 'Porter':
return 6;
case 'Kresge':
return 7;
case 'Oakes':
return 8;
case 'Rachel Carson':
return 9;
}
}
function roomToEnum(roomType) {
switch (roomType) {
case 'Single':
return 0;
case 'Double':
return 1;
case 'Triple':
return 2;
case 'Large Triple':
return 3;
}
}
function fahrenheitToCelsius(f) {
return (f - 32) * 5 / 9
}
// API endpoint for submitting data
// POST http://localhost:PORT/api/v1/submit
app.post('/api/v1/submit', async (req, res) => {
const { discordUsername, email, currentTemp, targetTemp, college, roomType } = req.body;
const dormParameters = getDormParameters(collegeToEnum(college), roomToEnum(roomType));
console.log(fahrenheitToCelsius(currentTemp), fahrenheitToCelsius(targetTemp), dormParameters.latitude, dormParameters.longitude, dormParameters.roomVolume, dormParameters.windowArea)
const result = await calculateTime(fahrenheitToCelsius(currentTemp), fahrenheitToCelsius(targetTemp), dormParameters.latitude, dormParameters.longitude, dormParameters.roomVolume, dormParameters.windowArea, 0.01)
console.log(result)
// Fetch user data
let data = await JSON.parse(readFileSync('./data.json'))
// Check if user already exists to eliminate duplicates, if so return error
// if (data.users?.filter(user => user.discordUsername === discordUsername).length)
// return res.json({ success: false, error: 'User already exists' })
if (!result?.time) return res.json({ success: false, error: 'Failed to calculate' })
// Add user to data
data.users.push({
email: email ?? null,
username: discordUsername.toLowerCase() ?? null,
college: college,
roomType: roomType,
epoch: Date.now() + (result.time * 1000),
})
// Write data to file
writeFileSync('./data.json', JSON.stringify(data))
// Send final time back to client
res.json({
success: true,
data: result
})
})
// Check if user needs to be notified every 15s
setInterval(() => {
console.log('Checking users')
dmUsers()
}, 7_500);
// Run API on http://localhost:PORT
app.listen(process.env.PORT_SERVER, () => {
console.log(`Server is running on port ${process.env.PORT_SERVER}`);
})