From cc1f6683080070fe4965c31a9251435eddc495d0 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli <barisusakli@gmail.com> Date: Wed, 28 Aug 2013 22:08:46 -0400 Subject: [PATCH] changed chat online offline messages --- public/src/forum/account.js | 12 ++-- public/src/forum/footer.js | 23 +++----- public/src/forum/topic.js | 10 +++- public/src/modules/chat.js | 115 ++++++++++++++++++++++-------------- public/templates/footer.tpl | 2 +- src/websockets.js | 39 +----------- 6 files changed, 98 insertions(+), 103 deletions(-) diff --git a/public/src/forum/account.js b/public/src/forum/account.js index aba3eb33a1..5818cae7b1 100644 --- a/public/src/forum/account.js +++ b/public/src/forum/account.js @@ -54,17 +54,19 @@ var onlineStatus = $('.account-online-status'); - socket.on('api:user.isOnline', function(online) { - if(online) { + function handleUserOnline(data) { + if(data.online) { onlineStatus.find('span span').text('online'); onlineStatus.find('i').attr('class', 'icon-circle'); } else { onlineStatus.find('span span').text('offline'); onlineStatus.find('i').attr('class', 'icon-circle-blank'); } - }); - - socket.emit('api:user.isOnline', theirid); + } + + socket.on('api:user.isOnline', handleUserOnline); + + socket.emit('api:user.isOnline', theirid, handleUserOnline); }); diff --git a/public/src/forum/footer.js b/public/src/forum/footer.js index c892b300eb..4a1b52fdd5 100644 --- a/public/src/forum/footer.js +++ b/public/src/forum/footer.js @@ -162,25 +162,18 @@ socket.on('chatMessage', function(data) { require(['chat'], function(chat) { - var chatModal = chat.createModalIfDoesntExist(data.username, data.fromuid, function(created, modal) { - if(!created) - chat.appendChatMessage(modal, data.message, data.timestamp); - }); + var modal = null; + if(chat.modalExists(data.fromuid)) { + modal = chat.getModal(data.fromuid); + chat.appendChatMessage(modal, data.message, data.timestamp); + } else { + modal = chat.createModal(data.username, data.fromuid); + } - chatModal.show(); - chat.bringModalToTop(chatModal); + chat.load(modal.attr('UUID')); }); }); - socket.on('chatGoOffline', function(data) { - require(['chat'], function(chat) { - if(chat.modalOpen(data.uid)) { - var modal = chat.getModal(data.uid); - chat.appendChatMessage(modal, data.username + ' went offline\n', data.timestamp); - } - }); - }) - require(['mobileMenu'], function(mobileMenu) { mobileMenu.init(); }); diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index 500cab3e84..8f07b2cac3 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -288,9 +288,13 @@ return; require(['chat'], function(chat) { - var chatModal = chat.createModalIfDoesntExist(username, touid); - chatModal.modal(); - chat.bringModalToTop(chatModal); // I don't think this is necessary + var chatModal; + if(!chat.modalExists(touid)) { + chatModal = chat.createModal(username, touid); + } else { + chatModal = chat.getModal(touid); + } + chat.load(chatModal.attr('UUID')); }); }); diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 704bf16b5a..3c67a6e170 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -17,46 +17,74 @@ define(['taskbar'], function(taskbar) { return $('#chat-modal-' + touid); } - module.modalOpen = function(touid) { + module.modalExists = function(touid) { return $('#chat-modal-' + touid).length !== 0; } - module.createModalIfDoesntExist = function(username, touid, callback) { - var chatModal = $('#chat-modal-' + touid); - - if(!chatModal.length) { - var chatModal = $('#chat-modal').clone(); - chatModal.attr('id','chat-modal-' + touid); - var uuid = utils.generateUUID(); - chatModal.attr('UUID', uuid); - chatModal.appendTo($('body')); - chatModal.draggable({ - start:function(){ - module.bringModalToTop(chatModal); + + function checkStatus(chatModal, callback) { + socket.emit('api:user.isOnline', chatModal.touid, function(data) { + if(data.online !== chatModal.online) { + if(data.online) { + module.appendChatMessage(chatModal, chatModal.username + ' has come online.\n', data.timestamp); + } else { + module.appendChatMessage(chatModal, chatModal.username + ' has gone offline.\n', data.timestamp); } - }); - chatModal.find('#chat-with-name').html(username); - - chatModal.find('.close').on('click', function(e) { - chatModal.hide(); - taskbar.discard('chat', uuid); - }); - - chatModal.on('click', function(e) { + chatModal.online = data.online; + } + if(callback) + callback(data.online); + }); + } + + function checkOnlineStatus(chatModal) { + if(chatModal.intervalId === 0) { + chatModal.intervalId = setInterval(function(){ + checkStatus(chatModal); + }, 1000); + } + } + + module.createModal = function(username, touid, callback) { + + var chatModal = $('#chat-modal').clone(), + uuid = utils.generateUUID(); + + chatModal.intervalId = 0; + chatModal.touid = touid; + chatModal.username = username; + + chatModal.attr('id', 'chat-modal-' + touid); + chatModal.attr('UUID', uuid); + chatModal.appendTo($('body')); + chatModal.draggable({ + start:function() { module.bringModalToTop(chatModal); - }); - - addSendHandler(chatModal, touid); - - getChatMessages(chatModal, touid, callback); + } + }); + + chatModal.find('#chat-with-name').html(username); + + chatModal.find('.close').on('click', function(e) { + clearInterval(chatModal.intervalId); + chatModal.intervalId = 0; + chatModal.hide(); + taskbar.discard('chat', uuid); + }); - taskbar.push('chat', chatModal.attr('UUID'), {title:'chat with '+username}); - return chatModal; - } + chatModal.on('click', function(e) { + module.bringModalToTop(chatModal); + }); + + addSendHandler(chatModal); - if(callback) - callback(false, chatModal); + checkStatus(chatModal, function(online) { + chatModal.online = online; + getChatMessages(chatModal, function() { + checkOnlineStatus(chatModal); + }); + }); - taskbar.push('chat', chatModal.attr('UUID'), {title:'chat with '+username}); + taskbar.push('chat', chatModal.attr('UUID'), {title:'chat with ' + username}); return chatModal; } @@ -64,45 +92,46 @@ define(['taskbar'], function(taskbar) { var chatModal = $('div[UUID="'+uuid+'"]'); chatModal.show(); module.bringModalToTop(chatModal); + checkOnlineStatus(chatModal); } module.minimize = function(uuid) { var chatModal = $('div[UUID="'+uuid+'"]'); chatModal.hide(); taskbar.minimize('chat', uuid); + clearInterval(chatModal.intervalId); + chatModal.intervalId = 0; } - function getChatMessages(chatModal, touid, callback) { - socket.emit('getChatMessages', {touid:touid}, function(messages) { + function getChatMessages(chatModal, callback) { + socket.emit('getChatMessages', {touid:chatModal.touid}, function(messages) { for(var i = 0; i<messages.length; ++i) { module.appendChatMessage(chatModal, messages[i].content, messages[i].timestamp); } - - if(callback) - callback(true, chatModal); + callback(); }); } - function addSendHandler(chatModal, touid) { + function addSendHandler(chatModal) { chatModal.find('#chat-message-input').off('keypress'); chatModal.find('#chat-message-input').on('keypress', function(e) { if(e.which === 13) { - sendMessage(chatModal, touid); + sendMessage(chatModal); } }); chatModal.find('#chat-message-send-btn').off('click'); chatModal.find('#chat-message-send-btn').on('click', function(e){ - sendMessage(chatModal, touid); + sendMessage(chatModal); return false; }); } - function sendMessage(chatModal, touid) { + function sendMessage(chatModal) { var msg = app.strip_tags(chatModal.find('#chat-message-input').val()); if(msg.length) { msg = msg +'\n'; - socket.emit('sendChatMessage', { touid:touid, message:msg}); + socket.emit('sendChatMessage', { touid:chatModal.touid, message:msg}); chatModal.find('#chat-message-input').val(''); } } diff --git a/public/templates/footer.tpl b/public/templates/footer.tpl index 11b04261b9..85e9938b84 100644 --- a/public/templates/footer.tpl +++ b/public/templates/footer.tpl @@ -18,7 +18,7 @@ </div><!-- /.modal-dialog --> </div><!-- /.modal --> - <div id="chat-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="Chat" aria-hidden="true"> + <div id="chat-modal" class="modal" tabindex="-1" role="dialog" aria-labelledby="Chat" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> diff --git a/src/websockets.js b/src/websockets.js index f75eeda2a0..39f47ffa4d 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -32,8 +32,7 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), (function(io) { var users = {}, userSockets = {}, - rooms = {}, - chats = {}; + rooms = {}; global.io = io; @@ -57,13 +56,6 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), user.getUserField(uid, 'username', function(err, username) { socket.emit('event:connect', {status: 1, username:username, uid:uid}); - - if(chats[uid]) { - for(var i=0; i<chats[uid].length; ++i) { - io.sockets.in(chats[uid][i]).emit('chatMessage', {fromuid:uid, username:username, message: username+' came online\n', timestamp: Date.now()}); - socket.join(chats[uid][i]); - } - } }); } }); @@ -82,18 +74,6 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), delete users[sessionID]; if(uid) { io.sockets.in('global').emit('api:user.isOnline', isUserOnline(uid)); - - user.getUserField(uid, 'username', function(err, username) { - - if(chats[uid] && chats[uid].length) { - - for(var i=0; i<chats[uid].length; ++i) { - - io.sockets.in(chats[uid][i]).emit('chatGoOffline', {uid:uid, username:username, timestamp:Date.now()}); - socket.leave(chats[uid][i]); - } - } - }); } } @@ -269,8 +249,8 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), socket.emit('api:user.get_online_users', returnData); }); - socket.on('api:user.isOnline', function(uid) { - socket.emit('api:user.isOnline', isUserOnline(uid)); + socket.on('api:user.isOnline', function(uid, callback) { + callback({online:isUserOnline(uid), timestamp:Date.now()}); }); socket.on('api:user.changePassword', function(data, callback) { @@ -548,9 +528,6 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), var msg = utils.strip_tags(data.message); - var uids = [uid, touid].sort(); - var chatroom = 'chatroom_'+uids[0]+'_'+uids[1]; - user.getUserField(uid, 'username', function(err, username) { var finalMessage = username + ': ' + msg, notifText = 'New message from <strong>' + username + '</strong>'; @@ -570,13 +547,8 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), numSockets = userSockets[touid].length; for(var x=0; x<numSockets; ++x) { - userSockets[touid][x].join(chatroom); userSockets[touid][x].emit('chatMessage', {fromuid:uid, username:username, message: finalMessage, timestamp: Date.now()}); } - - chats[touid] = chats[touid] || []; - if(chats[touid].indexOf(chatroom) === -1) - chats[touid].push(chatroom); } if(userSockets[uid]) { @@ -584,13 +556,8 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), numSockets = userSockets[uid].length; for(var x=0; x<numSockets; ++x) { - userSockets[uid][x].join(chatroom); userSockets[uid][x].emit('chatMessage', {fromuid:touid, username:username, message:'You : ' + msg, timestamp: Date.now()}); } - - chats[uid] = chats[uid] || []; - if(chats[uid].indexOf(chatroom) === -1) - chats[uid].push(chatroom); } }); });