main.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  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':'Lobby'});
  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':'Lobby', 'username':'Radio-bot', 'msg':'---- Lost connection ----'};
  27. addBotMessage(info);
  28. });
  29. // Reconnected to server
  30. socket.on('reconnect', function (data) {
  31. var info = {'room':'Lobby', 'username':'Radio-bot', 'msg':'---- Reconnected ----'};
  32. addBotMessage(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. addBotMessage(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. // Robot Add message to room
  152. var addBotMessage = function(msg) {
  153. getTemplate('js/templates/message-bot.handlebars', function(template) {
  154. var room_messages = '#'+msg.room+' #room_messages';
  155. $(room_messages).append(template(msg));
  156. });
  157. };
  158. // Add user to connected users list
  159. var addUser = function(user) {
  160. getTemplate('js/templates/user.handlebars', function(template) {
  161. var room_users = '#'+user.room+' #room_users';
  162. // Add only if it doesn't exist in the room
  163. var user_badge = '#'+user.room+' #'+user.id;
  164. if (!($(user_badge).length)) {
  165. $(room_users).append(template(user));
  166. }
  167. });
  168. }
  169. // Remove user from connected users list
  170. var removeUser = function(user) {
  171. var user_badge = '#'+user.room+' #'+user.id;
  172. $(user_badge).remove();
  173. };
  174. // Check if room exists
  175. var roomExists = function(room) {
  176. var room_selector = '#'+room;
  177. if ($(room_selector).length) {
  178. return true;
  179. } elseĀ {
  180. return false;
  181. }
  182. };
  183. // Get current room
  184. var getCurrentRoom = function() {
  185. return $('li[id$="_tab"][class="active"]').text();
  186. };
  187. // Get message text from input field
  188. var getMessageText = function() {
  189. var text = $('#message_text').val();
  190. $('#message_text').val("");
  191. return text;
  192. };
  193. // Get room name from input field
  194. var getRoomName = function() {
  195. var name = $('#room_name').val().trim();
  196. $('#room_name').val("");
  197. return name;
  198. };
  199. // Get nickname from input field
  200. var getNickname = function() {
  201. var nickname = $('#nickname').val();
  202. $('#nickname').val("");
  203. return nickname;
  204. };
  205. // Update nickname in badges
  206. var updateNickname = function(data) {
  207. var badges = '#'+data.room+' #'+data.id;
  208. $(badges).text(data.newUsername);
  209. };
  210. // ***************************************************************************
  211. // Events
  212. // ***************************************************************************
  213. // Send new message
  214. $('#b_send_message').click(function(eventObject) {
  215. eventObject.preventDefault();
  216. if ($('#message_text').val() != "") {
  217. socket.emit('newMessage', {'room':getCurrentRoom(), 'msg':getMessageText()});
  218. }
  219. });
  220. // Join new room
  221. $('#b_join_room').click(function(eventObject) {
  222. var roomName = getRoomName();
  223. if (roomName) {
  224. eventObject.preventDefault();
  225. socket.emit('subscribe', {'rooms':[roomName]});
  226. // Added error class if empty room name
  227. } else {
  228. $('#room_name').addClass('error');
  229. }
  230. });
  231. // Leave current room
  232. $('#b_leave_room').click(function(eventObject) {
  233. eventObject.preventDefault();
  234. var currentRoom = getCurrentRoom();
  235. if (currentRoom != 'Lobby') {
  236. socket.emit('unsubscribe', {'rooms':[getCurrentRoom()]});
  237. // Toogle to MainRoom
  238. $('[href="#Lobby"]').click();
  239. } else {
  240. console.log('Cannot leave Lobby, sorry');
  241. }
  242. });
  243. // Remove error style to hide modal
  244. $('#modal_joinroom').on('hidden.bs.modal', function (e) {
  245. if ($('#room_name').hasClass('error')) {
  246. $('#room_name').removeClass('error');
  247. }
  248. });
  249. // Set nickname
  250. $('#b_set_nickname').click(function(eventObject) {
  251. eventObject.preventDefault();
  252. socket.emit('setNickname', {'username':getNickname()});
  253. // Close modal if opened
  254. $('#modal_setnick').modal('hide');
  255. });
  256. })();