Advertisement
comniemeer

chat.js

Mar 24th, 2016
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // http://ahoj.io/nodejs-and-websocket-simple-chat-tutorial
  2.  
  3. // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
  4. "use strict";
  5.  
  6. // Optional. You will see this name in eg. 'ps' or 'top' command
  7. process.title = 'node-chat';
  8.  
  9. // Port where we'll run the websocket server
  10. var webSocketsServerPort = 1338;
  11.  
  12. // websocket and http servers
  13. var webSocketServer = require('websocket').server;
  14. var http = require('http');
  15. var fs = require('fs');
  16. var S = require('string');
  17.  
  18. /**
  19.  * Global variables
  20.  */
  21. // latest 100 messages
  22. var history = [ ];
  23. // list of currently connected clients (users)
  24. var clients = [ ];
  25. var userNames = [ ];
  26.  
  27. /**
  28.  * Helper function for escaping input strings
  29.  */
  30. function htmlEntities(str) {
  31.     return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;')
  32.                       .replace(/>/g, '&gt;').replace(/"/g, '&quot;');
  33. }
  34.  
  35. Object.size = function(obj) {
  36.     var size = 0, key;
  37.    
  38.     for (key in obj) {
  39.         if (obj.hasOwnProperty(key)) size++;
  40.     }
  41.    
  42.     return size;
  43. };
  44.  
  45. var sslOptions = {};
  46.  
  47. sslOptions = {
  48.     key: fs.readFileSync("/etc/letsencrypt/live/comniemeer.de/privkey.pem"),
  49.     cert: fs.readFileSync("/etc/letsencrypt/live/comniemeer.de/cert.pem")
  50. };
  51.  
  52. /**
  53.  * HTTP server
  54.  */
  55. var server = http.createServer(function(request, response) {
  56.     console.log((new Date()) + " HTTP Server received request for " + request.url);
  57. });
  58.  
  59. server.listen(webSocketsServerPort, function() {
  60.     console.log((new Date()) + " HTTP Server is listening on port " + webSocketsServerPort);
  61. });
  62.  
  63. /**
  64.  * WebSocket server
  65.  */
  66. var wsServer = new webSocketServer({
  67.     // WebSocket server is tied to a HTTP server. WebSocket request is just
  68.     // an enhanced HTTP request. For more info http://tools.ietf.org/html/rfc6455#page-6
  69.     httpServer: server
  70. });
  71.  
  72. // This callback function is called every time someone
  73. // tries to connect to the WebSocket server
  74. wsServer.on('request', function(request) {
  75.     console.log((new Date()) + ' Connection from origin ' + request.origin + '.');
  76.    
  77.     // accept connection - you should check 'request.origin' to make sure that
  78.     // client is connecting from your website
  79.     // (http://en.wikipedia.org/wiki/Same_origin_policy)
  80.     var connection;
  81.    
  82.     if (request.origin != "http://agarchat.comniemeer.de") {
  83.         connection = request.reject(102, 'gtfo');
  84.         return;
  85.     } else {
  86.         connection = request.accept(null, request.origin);
  87.     }
  88.    
  89.     var index = clients.push(connection) - 1;
  90.     var userName = false;
  91.    
  92.     console.log((new Date()) + ' Connection accepted. IP: ' + connection.remoteAddress);
  93.    
  94.     // send back chat history
  95.     if (history.length > 0) {
  96.         connection.sendUTF(JSON.stringify( { type: 'history', data: history} ));
  97.     }
  98.    
  99.     console.log("User verbunden: " + userNames.length);
  100.    
  101.     // user sent some message
  102.     connection.on('message', function(message) {
  103.         if (message.type === 'utf8') { // accept only text
  104.             if (userName === false) {
  105.                 var requestedName = htmlEntities(message.utf8Data);
  106.                
  107.                 if (userNames.indexOf(requestedName) != -1) {
  108.                     var obj = {
  109.                         time: (new Date()).getTime(),
  110.                         text: "Der Name " + requestedName + " ist bereits vergeben."
  111.                     };
  112.                    
  113.                     connection.sendUTF(JSON.stringify({ type: 'command', data: obj }));
  114.                 } else if (requestedName.length > 20) {
  115.                     var obj = {
  116.                         time: (new Date()).getTime(),
  117.                         text: "Der Name " + requestedName + " ist zu lang."
  118.                     };
  119.                    
  120.                     connection.sendUTF(JSON.stringify({ type: 'command', data: obj }));
  121.                 } else if (!requestedName.match("^[A-Za-zß0-9_.]+$")) {
  122.                     var obj = {
  123.                         time: (new Date()).getTime(),
  124.                         text: "Der Name " + requestedName + " enthält ungültige Zeichen."
  125.                     };
  126.                    
  127.                     connection.sendUTF(JSON.stringify({ type: 'command', data: obj }));
  128.                 } else {
  129.                     userName = requestedName;
  130.                     userNames.push(userName);
  131.                    
  132.                     connection.sendUTF(JSON.stringify({ type: 'login', name: userName}));
  133.                    
  134.                     console.log((new Date()) + ' User is known as: ' + userName);
  135.                 }
  136.             } else { // log and broadcast the message
  137.                 console.log((new Date()) + ' Received Message from ' + userName + ': ' + message.utf8Data);
  138.                
  139.                 if (S(message.utf8Data).startsWith("/")) {
  140.                     var command = message.utf8Data.replace("/", "");
  141.                     var obj;
  142.                    
  143.                     if (command == "help") {
  144.                         obj = {
  145.                             time: (new Date()).getTime(),
  146.                             text: "Verfügbare Befehle:"
  147.                                 + "<br>/help - Zeigt alle Befehle an"
  148.                                 + "<br>/users - Zeigt aktuell verbundene User an"
  149.                         };
  150.                     } else if (command == "users") {
  151.                         var usersString = "Angemeldete User: ";
  152.                         var usersSize = userNames.length;
  153.                        
  154.                         for (var i = 0; i < usersSize; i++) {
  155.                             usersString += userNames[i];
  156.                            
  157.                             if (i + 1 < usersSize) {
  158.                                 usersString += ", ";
  159.                             }
  160.                         }
  161.                        
  162.                         obj = {
  163.                             time: (new Date()).getTime(),
  164.                             text: htmlEntities(usersString)
  165.                         };
  166.                     } else {
  167.                         obj = {
  168.                             time: (new Date()).getTime(),
  169.                             text: htmlEntities("Unbekannter Befehl!")
  170.                         };
  171.                     }
  172.                    
  173.                     var json = JSON.stringify({ type: 'command', data: obj });
  174.                    
  175.                     connection.sendUTF(json);
  176.                 } else {
  177.                     // we want to keep history of all sent messages
  178.                     var obj = {
  179.                         time: (new Date()).getTime(),
  180.                         text: htmlEntities(message.utf8Data),
  181.                         author: userName
  182.                     };
  183.                    
  184.                     history.push(obj);
  185.                     history = history.slice(-100);
  186.                    
  187.                     // broadcast message to all connected clients
  188.                     var json = JSON.stringify({ type: 'message', data: obj });
  189.                    
  190.                     for (var i = 0; i < clients.length; i++) {
  191.                         clients[i].sendUTF(json);
  192.                     }
  193.                 }
  194.             }
  195.         }
  196.     });
  197.    
  198.     // user disconnected
  199.     connection.on('close', function(connection) {
  200.         if (userName !== false) {
  201.             console.log((new Date()) + " Peer " + connection.remoteAddress + " disconnected.");
  202.             clients.splice(index, 1);
  203.            
  204.             var userIndex = userNames.indexOf(userName);
  205.            
  206.             if (userIndex > -1) {
  207.                 userNames.splice(userIndex, 1);
  208.             }
  209.         }
  210.     });
  211. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement