forked from GitHub/dbot
something something reddit feeds
This commit is contained in:
parent
9c17803e03
commit
f04da64b21
@ -1,4 +1,5 @@
|
||||
{
|
||||
"outputPrefix": "\u000312reddit\u000f",
|
||||
"dependencies": [ "link" ]
|
||||
"dependencies": [ "link" ],
|
||||
"dbType": "redis"
|
||||
}
|
||||
|
@ -9,6 +9,71 @@ var reddit = function(dbot) {
|
||||
this.ApiRoot = 'http://reddit.com/';
|
||||
this.UserAgent = 'dbot by u/realitone';
|
||||
|
||||
this.internalAPI = {
|
||||
'getChannelFeeds': function(server, cName, callback) {
|
||||
dbot.api.users.resolveChannel(server, cName, function(channel) {
|
||||
if(channel) {
|
||||
this.db.read('reddit_feeds', channel.id, function(err, cFeeds) {
|
||||
if(err || !cFeeds) {
|
||||
callback(null, {
|
||||
'id': channel.id,
|
||||
'server': server,
|
||||
'channel': cName,
|
||||
'feeds': {}
|
||||
});
|
||||
} else {
|
||||
callback(null, cFeeds);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
callback('NoSuchChannel', null);
|
||||
}
|
||||
}.bind(this));
|
||||
}.bind(this),
|
||||
|
||||
'updateChannelFeeds': function(cFeeds, callback) {
|
||||
this.db.update('reddit_feeds', cFeeds.id, cFeeds, callback);
|
||||
}.bind(this),
|
||||
|
||||
'reloadChannelFeeds': function() {
|
||||
var channels = [],
|
||||
checkTimes = [];
|
||||
|
||||
this.db.scan('reddit_feeds', function(channel) {
|
||||
if(channel) {
|
||||
console.log(channel);
|
||||
channels.push(channel);
|
||||
}
|
||||
}, function() {
|
||||
_.each(channels, function(channel) {
|
||||
checkTimes[channel.id] = {};
|
||||
_.each(channel.feeds, function(feed) {
|
||||
checkTimes[channel.id][feed.subreddit] = Date.now();
|
||||
dbot.api.timers.addTimer(30000, function() {
|
||||
this.api.getNewPosts(feed.subreddit, checkTimes[channel.id][feed.subreddit], function(err, posts) {
|
||||
if(!err && posts.length > 0) {
|
||||
_.each(posts, function(post) {
|
||||
dbot.say(channel.server, channel.channel, dbot.t('about_post', {
|
||||
'title': post.title.trim(),
|
||||
'poster': post.author,
|
||||
'subreddit': post.subreddit,
|
||||
'comments': post.num_comments,
|
||||
'score': post.score,
|
||||
'up': post.ups,
|
||||
'down': post.downs,
|
||||
'url': this.ApiRoot + post.id
|
||||
}));
|
||||
}, this);
|
||||
checkTimes[channel.id][feed.subreddit] = Date.now();
|
||||
}
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}.bind(this)
|
||||
};
|
||||
|
||||
this.api = {
|
||||
'getSubredditInfo': function(name, callback) {
|
||||
request.get({
|
||||
@ -53,10 +118,90 @@ var reddit = function(dbot) {
|
||||
callback(body[1].data.children[0].data);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'getNewPosts': function(sr, last, callback) {
|
||||
request.get({
|
||||
'url': this.ApiRoot + 'r/' + sr + '/new.json',
|
||||
'json': true,
|
||||
'headers': {
|
||||
'User-Agent': this.UserAgent
|
||||
}
|
||||
}, function(err, response, body) {
|
||||
if(!err && body && body.kind === 'Listing') {
|
||||
var posts = _.pluck(body.data.children, 'data');
|
||||
newPosts = _.filter(posts, function(post) {
|
||||
console.log(post.created_utc + ' vs ' + (last /
|
||||
1000));
|
||||
return post.created_utc > (last / 1000);
|
||||
});
|
||||
callback(null, newPosts);
|
||||
} else {
|
||||
callback(true, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
this.commands = {
|
||||
'~addredditfeed': function(event) {
|
||||
var channel = event.input[1],
|
||||
subreddit = event.input[2].replace('r/', ''),
|
||||
interval = event.input[3] * 60000;
|
||||
|
||||
this.internalAPI.getChannelFeeds(event.server, channel, function(err, channel) {
|
||||
if(!err) {
|
||||
if(!_.has(channel.feeds, subreddit)) {
|
||||
channel.feeds[subreddit] = {
|
||||
'subreddit': subreddit,
|
||||
'interval': interval
|
||||
};
|
||||
this.internalAPI.updateChannelFeeds(channel, function() {
|
||||
this.internalAPI.reloadChannelFeeds();
|
||||
}.bind(this));
|
||||
event.reply(dbot.t('added_channel_feed', {
|
||||
'subreddit': subreddit,
|
||||
'interval': interval / 60000,
|
||||
'channel': channel.channel
|
||||
}));
|
||||
} else {
|
||||
event.reply(dbot.t('feed_already_watched'));
|
||||
}
|
||||
} else {
|
||||
if(err === 'NoSuchChannel') {
|
||||
event.reply(dbot.t('no_such_channel'));
|
||||
}
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
'~rmredditfeed': function(event) {
|
||||
var channel = event.input[1],
|
||||
subreddit = event.input[2].replace('r/', '');
|
||||
|
||||
this.internalAPI.getChannelFeeds(event.server, channel, function(err, channel) {
|
||||
if(!err && channel && _.has(channel.feeds, subreddit)) {
|
||||
delete channel.feeds[subreddit];
|
||||
this.internalAPI.updateChannelFeeds(channel, function() {
|
||||
this.internalAPI.reloadChannelFeeds();
|
||||
}.bind(this));
|
||||
|
||||
event.reply(dbot.t('removed_channel_feed', {
|
||||
'subreddit': subreddit,
|
||||
'channel': channel.channel
|
||||
}));
|
||||
} else {
|
||||
event.reply(dbot.t('no_such_feed'));
|
||||
}
|
||||
}.bind(this));
|
||||
}
|
||||
};
|
||||
this.commands['~addredditfeed'].regex = [/^~addredditfeed ([^ ]+) ([^ ]+) ([^ ]+)$/, 4];
|
||||
this.commands['~rmredditfeed'].regex = [/^~rmredditfeed ([^ ]+) ([^ ]+)$/, 3];
|
||||
|
||||
this.onLoad = function() {
|
||||
this.internalAPI.reloadChannelFeeds();
|
||||
|
||||
var rHandler = function(matches, name, callback) {
|
||||
if(matches[6]) { // It's a comment
|
||||
this.api.getCommentInfo(matches[4], matches[6], function(info) {
|
||||
|
@ -7,7 +7,7 @@
|
||||
"it": "[{display_name} ha {subscribers} abonnati ({active} activo/i)]"
|
||||
},
|
||||
"about_post": {
|
||||
"en": "[Post by {poster} in {subreddit} — Comments: {comments}, Score: {score} (\u00039▲{up}\u000f|\u000312{down}▼\u000f)] — {url}",
|
||||
"en": "[{title}] [Post by {poster} in {subreddit} — Comments: {comments}, Score: {score} (\u00039▲{up}\u000f|\u000312{down}▼\u000f)] — {url}",
|
||||
"cy": "[Postio gan {poster} yn {subreddit} - Sylwadau: {comments}, Sgôr: {score} (\u00039]▲{up}\u000f|\u000312{down}▼\u000f)] — {url}",
|
||||
"de": "[Beitrag von {poster} in {subreddit} — Kommentare: {comments}, Bewertung: {score} (\u00039▲{up}\u000f|\u000312{down}▼\u000f)] — {url}",
|
||||
"fr": "[Message de {poster} dans {subreddit} — Commentaires: {comments}, Score: {score} (\u00039▲{up}\u000f|\u000312{down}▼\u000f)] — {url}",
|
||||
@ -27,5 +27,17 @@
|
||||
"cy": "[Anniogel Ar Gwaith (AAG)]",
|
||||
"fr": "[Risqué Pour le Travail (NSFW)]",
|
||||
"it": "[Rischioso per il lavoro (NSFW)]"
|
||||
},
|
||||
"added_channel_feed": {
|
||||
"en": "Added r/{subreddit} feed to {channel} every {interval} minute(s)."
|
||||
},
|
||||
"removed_channel_feed": {
|
||||
"en": "Removed r/{subreddit} feed from {channel}."
|
||||
},
|
||||
"no_such_feed": {
|
||||
"en": "No such feed..."
|
||||
},
|
||||
"feed_already_watched": {
|
||||
"en": "This feed already exists..."
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user