Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var mysql = require('mysql');
  2. var domain = require('domain');
  3.  
  4. var serverDB = (function(connectionData, callback) {
  5.     var queries = {
  6.         markRead    : "UPDATE messages SET readable = TRUE WHERE message_id = ?",
  7.         getHistory  : "SELECT * FROM messages WHERE (date_time >= ?) AND ((from_login = ? AND to_login = ?) OR (from_login = ? AND to_login = ?) ) ORDER BY date_time",
  8.         getUG       : "SELECT * FROM users; SELECT * FROM groups",
  9.         getUserInfo : "SELECT * FROM users WHERE login = ?",
  10.         login       : "SELECT 1 FROM users WHERE login = ? AND password = ?",
  11.         userExists  : "SELECT 1 FROM users WHERE login = ?",
  12.         insertMess  : "INSERT INTO messages SET ?",
  13.         addUser     : "INSERT INTO users SET ?",
  14.         deleteUser  : "DELETE FROM users WHERE login = ?"
  15.     };
  16.  
  17.     var connData = connectionData;
  18.     connData.multipleStatements = true;
  19.    
  20.     var mysqlConnection = mysql.createConnection (connectionData);
  21.     mysqlConnection.connect ( function (error) {
  22.         if (error)
  23.             throw error;
  24.         console.log ('Successfully connected to MySQL server.');
  25.        
  26.         if (callback)
  27.             callback(this);
  28.     });
  29.    
  30.    
  31.     function _messageSetRead(id, callback) {
  32.         mysqlConnection.query (queries.markRead, id, function (err) {
  33.             if (err)
  34.                 throw err;
  35.             if (callback)
  36.                 callback();
  37.         });
  38.     }
  39.    
  40.     function _getHistory (loginFrom, loginTo, dateAfter, callback) {
  41.         mysqlConnection.query (
  42.                 queries.getHistory,
  43.                 [dateAfter, loginFrom, loginTo, loginTo, loginFrom],
  44.                 function (err, rows) {
  45.                     if (err)
  46.                         throw err;
  47.                     if (callback)
  48.                         callback (rows);
  49.                 }
  50.         );
  51.     }
  52.    
  53.     function _getUG(callback) {
  54.         mysqlConnection.query (queries.getUG, function (err, result) {
  55.             if (err)
  56.                 throw err;
  57.             if (callback)
  58.                 callback (result[0], result[1]);
  59.         });
  60.     }
  61.    
  62.     function _getUserInfo (login, callback){
  63.         mysqlConnection.query (queries.getUserInfo, login, function (err, result) {
  64.             if (err)
  65.                 throw err;
  66.             if (callback)
  67.                 callback (result[0]);
  68.         });
  69.     }
  70.  
  71.     function _checkUser(login, password, callback){
  72.         mysqlConnection.query (queries.login, [login, password], function (err, result) {
  73.             if (err)
  74.                 throw err;
  75.             if (callback)
  76.                 callback (result.length > 0);
  77.         });
  78.     }
  79.    
  80.     function _insertMessage (from, to, message, time, callback){
  81.         var insertSet = {
  82.             'from_login' : from,
  83.             'to_login' : to,
  84.             'message' : message,
  85.             'date_time' : time
  86.         };  
  87.        
  88.         mysqlConnection.query (queries.insertMess, insertSet, function (err, result) {
  89.             if (err)
  90.                 throw err;
  91.             if (callback)
  92.                 callback (result.id);
  93.         });
  94.     }
  95.    
  96.     function _userExists (login, callback){
  97.         mysqlConnection.query (queries.userExists, login, function (err, result) {
  98.             if(err)
  99.                 throw err;
  100.             if (callback)
  101.                 callback (result.length !== 0);
  102.         });
  103.     }
  104.  
  105.     function _addUser (user, callback){
  106.         mysqlConnection.query (queries.addUser, user, function (err, result) {
  107.             if(err)
  108.                 throw err;
  109.             if (callback)
  110.                 callback();
  111.         });
  112.     }
  113.  
  114.     function _deleteUser (login, callback){
  115.         mysqlConnection.query (queries.deleteUser, login, function (err, result) {
  116.             if(err)
  117.                 throw err;
  118.             if (callback)
  119.                 callback();
  120.         });
  121.     }
  122.    
  123.     return {
  124.         messageSetRead : _messageSetRead,
  125.         getHistory : _getHistory,
  126.         getUG : _getUG,
  127.         getUserInfo : _getUserInfo,
  128.         checkUser : _checkUser,
  129.         insertMessage : _insertMessage,
  130.         userExists : _userExists,
  131.         addUser : _addUser,
  132.         deleteUser : _deleteUser,
  133.     };
  134.  
  135. })({
  136.      host     : '178.62.178.14',
  137.      user     : 'root',
  138.      password : 'databasepassword',
  139.      database : 'corporative_messenger'
  140. });
  141.  
  142. function ChatClient (clientSocket) {
  143.     var self = this;
  144.     this.websocket = clientSocket;
  145.     this.authorized = false;
  146.     this.authorizedAdmin = false;
  147.  
  148.     this.websocket.on ('message', function (message) {
  149.         self.onMessage (message);
  150.     });
  151.  
  152.     this.websocket.on ('close', function (){
  153.         self.onClose();
  154.     });
  155.  
  156.     this.websocket.on ('error', function(){
  157.         self.onError();
  158.     });
  159. }
  160.  
  161. ChatClient.prototype.onClose = function (){
  162.     server.disconnect (this);
  163. }
  164.  
  165. ChatClient.prototype.onError = function() {
  166.  
  167. }
  168.  
  169. ChatClient.prototype.onMessage = function(message) {
  170.     var self = this;
  171.     console.log (message);
  172.  
  173.     domain.create().on ('error', function(err){
  174.         console.log ('Failure is handling ' + message);
  175.         console.log ('Error: '  + err);
  176.     }).run (function() {
  177.         var messageData = JSON.parse(message);
  178.         if (self.authorizedAdmin){
  179.             switch (message.type) {
  180. /*                case 'AdminAddUser': break;
  181.                 case 'AdminAddGroup': self.historyRequest (messageData.to, messageData.date_time); break;
  182.                 case 'AdminDeleteUser': self.messageRead (messageData.id); break;
  183.                 case 'AdminDeleteGroup': self.getUsersGroups (); break;*/
  184.             }
  185.         }
  186.         if (self.authorized){
  187.             switch (messageData.type) {
  188.                 case 'SendMessageRequest': self.sendMessage (messageData.to, messageData.message); break;
  189.                 case 'HistoryRequest': self.historyRequest (messageData.to, messageData.date_time); break;
  190.                 case 'MessageAlreadyReadable': self.messageRead (messageData.id); break;
  191.                 case 'GetUsersGroups': self.getUsersGroups (); break;
  192.  
  193.                 default: console.log ('Unknown event ' + messageData.type + 'from ' + self.login);
  194.             }
  195.         }else {
  196.             switch (messageData.type) {
  197.                     case 'AuthorizeRequest' : self.authorize (messageData.login, messageData.password); break;
  198.                    
  199.                     default: console.log ('Unknown event ' + messageData.type + 'from ' + self.login);
  200.             }
  201.         }
  202.     });
  203. };
  204.  
  205.  
  206. ChatClient.prototype.adminAddUser = function (user, callback){
  207.     server.addUser (user, function(answer) {
  208.         this.sendData (answer, callback);
  209.     });
  210. }
  211.  
  212. ChatClient.prototype.adminDeleteUser = function (user, callback){
  213.     server.deleteUser (user, function(answer) {
  214.         this.sendData (answer, callback);
  215.     });
  216. }
  217.  
  218. ChatClient.prototype.adminAddGroup = function (group, callback) {
  219.     server.addGroup (group, function(answer) {
  220.         this.sendData (answer, callback);
  221.     });
  222. }
  223.  
  224. ChatClient.prototype.adminDeleteGroup = function (group, callback) {
  225.     server.deleteGroup (group, function(answer) {
  226.         this.sendData (answer, callback);
  227.     });
  228. }
  229.  
  230. ChatClient.prototype.successAuth = function (callback){
  231.     server.successAuth (this, callback);
  232. }
  233.  
  234. ChatClient.prototype.getUsersGroups = function (callback){
  235.     var self = this;
  236.     serverDB.getUG (function(users, groups){
  237.         self.sendData ({
  238.             type : 'UsersGroups',
  239.             allUsers: users,
  240.             allGroups: groups
  241.         }, callback);
  242.     });
  243. }
  244. ChatClient.prototype.sendData = function (data, callback){
  245.     if (this.websocket)
  246.         this.websocket.send (JSON.stringify (data), function (error) {
  247.             if (error)
  248.                 throw error;
  249.             if (callback)
  250.                 callback();
  251.         });
  252. }
  253.  
  254. ChatClient.prototype.authorize = function (login, password, callback){
  255.     var self = this;
  256.  
  257.     serverDB.getUserInfo (login, function (userData){
  258.         if (userData == undefined || userData.password != password)
  259.         {
  260.             self.sendData ({
  261.                 type: 'AuthorizeRequestAnswer',
  262.                 answer: 'WrongLoginOrPassword'
  263.             }, callback);
  264.         } else {
  265.             self.login = login;
  266.             self.authorized = true;
  267.             if (login == 'admin')
  268.                 self.authorizedAdmin = authorized;
  269.  
  270.             self.sendData ({
  271.                 type: 'AuthorizeRequestAnswer',
  272.                 answer: 'SuccessAuthorization',
  273.                 lpeers: server.getOnline(),
  274.                 user : userData
  275.             }, function () {
  276.                 self.successAuth (callback);
  277.             })
  278.         }
  279.     });
  280. }
  281.  
  282.  
  283. ChatClient.prototype.sessionExpired = function (callback) {
  284.     var self = this;
  285.  
  286.     this.sendData ({
  287.         type: 'AdminYouHasBeenDeleted'
  288.     }, function () {
  289.         self.websocket.close();
  290.         if (callback)
  291.             callback();
  292.     });
  293.  
  294. }
  295.  
  296. ChatClient.prototype.sendMessage = function (to, message, callback) {
  297.     var self = this;
  298.     var currentTime = new Date();
  299.     serverDB.insertMessage (self.login, to, message, currentTime, function (id) {
  300.         var messageData = {
  301.             type: 'RenderMessageRequest',
  302.             id:         id,
  303.             from:       self.login,
  304.             to:         to,
  305.             message:    message,
  306.             date_time:  currentTime,
  307.             readable:   false
  308.         };
  309.  
  310.         server.sendTo(self.login, messageData, function (){
  311.             server.sendTo (to, messageData, callback);
  312.         });
  313.     });
  314. }
  315.  
  316. ChatClient.prototype.historyRequest = function (loginTo, dateAfter, callback) {
  317.     var self = this;
  318.     serverDB.getHistory (self.login, loginTo, dateAfter, function (history){
  319.         self.sendData ({
  320.             type: 'HistoryRequestAnswer',
  321.             answer: history
  322.         }, callback);
  323.     });
  324. }
  325.  
  326. ChatClient.prototype.messageRead = function (id, callback) {
  327.     serverDB.messageSetRead (id, callback);
  328. }
  329.  
  330. ChatClient.prototype.userOnlineStatus = function (user, ustate, callback){
  331.     this.sendData ({
  332.         type: 'OnlineOfflineStateRequest',
  333.         login: user,
  334.         state: ustate
  335.     }, callback);
  336. }
  337.  
  338. ChatClient.prototype.addUser = function (userd, callback){
  339.     self.sendData ({
  340.         type: 'AdminAddUserAnswer',
  341.         user: userd,
  342.         answer: 'UserHasBeenAdded'
  343.     }, callback);
  344. }
  345.  
  346. ChatClient.prototype.deleteUser = function (logind, callback){
  347.     if (logind == this.login)
  348.         this.sessionExpired (callback);
  349.     else {
  350.         this.sendData ({
  351.             type: 'AdminUserHasBeenDeleted',
  352.             login: logind
  353.         }, callback);
  354.     }
  355. }
  356.  
  357. ChatClient.prototype.addGroup = function (group_name, callback) {  
  358. }
  359.  
  360. ChatClient.prototype.deleteGroup = function (group_id, callback) {  
  361. }
  362.  
  363. // ----------------------------------------------------------------------------
  364. var server = (function (){
  365.     var TWebSocketServer = require('ws').Server;
  366.     var TMySQL =  require('mysql');
  367.     var wsserver = new TWebSocketServer ({ port: 1338 });
  368.  
  369.     var connectedClients = [];
  370.     var authorizedClients = {};
  371.  
  372.     wsserver.on ('connection', function (ws){
  373.         connectedClients.push (new ChatClient (ws));
  374.     });
  375.  
  376.     wsserver.on ('error', function (error) {
  377.         if (error)
  378.             throw error;
  379.     });
  380.  
  381.     function getOnline (callback){
  382.        return Object.keys(authorizedClients);
  383.     }
  384.  
  385.     function successAuth (client, callback){
  386.         authorizedClients [client.login] = client;
  387.         for (var login in authorizedClients)
  388.             authorizedClients [login].userOnlineStatus (client.login, 1);
  389.     }
  390.  
  391.     function disconnect (client) {
  392.         console.log ('disconnect: ' + client);
  393.  
  394.         delete authorizedClients [client.login];
  395.         connectedClients.remove (client);
  396.  
  397.         for (var login in authorizedClients)
  398.             authorizedClients [login].userOnlineStatus (client.login, 0);
  399.     }
  400.  
  401.     function sendTo (login, messageData, callback) {
  402.         if (authorizedClients[login])
  403.             authorizedClients[login].sendData (messageData, callback);
  404.     }
  405.  
  406.     function addUser (user, callback){
  407.         serverDB.userExists (user.login, function (r){
  408.             if (r) {
  409.                 if (callback)
  410.                     callback ({
  411.                         type: 'AdminAddUserAnswer',
  412.                         answer: 'UserAlreadyExist',
  413.                         user: user
  414.                     });
  415.             }else {
  416.                 serverDB.addUser (user, function (){
  417.                     authorizedClients.forEach (function (client){
  418.                         client.addUser (user);
  419.                     });
  420.  
  421.                     if (callback)
  422.                         callback ({
  423.                             type: 'AdminAddUserAnswer',
  424.                             answer: 'UserHasBeenAdded',
  425.                             user: user
  426.                         });
  427.                 });
  428.             }
  429.         });
  430.     }
  431.  
  432.     function deleteUser (user, callback){
  433.         serverDB.userExists (user.login, function (r){
  434.             if (!r) {
  435.                 if (callback)
  436.                     callback ({
  437.                         type: 'AdminDeleteUserAnswer',
  438.                         answer: 'UserDoesNotExist',
  439.                         user: user
  440.                     });
  441.             }else {
  442.                 serverDB.deleteUser (user, function (){
  443.                     authorizedClients.forEach (function (client){
  444.                         client.deleteUser (user);
  445.                     });
  446.  
  447.                     if (callback)
  448.                         callback ({
  449.                             type: 'AdminDeleteUserAnswer',
  450.                             answer: 'UserHasBeenDeleted',
  451.                             user: user
  452.                         });
  453.                 });
  454.             }
  455.         });
  456.     }    
  457.  
  458.     function addGroup (group, callback){
  459.  
  460.     }
  461.  
  462.     function deleteGroup (group, callback){
  463.  
  464.     }
  465.  
  466.     Array.prototype.remove = function (value) {
  467.         var i = this.indexOf(value);
  468.         if (i === -1) return;
  469.         this.splice(i, 1);
  470.     };
  471.  
  472.     return {
  473.         successAuth : successAuth,
  474.         disconnect : disconnect,
  475.         sendTo : sendTo,
  476.         addUser : addUser,
  477.         deleteUser : deleteUser,
  478.         addGroup : addGroup,
  479.         deleteGroup : deleteGroup,
  480.         getOnline : getOnline
  481.     }
  482. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement