Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

147 lines (123 sloc) 4.377 kb
# Description:
# Grabs movie scores from Rotten Tomatoes
#
# Dependencies:
# None
#
# Configuration:
# HUBOT_ROTTEN_TOMATOES_API_KEY
#
# Commands:
# hubot rotten [me] <movie>
# hubot what's in theaters?
# hubot what's coming out in theaters?
# hubot what's coming out on (dvd|bluray)? - there is not a distinction between dvd and bluray
#
# Author:
# mportiz08
class Rotten
constructor: (@robot) ->
@api_url = "http://api.rottentomatoes.com/api/public/v1.0"
@api_key = process.env.HUBOT_ROTTEN_TOMATOES_API_KEY
_links: (match, callback) =>
return callback @__links[match] if @__links
@send "#{@api_url}/lists.json", {},
(err, res, body) =>
@__links = JSON.parse(body)['links']
callback @__links[match]
_movie_links: (match, callback) =>
return callback @__movie_links[match] if @__movie_links
@_links 'movies',
(link) =>
@send link, {},
(err, res, body) =>
@__movie_links = JSON.parse(body)['links']
callback @__movie_links[match]
_dvd_links: (match, callback) =>
return callback @__dvd_links[match] if @__dvd_links
@_links 'dvds',
(link) =>
@send link, {},
(err, res, body) =>
@__dvd_links = JSON.parse(body)['links']
callback @__dvd_links[match]
in_theaters: (callback) =>
@_movie_links 'in_theaters',
(match) =>
@send match,
page_limit: 20
country: 'us'
(err, res, body) ->
movies = JSON.parse(body)['movies']
unless err? or movies?
return callback("Couldn't find anything, sorry.")
callback null, (new RottenMovie(movie) for movie in movies)
upcoming: (type, callback) =>
link_list = switch type
when 'movies'
@_movie_links
when 'dvds'
@_dvd_links
else
@_movie_links
link_list 'upcoming',
(match) =>
@send match,
page_limit: 20
country: 'us'
(err, res, body) ->
movies = JSON.parse(body)['movies']
unless err? or movies?
return callback("Couldn't find anything, sorry.")
callback null, (new RottenMovie(movie) for movie in movies)
search: (query, callback) =>
@send "#{@api_url}/movies.json",
q: query
page_limit: 1
(err, res, body) ->
movie = JSON.parse(body)['movies'][0]
unless err? or movie?
return callback("Couldn't find anything, sorry.")
callback null, new RottenMovie(movie)
return
send: (url, options, callback) =>
options.apikey = @api_key
@robot.http(url).query(options).get()(callback)
class RottenMovie
constructor: (@info) ->
toDetailedString: ->
"#{@info['title']} (#{@info['year']})\n" +
"#{@info['runtime']} min, #{@info['mpaa_rating']}\n\n" +
"Critics:\t" + "#{@info['ratings']['critics_score']}%" +
"\t\"#{@info['ratings']['critics_rating']}\"\n" +
"Audience:\t" + "#{@info['ratings']['audience_score']}%" +
"\t\"#{@info['ratings']['audience_rating']}\"\n\n" +
"#{@info['critics_consensus']}"
toReleaseString: ->
"#{@info['title']}, #{@info['release_dates']['dvd'] || @info['release_dates']['theater']} (#{@info['ratings']['audience_score']}%)"
toString: ->
"#{@info['title']} (#{@info['ratings']['audience_score']}%)"
module.exports = (robot) ->
rotten = new Rotten robot
robot.respond /rotten (me )?(.*)$/i, (message) ->
message.send "Well, let's see..."
rotten.search message.match[2], (err, movie) ->
unless err?
message.send movie.toDetailedString()
else
message.send err
robot.respond /what(\')?s in theaters(\?)?$/i, (message) ->
message.send "Well, let's see..."
rotten.in_theaters (err, movies) ->
unless err?
message.send (movie.toString() for movie in movies).join("\n")
else
message.send err
robot.respond /what(\')?s coming out ((on (dvd|blu(-)?ray))|(in theaters))(\?)?$/i, (message) ->
message.send "Well, let's see..."
type = if message.match[2] is 'in theaters' then 'movies' else 'dvds'
rotten.upcoming type, (err, movies) ->
unless err?
message.send (movie.toReleaseString() for movie in movies).join("\n")
else
message.send err
Jump to Line
Something went wrong with that request. Please try again.