Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var mysql = require('mysql');
  2.  
  3. var serverDB = (function(connectionData, callback) {
  4.     var queries = {
  5.         markRead    : "UPDATE messages SET readable = TRUE WHERE message_id = ?",
  6.         getHistory  : "SELECT * FROM messages WHERE (date_time >= ?) AND ((from_login = ? AND to_login = ?) OR (from_login = ? AND to_login = ?) ) ORDER BY date_time",
  7.         getUG       : "SELECT * FROM users; SELECT * FROM groups",
  8.         login       : "SELECT 1 FROM users WHERE login = ? AND password = ?",
  9.         userExists  : "SELECT 1 FROM users WHERE login = ?",
  10.         insertMess  : "INSERT INTO messages SET ?",
  11.     };
  12.  
  13.     var connData = connectionData;
  14.     connData.multipleStatements = true;
  15.    
  16.     var mysqlConnection = mysql.createConnection (connectionData);
  17.     mysqlConnection.connect ( function (error) {
  18.         if (error)
  19.             throw error;
  20.         console.log ('Successfully connected to MySQL server.');
  21.        
  22.         if (callback)
  23.             callback(this);
  24.     });
  25.    
  26.    
  27.     function _messageSetRead(id, callback) {
  28.         var query = util.format (queries.markRead, id);
  29.         mysqlConnection.query (query, function (err) {
  30.             if (err)
  31.                 throw err;
  32.             if (callback)
  33.                 callback();
  34.         });
  35.     }
  36.    
  37.     function _getHistory (loginFrom, loginTo, dateAfter, callback) {
  38.         mysqlConnection.query (
  39.                 queries.getHistory,
  40.                 [dateAfter, loginFrom, loginTo, loginTo, loginFrom],
  41.                 function (err, rows) {
  42.                     if (err)
  43.                         throw err;
  44.                     if (callback)
  45.                         callback (rows);
  46.                 }
  47.         );
  48.     }
  49.    
  50.     function _getUG(callback) {
  51.         mysqlConnection.query (queries.getUG, function (err, result) {
  52.             if (err)
  53.                 throw err;
  54.             if (callback)
  55.                 callback (result[0], result[1]);
  56.         });
  57.     }
  58.    
  59.     function _checkUser(login, password, callback){
  60.         mysqlConnection.query (queries.login, [login, password], function (err, result) {
  61.             if (err)
  62.                 throw err;
  63.             if (callback)
  64.                 callback (result.length !== 0);
  65.         });
  66.     }
  67.    
  68.     function _insertMessage (from, to, message, time, callback){
  69.         var insertSet = {
  70.             'from_login' : from,
  71.             'to_login' : to,
  72.             'message' : message,
  73.             'date_time' : time
  74.         }; 
  75.        
  76.         mysqlConnection.query (queries.insertMess, insertSet, function (err, result) {
  77.             if (err)
  78.                 throw err;
  79.             if (callback)
  80.                 callback (result.id);
  81.         });
  82.     }
  83.    
  84.     function _userExists (login, callback){
  85.         mysqlConnection.query (queries.userExists, login, function (err, result) {
  86.             if(err)
  87.                 throw err;
  88.             if (callback)
  89.                 callback (result.length !== 0);
  90.         });
  91.     }
  92.    
  93.     return {
  94.         messageSetRead : _messageSetRead,
  95.         getHistory : _getHistory,
  96.         getUG : _getUG,
  97.         checkUser : _checkUser,
  98.         insertMessage : _insertMessage,
  99.         userExists : _userExists,
  100.     };
  101.    
  102.     // ADMIN FUNCTIONS 
  103. })({
  104.      host     : '178.62.178.14',
  105.      user     : 'root',
  106.      password : 'databasepassword',
  107.      database : 'corporative_messenger'
  108. });
  109.  
  110.  
  111. function ChatClient (clientSocket, server) {
  112.     this.server = server;
  113.     this.websocket = clientSocket;
  114.     this.authorized = false;
  115.     this.authorizedAdmin = false;
  116.     this.websocket.on ('message', this.onMessage);
  117.     this.websocket.on ('close', this.onClose);
  118.     this.websocket.on ('error', this.onError);
  119. }
  120.  
  121. ChatClient.prototype.onClose = function (){
  122.     server.disconnect (this);
  123. }
  124.  
  125. ChatClient.prototype.onError = function() {
  126.  
  127. }
  128.  
  129. ChatClient.prototype.onMessage = function(message) {
  130.     try {
  131.         var messageData = JSON.parse(message);
  132.  
  133.         if (this.authorizedAdmin){
  134.             switch (message.type) {
  135.                 case 'AdminAddUser': break;
  136.                 case 'AdminAddGroup': this.historyRequest (message.to, message.date_time); break;
  137.                 case 'AdminDeleteUser': this.messageRead (message.id); break;
  138.                 case 'AdminDeleteGroup': this.getUsersGroups (); break;
  139.             }
  140.         }
  141.         if (this.authorized){
  142.             switch (message.type) {
  143.                 case 'SendMessageRequest': this.sendMessage (message.to, message.message); break;
  144.                 case 'HistoryRequest': this.historyRequest (message.to, message.date_time); break;
  145.                 case 'MessageAlreadyReadable': this.messageRead (message.id); break;
  146.                 case 'GetUsersGroups': this.getUsersGroups (); break;
  147.  
  148.                 default: console.log ('Unknown event ' + message.type + 'from ' + this.login);
  149.             }
  150.         }else {
  151.             switch (messageData.type) {
  152.                     case 'AuthorizeRequest' : this.obtainSession (message.login, message.password); break;
  153.                     case 'ConfirmSession': this.confirmSession (this.login, message.session_id); break;
  154.                    
  155.                     default: console.log ('Unknown event ' + message.type + 'from ' + this.login);
  156.             }
  157.         }
  158.     } catch (e) {
  159.         console.log ('Bad message from ' + this.login);
  160.     }
  161. };
  162.  
  163.  
  164. ChatClient.prototype.adminAddUser = function (user, callback){
  165.     server.addUser (user, function(answer) {
  166.         this.sendData (answer, callback);
  167.     });
  168. }
  169.  
  170. ChatClient.prototype.adminDeleteUser = function (user, callback){
  171.     server.deleteUser (user, function(answer) {
  172.         this.sendData (answer, callback);
  173.     });
  174. }
  175.  
  176. ChatClient.prototype.adminAddGroup = function (group, callback) {
  177.     server.addGroup (group, function(answer) {
  178.         this.sendData (answer, callback);
  179.     });
  180. }
  181.  
  182. ChatClient.prototype.adminDeleteGroup = function (group, callback) {
  183.     server.deleteGroup (group, function(answer) {
  184.         this.sendData (answer, callback);
  185.     });
  186. }
  187.  
  188. ChatClient.prototype.successAuth = function (callback){
  189.     server.successAuth (this, callback);
  190. }
  191.  
  192. ChatClient.prototype.getUsersGroups = function (callback){
  193.     serverDB.getUG (function(users, groups){
  194.         this.sendData ({
  195.             type : 'UsersGroups',
  196.             allUsers: users,
  197.             groupName: groups
  198.         }, callback);
  199.     });
  200. }
  201. ChatClient.prototype.sendData = function (data, callback){
  202.     if (this.websocket)
  203.         this.websocket.send (JSON.stringify (data), function (error) {
  204.             if (error)
  205.                 throw error;
  206.             if (callback)
  207.                 callback();
  208.         });
  209. }
  210.  
  211. ChatClient.prototype.authorize = function (login, password, callback){    
  212.     serverDB.checkUser (login, password, function (authorized){
  213.         if (authorized){
  214.             this.login = login;
  215.             this.authorized = true;
  216.             if (login == 'admin')
  217.                 this.authorizedAdmin = authorized;
  218.  
  219.             this.sendData ({
  220.                 type: 'AuthorizeRequestAnswer',
  221.                 answer: 'SuccessAuthorization'
  222.             }, function () {
  223.                 this.successAuth (callback);
  224.             })
  225.         } else {
  226.             this.sendData ({
  227.                 type: 'AuthorizeRequestAnswer',
  228.                 answer: 'WrongLoginOrPassword'
  229.             }, callback);
  230.         }
  231.     });
  232. }
  233.  
  234.  
  235. ChatClient.prototype.sessionExpired = function (callback) {
  236.     this.sendData ({
  237.         type: 'AdminYouHasBeenDeleted'
  238.     }, function () {
  239.         this.websocket.close();
  240.         if (callback)
  241.             callback();
  242.     });
  243.  
  244. }
  245.  
  246. ChatClient.prototype.sendMessage = function (to, message, callback) {
  247.     var currentTime = new Date();
  248.     serverDB.insertMessage (this.login, to, message, currentTime, function (id) {
  249.         var messageData = {
  250.             type: 'RenderMessageRequest',
  251.             id:         id,
  252.             from:       this.login,
  253.             to:         to,
  254.             message:    message,
  255.             date_time:  currentTime,
  256.             readable:   false
  257.         };
  258.  
  259.         server.sendTo(this.login, messageData, function (){
  260.             server.sendTo (msg.to, messageData, callback);
  261.         });
  262.     });
  263. }
  264.  
  265. ChatClient.prototype.historyRequest = function (loginTo, dateAfter, callback) {
  266.     serverDB.getHistory (this.login, loginTo, dateAfter, function (history){
  267.         this.sendData ({
  268.             type: 'HistoryRequestAnswer',
  269.             answer: history
  270.         }, callback);
  271.     });
  272. }
  273.  
  274. ChatClient.prototype.messageRead = function (id, callback) {
  275.     serverDB.messageSetRead (id, callback);
  276. }
  277.  
  278. ChatClient.prototype.userOnlineStatus = function (user, ustate, callback){
  279.     this.sendData ({
  280.         type: 'OnlineOfflineStateRequest',
  281.         login: user,
  282.         state: ustate
  283.     }, callback);
  284. }
  285.  
  286. ChatClient.prototype.addUser = function (userd, callback){
  287.     this.sendData ({
  288.         type: 'AdminAddUserAnswer',
  289.         user: userd,
  290.         answer: 'UserHasBeenAdded'
  291.     }, callback);
  292. }
  293.  
  294. ChatClient.prototype.deleteUser = function (logind, callback){
  295.     if (logind == this.login)
  296.         this.sessionExpired (callback);
  297.     else {
  298.         this.sendData ({
  299.             type: 'AdminUserHasBeenDeleted',
  300.             login: logind
  301.         }, callback);
  302.     }
  303. }
  304.  
  305. ChatClient.prototype.addGroup = function (group_name, callback) {  
  306. }
  307.  
  308. ChatClient.prototype.deleteGroup = function (group_id, callback) {  
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement