main.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // Author: Sergio Castaño Arteaga
  2. // Email: sergio.castano.arteaga@gmail.com
  3. (function(){
  4. var debug = false;
  5. // ***************************************************************************
  6. // Socket.io events
  7. // ***************************************************************************
  8. var socket = io.connect(window.location.host);
  9. // Connection established
  10. socket.on('connected', function (data) {
  11. console.log(data);
  12. // Get users connected to mainroom
  13. socket.emit('getUsersInRoom', {'room':'MainRoom'});
  14. if (debug) {
  15. // Subscription to rooms
  16. socket.emit('subscribe', {'username':'sergio', 'rooms':['sampleroom']});
  17. // Send sample message to room
  18. socket.emit('newMessage', {'room':'sampleroom', 'msg':'Hellooooooo!'});
  19. // Auto-disconnect after 10 minutes
  20. setInterval(function() {
  21. socket.emit('unsubscribe', {'rooms':['sampleroom']});
  22. socket.disconnect();
  23. }, 600000);
  24. }
  25. });
  26. // Disconnected from server
  27. socket.on('disconnect', function (data) {
  28. var info = {'room':'MainRoom', 'username':'ServerBot', 'msg':'----- Lost connection to server -----'};
  29. addMessage(info);
  30. });
  31. // Reconnected to server
  32. socket.on('reconnect', function (data) {
  33. var info = {'room':'MainRoom', 'username':'ServerBot', 'msg':'----- Reconnected to server -----'};
  34. addMessage(info);
  35. });
  36. // Subscription to room confirmed
  37. socket.on('subscriptionConfirmed', function(data) {
  38. // Create room space in interface
  39. if (!roomExists(data.room)) {
  40. addRoomTab(data.room);
  41. addRoom(data.room);
  42. }
  43. // Close modal if opened
  44. $('#modal_joinroom').modal('hide');
  45. });
  46. // Unsubscription to room confirmed
  47. socket.on('unsubscriptionConfirmed', function(data) {
  48. // Remove room space in interface
  49. if (roomExists(data.room)) {
  50. removeRoomTab(data.room);
  51. removeRoom(data.room);
  52. }
  53. });
  54. // User joins room
  55. socket.on('userJoinsRoom', function(data) {
  56. console.log("userJoinsRoom: %s", JSON.stringify(data));
  57. // Log join in conversation
  58. addMessage(data);
  59. // Add user to connected users list
  60. addUser(data);
  61. });
  62. // User leaves room
  63. socket.on('userLeavesRoom', function(data) {
  64. console.log("userLeavesRoom: %s", JSON.stringify(data));
  65. // Log leave in conversation
  66. addMessage(data);
  67. // Remove user from connected users list
  68. removeUser(data);
  69. });
  70. // Message received
  71. socket.on('newMessage', function (data) {
  72. console.log("newMessage: %s", JSON.stringify(data));
  73. addMessage(data);
  74. // Scroll down room messages
  75. var room_messages = '#'+data.room+' #room_messages';
  76. $(room_messages).animate({
  77. scrollTop: $(room_messages).height()
  78. }, 300);
  79. });
  80. // Users in room received
  81. socket.on('usersInRoom', function(data) {
  82. console.log('usersInRoom: %s', JSON.stringify(data));
  83. _.each(data.users, function(user) {
  84. addUser(user);
  85. });
  86. });
  87. // User nickname updated
  88. socket.on('userNicknameUpdated', function(data) {
  89. console.log("userNicknameUpdated: %s", JSON.stringify(data));
  90. updateNickname(data);
  91. msg = '----- ' + data.oldUsername + ' is now ' + data.newUsername + ' -----';
  92. var info = {'room':data.room, 'username':'ServerBot', 'msg':msg};
  93. addMessage(info);
  94. });
  95. // ***************************************************************************
  96. // Templates and helpers
  97. // ***************************************************************************
  98. var templates = {};
  99. var getTemplate = function(path, callback) {
  100. var source;
  101. var template;
  102. // Check first if we've the template cached
  103. if (_.has(templates, path)) {
  104. if (callback) callback(templates[path]);
  105. // If not we get and compile it
  106. } else {
  107. $.ajax({
  108. url: path,
  109. success: function(data) {
  110. source = data;
  111. template = Handlebars.compile(source);
  112. // Store compiled template in cache
  113. templates[path] = template;
  114. if (callback) callback(template);
  115. }
  116. });
  117. }
  118. }
  119. // Add room tab
  120. var addRoomTab = function(room) {
  121. getTemplate('js/templates/room_tab.handlebars', function(template) {
  122. $('#rooms_tabs').append(template({'room':room}));
  123. });
  124. };
  125. // Remove room tab
  126. var removeRoomTab = function(room) {
  127. var tab_id = "#"+room+"_tab";
  128. $(tab_id).remove();
  129. };
  130. // Add room
  131. var addRoom = function(room) {
  132. getTemplate('js/templates/room.handlebars', function(template) {
  133. $('#rooms').append(template({'room':room}));
  134. // Toogle to created room
  135. var newroomtab = '[href="#'+room+'"]';
  136. $(newroomtab).click();
  137. // Get users connected to room
  138. socket.emit('getUsersInRoom', {'room':room});
  139. });
  140. };
  141. // Remove room
  142. var removeRoom = function(room) {
  143. var room_id = "#"+room;
  144. $(room_id).remove();
  145. };
  146. // Add message to room
  147. var addMessage = function(msg) {
  148. getTemplate('js/templates/message.handlebars', function(template) {
  149. var room_messages = '#'+msg.room+' #room_messages';
  150. $(room_messages).append(template(msg));
  151. });
  152. };
  153. // Add user to connected users list
  154. var addUser = function(user) {
  155. getTemplate('js/templates/user.handlebars', function(template) {
  156. var room_users = '#'+user.room+' #room_users';
  157. // Add only if it doesn't exist in the room
  158. var user_badge = '#'+user.room+' #'+user.id;
  159. if (!($(user_badge).length)) {
  160. $(room_users).append(template(user));
  161. }
  162. });
  163. }
  164. // Remove user from connected users list
  165. var removeUser = function(user) {
  166. var user_badge = '#'+user.room+' #'+user.id;
  167. $(user_badge).remove();
  168. };
  169. // Check if room exists
  170. var roomExists = function(room) {
  171. var room_selector = '#'+room;
  172. if ($(room_selector).length) {
  173. return true;
  174. } else {
  175. return false;
  176. }
  177. };
  178. // Get current room
  179. var getCurrentRoom = function() {
  180. return $('li[id$="_tab"][class="active"]').text();
  181. };
  182. // Get message text from input field
  183. var getMessageText = function() {
  184. var text = $('#message_text').val();
  185. $('#message_text').val("");
  186. return text;
  187. };
  188. // Get room name from input field
  189. var getRoomName = function() {
  190. var name = $('#room_name').val().trim();
  191. $('#room_name').val("");
  192. return name;
  193. };
  194. // Get nickname from input field
  195. var getNickname = function() {
  196. var nickname = $('#nickname').val();
  197. $('#nickname').val("");
  198. return nickname;
  199. };
  200. // Update nickname in badges
  201. var updateNickname = function(data) {
  202. var badges = '#'+data.room+' #'+data.id;
  203. $(badges).text(data.newUsername);
  204. };
  205. // ***************************************************************************
  206. // Events
  207. // ***************************************************************************
  208. // Send new message
  209. $('#b_send_message').click(function(eventObject) {
  210. eventObject.preventDefault();
  211. if ($('#message_text').val() != "") {
  212. socket.emit('newMessage', {'room':getCurrentRoom(), 'msg':getMessageText()});
  213. }
  214. });
  215. // Join new room
  216. $('#b_join_room').click(function(eventObject) {
  217. var roomName = getRoomName();
  218. if (roomName) {
  219. eventObject.preventDefault();
  220. socket.emit('subscribe', {'rooms':[roomName]});
  221. // Added error class if empty room name
  222. } else {
  223. $('#room_name').addClass('error');
  224. }
  225. });
  226. // Leave current room
  227. $('#b_leave_room').click(function(eventObject) {
  228. eventObject.preventDefault();
  229. var currentRoom = getCurrentRoom();
  230. if (currentRoom != 'MainRoom') {
  231. socket.emit('unsubscribe', {'rooms':[getCurrentRoom()]});
  232. // Toogle to MainRoom
  233. $('[href="#MainRoom"]').click();
  234. } else {
  235. console.log('Cannot leave MainRoom, sorry');
  236. }
  237. });
  238. // Remove error style to hide modal
  239. $('#modal_joinroom').on('hidden.bs.modal', function (e) {
  240. if ($('#room_name').hasClass('error')) {
  241. $('#room_name').removeClass('error');
  242. }
  243. });
  244. // Set nickname
  245. $('#b_set_nickname').click(function(eventObject) {
  246. eventObject.preventDefault();
  247. socket.emit('setNickname', {'username':getNickname()});
  248. // Close modal if opened
  249. $('#modal_setnick').modal('hide');
  250. });
  251. })();