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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 reality
						reality