-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
112 lines (97 loc) · 3.02 KB
/
server.js
File metadata and controls
112 lines (97 loc) · 3.02 KB
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
const express = require('express');
const http = require('http');
const https = require('https');
const fs = require('fs');
const socketIo = require('socket.io');
const path = require('path');
const { render } = require('ejs');
require('dotenv').config();
const app = express();
const APPName = "Chat Whirl";
const UserName = "Krish";
const isHttps = process.env.HTTPS === 'true';
// Load SSL certificates if HTTPS is enabled
let server;
// if (isHttps) {
// const options = {
// key: fs.readFileSync('key.pem'),
// cert: fs.readFileSync('cert.pem')
// };
// server = https.createServer(options, app);
// } else {
server = http.createServer(app);
// }
const io = socketIo(server);
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/image',express.static(path.join(__dirname,'image')));
app.use('/public',express.static(path.join(__dirname,'public')));
app.use((req,res,next) => {
let ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress || req.connection.remoteAddress || null;
if(ip.includes('::ffff:')){
ip = ip.split('::ffff:')[1];
}
if(ip=='::1'){
ip = "127.0.0.1:"+PORT;
}
req.userIp = ip;
next();
});
app.get('/', (req, res) => {
res.redirect('/join');
});
app.get('/create', (req, res) => {
res.render('creatchat',{ip: req.userIp, APPName, UserName});
});
app.get('/join', (req, res) => {
res.render('joinchat',{ip: req.userIp, APPName, UserName});
});
app.get('/chat', (req, res) => {
const { key } = req.query;
if(!key){
return res.redirect('/');
}
const requirements = [
{regex: /.{7,}/, index: 0},
{regex: /[0-9]/, index: 1},
{regex: /[a-z]/, index: 2},
{regex: /[A-Z]/, index: 3}
];
let requirementItem=0;
requirements.forEach((item)=>{
let isValid = item.regex.test(key);
if(isValid){
requirementItem++;
}
});
if(requirementItem >= requirements.length && key.length<=7 && key.length>=5){
let roomName = APPName;
res.render('chat', { key , roomName});
}else{
return res.redirect('*');
}
});
app.get('*', (req, res) => {
res.status(404).render('notfound');
});
io.on('connection', (socket) => {
console.log('A user connected');
socket.on('join', (key) => {
socket.join(key);
console.log(`User joined room: ${key}`);
});
socket.on('message', ({ key, message }) => {
io.to(key).emit('message', message);
});
socket.on('disconnect', () => {
console.log('A user disconnected');
});
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, (err) => {
if(err) console.log("Oops an error occure: "+err);
console.log(`Compiled successfully!\n\nYou can now view ./${path.basename(__filename)} in the browser.`);
console.info(`\thttp://localhost:${PORT}`);
console.log("\nNode web compiled!\n");
});