From aa36ad9fbb64496a482eda155e5115c6452cc108 Mon Sep 17 00:00:00 2001 From: Karl Jakober Date: Wed, 5 Feb 2014 16:37:48 +0000 Subject: [PATCH 1/5] Adds Steam auth and API --- README.md | 7 +++++++ app.js | 6 ++++++ config/passport.js | 48 +++++++++++++++++++++++++++++++++++++++++++- controllers/api.js | 24 ++++++++++++++++++++++ models/User.js | 4 +++- package.json | 4 +++- views/api/index.jade | 4 ++++ views/api/steam.jade | 23 +++++++++++++++++++++ 8 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 views/api/steam.jade diff --git a/README.md b/README.md index 205f57b13f..8849cd1a95 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,13 @@ Obtaining API Keys - Click **✔Register** - Copy and paste *OAuth consumer key* and *OAuth consumer secret* keys into `config/secrets.js` +
+ + +- Go to http://steamcommunity.com/dev/apikey +- Once signed in, enter your domainm agree to terms, and click **Register** +- Copy and paste *key* into `config.secrets.js` + Project Structure ----------------- diff --git a/app.js b/app.js index 229f85f9d7..a185a4ec12 100755 --- a/app.js +++ b/app.js @@ -118,6 +118,8 @@ app.get('/api/aviary', apiController.getAviary); app.get('/api/paypal', apiController.getPayPal); app.get('/api/paypal/success', apiController.getPayPalSuccess); app.get('/api/paypal/cancel', apiController.getPayPalCancel); +app.get('/api/steam', passportConf.isAuthorized, passportConf.isAuthorized, apiController.getSteam); + /** * OAuth routes for sign-in. @@ -144,6 +146,10 @@ app.get('/auth/tumblr', passport.authorize('tumblr')); app.get('/auth/tumblr/callback', passport.authorize('tumblr', { failureRedirect: '/api' }), function(req, res) { res.redirect('/api/tumblr'); }); +app.get('/auth/steam', passport.authenticate('steam')); +app.get('/auth/steam/callback', passport.authenticate('steam', { failureRedirect: '/login' }), function(req, res) { + res.redirect('/api/steam'); +}); app.listen(app.get('port'), function() { console.log("✔ Express server listening on port %d in %s mode", app.get('port'), app.settings.env); diff --git a/config/passport.js b/config/passport.js index 518e89a3fa..584eaa1aef 100755 --- a/config/passport.js +++ b/config/passport.js @@ -6,6 +6,7 @@ var FacebookStrategy = require('passport-facebook').Strategy; var TwitterStrategy = require('passport-twitter').Strategy; var GitHubStrategy = require('passport-github').Strategy; var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; +var SteamStrategy = require('passport-steam').Strategy; var User = require('../models/User'); var secrets = require('./secrets'); var _ = require('underscore'); @@ -37,7 +38,7 @@ passport.use(new LocalStrategy({ usernameField: 'email' }, function(email, passw * Sign in with Facebook. */ -passport.use(new FacebookStrategy(secrets.facebook, function (req, accessToken, refreshToken, profile, done) { +passport.use(new FacebookStrategy(secrets.facebook, function(req, accessToken, refreshToken, profile, done) { if (req.user) { User.findOne({ $or: [{ facebook: profile.id }, { email: profile.email }] }, function(err, existingUser) { if (existingUser) { @@ -201,6 +202,47 @@ passport.use(new GoogleStrategy(secrets.google, function(req, accessToken, refre } })); +/** + * Sign in with Steam. + */ + +passport.use(new SteamStrategy(secrets.steam, function(req, identifier, profile, done) { + identifier = identifier.match('http://steamcommunity.com/openid/id/([0-9]{17,25})'); + var steam_id = identifier[1]; + if (req.user) { + User.findOne({ steam: steam_id }, function(err, existingUser) { + if (existingUser) { + req.flash('errors', { msg: 'There is already a Steam account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); + done(err); + } else { + User.findById(req.user.id, function(err, user) { + user.steam = steam_id; + user.tokens.push({ kind: 'steam', accessToken: steam_id }); + user.save(function(err) { + req.flash('info', { msg: 'Steam account has been linked.' }); + done(err, user); + }); + }); + } + }); + + } else { + User.findOne({ steam: steam_id }, function(err, existingUser) { + if (existingUser) return done(null, existingUser); + var user = new User(); + user.steam = steam_id; + user.tokens.push({ kind: 'steam', steam_id: steam_id }); + user.save(function(err) { + done(err, user); + }); + }); + } +})); + +/** + * Sign in with Tumblr. + */ + passport.use('tumblr', new OAuthStrategy({ requestTokenURL: 'http://www.tumblr.com/oauth/request_token', accessTokenURL: 'http://www.tumblr.com/oauth/access_token', @@ -220,6 +262,10 @@ passport.use('tumblr', new OAuthStrategy({ } )); +/** + * Sign in with Foursquare. + */ + passport.use('foursquare', new OAuth2Strategy({ authorizationURL: 'https://foursquare.com/oauth2/authorize', tokenURL: 'https://foursquare.com/oauth2/access_token', diff --git a/controllers/api.js b/controllers/api.js index a9db5a6045..c33837b36e 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -12,6 +12,9 @@ var foursquare = require('node-foursquare')({ secrets: secrets.foursquare }); var Github = require('github-api'); var Twit = require('twit'); var paypal = require('paypal-rest-sdk'); +var steam = require('steam-web'); + + /** * GET /api @@ -331,4 +334,25 @@ exports.getPayPalCancel = function(req, res, next) { result: true, canceled: true }); +}; + +/** + * GET /api/steam + * Steam API example. + */ + +exports.getSteam = function(req, res) { + var S = new steam({ + apiKey: secrets.steam.apiKey + }); + + S.getPlayerSummaries({ + steamids: [ req.user.steam ], + callback: function(err, data) { + res.render('api/steam', { + title: 'Steam Web API', + players: data.response.players, + }); + } + }); }; \ No newline at end of file diff --git a/models/User.js b/models/User.js index 734b942f28..9ac347580e 100644 --- a/models/User.js +++ b/models/User.js @@ -2,13 +2,15 @@ var mongoose = require('mongoose'); var bcrypt = require('bcrypt-nodejs'); var userSchema = new mongoose.Schema({ - email: { type: String, unique: true }, + email: { type: String, unique: true, sparse: true }, password: String, facebook: { type: String, unique: true, sparse: true }, twitter: { type: String, unique: true, sparse: true }, google: { type: String, unique: true, sparse: true }, github: { type: String, unique: true, sparse: true }, + steam: { type: String, unique: true, sparse: true }, + tokens: Array, profile: { diff --git a/package.json b/package.json index 3d71ab59ed..a003f88b03 100755 --- a/package.json +++ b/package.json @@ -28,6 +28,8 @@ "twit": "~1.1.12", "underscore": "~1.5.2", "paypal-rest-sdk": "~0.6.4", - "connect-mongo": "~0.4.0" + "connect-mongo": "~0.4.0", + "passport-steam": "~0.1.3", + "steam-web": "~0.2.1" } } diff --git a/views/api/index.jade b/views/api/index.jade index 97e2775dea..9c340a36fb 100644 --- a/views/api/index.jade +++ b/views/api/index.jade @@ -35,3 +35,7 @@ block content a(href='/api/scraping') Web Scraping li a(href='/api/paypal') PayPal + li + a(href='/api/steam') + i.fa.fa-lock + | Steam diff --git a/views/api/steam.jade b/views/api/steam.jade new file mode 100644 index 0000000000..da0f9fc49b --- /dev/null +++ b/views/api/steam.jade @@ -0,0 +1,23 @@ +extends ../layout + +block content + .page-header + h2 + i.fa.fa-gamepad + | Steam Web API + + .btn-group.btn-group-justified + a.btn.btn-primary(href='https://developer.valvesoftware.com/wiki/Steam_Web_API', target='_blank') + i.fa.fa-check-square-o + | Overview + + h4 Steam Players + + ul.list-unstyled + for player in players + li + .panel.panel-default + .panel-body + .clearfix + img.pull-left(src='#{player.avatarfull}', style='margin-right: 10px') + =player.personaname \ No newline at end of file From 168744058878a16868ca95a0b3c6b7fbc28dcb3a Mon Sep 17 00:00:00 2001 From: Karl Jakober Date: Wed, 5 Feb 2014 21:04:02 +0000 Subject: [PATCH 2/5] removes steam auth, sets up steam api requests in async --- app.js | 6 +---- config/passport.js | 38 ----------------------------- controllers/api.js | 57 ++++++++++++++++++++++++++++++++++---------- models/User.js | 3 +-- package.json | 4 +--- views/api/steam.jade | 11 --------- 6 files changed, 47 insertions(+), 72 deletions(-) diff --git a/app.js b/app.js index a185a4ec12..5c1f1ae498 100755 --- a/app.js +++ b/app.js @@ -118,7 +118,7 @@ app.get('/api/aviary', apiController.getAviary); app.get('/api/paypal', apiController.getPayPal); app.get('/api/paypal/success', apiController.getPayPalSuccess); app.get('/api/paypal/cancel', apiController.getPayPalCancel); -app.get('/api/steam', passportConf.isAuthorized, passportConf.isAuthorized, apiController.getSteam); +app.get('/api/steam', apiController.getSteam); /** @@ -146,10 +146,6 @@ app.get('/auth/tumblr', passport.authorize('tumblr')); app.get('/auth/tumblr/callback', passport.authorize('tumblr', { failureRedirect: '/api' }), function(req, res) { res.redirect('/api/tumblr'); }); -app.get('/auth/steam', passport.authenticate('steam')); -app.get('/auth/steam/callback', passport.authenticate('steam', { failureRedirect: '/login' }), function(req, res) { - res.redirect('/api/steam'); -}); app.listen(app.get('port'), function() { console.log("✔ Express server listening on port %d in %s mode", app.get('port'), app.settings.env); diff --git a/config/passport.js b/config/passport.js index 584eaa1aef..63624cdc81 100755 --- a/config/passport.js +++ b/config/passport.js @@ -6,7 +6,6 @@ var FacebookStrategy = require('passport-facebook').Strategy; var TwitterStrategy = require('passport-twitter').Strategy; var GitHubStrategy = require('passport-github').Strategy; var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; -var SteamStrategy = require('passport-steam').Strategy; var User = require('../models/User'); var secrets = require('./secrets'); var _ = require('underscore'); @@ -202,43 +201,6 @@ passport.use(new GoogleStrategy(secrets.google, function(req, accessToken, refre } })); -/** - * Sign in with Steam. - */ - -passport.use(new SteamStrategy(secrets.steam, function(req, identifier, profile, done) { - identifier = identifier.match('http://steamcommunity.com/openid/id/([0-9]{17,25})'); - var steam_id = identifier[1]; - if (req.user) { - User.findOne({ steam: steam_id }, function(err, existingUser) { - if (existingUser) { - req.flash('errors', { msg: 'There is already a Steam account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); - done(err); - } else { - User.findById(req.user.id, function(err, user) { - user.steam = steam_id; - user.tokens.push({ kind: 'steam', accessToken: steam_id }); - user.save(function(err) { - req.flash('info', { msg: 'Steam account has been linked.' }); - done(err, user); - }); - }); - } - }); - - } else { - User.findOne({ steam: steam_id }, function(err, existingUser) { - if (existingUser) return done(null, existingUser); - var user = new User(); - user.steam = steam_id; - user.tokens.push({ kind: 'steam', steam_id: steam_id }); - user.save(function(err) { - done(err, user); - }); - }); - } -})); - /** * Sign in with Tumblr. */ diff --git a/controllers/api.js b/controllers/api.js index c33837b36e..b05ac857db 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -12,9 +12,6 @@ var foursquare = require('node-foursquare')({ secrets: secrets.foursquare }); var Github = require('github-api'); var Twit = require('twit'); var paypal = require('paypal-rest-sdk'); -var steam = require('steam-web'); - - /** * GET /api @@ -342,17 +339,51 @@ exports.getPayPalCancel = function(req, res, next) { */ exports.getSteam = function(req, res) { - var S = new steam({ - apiKey: secrets.steam.apiKey - }); + var defaultSteamId = '76561197992403307'; + var steamId = _.findWhere(req.user.tokens, { kind: 'steam' }).steamId || defaultSteamId; + var query = { l: 'english', steamid: steamId, key: secrets.steam.apiKey }; - S.getPlayerSummaries({ - steamids: [ req.user.steam ], - callback: function(err, data) { - res.render('api/steam', { - title: 'Steam Web API', - players: data.response.players, + async.parallel([ + function (callback) { + builtQuery = querystring.stringify(query); + request.get({url:'http://api.steampowered.com/IPlayerService/GetRecentlyPlayedGames/v0001/?' + builtQuery, json:true}, function(err, request, body) { + if (err) return next(err); + callback(null, body); }); - } + }, + function (callback) { + query.appid = '570'; // Dota 2 + builtQuery = querystring.stringify(query); + request.get({url:'http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?' + builtQuery, json:true}, function(err, request, body) { + if (err) return next(err); + delete query.appid; + callback(null, body); + }); + }, + function (callback) { + query.appid = '219640'; //Chivalry: Medieval Warfare + builtQuery = querystring.stringify(query); + request.get({url:'http://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v0001/?' + builtQuery, json:true}, function(err, request, body) { + if (err) return next(err); + delete query.appid; + callback(null, body); + }); + }, + function (callback) { + delete query.steamid; + query.steamids = steamId; //this request can be supplied a set of comma seperated steam ids + builtQuery = querystring.stringify(query); + request.get({url:'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?' + builtQuery, json:true}, function(err, request, body) { + if (err) return next(err); + callback(null, body); + }); + }, + ], + function (err, results) { + console.log(require('util').inspect(results, false, null)); + if (err) return next(err); + else res.render('api/steam', { + title: 'Steam Web API', + items: results }); }); }; \ No newline at end of file diff --git a/models/User.js b/models/User.js index 9ac347580e..47cd7666da 100644 --- a/models/User.js +++ b/models/User.js @@ -2,14 +2,13 @@ var mongoose = require('mongoose'); var bcrypt = require('bcrypt-nodejs'); var userSchema = new mongoose.Schema({ - email: { type: String, unique: true, sparse: true }, + email: { type: String, unique: true }, password: String, facebook: { type: String, unique: true, sparse: true }, twitter: { type: String, unique: true, sparse: true }, google: { type: String, unique: true, sparse: true }, github: { type: String, unique: true, sparse: true }, - steam: { type: String, unique: true, sparse: true }, tokens: Array, diff --git a/package.json b/package.json index a003f88b03..3d71ab59ed 100755 --- a/package.json +++ b/package.json @@ -28,8 +28,6 @@ "twit": "~1.1.12", "underscore": "~1.5.2", "paypal-rest-sdk": "~0.6.4", - "connect-mongo": "~0.4.0", - "passport-steam": "~0.1.3", - "steam-web": "~0.2.1" + "connect-mongo": "~0.4.0" } } diff --git a/views/api/steam.jade b/views/api/steam.jade index da0f9fc49b..1bfa5d3679 100644 --- a/views/api/steam.jade +++ b/views/api/steam.jade @@ -10,14 +10,3 @@ block content a.btn.btn-primary(href='https://developer.valvesoftware.com/wiki/Steam_Web_API', target='_blank') i.fa.fa-check-square-o | Overview - - h4 Steam Players - - ul.list-unstyled - for player in players - li - .panel.panel-default - .panel-body - .clearfix - img.pull-left(src='#{player.avatarfull}', style='margin-right: 10px') - =player.personaname \ No newline at end of file From 7fa3a401e61e058a0846076618476cf45eeaf000 Mon Sep 17 00:00:00 2001 From: Sahat Yalkabov Date: Wed, 5 Feb 2014 19:29:46 -0500 Subject: [PATCH 3/5] Steam API code refactoring, added ownedGames API call --- controllers/api.js | 255 ++++++++++++++++++++++----------------------- 1 file changed, 123 insertions(+), 132 deletions(-) diff --git a/controllers/api.js b/controllers/api.js index b05ac857db..63bb8101a8 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -32,31 +32,31 @@ exports.getApi = function(req, res) { exports.getFoursquare = function(req, res, next) { var token = _.findWhere(req.user.tokens, { kind: 'foursquare' }); async.parallel({ - trendingVenues: function(callback) { - foursquare.Venues.getTrending('40.7222756', '-74.0022724', { limit: 50 }, token.accessToken, function(err, results) { - callback(err, results); - }); + trendingVenues: function(callback) { + foursquare.Venues.getTrending('40.7222756', '-74.0022724', { limit: 50 }, token.accessToken, function(err, results) { + callback(err, results); + }); + }, + venueDetail: function(callback) { + foursquare.Venues.getVenue('49da74aef964a5208b5e1fe3', token.accessToken, function(err, results) { + callback(err, results); + }); + }, + userCheckins: function(callback) { + foursquare.Users.getCheckins('self', null, token.accessToken, function(err, results) { + callback(err, results); + }); + } }, - venueDetail: function(callback) { - foursquare.Venues.getVenue('49da74aef964a5208b5e1fe3', token.accessToken, function(err, results) { - callback(err, results); + function(err, results) { + if (err) return next(err); + res.render('api/foursquare', { + title: 'Foursquare API', + trendingVenues: results.trendingVenues, + venueDetail: results.venueDetail, + userCheckins: results.userCheckins }); - }, - userCheckins: function(callback) { - foursquare.Users.getCheckins('self', null, token.accessToken, function(err, results) { - callback(err, results); - }); - } - }, - function(err, results) { - if (err) return next(err); - res.render('api/foursquare', { - title: 'Foursquare API', - trendingVenues: results.trendingVenues, - venueDetail: results.venueDetail, - userCheckins: results.userCheckins }); - }); }; /** @@ -90,25 +90,25 @@ exports.getFacebook = function(req, res, next) { var token = _.findWhere(req.user.tokens, { kind: 'facebook' }); graph.setAccessToken(token.accessToken); async.parallel({ - getMe: function(done) { - graph.get(req.user.facebook, function(err, me) { - done(err, me); - }); + getMe: function(done) { + graph.get(req.user.facebook, function(err, me) { + done(err, me); + }); + }, + getMyFriends: function(done) { + graph.get(req.user.facebook + '/friends', function(err, friends) { + done(err, friends.data); + }); + } }, - getMyFriends: function(done) { - graph.get(req.user.facebook + '/friends', function(err, friends) { - done(err, friends.data); + function(err, results) { + if (err) return next(err); + res.render('api/facebook', { + title: 'Facebook API', + me: results.getMe, + friends: results.getMyFriends }); - } - }, - function(err, results) { - if (err) return next(err); - res.render('api/facebook', { - title: 'Facebook API', - me: results.getMe, - friends: results.getMyFriends }); - }); }; /** @@ -185,53 +185,53 @@ exports.getNewYorkTimes = function(req, res, next) { exports.getLastfm = function(req, res, next) { var lastfm = new LastFmNode(secrets.lastfm); async.parallel({ - artistInfo: function(done) { - lastfm.request("artist.getInfo", { - artist: 'Epica', - handlers: { - success: function(data) { - done(null, data); - }, - error: function(err) { - done(err); + artistInfo: function(done) { + lastfm.request("artist.getInfo", { + artist: 'Epica', + handlers: { + success: function(data) { + done(null, data); + }, + error: function(err) { + done(err); + } } - } - }); + }); + }, + artistTopAlbums: function(done) { + lastfm.request("artist.getTopAlbums", { + artist: 'Epica', + handlers: { + success: function(data) { + var albums = []; + _.each(data.topalbums.album, function(album) { + albums.push(album.image.slice(-1)[0]['#text']); + }); + done(null, albums.slice(0, 4)); + }, + error: function(err) { + done(err); + } + } + }); + } }, - artistTopAlbums: function(done) { - lastfm.request("artist.getTopAlbums", { - artist: 'Epica', - handlers: { - success: function(data) { - var albums = []; - _.each(data.topalbums.album, function(album) { - albums.push(album.image.slice(-1)[0]['#text']); - }); - done(null, albums.slice(0,4)); - }, - error: function(err) { - done(err); - } - } + function(err, results) { + if (err) return next(err.message); + var artist = { + name: results.artistInfo.artist.name, + image: results.artistInfo.artist.image.slice(-1)[0]['#text'], + tags: results.artistInfo.artist.tags.tag, + bio: results.artistInfo.artist.bio.summary, + stats: results.artistInfo.artist.stats, + similar: results.artistInfo.artist.similar.artist, + topAlbums: results.artistTopAlbums + }; + res.render('api/lastfm', { + title: 'Last.fm API', + artist: artist }); - } - }, - function(err, results) { - if (err) return next(err.message); - var artist = { - name: results.artistInfo.artist.name, - image: results.artistInfo.artist.image.slice(-1)[0]['#text'], - tags: results.artistInfo.artist.tags.tag, - bio: results.artistInfo.artist.bio.summary, - stats: results.artistInfo.artist.stats, - similar: results.artistInfo.artist.similar.artist, - topAlbums: results.artistTopAlbums - }; - res.render('api/lastfm', { - title: 'Last.fm API', - artist: artist }); - }); }; /** @@ -258,7 +258,7 @@ exports.getTwitter = function(req, res, next) { /** * GET /api/paypal - * PayPal SDK example + * PayPal SDK example. */ exports.getPayPal = function(req, res, next) { @@ -272,16 +272,18 @@ exports.getPayPal = function(req, res, next) { 'return_url': secrets.paypal.returnUrl, 'cancel_url': secrets.paypal.cancelUrl }, - 'transactions': [{ - 'description': 'Node.js Boilerplate', - 'amount': { - 'currency': 'USD', - 'total': '2.99' + 'transactions': [ + { + 'description': 'Node.js Boilerplate', + 'amount': { + 'currency': 'USD', + 'total': '2.99' + } } - }] + ] }; - paypal.payment.create(payment_details, function (error, payment) { - if(error){ + paypal.payment.create(payment_details, function(error, payment) { + if (error) { console.log(error); } else { req.session.payment_id = payment.id; @@ -299,14 +301,14 @@ exports.getPayPal = function(req, res, next) { /** * GET /api/paypal/success - * PayPal SDK example + * PayPal SDK example. */ exports.getPayPalSuccess = function(req, res, next) { var payment_id = req.session.payment_id; var payment_details = { 'payer_id': req.query.PayerID }; - paypal.payment.execute(payment_id, payment_details, function(error, payment){ - if(error){ + paypal.payment.execute(payment_id, payment_details, function(error, payment) { + if (error) { res.render('api/paypal', { result: true, success: false @@ -322,7 +324,7 @@ exports.getPayPalSuccess = function(req, res, next) { /** * GET /api/paypal/cancel - * PayPal SDK example + * PayPal SDK example. */ exports.getPayPalCancel = function(req, res, next) { @@ -339,51 +341,40 @@ exports.getPayPalCancel = function(req, res, next) { */ exports.getSteam = function(req, res) { - var defaultSteamId = '76561197992403307'; - var steamId = _.findWhere(req.user.tokens, { kind: 'steam' }).steamId || defaultSteamId; + var steamId = '76561197982488301'; var query = { l: 'english', steamid: steamId, key: secrets.steam.apiKey }; - - async.parallel([ - function (callback) { - builtQuery = querystring.stringify(query); - request.get({url:'http://api.steampowered.com/IPlayerService/GetRecentlyPlayedGames/v0001/?' + builtQuery, json:true}, function(err, request, body) { - if (err) return next(err); - callback(null, body); + + async.parallel({ + playerAchievements: function(done) { + query.appid = '49520'; + var qs = querystring.stringify(query); + request.get({ url: 'http://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v0001/?' + qs, json: true }, function(error, request, body) { + done(error, body.playerstats); }); }, - function (callback) { - query.appid = '570'; // Dota 2 - builtQuery = querystring.stringify(query); - request.get({url:'http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?' + builtQuery, json:true}, function(err, request, body) { - if (err) return next(err); - delete query.appid; - callback(null, body); + playerSummaries: function(done) { + query.steamids = steamId; + var qs = querystring.stringify(query); + request.get({ url: 'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?' + qs, json: true }, function(error, request, body) { + done(error, body); }); }, - function (callback) { - query.appid = '219640'; //Chivalry: Medieval Warfare - builtQuery = querystring.stringify(query); - request.get({url:'http://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v0001/?' + builtQuery, json:true}, function(err, request, body) { - if (err) return next(err); - delete query.appid; - callback(null, body); + ownedGames: function(done) { + var qs = querystring.stringify(query); + request.get({ url: 'http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?' + qs, json: true }, function(error, request, body) { + done(error, body); }); - }, - function (callback) { - delete query.steamid; - query.steamids = steamId; //this request can be supplied a set of comma seperated steam ids - builtQuery = querystring.stringify(query); - request.get({url:'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?' + builtQuery, json:true}, function(err, request, body) { - if (err) return next(err); - callback(null, body); - }); - }, - ], - function (err, results) { - console.log(require('util').inspect(results, false, null)); + } + }, + function(err, results) { if (err) return next(err); - else res.render('api/steam', { + console.log(results.ownedGames); + console.log(results.playerSummaries); + res.render('api/steam', { title: 'Steam Web API', - items: results }); + ownedGames: results.ownedGames, + playerAchievemments: results.playerAchievements, + playerSummaries: results.playerSummaries + }); }); }; \ No newline at end of file From eedfb77ac65f0f2168ce9de5ae0e8afe8fa944b5 Mon Sep 17 00:00:00 2001 From: Sahat Yalkabov Date: Wed, 5 Feb 2014 19:30:00 -0500 Subject: [PATCH 4/5] Steam API template display achievements --- views/api/steam.jade | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/views/api/steam.jade b/views/api/steam.jade index 1bfa5d3679..5f5ea08357 100644 --- a/views/api/steam.jade +++ b/views/api/steam.jade @@ -10,3 +10,10 @@ block content a.btn.btn-primary(href='https://developer.valvesoftware.com/wiki/Steam_Web_API', target='_blank') i.fa.fa-check-square-o | Overview + + h3 Player achievements for #{playerAchievemments.gameName} + p Returns a list of achievements for this user by app id + ul.lead.list-unstyled + for achievement in playerAchievemments.achievements + if achievement.achieved + li.text-success= achievement.name From aa3e6e6a6708957b71578908ad803dce738b9e34 Mon Sep 17 00:00:00 2001 From: Sahat Yalkabov Date: Wed, 5 Feb 2014 19:39:31 -0500 Subject: [PATCH 5/5] Add profile information and owned games to Steam template --- views/api/steam.jade | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/views/api/steam.jade b/views/api/steam.jade index 5f5ea08357..52e633f480 100644 --- a/views/api/steam.jade +++ b/views/api/steam.jade @@ -11,9 +11,22 @@ block content i.fa.fa-check-square-o | Overview + h3 Profile Information + .lead + // profile name + // profile avatar + // online status + h3 Player achievements for #{playerAchievemments.gameName} p Returns a list of achievements for this user by app id ul.lead.list-unstyled for achievement in playerAchievemments.achievements if achievement.achieved li.text-success= achievement.name + + h3 Owned Games + ul.list-unstyled + for game in ownedGames + li + img(src='#') +