main.js 8.9 KB

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