Guest User

Untitled

a guest
Jul 19th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.21 KB | None | 0 0
  1. var monterosa = monterosa || {};
  2. monterosa.ReacTV = monterosa.ReacTV || {};
  3.  
  4.  
  5. monterosa.ReacTV.Stream = function(init) {
  6. var self = this,
  7. online = false,
  8. user,
  9. pinned_message,
  10. pending_message,
  11. messages = {},
  12. transport = init.transport || { send: function() {} };
  13.  
  14.  
  15. /**
  16. * Send initialization call to enmasse and user data, if user’s
  17. * logged in.
  18. *
  19. * @private
  20. */
  21. function initialize() {
  22. transport.send('init');
  23. if (user) {
  24. transport.send('login', [user.method,
  25. user.name,
  26. user.userPic]);
  27. }
  28. online = true;
  29. jQuery(self).trigger('connected');
  30. }
  31.  
  32.  
  33. /**
  34. * Create new Message object, add it to storage and notify
  35. * the controller.
  36. *
  37. * @private
  38. */
  39. function parse_message(body) {
  40. var id = typeof body[0] == 'number' ? body[0] : Number(body[0]);
  41. if (!id) { return; }
  42.  
  43. messages[id] = new monterosa.ReacTV.Message(body);
  44. jQuery(self).trigger('newMessage', messages[id]);
  45. }
  46.  
  47.  
  48. /**
  49. * Toggle the approval status of the message and notify
  50. * the controller so that it could update the message view
  51. * accordingly.
  52. *
  53. * @private
  54. */
  55. function approve_message(id) {
  56. if (!messages[id]) { return; }
  57. messages[id].approve();
  58.  
  59. jQuery(self).trigger('approvedMessage', id);
  60. }
  61.  
  62.  
  63. /**
  64. * Set the particular message as “featured” and notify
  65. * the controller so that it could update views. If other
  66. * message was “featured” before it will become “unfeatured”
  67. * and corresponding notification will be sent to controller.
  68. *
  69. * @private
  70. */
  71. function pin_message(id) {
  72. if (!messages[id]) { return; }
  73. if (pinned_message) {
  74. pinned_message.pinned = false;
  75. jQuery(self).trigger('unpinnedMessage', pinned_message.id);
  76. }
  77.  
  78. messages[id].pinned = true;
  79. pinned_message = messages[id];
  80. jQuery(self).trigger('pinnedMessage', id);
  81. }
  82.  
  83.  
  84. /**
  85. * Removes message from storage and notify the controller. If
  86. * the removed message was featured, it will be “unfeatured”
  87. * along with corresponding notification.
  88. *
  89. * @private
  90. */
  91. function remove_message(id) {
  92. if (!messages[id]) { return; }
  93. if (pinned_message && pinned_message.id == id) {
  94. pinned_message = null;
  95. jQuery(self).trigger('unpinnedMessage', id);
  96. }
  97. delete messages[id];
  98. jQuery(self).trigger('removedMessage', id);
  99. }
  100.  
  101.  
  102. /**
  103. * Assign the server-generated ID to newly sent message and
  104. * send newMessage notification to controller so it’s view
  105. * can be created.
  106. *
  107. * @private
  108. */
  109. function confirm_message(id) {
  110. if (!pending_message) { return; }
  111. pending_message.id = id;
  112. messages[id] = pending_message;
  113. pending_message = null;
  114. jQuery(self).trigger('newMessage', messages[id]);
  115. }
  116.  
  117.  
  118.  
  119.  
  120. jQuery(transport).bind('ready', initialize);
  121. jQuery(transport).bind('disconnected', function() {
  122. online = false;
  123. jQuery(self).trigger('disconnected');
  124. });
  125.  
  126. jQuery(transport).bind('received', function(e, type, body) {
  127. switch(type) {
  128. case 'message':
  129. parse_message(body);
  130. break;
  131.  
  132. case 'topic':
  133. jQuery(self).trigger('topicChange', body[0]);
  134. break;
  135.  
  136. case 'approve':
  137. approve_message(body[0]);
  138. break;
  139.  
  140. case 'pin':
  141. pin_message(body[0]);
  142. break;
  143.  
  144. case 'delete':
  145. remove_message(body[0]);
  146. break;
  147.  
  148. case 'message_sent':
  149. confirm_message(body[0]);
  150. break;
  151. }
  152. });
  153.  
  154.  
  155.  
  156. /**
  157. * Retreive a message object from storage
  158. *
  159. * @argument {Number} id ID of a message
  160. * @returns {monterosa.ReacTV.Message} a message object
  161. */
  162. self.getMessage = function getMessage(id) {
  163. return messages[id];
  164. };
  165.  
  166.  
  167. /**
  168. * Sends user info to the server.
  169. *
  170. * @argument {String} name User name
  171. * @argument {String} source Login method, defaults to 'guest'
  172. * @argument {String} userpic User’s picture URL
  173. */
  174. self.login = function login(name, source, userpic) {
  175. var newUser = { name: name,
  176. source: source || 'guest',
  177. userpic: userpic || '' };
  178. if (user) {
  179. transport.send('changeName', [newUser.name, newUser.userpic, newUser.source]);
  180. } else {
  181. transport.send('login', [newUser.name, newUser.userpic, newUser.source]);
  182. }
  183. user = newUser;
  184. };
  185.  
  186.  
  187. /**
  188. * Begins sending a message to server and creates an object
  189. * to wait for server-assigned ID. Upon receiving an ID,
  190. * ReacTV.Stream will finalize message creation and fire a
  191. * 'newMessage' event to notify the controller that it needs
  192. * to add a message view.
  193. *
  194. * @argument {String} msg Message to send
  195. */
  196. self.sendMessage = function sendMessage(msg) {
  197. if (!user) { return; }
  198. var time = Math.floor( new Date() / 1000 );
  199. pending_message = [null, msg, time, user.source, user.name, user.userpic];
  200. transport.send('message', [msg]);
  201. };
  202.  
  203.  
  204.  
  205. initialize();
  206. };
Add Comment
Please, Sign In to add comment