From 2cb82a4ab32974052e8e3a0eb3b72f8e728c2c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Soko=C5=82owski?= Date: Sun, 29 May 2016 21:35:06 +0200 Subject: [PATCH] Add Mozilla Addons support --- package.json | 10 +++++++-- server.js | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ try.html | 20 +++++++++++++++-- 3 files changed, 87 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8534186..5372356 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 1adb2b8..a448037 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 c2f9f49..7aef7e2 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.svg Website: - - https://img.shields.io/website-up-down-green-red/http/shields.io.svg + + https://img.shields.io/website-up-down-green-red/http/shields.io.svg CocoaPods: @@ -403,6 +403,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/cocoapods/dw/AFNetworking.svg + Mozilla Addons: + + https://img.shields.io/amo/d/dustman.svg +

Version

@@ -554,6 +558,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable + + + +
https://img.shields.io/homebrew/v/cake.svg
Mozilla Addons: https://img.shields.io/amo/v/dustman.svg

Social

@@ -865,6 +873,14 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/aur/votes/yaourt.svg + Mozilla Addons: + + https://img.shields.io/amo/users/dustman.svg + + Mozilla Addons: + + https://img.shields.io/amo/rating/dustman.svg +

Longer Miscellaneous