dbot/modules/reddit/reddit.js
2013-11-20 10:25:05 +00:00

135 lines
5.1 KiB
JavaScript

/**
* Module Name: reddit
* Description: Various reddit functionality
*/
var _ = require('underscore')._,
request = require('request');
var reddit = function(dbot) {
this.ApiRoot = 'http://reddit.com/';
this.UserAgent = 'dbot by u/realitone';
this.api = {
'getSubredditInfo': function(name, callback) {
request.get({
'url': this.ApiRoot + 'r/' + name + '/about.json',
'json': true,
'headers': {
'User-Agent': this.UserAgent
}
}, function(err, response, body) {
var data = null;
if(_.has(body, 'data')) data = body.data;
callback(data);
});
},
'getPostInfo': function(name, callback) {
request.get({
'url': this.ApiRoot + 'comments/' + name + '.json',
'json': true,
'headers': {
'User-Agent': this.UserAgent
}
}, function(err, response, body) {
if(body[0] && _.has(body[0], 'data')) {
callback(body[0].data.children[0].data);
}
});
},
'getCommentInfo': function(post, name, callback) {
request.get({
'url': this.ApiRoot + 'comments/' + post + '.json',
'qs': {
'comment': name
},
'json': true,
'headers': {
'User-Agent': this.UserAgent
}
}, function(err, response, body) {
if(body[1] && _.has(body[1], 'data')) {
callback(body[1].data.children[0].data);
}
});
}
};
this.onLoad = function() {
var rHandler = function(matches, name, callback) {
if(matches[6]) { // It's a comment
this.api.getCommentInfo(matches[4], matches[6], function(info) {
if(info) {
var infoString = dbot.t('about_comment', {
'poster': info.author,
'subreddit': info.subreddit,
'comments': info.num_comments,
'score': info.ups - info.downs,
'up': info.ups,
'down': info.downs
});
if(info.over_18) infoString += " " + dbot.t("nsfw");
callback(infoString);
}
});
} else if(matches[4]) { // It's a post
this.api.getPostInfo(matches[4], function(info) {
if(info) {
var infoString = dbot.t('about_post', {
'poster': info.author,
'subreddit': info.subreddit,
'comments': info.num_comments,
'score': info.score,
'up': info.ups,
'down': info.downs,
'url': this.ApiRoot + matches[4]
});
if(info.over_18) infoString += " " + dbot.t("nsfw");
callback(infoString);
}
}.bind(this));
} else if(matches[2]) { // It's a subreddit
this.api.getSubredditInfo(matches[2], function(info) {
if(info) {
var infoString = dbot.t('about_subreddit', {
'display_name': info.display_name,
'subscribers': info.subscribers,
'active': info.accounts_active
});
if(info.over18) infoString += dbot.t("nsfw");
callback(infoString);
}
});
}
}.bind(this);
dbot.api.link.addHandler(this.name, // I'm so sorry, Jesus.
/https?:\/\/(www\.)?reddit\.com\/r\/([a-zA-Z0-9]+)(\/comments\/([a-zA-Z0-9]+)?\/([a-zA-Z0-9_]+)\/([a-zA-Z0-9_]+)?)?/,
rHandler);
dbot.api.link.addHandler(this.name + 'short',
/https?:\/\/(www\.)?redd.it\/([a-zA-Z0-9]+)/,
function(match, name, callback) {
this.api.getPostInfo(match[2], function(info) {
if(info) {
var infoString = dbot.t('about_post', {
'poster': info.author,
'subreddit': info.subreddit,
'comments': info.num_comments,
'score': info.score,
'up': info.ups,
'down': info.downs,
'url': this.ApiRoot + match[2]
});
if(info.over_18) infoString += " " + dbot.t("nsfw");
callback(infoString);
}
}.bind(this));
}.bind(this));
}.bind(this);
};
exports.fetch = function(dbot) {
return new reddit(dbot);
}