From b7b618f1487e6337c7c408923982a4e82cb0f766 Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 18:23:03 -1000 Subject: [PATCH 01/11] Able to communicate with other clients --- client.js | 23 +++++++++++++++++++++++ config.json | 3 +++ server.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 client.js create mode 100644 config.json create mode 100644 server.js diff --git a/client.js b/client.js new file mode 100644 index 0000000..30ecb95 --- /dev/null +++ b/client.js @@ -0,0 +1,23 @@ +var net = require('net'); +var Stream = require('stream'); +var WriteableStream = Stream.Writable; +var ReadableStream = Stream.Readable; +var CONFIG = require('./config'); +var socket = new net.Socket(); + +var a = process.stdin; +var b = process.stdout; + +a.setEncoding('utf-8'); + +socket.connect({port:CONFIG.PORT}); + + +a.on('data', function(chunk){ + socket.write(chunk,'utf8'); +}); + + +socket.on('data', function(chunk){ + b.write(chunk, 'utf8'); +}); \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..1f37b71 --- /dev/null +++ b/config.json @@ -0,0 +1,3 @@ +{ + "PORT":7979 +} \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..83e6ed1 --- /dev/null +++ b/server.js @@ -0,0 +1,33 @@ +var net = require('net'); +var b = process.stdout; +var CONFIG = require('./config'); + +var PORT = 6969; +var count = 0; +var connections = []; +var server = net.createServer(function(socket){ + console.log('someone connected \n'); + connections.push(socket); + socket.write('Connected to ' + CONFIG.PORT + '\n', 'utf8'); + socket.on('data', function(chunk){ + b.write('Server Bcast from' +socket.remoteAddress + ': ' + socket.remotePort + ': ' +chunk,'utf8'); + for(var i = 0; i < connections.length; i++){ + connections[i].write( connections[i].remoteAddress + ': ' +connections[i].remotePort + ': ' + chunk,'utf8'); + } + }); + count++; +}); + + + +server.listen(CONFIG.PORT, function(){ + var finalPort = server.address().port; + console.log('listening on port \n', finalPort); +}); + +server.on('error', function(err){ + this.listen(CONFIG.PORT, function(){ + var finalPort = server.address().port; + console.log('listening on port \n', finalPort); + }); +}); \ No newline at end of file From 0d00377f365c81b790c7c78f3e178c655a8d0fe5 Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 18:36:37 -1000 Subject: [PATCH 02/11] fixed server messages --- package.json | 21 +++++++++++++++++++++ server.js | 8 ++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..7e01805 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "Network-Broadcast-News", + "version": "1.0.0", + "description": "A NodeJS broadcast server for the largest media conglomerate in the world", + "main": "client.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Tanachi/Network-Broadcast-News.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/Tanachi/Network-Broadcast-News/issues" + }, + "homepage": "https://github.com/Tanachi/Network-Broadcast-News#readme" +} diff --git a/server.js b/server.js index 83e6ed1..1e03652 100644 --- a/server.js +++ b/server.js @@ -6,16 +6,20 @@ var PORT = 6969; var count = 0; var connections = []; var server = net.createServer(function(socket){ - console.log('someone connected \n'); + b.write( socket.remoteAddress + ': ' + socket.remotePort + ' connected \n'); connections.push(socket); socket.write('Connected to ' + CONFIG.PORT + '\n', 'utf8'); socket.on('data', function(chunk){ - b.write('Server Bcast from' +socket.remoteAddress + ': ' + socket.remotePort + ': ' +chunk,'utf8'); + b.write('Server Bcast from' + socket.remoteAddress + ': ' + socket.remotePort + ': ' +chunk,'utf8'); for(var i = 0; i < connections.length; i++){ connections[i].write( connections[i].remoteAddress + ': ' +connections[i].remotePort + ': ' + chunk,'utf8'); } }); count++; + + socket.on('close', function(){ + console.log('goodbye ]n'); + }); }); From d6f3c38d4135670e47786aabac1d03c1f48729dd Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 18:49:30 -1000 Subject: [PATCH 03/11] Clients are able to leave now --- server.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 1e03652..719859b 100644 --- a/server.js +++ b/server.js @@ -1,4 +1,6 @@ var net = require('net'); +var a = process.stdin; +a.setEncoding('utf-8'); var b = process.stdout; var CONFIG = require('./config'); @@ -10,15 +12,25 @@ var server = net.createServer(function(socket){ connections.push(socket); socket.write('Connected to ' + CONFIG.PORT + '\n', 'utf8'); socket.on('data', function(chunk){ - b.write('Server Bcast from' + socket.remoteAddress + ': ' + socket.remotePort + ': ' +chunk,'utf8'); + b.write('Server Bcast from' + socket.remoteAddress + ': ' + socket.remotePort + ': ' + chunk + '\n','utf8'); for(var i = 0; i < connections.length; i++){ - connections[i].write( connections[i].remoteAddress + ': ' +connections[i].remotePort + ': ' + chunk,'utf8'); + connections[i].write( connections[i].remoteAddress + ': ' +connections[i].remotePort + ': ' + chunk + '\n','utf8'); } }); count++; socket.on('close', function(){ - console.log('goodbye ]n'); + var closedPort; + for(var z = 0; z < connections.length; z++){ + if(connections[z].remotePort === socket.remotePort){ + closedPort = connections[z].remotePort; + b.write('Closed' + connections[z].remotePort + '\n'); + connections.splice(z, 1); + } + } + for(var x = 0; x < connections.length;x++){ + connections[x].write( closedPort + ' left \n','utf8'); + } }); }); From df9b9a0981724050fb15fcb0c5a56e5d3996eafb Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 18:54:48 -1000 Subject: [PATCH 04/11] Added server broadcast --- server.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index 719859b..79f14c6 100644 --- a/server.js +++ b/server.js @@ -24,7 +24,7 @@ var server = net.createServer(function(socket){ for(var z = 0; z < connections.length; z++){ if(connections[z].remotePort === socket.remotePort){ closedPort = connections[z].remotePort; - b.write('Closed' + connections[z].remotePort + '\n'); + b.write('Closed ' + connections[z].remotePort + '\n'); connections.splice(z, 1); } } @@ -35,6 +35,12 @@ var server = net.createServer(function(socket){ }); +a.on('data', function(chunk){ + for(var i = 0; i < connections.length; i++){ + connections[i].write( '[ADMIN]' + ': ' + chunk + '\n','utf8'); + } + b.write(chunk); +}); server.listen(CONFIG.PORT, function(){ var finalPort = server.address().port; From d671f22edd451e9ae05b3d0636bb6ac97c03b1c9 Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 19:05:56 -1000 Subject: [PATCH 05/11] Added username entry for array --- server.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/server.js b/server.js index 79f14c6..058ebd6 100644 --- a/server.js +++ b/server.js @@ -9,12 +9,13 @@ var count = 0; var connections = []; var server = net.createServer(function(socket){ b.write( socket.remoteAddress + ': ' + socket.remotePort + ' connected \n'); - connections.push(socket); + connections.push({socket:socket, userName:null}); socket.write('Connected to ' + CONFIG.PORT + '\n', 'utf8'); socket.on('data', function(chunk){ b.write('Server Bcast from' + socket.remoteAddress + ': ' + socket.remotePort + ': ' + chunk + '\n','utf8'); for(var i = 0; i < connections.length; i++){ - connections[i].write( connections[i].remoteAddress + ': ' +connections[i].remotePort + ': ' + chunk + '\n','utf8'); + connections[i].socket.write( connections[i].socket.remoteAddress + ': ' + + connections[i].socket.remotePort + ': ' + chunk + '\n','utf8'); } }); count++; @@ -22,14 +23,14 @@ var server = net.createServer(function(socket){ socket.on('close', function(){ var closedPort; for(var z = 0; z < connections.length; z++){ - if(connections[z].remotePort === socket.remotePort){ - closedPort = connections[z].remotePort; - b.write('Closed ' + connections[z].remotePort + '\n'); + if(connections[z].socket.remotePort === socket.remotePort){ + closedPort = connections[z].socket.remotePort; + b.write('Closed ' + connections[z].socket.remotePort + '\n'); connections.splice(z, 1); } } for(var x = 0; x < connections.length;x++){ - connections[x].write( closedPort + ' left \n','utf8'); + connections[x].socket.write( closedPort + ' left \n','utf8'); } }); }); From 1bae171b9d9555fb60b8d730cccffe310b43ec49 Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 19:36:57 -1000 Subject: [PATCH 06/11] Added username function --- server.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/server.js b/server.js index 058ebd6..964d38f 100644 --- a/server.js +++ b/server.js @@ -5,20 +5,30 @@ var b = process.stdout; var CONFIG = require('./config'); var PORT = 6969; -var count = 0; var connections = []; +var userCount = 0; var server = net.createServer(function(socket){ b.write( socket.remoteAddress + ': ' + socket.remotePort + ' connected \n'); - connections.push({socket:socket, userName:null}); + connections.push({socket:socket, userName:''}); socket.write('Connected to ' + CONFIG.PORT + '\n', 'utf8'); + socket.write('Please enter username \n', 'utf8'); socket.on('data', function(chunk){ + if(connections.length > userCount){ + connections[userCount].userName = chunk; + userCount++; + } + else{ + var senderName; + for(var y = 0; y < connections.length; y++){ + if(connections[y].socket.remotePort === socket.remotePort) + senderName = connections[y].userName.toString().replace(/(\r\n|\n|\r)/gm,""); + } b.write('Server Bcast from' + socket.remoteAddress + ': ' + socket.remotePort + ': ' + chunk + '\n','utf8'); - for(var i = 0; i < connections.length; i++){ - connections[i].socket.write( connections[i].socket.remoteAddress + ': ' + - connections[i].socket.remotePort + ': ' + chunk + '\n','utf8'); + for(var i = 0; i < connections.length; i++){ + connections[i].socket.write( senderName + ': ' + chunk + '\n','utf8'); + } } }); - count++; socket.on('close', function(){ var closedPort; @@ -27,6 +37,7 @@ var server = net.createServer(function(socket){ closedPort = connections[z].socket.remotePort; b.write('Closed ' + connections[z].socket.remotePort + '\n'); connections.splice(z, 1); + } } for(var x = 0; x < connections.length;x++){ From b45e4781ba814a4606c097342dc5d509589ecc54 Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 19:54:09 -1000 Subject: [PATCH 07/11] added name checking functions --- server.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 964d38f..d7b0f36 100644 --- a/server.js +++ b/server.js @@ -14,8 +14,21 @@ var server = net.createServer(function(socket){ socket.write('Please enter username \n', 'utf8'); socket.on('data', function(chunk){ if(connections.length > userCount){ - connections[userCount].userName = chunk; - userCount++; + var validName = 1; + if(chunk.toString() === '[ADMIN]\n'){ + validName = 0; + socket.write('Not allowed to set username as admin \n', 'utf8'); + } + for(var k = 0; k < userCount; k++){ + if(chunk.toString() === connections[k].userName.toString()){ + validName = 0; + socket.write('Username is already taken \n', 'utf8'); + } + } + if(validName === 1){ + connections[userCount].userName = chunk; + userCount++; + } } else{ var senderName; From e7e6f195034d6d57338ab4281317cc5f5a976e99 Mon Sep 17 00:00:00 2001 From: Tanachi Date: Wed, 29 Jun 2016 21:23:04 -1000 Subject: [PATCH 08/11] Added kick function --- server.js | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/server.js b/server.js index d7b0f36..25139e4 100644 --- a/server.js +++ b/server.js @@ -50,7 +50,7 @@ var server = net.createServer(function(socket){ closedPort = connections[z].socket.remotePort; b.write('Closed ' + connections[z].socket.remotePort + '\n'); connections.splice(z, 1); - + userCount--; } } for(var x = 0; x < connections.length;x++){ @@ -61,10 +61,38 @@ var server = net.createServer(function(socket){ a.on('data', function(chunk){ - for(var i = 0; i < connections.length; i++){ - connections[i].write( '[ADMIN]' + ': ' + chunk + '\n','utf8'); + var myRegexp = /(\\kick) (.*)/; + var match = myRegexp.exec(chunk); + if(match !== null){ + if(match.length === 3){ + for(var k = 0; k < connections.length; k++){ + if(isNaN(match[2])){ + var checkName = connections[k].userName.toString().replace(/(\r\n|\n|\r)/gm,""); + console.log(match[2]); + if(match[2].toString() === checkName){ + console.log('User got kicked'); + connections[k].socket.end(); + connections.splice(k,1); + userCount--; + } + } + else{ + if(parseInt(match[2]) === connections[k].socket.remotePort){ + console.log('User got kicked'); + connections[k].socket.end(); + connections.splice(k,1); + userCount--; + } + } + } + } + } + else{ + for(var i = 0; i < connections.length; i++){ + connections[i].socket.write('[ADMIN]' + ': ' + chunk + '\n','utf8'); + } + b.write('[ADMIN]' + ': ' + chunk); } - b.write(chunk); }); server.listen(CONFIG.PORT, function(){ From 9bda27c2c9415352dc5f9cda58b79a7f789b17ba Mon Sep 17 00:00:00 2001 From: Tanachi Date: Thu, 30 Jun 2016 18:04:39 -1000 Subject: [PATCH 09/11] Added message limit to server --- server.js | 52 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/server.js b/server.js index 25139e4..37d0565 100644 --- a/server.js +++ b/server.js @@ -7,11 +7,18 @@ var CONFIG = require('./config'); var PORT = 6969; var connections = []; var userCount = 0; + + + var server = net.createServer(function(socket){ b.write( socket.remoteAddress + ': ' + socket.remotePort + ' connected \n'); - connections.push({socket:socket, userName:''}); + connections.push({socket:socket, userName:'', writeLimit: 3}); socket.write('Connected to ' + CONFIG.PORT + '\n', 'utf8'); socket.write('Please enter username \n', 'utf8'); + socket.writeLimit = 3; + socket.startMessage = null; + socket.endMessage = null; + socket.totalTime = 0; socket.on('data', function(chunk){ if(connections.length > userCount){ var validName = 1; @@ -31,14 +38,41 @@ var server = net.createServer(function(socket){ } } else{ - var senderName; - for(var y = 0; y < connections.length; y++){ - if(connections[y].socket.remotePort === socket.remotePort) - senderName = connections[y].userName.toString().replace(/(\r\n|\n|\r)/gm,""); - } - b.write('Server Bcast from' + socket.remoteAddress + ': ' + socket.remotePort + ': ' + chunk + '\n','utf8'); - for(var i = 0; i < connections.length; i++){ - connections[i].socket.write( senderName + ': ' + chunk + '\n','utf8'); + var isSpam = 0; + if(socket.writeLimit === 3){ + socket.startMessage = new Date(); + } + socket.writeLimit--; + if(socket.writeLimit < 0){ + if(socket.totalTime < 1000){ + for(var t = 0; t < connections.length; t++){ + if(connections[t].socket.remotePort === socket.remotePort){ + console.log('Someone got kicked'); + connections.splice(t, 1); + userCount--; + socket.end(); + isSpam = 1; + } + } + } + else{ + socket.startMessage = new Date(); + socket.writeLimit = 3; + } + } + if(isSpam === 0){ + var senderName; + for(var y = 0; y < connections.length; y++){ + if(connections[y].socket.remotePort === socket.remotePort) + senderName = connections[y].userName.toString().replace(/(\r\n|\n|\r)/gm,""); + } + b.write('Server Bcast from' + socket.remoteAddress + ': ' + socket.remotePort + ': ' + chunk + '\n','utf8'); + for(var i = 0; i < connections.length; i++){ + connections[i].socket.write( senderName + ': ' + chunk + '\n','utf8'); + } + socket.endMessage = new Date(); + var spamTime = socket.endMessage.getTime() - socket.startMessage.getTime(); + socket.totalTime += spamTime; } } }); From 32664adac588d60b4036b3185c7b004c7e62daf6 Mon Sep 17 00:00:00 2001 From: Tanachi Date: Thu, 30 Jun 2016 18:13:15 -1000 Subject: [PATCH 10/11] add flood function and fixed message limit kick function --- client.js | 13 ++++++++++++- server.js | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/client.js b/client.js index 30ecb95..c9fad57 100644 --- a/client.js +++ b/client.js @@ -14,7 +14,18 @@ socket.connect({port:CONFIG.PORT}); a.on('data', function(chunk){ - socket.write(chunk,'utf8'); + var myRegexp = /(\\flood) (\w*)/; + var match = myRegexp.exec(chunk); + if(match !== null){ + console.log('hello'); + if(match.length === 3){ + for(var i = 0; i < 99; i++) + socket.write(match[2],'utf8'); + } + } + else{ + socket.write(chunk,'utf8'); + } }); diff --git a/server.js b/server.js index 37d0565..0c144ef 100644 --- a/server.js +++ b/server.js @@ -58,6 +58,7 @@ var server = net.createServer(function(socket){ else{ socket.startMessage = new Date(); socket.writeLimit = 3; + socket.totalTIme = 0; } } if(isSpam === 0){ From 282817db39736b23231a5367c30ecec833a7fc6b Mon Sep 17 00:00:00 2001 From: Tanachi Date: Thu, 30 Jun 2016 18:15:49 -1000 Subject: [PATCH 11/11] fixed typo --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 0c144ef..1b05995 100644 --- a/server.js +++ b/server.js @@ -58,7 +58,7 @@ var server = net.createServer(function(socket){ else{ socket.startMessage = new Date(); socket.writeLimit = 3; - socket.totalTIme = 0; + socket.totalTime = 0; } } if(isSpam === 0){