GIF89a;
Direktori : /home/serb/public_html/livechat/js/app/model/ |
Current File : /home/serb/public_html/livechat/js/app/model/GuestChatModel.js |
//============================================================================== // // Chat model // //============================================================================== (function(app, $, config, _) { var GuestChatModel = app.GuestChatModel = Backbone.Model.extend({ defaults : { name : 'anonymous', mail : '' }, operatorsCache : {}, lastMessages : [], lastTypingUpdate : 0, initialize : function() { // Handle chatting features this.once('operators:online', this.manageConnection, this); this.on('messages:new', this.storeMessages, this); this.on('messages:new', this.confirmMessagesRead, this); }, autoLogin : function() { // Check if user is already logged in var _this = this; $.post(config.isLoggedInPath, { info : JSON.stringify(config.info) }, function(data) { if(data.success) { // Store the login data _this.set({ name : data.name, mail : data.mail, image : data.image }); // Notify success _this.trigger('login:success'); // Read previous messages if any $.get(config.lastMessagesPath, function(data) { if(data.success && data.messages.length > 0) { _this.trigger('messages:last', data.messages); } }); } else { // Notify about need to log in again _this.trigger('login:login'); } }); }, login : function(input) { var _this = this; input.info = JSON.stringify(config.info); $.post(config.loginPath, input, function(data) { if(data.success) { // Store the login data _this.set({ name : input.name, mail : input.mail, image : input.image }); // Notify success _this.trigger('login:success'); } else { // Notify about need to log in again _this.trigger('login:error'); } }); }, logout : function() { // Stop connection management if(this.connectionTimer) clearInterval(this.connectionTimer); // Inform the operator var _this = this; this.sendMessage(new app.MessageModel({ body : '[ user has closed the chat ]' }), function() { // Send a logout request $.post(config.logoutPath, function(data) { if(data && data.success) { // Notify about successful log-out _this.trigger('logout:success'); } else { // Notify about log-out error _this.trigger('logout:error'); } }); }); // Clear messages cache this.lastMessages = []; // Notify about logging out this.trigger('logout:init'); // Check operators again this.once('operators:online', this.manageConnection, this); }, checkOperators : function() { // Check if there's any operator on-line var _this = this; $.get(config.isOperatorOnlinePath, function(data) { if(data.success) { // Notify about online operator(s) _this.trigger('operators:online'); } else { // Notify about no operator(s) _this.trigger('operators:offline'); } }); }, keepAlive : function() { // Send keep-alive request $.get(config.keepAlivePath); }, updateTypingStatus : function() { // Get operator's ID var operatorId = this.lastOperator && this.lastOperator.id; if(operatorId) { // Send the request only once per given amount of time var time = (new Date()).getTime(); if(this.lastTypingUpdate + GuestChatModel.POLLING_INTERVAL < time) { this.lastTypingUpdate = time; // Send typing status update request $.post(config.updateTypingStatusPath, { secondUserId : operatorId, status : true }); } } }, getTypingStatus : function() { // Get operator's ID var operatorId = this.lastOperator && this.lastOperator.id; if(operatorId) { // Get typing status var _this = this; $.post(config.getTypingStatusPath, { ids : [ operatorId ] }, function(data) { if(data.success && data.results[operatorId]) { _this.trigger('operator:typing'); } }); } }, getMessages : function() { // Poll new messages data var _this = this; $.get(config.newMessagesPath, function(data) { // Check if there are any new messages if(data.length > 0) { // Collect operator(s) info _this.loadOperatorsData(data, function() { // Notify about new messages data.authorType = 'operator'; _this.trigger('messages:new', data); }); } }); }, confirmMessagesRead : function(data) { // Get first and last message IDs var data = { firstId : data[0].id, lastId : data[data.length - 1].id }; // Send the confirmation request $.post(config.markMessagesReadPath, data); }, storeMessages : function(messages) { // Prepare the messages _.each(messages, function(message) { if(!message.datetime && message.time) { message.datetime = message.time.getTime(); } }); // Save the messages this.lastMessages = this.lastMessages.concat(messages); // Store in the cookie /* var date = new Date(); var minutes = 10; date.setTime(date.getTime() + minutes * 60 * 1000); $.cookie('customer-chat-messages', JSON.stringify(this.lastMessages), { expires : date });*/ }, storeOperator : function(operator) { this.lastOperator = this.operatorsCache[operator.id] = operator; // Save the cookie /* var date = new Date(); var minutes = 15; date.setTime(date.getTime() + minutes * 60 * 1000); $.cookie('customer-chat-operators', JSON.stringify(this.operatorsCache), { expires : date });*/ }, loadOperatorsData : function(messages, callback) { var _this = this; var loadCount = 0; // Check if there's any message from a not known operator for(var i = 0; i < messages.length; i++) { var message = messages[i]; if(!this.operatorsCache[message.from_id]) { // Load operator's info loadCount++; $.post(config.getOperatorPath, { id : message.from_id }) .success(function(data) { if(data.success) { // Store the data _this.storeOperator(data.user); } }) .always(function() { loadCount--; if(loadCount <= 0) { // Finish the operation callback(); } }) ; } } if(loadCount <= 0) { // Finish the operation callback(); } }, getOperatorName : function(id) { return this.operatorsCache[id] && this.operatorsCache[id].name; }, sendMessage : function(message, callback) { // Prepare data var input = { body : message.get('body') }; // Send message to the server var _this = this; $.post(config.sendMessagePath, input, function(data) { if(data.success) { // Notify success _this.trigger('messages:sent'); } else { // Notify error _this.trigger('messages:sendError'); } if(callback) callback(data); }); // Store the message this.storeMessages([ message.attributes ]); }, manageConnection : function() { var _this = this; this.connectionTimer = setInterval(function() { // New messages polling _this.getMessages(); // Keeping connection alive _this.keepAlive(); // Checking typing status _this.getTypingStatus(); // Checking operator's availability _this.checkOperators(); }, GuestChatModel.POLLING_INTERVAL); } }, { POLLING_INTERVAL : 5000 }); })(window.Application, jQuery, window.chatConfig, _);