Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var monterosa = monterosa || {};
- monterosa.ReacTV = monterosa.ReacTV || {};
- monterosa.ReacTV.Stream = function(init) {
- var self = this,
- online = false,
- user,
- pinned_message,
- pending_message,
- messages = {},
- transport = init.transport || { send: function() {} };
- /**
- * Send initialization call to enmasse and user data, if user’s
- * logged in.
- *
- * @private
- */
- function initialize() {
- transport.send('init');
- if (user) {
- transport.send('login', [user.method,
- user.name,
- user.userPic]);
- }
- online = true;
- jQuery(self).trigger('connected');
- }
- /**
- * Create new Message object, add it to storage and notify
- * the controller.
- *
- * @private
- */
- function parse_message(body) {
- var id = typeof body[0] == 'number' ? body[0] : Number(body[0]);
- if (!id) { return; }
- messages[id] = new monterosa.ReacTV.Message(body);
- jQuery(self).trigger('newMessage', messages[id]);
- }
- /**
- * Toggle the approval status of the message and notify
- * the controller so that it could update the message view
- * accordingly.
- *
- * @private
- */
- function approve_message(id) {
- if (!messages[id]) { return; }
- messages[id].approve();
- jQuery(self).trigger('approvedMessage', id);
- }
- /**
- * Set the particular message as “featured” and notify
- * the controller so that it could update views. If other
- * message was “featured” before it will become “unfeatured”
- * and corresponding notification will be sent to controller.
- *
- * @private
- */
- function pin_message(id) {
- if (!messages[id]) { return; }
- if (pinned_message) {
- pinned_message.pinned = false;
- jQuery(self).trigger('unpinnedMessage', pinned_message.id);
- }
- messages[id].pinned = true;
- pinned_message = messages[id];
- jQuery(self).trigger('pinnedMessage', id);
- }
- /**
- * Removes message from storage and notify the controller. If
- * the removed message was featured, it will be “unfeatured”
- * along with corresponding notification.
- *
- * @private
- */
- function remove_message(id) {
- if (!messages[id]) { return; }
- if (pinned_message && pinned_message.id == id) {
- pinned_message = null;
- jQuery(self).trigger('unpinnedMessage', id);
- }
- delete messages[id];
- jQuery(self).trigger('removedMessage', id);
- }
- /**
- * Assign the server-generated ID to newly sent message and
- * send newMessage notification to controller so it’s view
- * can be created.
- *
- * @private
- */
- function confirm_message(id) {
- if (!pending_message) { return; }
- pending_message.id = id;
- messages[id] = pending_message;
- pending_message = null;
- jQuery(self).trigger('newMessage', messages[id]);
- }
- jQuery(transport).bind('ready', initialize);
- jQuery(transport).bind('disconnected', function() {
- online = false;
- jQuery(self).trigger('disconnected');
- });
- jQuery(transport).bind('received', function(e, type, body) {
- switch(type) {
- case 'message':
- parse_message(body);
- break;
- case 'topic':
- jQuery(self).trigger('topicChange', body[0]);
- break;
- case 'approve':
- approve_message(body[0]);
- break;
- case 'pin':
- pin_message(body[0]);
- break;
- case 'delete':
- remove_message(body[0]);
- break;
- case 'message_sent':
- confirm_message(body[0]);
- break;
- }
- });
- /**
- * Retreive a message object from storage
- *
- * @argument {Number} id ID of a message
- * @returns {monterosa.ReacTV.Message} a message object
- */
- self.getMessage = function getMessage(id) {
- return messages[id];
- };
- /**
- * Sends user info to the server.
- *
- * @argument {String} name User name
- * @argument {String} source Login method, defaults to 'guest'
- * @argument {String} userpic User’s picture URL
- */
- self.login = function login(name, source, userpic) {
- var newUser = { name: name,
- source: source || 'guest',
- userpic: userpic || '' };
- if (user) {
- transport.send('changeName', [newUser.name, newUser.userpic, newUser.source]);
- } else {
- transport.send('login', [newUser.name, newUser.userpic, newUser.source]);
- }
- user = newUser;
- };
- /**
- * Begins sending a message to server and creates an object
- * to wait for server-assigned ID. Upon receiving an ID,
- * ReacTV.Stream will finalize message creation and fire a
- * 'newMessage' event to notify the controller that it needs
- * to add a message view.
- *
- * @argument {String} msg Message to send
- */
- self.sendMessage = function sendMessage(msg) {
- if (!user) { return; }
- var time = Math.floor( new Date() / 1000 );
- pending_message = [null, msg, time, user.source, user.name, user.userpic];
- transport.send('message', [msg]);
- };
- initialize();
- };
Add Comment
Please, Sign In to add comment