forked from github/hubot-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request github#501 from guyoron/drupalorg
Added drupalorg.coffee, allows hubot to respond to drupal.org urls
- Loading branch information
Showing
1 changed file
with
108 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
# Description: | ||
# Display issue/page information from drupal.org | ||
# | ||
# Dependencies: | ||
# "jsdom" : ">0.2.1" | ||
# | ||
# Configuration: | ||
# NONE | ||
# | ||
# Commands: | ||
# Drupal.org url - Show details about a drupal.org page or issue | ||
# | ||
# Notes: | ||
# HUBOT_DRUPALORG_LINKDELAY: number of seconds to not respond to a link again after it's been | ||
# mentioned once. This helps to cut down on noise from the bot. | ||
# Defaults to 30. | ||
# | ||
# Author: | ||
# guyoron | ||
|
||
|
||
jsdom = require 'jsdom' | ||
jquery = 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js' | ||
|
||
# keeps track of recently displayed pages, to prevent spamming | ||
class RecentIssues | ||
constructor: (@maxage) -> | ||
@issues = [] | ||
|
||
cleanup: -> | ||
for issue,time of @issues | ||
age = Math.round(((new Date()).getTime() - time) / 1000) | ||
if age > @maxage | ||
delete @issues[issue] | ||
return | ||
|
||
contains: (issue) -> | ||
@cleanup() | ||
@issues[issue]? | ||
|
||
add: (issue,time) -> | ||
time = time || (new Date()).getTime() | ||
@issues[issue] = time | ||
|
||
module.exports = (robot) -> | ||
# how long (seconds) to wait between repeating the same link | ||
|
||
linkDelay = process.env.HUBOT_DRUPALORG_LINKDELAY || 30 | ||
|
||
recentLinks = new RecentIssues linkDelay | ||
|
||
# scrape (already retrieved) HTML | ||
# selectors: an array of jquery selectors | ||
# callback: function that takes scrape results | ||
scrape = (body, selectors, callback) -> | ||
jsdom.env body, [jquery], (errors, window) -> | ||
# use jquery to run selector and return the elements | ||
callback (window.$(selector).text().trim() for selector in selectors) | ||
|
||
# fetch a drupal.org page using http scraping | ||
fetchPage = (msg) -> | ||
url = msg.match[0] | ||
return if recentLinks.contains url | ||
recentLinks.add url | ||
msg.http(url).get() (err, res, body) -> | ||
if err | ||
console.log "Errors getting url: #{url}" | ||
return | ||
# check if this is an issue or non-issue page | ||
scrape body, ['#project-issue-summary-table tbody tr:first-child td:last-child', 'dl.about-section dd:nth-child(2)'], (result) -> | ||
if result[0] != '' | ||
outputIssue msg, url, body | ||
else if result[1] != '' | ||
outputPage msg, url, body | ||
else | ||
console.log "Errors scraping url: #{url}" | ||
|
||
# outputs info about a d.o issue, given a scrape response | ||
outputIssue = (msg, url, body) -> | ||
scrape body, | ||
[ | ||
'#page-subtitle', # title | ||
'#project-issue-summary-table tbody tr:first-child td:last-child', # project name | ||
'#project-issue-summary-table tbody tr:last-child td:last-child', # status | ||
'div.comment:last-child h3.comment-title a', # last comment number | ||
'div.project-issue-follow-count' # follower count | ||
], | ||
(results) -> | ||
commentNumber = results[3].substring(1) | ||
if commentNumber != '' | ||
comments = commentNumber + " comments" | ||
else | ||
comments = "0 comments" | ||
msg.send "#{url} => #{results[0]} [#{results[1]}, #{results[2]}, #{comments}, #{results[4]}]" | ||
|
||
# outputs info about a d.o non-issue page, given a scrape response | ||
outputPage = (msg, url, body) -> | ||
scrape body, | ||
[ | ||
'#page-subtitle', # title | ||
'dl.about-section dd:nth-child(2)' # drupal versions | ||
'dl.about-section dd:last-child' # audience | ||
], | ||
(results) -> | ||
msg.send "#{url} => #{results[0]} [#{results[1]}, #{results[2]}]" | ||
|
||
# listen for page links | ||
robot.hear /http:\/\/drupal.org\/node\/(\d+)/, fetchPage |