diff --git a/package.json b/package.json index 8534186d39..537235672c 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,14 @@ "camp": "~16.2.3", "semver": "~5.3.0", "bower": "~1.7.9", - "chrome-web-store-item-property": "^1.1.2", - "json-autosave": "~1.1.1" + "chrome-web-store-item-property": "~1.1.2", + "json-autosave": "~1.1.1", + "xml2js": "~0.4.16" + }, + "devDependencies": { + "ass": "~0.0.6", + "should": "~3.0.0", + "mocha": "~1.14.0" }, "scripts": { "test": "node test/test.js" diff --git a/server.js b/server.js index 1adb2b857c..a448037942 100644 --- a/server.js +++ b/server.js @@ -21,6 +21,7 @@ var svg2img = require('./svg-to-img.js'); var loadLogos = require('./load-logos.js'); var githubAuth = require('./lib/github-auth.js'); var querystring = require('querystring'); +var xml2js = require('xml2js'); var serverSecrets; try { // Everything that cannot be checked in but is useful server-side @@ -5346,6 +5347,66 @@ cache(function(data, match, sendBadge, request) { }); })); +// Mozilla addons integration +camp.route(/^\/amo\/(v|d|rating|users)\/(.*)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var type = match[1]; + var addonId = match[2]; + var format = match[3]; + var badgeData = getBadgeData('mozilla addons', data); + var url = 'https://services.addons.mozilla.org/api/1.5/addon/' + addonId; + + request(url, function(err, res, buffer) { + if (err) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + + xml2js.parseString(buffer.toString(), function (err, data) { + if (err) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + return; + } + + try { + switch (type) { + case 'v': + var version = data.addon.version[0]; + var vdata = versionColor(version); + badgeData.text[1] = vdata.version; + badgeData.colorscheme = vdata.color; + break; + case 'd': + var downloads = parseInt(data.addon.total_downloads[0], 10); + badgeData.text[0] = 'downloads'; + badgeData.text[1] = metric(downloads); + badgeData.colorscheme = downloadCountColor(downloads); + break; + case 'rating': + var rating = parseInt(data.addon.rating, 10); + badgeData.text[0] = 'rating'; + badgeData.text[1] = rating + ' stars'; + badgeData.colorscheme = floorCountColor(rating, 2, 3, 4); + break; + case 'users': + var dailyUsers = parseInt(data.addon.daily_users[0], 10); + badgeData.text[0] = 'users'; + badgeData.text[1] = metric(dailyUsers); + badgeData.colorscheme = 'brightgreen'; + break; + } + + sendBadge(format, badgeData); + } catch (err) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); + }); +})); + // Test if a webpage is online camp.route(/^\/website(-(([^-]|--)*?)-(([^-]|--)*)(-(([^-]|--)+)-(([^-]|--)+))?)?\/(.+)\/(.+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { diff --git a/try.html b/try.html index c2f9f499e1..7aef7e22ff 100644 --- a/try.html +++ b/try.html @@ -388,8 +388,8 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/chrome-web-store/d/nimelepbpejjlbmoobocpfnjhihnpked.svghttps://img.shields.io/website-up-down-green-red/http/shields.io.svghttps://img.shields.io/website-up-down-green-red/http/shields.io.svghttps://img.shields.io/cocoapods/dw/AFNetworking.svghttps://img.shields.io/amo/d/dustman.svghttps://img.shields.io/homebrew/v/cake.svg |
+ ||
| Mozilla Addons: | +https://img.shields.io/amo/v/dustman.svg |
+
|---|
https://img.shields.io/aur/votes/yaourt.svghttps://img.shields.io/amo/users/dustman.svghttps://img.shields.io/amo/rating/dustman.svg