Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // http://ahoj.io/nodejs-and-websocket-simple-chat-tutorial
- // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
- "use strict";
- // Optional. You will see this name in eg. 'ps' or 'top' command
- process.title = 'node-chat';
- // Port where we'll run the websocket server
- var webSocketsServerPort = 1338;
- // websocket and http servers
- var webSocketServer = require('websocket').server;
- var http = require('http');
- var fs = require('fs');
- var S = require('string');
- /**
- * Global variables
- */
- // latest 100 messages
- var history = [ ];
- // list of currently connected clients (users)
- var clients = [ ];
- var userNames = [ ];
- /**
- * Helper function for escaping input strings
- */
- function htmlEntities(str) {
- return String(str).replace(/&/g, '&').replace(/</g, '<')
- .replace(/>/g, '>').replace(/"/g, '"');
- }
- Object.size = function(obj) {
- var size = 0, key;
- for (key in obj) {
- if (obj.hasOwnProperty(key)) size++;
- }
- return size;
- };
- var sslOptions = {};
- sslOptions = {
- key: fs.readFileSync("/etc/letsencrypt/live/comniemeer.de/privkey.pem"),
- cert: fs.readFileSync("/etc/letsencrypt/live/comniemeer.de/cert.pem")
- };
- /**
- * HTTP server
- */
- var server = http.createServer(function(request, response) {
- console.log((new Date()) + " HTTP Server received request for " + request.url);
- });
- server.listen(webSocketsServerPort, function() {
- console.log((new Date()) + " HTTP Server is listening on port " + webSocketsServerPort);
- });
- /**
- * WebSocket server
- */
- var wsServer = new webSocketServer({
- // WebSocket server is tied to a HTTP server. WebSocket request is just
- // an enhanced HTTP request. For more info http://tools.ietf.org/html/rfc6455#page-6
- httpServer: server
- });
- // This callback function is called every time someone
- // tries to connect to the WebSocket server
- wsServer.on('request', function(request) {
- console.log((new Date()) + ' Connection from origin ' + request.origin + '.');
- // accept connection - you should check 'request.origin' to make sure that
- // client is connecting from your website
- // (http://en.wikipedia.org/wiki/Same_origin_policy)
- var connection;
- if (request.origin != "http://agarchat.comniemeer.de") {
- connection = request.reject(102, 'gtfo');
- return;
- } else {
- connection = request.accept(null, request.origin);
- }
- var index = clients.push(connection) - 1;
- var userName = false;
- console.log((new Date()) + ' Connection accepted. IP: ' + connection.remoteAddress);
- // send back chat history
- if (history.length > 0) {
- connection.sendUTF(JSON.stringify( { type: 'history', data: history} ));
- }
- console.log("User verbunden: " + userNames.length);
- // user sent some message
- connection.on('message', function(message) {
- if (message.type === 'utf8') { // accept only text
- if (userName === false) {
- var requestedName = htmlEntities(message.utf8Data);
- if (userNames.indexOf(requestedName) != -1) {
- var obj = {
- time: (new Date()).getTime(),
- text: "Der Name " + requestedName + " ist bereits vergeben."
- };
- connection.sendUTF(JSON.stringify({ type: 'command', data: obj }));
- } else if (requestedName.length > 20) {
- var obj = {
- time: (new Date()).getTime(),
- text: "Der Name " + requestedName + " ist zu lang."
- };
- connection.sendUTF(JSON.stringify({ type: 'command', data: obj }));
- } else if (!requestedName.match("^[A-Za-zß0-9_.]+$")) {
- var obj = {
- time: (new Date()).getTime(),
- text: "Der Name " + requestedName + " enthält ungültige Zeichen."
- };
- connection.sendUTF(JSON.stringify({ type: 'command', data: obj }));
- } else {
- userName = requestedName;
- userNames.push(userName);
- connection.sendUTF(JSON.stringify({ type: 'login', name: userName}));
- console.log((new Date()) + ' User is known as: ' + userName);
- }
- } else { // log and broadcast the message
- console.log((new Date()) + ' Received Message from ' + userName + ': ' + message.utf8Data);
- if (S(message.utf8Data).startsWith("/")) {
- var command = message.utf8Data.replace("/", "");
- var obj;
- if (command == "help") {
- obj = {
- time: (new Date()).getTime(),
- text: "Verfügbare Befehle:"
- + "<br>/help - Zeigt alle Befehle an"
- + "<br>/users - Zeigt aktuell verbundene User an"
- };
- } else if (command == "users") {
- var usersString = "Angemeldete User: ";
- var usersSize = userNames.length;
- for (var i = 0; i < usersSize; i++) {
- usersString += userNames[i];
- if (i + 1 < usersSize) {
- usersString += ", ";
- }
- }
- obj = {
- time: (new Date()).getTime(),
- text: htmlEntities(usersString)
- };
- } else {
- obj = {
- time: (new Date()).getTime(),
- text: htmlEntities("Unbekannter Befehl!")
- };
- }
- var json = JSON.stringify({ type: 'command', data: obj });
- connection.sendUTF(json);
- } else {
- // we want to keep history of all sent messages
- var obj = {
- time: (new Date()).getTime(),
- text: htmlEntities(message.utf8Data),
- author: userName
- };
- history.push(obj);
- history = history.slice(-100);
- // broadcast message to all connected clients
- var json = JSON.stringify({ type: 'message', data: obj });
- for (var i = 0; i < clients.length; i++) {
- clients[i].sendUTF(json);
- }
- }
- }
- }
- });
- // user disconnected
- connection.on('close', function(connection) {
- if (userName !== false) {
- console.log((new Date()) + " Peer " + connection.remoteAddress + " disconnected.");
- clients.splice(index, 1);
- var userIndex = userNames.indexOf(userName);
- if (userIndex > -1) {
- userNames.splice(userIndex, 1);
- }
- }
- });
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement