postal.js/example/node/collectors/mention-count.js

73 lines
No EOL
2 KiB
JavaScript

var _ = require('underscore'),
_scanner = function(regExp, text, callback) {
var match;
while(text.search(regExp) !== -1) {
match = regExp.exec(text);
if(match && match[1]) {
callback(match[1].toLowerCase());
}
text = text.replace(regExp, "");
}
},
MentionCount = function(namespace) {
this.namespace = namespace;
this.events = {};
this.mentions = { list: [], registry: {} };
this.userImageMap = {};
this.lastStats = undefined;
};
MentionCount.prototype = {
init: function() {
this.mentions = { list: [], registry: {} };
this.lastStats = undefined;
},
on: function( eventName, callback ) {
if( !this.events[ eventName ] ) {
this.events[ eventName ] = [];
}
this.events[ eventName ].push( callback );
return function() {
this.events[ eventName ] = _.without( this.events[ eventName ], callback );
}.bind( this );
},
raiseEvent: function( eventName, data ) {
if( this.events[ eventName ] ) {
this.events[ eventName ].forEach( function( callback ){
callback( data );
});
}
},
processNewTweets: function(tweets) {
tweets.forEach(function(tweet){
this.userImageMap[ tweet.from_user ] = tweet.profile_image_url;
this.processMentions(tweet);
}, this);
this.tryToMatchProfileImages();
this.lastStats = { type: "MentionCount", mentions: this.mentions.list };
this.raiseEvent( this.namespace, this.lastStats );
},
tryToMatchProfileImages: function() {
_.each( this.mentions.registry, function( v, k ){
if( this.userImageMap[ k ] ) {
v.image = this.userImageMap[ k ];
}
}, this );
},
processMentions: function(tweet) {
_scanner(/@(\w*)/i, tweet.text, function(mentioned) {
if(!this.mentions.registry[mentioned]) {
var obj = { user: mentioned, count: 0, image: "images/default_profile_1_normal.png" };
this.mentions.registry[mentioned] = obj;
this.mentions.list.push(obj);
}
this.mentions.registry[mentioned].count++;
}.bind(this));
}
};
module.exports = MentionCount;