gamertag 1.1.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +11 -1
  3. data/LICENSE.md +11 -0
  4. data/README.md +84 -0
  5. data/gamertag.gemspec +25 -25
  6. data/lib/faraday/response/cleanup_xbox_leaders_naming.rb +30 -0
  7. data/lib/faraday/response/raise_xbox_leaders_error.rb +22 -0
  8. data/lib/gamertag.rb +21 -10
  9. data/lib/gamertag/client.rb +25 -0
  10. data/lib/gamertag/client/achievements.rb +15 -0
  11. data/lib/gamertag/client/friends.rb +14 -0
  12. data/lib/gamertag/client/games.rb +41 -0
  13. data/lib/gamertag/client/profile.rb +14 -0
  14. data/lib/gamertag/configuration.rb +48 -0
  15. data/lib/gamertag/connection.rb +22 -0
  16. data/lib/gamertag/error.rb +22 -0
  17. data/lib/gamertag/version.rb +2 -2
  18. data/spec/client/achievements_spec.rb +21 -0
  19. data/spec/client/friends_spec.rb +23 -0
  20. data/spec/client/games_spec.rb +49 -0
  21. data/spec/client/profile_spec.rb +22 -0
  22. data/spec/client_spec.rb +7 -0
  23. data/spec/faraday/xboxleader_cleanup_spec.rb +59 -0
  24. data/spec/faraday/xboxleader_error_spec.rb +63 -0
  25. data/spec/fixtures/achievements.json +654 -0
  26. data/spec/fixtures/errors/friends_not_found.json +9 -0
  27. data/spec/fixtures/errors/game_not_found.json +9 -0
  28. data/spec/fixtures/errors/gamertag_not_found.json +9 -0
  29. data/spec/fixtures/errors/invalid_game_id.json +9 -0
  30. data/spec/fixtures/errors/invalid_gamertag.json +9 -0
  31. data/spec/fixtures/friends.json +772 -0
  32. data/spec/fixtures/gamertag_not_found.json +9 -0
  33. data/spec/fixtures/games.json +2244 -0
  34. data/spec/fixtures/profile.json +125 -0
  35. data/spec/gamertag_spec.rb +13 -0
  36. data/spec/helper.rb +38 -0
  37. metadata +92 -124
  38. data/.gitignore +0 -9
  39. data/.rspec +0 -3
  40. data/.rvmrc +0 -1
  41. data/Gemfile +0 -4
  42. data/LICENSE +0 -20
  43. data/README.mdown +0 -106
  44. data/Rakefile +0 -12
  45. data/lib/gamertag/friends.rb +0 -25
  46. data/lib/gamertag/played_games.rb +0 -73
  47. data/lib/gamertag/profile.rb +0 -13
  48. data/lib/gamertag/simple_profile.rb +0 -68
  49. data/spec/fixtures/vcr_cassettes/Friends_Belial1984.yml +0 -520
  50. data/spec/fixtures/vcr_cassettes/PlayedGames_Belial1984.yml +0 -1309
  51. data/spec/fixtures/vcr_cassettes/PlayedGames_some_user.yml +0 -100
  52. data/spec/fixtures/vcr_cassettes/SimpleProfile_Belial1984.yml +0 -45
  53. data/spec/friends_spec.rb +0 -19
  54. data/spec/played_games_spec.rb +0 -25
  55. data/spec/profile_spec.rb +0 -15
  56. data/spec/simple_profile_spec.rb +0 -69
  57. data/spec/spec_helper.rb +0 -15
  58. data/spec/version_spec.rb +0 -7
@@ -0,0 +1,22 @@
1
+ module Gamertag
2
+ # Custom error class for rescuing from Xbox Leader API errors which are
3
+ # a little funky at best
4
+ class Error < StandardError
5
+ def initialize(response=nil)
6
+ @response = response
7
+ super(build_error_message)
8
+ end
9
+
10
+ private
11
+ def build_error_message
12
+ return nil if @response.nil?
13
+ "#{@response[:body].data.message}"
14
+ end
15
+ end
16
+
17
+ class GamertagNotFound < Error; end
18
+ class AchievementNotFound < Error; end
19
+ class FriendsNotFound < Error; end
20
+ class InvalidGamertag < Error; end
21
+ class InvalidGameId < Error; end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module Gamertag
2
- VERSION = "1.1.0"
3
- end
2
+ VERSION = '2.0.1'
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ describe Gamertag::Client::Achievements do
5
+ before do
6
+ @client = Gamertag::Client.new
7
+ @gamertag = 'belial1984'
8
+ end
9
+
10
+ describe '#achievements' do
11
+ it 'should return the users achievements' do
12
+ stub_get('/achievements.json?gameid=100&gamertag=belial1984').
13
+ to_return(json_response('achievements.json'))
14
+
15
+
16
+ achievements = @client.achievements(@gamertag, 100)
17
+
18
+ expect(achievements.last.title).to eq('Scavenger Hunt')
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ describe Gamertag::Client::Friends do
5
+ before do
6
+ @client = Gamertag::Client.new
7
+ @gamertag = 'belial1984'
8
+ end
9
+
10
+ describe '#friends' do
11
+ it 'returns friends for the gamertag' do
12
+ stub_get('/friends.json?gamertag=belial1984').
13
+ to_return(json_response('friends.json'))
14
+
15
+ friends = @client.friends(@gamertag)
16
+
17
+ expect(friends).not_to be_empty
18
+
19
+ gamertags = friends.map{|f| f.gamertag }
20
+ expect(gamertags).to include('Eternal Epoch')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ describe Gamertag::Client::Games do
5
+ before do
6
+ @client = Gamertag::Client.new
7
+ @gamertag = 'belial1984'
8
+ end
9
+
10
+ describe '#games' do
11
+ it 'returns the games that have been played by the gamertag' do
12
+ stub_get('/games.json?gamertag=belial1984').
13
+ to_return(json_response('games.json'))
14
+
15
+ games = @client.games(@gamertag)
16
+ expect(games.count).to eq(117)
17
+ end
18
+ end
19
+
20
+ describe '#potential_gamerscore' do
21
+ it 'returns the potential points the gamer could score from their library of games' do
22
+ stub_get('/games.json?gamertag=belial1984').
23
+ to_return(json_response('games.json'))
24
+
25
+ potential_gamerscore = @client.potential_gamerscore(@gamertag)
26
+ expect(potential_gamerscore).to eq(87770)
27
+ end
28
+ end
29
+
30
+ describe '#potential_achievements_count' do
31
+ it 'returns the number of potential achievements for the games played' do
32
+ stub_get('/games.json?gamertag=belial1984').
33
+ to_return(json_response('games.json'))
34
+
35
+ potential_achievement_count = @client.potential_achievement_count(@gamertag)
36
+ expect(potential_achievement_count).to eq(4165)
37
+ end
38
+ end
39
+
40
+ describe '#achievements_count' do
41
+ it 'returns the number of achievements for the games played' do
42
+ stub_get('/games.json?gamertag=belial1984').
43
+ to_return(json_response('games.json'))
44
+
45
+ achievement_count = @client.achievement_count(@gamertag)
46
+ expect(achievement_count).to eq(1054)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ describe Gamertag::Client::Profile do
5
+ before do
6
+ @client = Gamertag::Client.new
7
+ @gamertag = 'belial1984'
8
+ end
9
+
10
+ describe '#profile' do
11
+ it 'returns the profile for the gamertag' do
12
+ stub_get('/profile.json?gamertag=belial1984').
13
+ to_return(json_response('profile.json'))
14
+
15
+
16
+ profile = @client.profile(@gamertag)
17
+
18
+ expect(profile.gamertag).to eq(@gamertag)
19
+ expect(profile.name).to eq('baris balic')
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ describe Gamertag::Client do
4
+ before do
5
+ Gamertag.defaults
6
+ end
7
+ end
@@ -0,0 +1,59 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ describe Faraday::Response do
5
+ before do
6
+ @client = Gamertag::Client.new
7
+ @gamertag = 'belial1984'
8
+ end
9
+
10
+ context 'when the profile is requested' do
11
+ it "maps all crappy fields to snake_case" do
12
+ stub_get("/profile.json?gamertag=#{@gamertag}").
13
+ to_return(json_response('profile.json'))
14
+
15
+ profile = @client.profile(@gamertag)
16
+ expect(profile.gamertag).to eq('belial1984')
17
+
18
+ expect(profile.badges.xbox_launch_team).to eq(false)
19
+ expect(profile.badges.nxe_launch_team).to eq(false)
20
+ expect(profile.badges.kinect_launch_team).to eq(false)
21
+ expect(profile.recent_activity).not_to be_empty
22
+ expect(profile.recent_activity.first.is_app).to eq(false)
23
+ expect(profile.recent_activity.first.last_played).to eq('1370905190')
24
+
25
+ end
26
+ end
27
+
28
+ context 'when the friends are requested' do
29
+ it "maps all crappy fields to snake_case" do
30
+ stub_get("/friends.json?gamertag=#{@gamertag}").
31
+ to_return(json_response('friends.json'))
32
+
33
+ friends = @client.friends(@gamertag)
34
+ expect(friends.first.gamertag).to eq('Ageblaster')
35
+ expect(friends.first.last_seen).to eq('1041379200')
36
+ end
37
+ end
38
+
39
+ context 'when the games are requested' do
40
+ it "maps all crappy fields to snake_case" do
41
+ stub_get("/games.json?gamertag=#{@gamertag}").
42
+ to_return(json_response('games.json'))
43
+
44
+ games = @client.games(@gamertag)
45
+ expect(games.first.is_app).to eq(false)
46
+ end
47
+ end
48
+
49
+ context 'when the achievements are requested' do
50
+ it "maps all crappy fields to snake_case" do
51
+ stub_get("/achievements.json?gameid=100&gamertag=#{@gamertag}").
52
+ to_return(json_response('achievements.json'))
53
+
54
+ achievements = @client.achievements(@gamertag, 100)
55
+ expect(achievements.first.unlock_date).to eq('1370919805')
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,63 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ describe Faraday::Response do
5
+ before do
6
+ @client = Gamertag::Client.new
7
+ end
8
+
9
+ context 'when the friends are private or not found' do
10
+ it 'raises a Gamertag::FriendsNotFound error' do
11
+ stub_get('/friends.json?gamertag=belial1984').
12
+ to_return(json_response('errors/friends_not_found.json'))
13
+
14
+ expect {
15
+ @client.friends('belial1984')
16
+ }.to raise_error(Gamertag::FriendsNotFound)
17
+ end
18
+ end
19
+
20
+ context 'when the gamertag is invalid' do
21
+ it 'raises a Gamertag::InvalidGamertag error' do
22
+ stub_get('/profile.json?gamertag=InvalidGamertagHere').
23
+ to_return(json_response('errors/invalid_gamertag.json'))
24
+
25
+ expect {
26
+ @client.profile('InvalidGamertagHere')
27
+ }.to raise_error(Gamertag::InvalidGamertag)
28
+ end
29
+ end
30
+
31
+ context 'when the gamertag is not found' do
32
+ it 'raises a Gamertag::InvalidGamertag error' do
33
+ stub_get('/profile.json?gamertag=NoGamertagHere').
34
+ to_return(json_response('errors/gamertag_not_found.json'))
35
+
36
+ expect {
37
+ @client.profile('NoGamertagHere')
38
+ }.to raise_error(Gamertag::GamertagNotFound)
39
+ end
40
+ end
41
+
42
+ context 'when the game is not valid' do
43
+ it 'raises a Gamertag::InvalidGameId error' do
44
+ stub_get('/achievements.json?gameid=lemons&gamertag=belial1984').
45
+ to_return(json_response('errors/invalid_game_id.json'))
46
+
47
+ expect {
48
+ @client.achievements('belial1984', 'lemons')
49
+ }.to raise_error(Gamertag::InvalidGameId)
50
+ end
51
+ end
52
+
53
+ context 'when the game is not valid' do
54
+ it 'raises a Gamertag::InvalidGameId error' do
55
+ stub_get('/achievements.json?gamertag=belial1984&gameid=lemons').
56
+ to_return(json_response('errors/invalid_game_id.json'))
57
+
58
+ expect {
59
+ @client.achievements('belial1984', 'lemons')
60
+ }.to raise_error(Gamertag::InvalidGameId)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,654 @@
1
+ {
2
+ "status": "success",
3
+ "version": "2.0",
4
+ "data": {
5
+ "gamertag": "belial1984",
6
+ "game": "BioShock Infinite",
7
+ "gamerscore": {
8
+ "current": 470,
9
+ "total": 1000
10
+ },
11
+ "achievement": {
12
+ "current": 32,
13
+ "total": 50
14
+ },
15
+ "progress": 64,
16
+ "lastplayed": "1370905190",
17
+ "achievements": [
18
+ {
19
+ "id": 14,
20
+ "title": "Should Auld Acquaintance...",
21
+ "artwork": {
22
+ "locked": "https://live.xbox.com/tiles/ua/wM/1jc8P2NhbC8WWxoEGlxTWTVkL2FjaC8wL2FiAAAAAVBQUPkjrKU=.jpg",
23
+ "unlocked": ""
24
+ },
25
+ "description": "Unlock 1999 mode.",
26
+ "gamerscore": 10,
27
+ "secret": false,
28
+ "unlocked": true,
29
+ "unlockdate": "1370919805"
30
+ },
31
+ {
32
+ "id": 11,
33
+ "title": "Saw the Elephant",
34
+ "artwork": {
35
+ "locked": "https://live.xbox.com/tiles/MF/0G/0Tc8P2NhbC9BAhoEGlxTWTVkL2FjaC8wLzg1AAAAAVBQUP4pXSw=.jpg",
36
+ "unlocked": ""
37
+ },
38
+ "description": "Complete the game on Normal difficulty or above.",
39
+ "gamerscore": 25,
40
+ "secret": false,
41
+ "unlocked": true,
42
+ "unlockdate": "1370919805"
43
+ },
44
+ {
45
+ "id": 12,
46
+ "title": "Stone Cold Pinkerton",
47
+ "artwork": {
48
+ "locked": "https://live.xbox.com/tiles/GL/jg/0Tc8P2NhbC9MAhoEGlxTWTVkL2FjaC8wLzg4AAAAAVBQUP7PuAQ=.jpg",
49
+ "unlocked": ""
50
+ },
51
+ "description": "Complete the game on Hard difficulty or above.",
52
+ "gamerscore": 50,
53
+ "secret": false,
54
+ "unlocked": true,
55
+ "unlockdate": "1370919805"
56
+ },
57
+ {
58
+ "id": 10,
59
+ "title": "Tin Soldier",
60
+ "artwork": {
61
+ "locked": "https://live.xbox.com/tiles/Fq/zH/0jc8P2NhbC9DAhoEGlxTWTVkL2FjaC8wLzg3AAAAAVBQUP3orAo=.jpg",
62
+ "unlocked": ""
63
+ },
64
+ "description": "Complete the game on Easy difficulty or above.",
65
+ "gamerscore": 10,
66
+ "secret": false,
67
+ "unlocked": true,
68
+ "unlockdate": "1370919805"
69
+ },
70
+ {
71
+ "id": 52,
72
+ "title": "Secret Achievement",
73
+ "artwork": {
74
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
75
+ "unlocked": ""
76
+ },
77
+ "description": "This is a secret achievement. Unlock it to find out more.",
78
+ "gamerscore": 25,
79
+ "secret": true,
80
+ "unlocked": true,
81
+ "unlockdate": "1370918665"
82
+ },
83
+ {
84
+ "id": 32,
85
+ "title": "Strange Bedfellows",
86
+ "artwork": {
87
+ "locked": "https://live.xbox.com/tiles/DK/Ut/1Dc8P2NhbC8VWxoEGlxTWTVkL2FjaC8wL2FhAAAAAVBQUPsCpRA=.jpg",
88
+ "unlocked": ""
89
+ },
90
+ "description": "Kill 20 enemies using allies brought in through a Tear.",
91
+ "gamerscore": 10,
92
+ "secret": false,
93
+ "unlocked": true,
94
+ "unlockdate": "1370913870"
95
+ },
96
+ {
97
+ "id": 8,
98
+ "title": "Secret Achievement",
99
+ "artwork": {
100
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
101
+ "unlocked": ""
102
+ },
103
+ "description": "This is a secret achievement. Unlock it to find out more.",
104
+ "gamerscore": 25,
105
+ "secret": true,
106
+ "unlocked": true,
107
+ "unlockdate": "1370913340"
108
+ },
109
+ {
110
+ "id": 19,
111
+ "title": "Street Sweeper",
112
+ "artwork": {
113
+ "locked": "https://live.xbox.com/tiles/iB/-k/1zc8P2NhbC9AWxoEGlxTWTVkL2FjaC8wL2E0AAAAAVBQUPjLH5Q=.jpg",
114
+ "unlocked": ""
115
+ },
116
+ "description": "Kill 50 enemies with the Founder China Broom Shotgun or Vox Heater.",
117
+ "gamerscore": 5,
118
+ "secret": false,
119
+ "unlocked": true,
120
+ "unlockdate": "1370909160"
121
+ },
122
+ {
123
+ "id": 7,
124
+ "title": "Secret Achievement",
125
+ "artwork": {
126
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
127
+ "unlocked": ""
128
+ },
129
+ "description": "This is a secret achievement. Unlock it to find out more.",
130
+ "gamerscore": 25,
131
+ "secret": true,
132
+ "unlocked": true,
133
+ "unlockdate": "1370801641"
134
+ },
135
+ {
136
+ "id": 20,
137
+ "title": "Big Game Hunter",
138
+ "artwork": {
139
+ "locked": "https://live.xbox.com/tiles/Wk/5E/1Tc8P2NhbC9HAhoEGlxTWTVkL2FjaC8wLzgzAAAAAVBQUPprTkY=.jpg",
140
+ "unlocked": ""
141
+ },
142
+ "description": "Kill 100 enemies with the Founder Huntsman Carbine or Vox Burstgun.",
143
+ "gamerscore": 5,
144
+ "secret": false,
145
+ "unlocked": true,
146
+ "unlockdate": "1370754706"
147
+ },
148
+ {
149
+ "id": 21,
150
+ "title": "Loose Cannon",
151
+ "artwork": {
152
+ "locked": "https://live.xbox.com/tiles/x6/2o/1Tc8P2NhbC9CAxoEGlxTWTVkL2FjaC8wLzk2AAAAAVBQUPqHrds=.jpg",
153
+ "unlocked": ""
154
+ },
155
+ "description": "Kill 25 enemies with the Paddywhacker Hand Cannon.",
156
+ "gamerscore": 5,
157
+ "secret": false,
158
+ "unlocked": true,
159
+ "unlockdate": "1370752096"
160
+ },
161
+ {
162
+ "id": 35,
163
+ "title": "Hazard Pay",
164
+ "artwork": {
165
+ "locked": "https://live.xbox.com/tiles/Jx/8v/0zc8P2NhbC8VAhoEGlxTWTVkL2FjaC8wLzhhAAAAAVBQUPwAHzs=.jpg",
166
+ "unlocked": ""
167
+ },
168
+ "description": "Kill 10 enemies by utilizing environmental hazards.",
169
+ "gamerscore": 25,
170
+ "secret": false,
171
+ "unlocked": true,
172
+ "unlockdate": "1370750740"
173
+ },
174
+ {
175
+ "id": 48,
176
+ "title": "Grand Largesse",
177
+ "artwork": {
178
+ "locked": "https://live.xbox.com/tiles/oP/oC/1zc8P2NhbC9NWxoEGlxTWTVkL2FjaC8wL2E5AAAAAVBQUPgt+rw=.jpg",
179
+ "unlocked": ""
180
+ },
181
+ "description": "Spend $10,000 at the vending machines of Columbia.",
182
+ "gamerscore": 10,
183
+ "secret": false,
184
+ "unlocked": true,
185
+ "unlockdate": "1370747630"
186
+ },
187
+ {
188
+ "id": 26,
189
+ "title": "Well Rounded",
190
+ "artwork": {
191
+ "locked": "https://live.xbox.com/tiles/9U/6P/0Tc8P2NhbC8SWxoEGlxTWTVkL2FjaC8wL2FmAAAAAVBQUP6gTuk=.jpg",
192
+ "unlocked": ""
193
+ },
194
+ "description": "Hit an enemy with each of the 8 Vigors.",
195
+ "gamerscore": 10,
196
+ "secret": false,
197
+ "unlocked": true,
198
+ "unlockdate": "1370747495"
199
+ },
200
+ {
201
+ "id": 46,
202
+ "title": "The Roguish Type",
203
+ "artwork": {
204
+ "locked": "https://live.xbox.com/tiles/yb/mP/1jc8P2NhbC9NAxoEGlxTWTVkL2FjaC8wLzk5AAAAAVBQUPmgudU=.jpg",
205
+ "unlocked": ""
206
+ },
207
+ "description": "Have Elizabeth pick 30 locks.",
208
+ "gamerscore": 25,
209
+ "secret": false,
210
+ "unlocked": true,
211
+ "unlockdate": "1370746856"
212
+ },
213
+ {
214
+ "id": 42,
215
+ "title": "Kitted Out",
216
+ "artwork": {
217
+ "locked": "https://live.xbox.com/tiles/bc/11/0jc8P2NhbC9EWBoEGlxTWTVkL2FjaC8wL2IwAAAAAVBQUP1azXE=.jpg",
218
+ "unlocked": ""
219
+ },
220
+ "description": "Fully upgrade one weapon and one Vigor.",
221
+ "gamerscore": 10,
222
+ "secret": false,
223
+ "unlocked": true,
224
+ "unlockdate": "1370746135"
225
+ },
226
+ {
227
+ "id": 6,
228
+ "title": "Secret Achievement",
229
+ "artwork": {
230
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
231
+ "unlocked": ""
232
+ },
233
+ "description": "This is a secret achievement. Unlock it to find out more.",
234
+ "gamerscore": 25,
235
+ "secret": true,
236
+ "unlocked": true,
237
+ "unlockdate": "1370743955"
238
+ },
239
+ {
240
+ "id": 23,
241
+ "title": "Here Little Piggy",
242
+ "artwork": {
243
+ "locked": "https://live.xbox.com/tiles/GL/fL/0zc8P2NhbC9HAxoEGlxTWTVkL2FjaC8wLzkzAAAAAVBQUPzktwQ=.jpg",
244
+ "unlocked": ""
245
+ },
246
+ "description": "Kill 30 enemies with the Founder Pig Volley Gun or Vox Hail Fire.",
247
+ "gamerscore": 5,
248
+ "secret": false,
249
+ "unlocked": true,
250
+ "unlockdate": "1370743220"
251
+ },
252
+ {
253
+ "id": 25,
254
+ "title": "Seasoned to Taste",
255
+ "artwork": {
256
+ "locked": "https://live.xbox.com/tiles/4V/xp/1jc8P2NhbC9AAxoEGlxTWTVkL2FjaC8wLzk0AAAAAVBQUPlGXP0=.jpg",
257
+ "unlocked": ""
258
+ },
259
+ "description": "Kill 30 enemies with the Peppermill Crank Gun.",
260
+ "gamerscore": 5,
261
+ "secret": false,
262
+ "unlocked": true,
263
+ "unlockdate": "1370743140"
264
+ },
265
+ {
266
+ "id": 31,
267
+ "title": "Tear &amp;#039;em a New One",
268
+ "artwork": {
269
+ "locked": "https://live.xbox.com/tiles/xP/1n/0Dc8P2NhbC9EWxoEGlxTWTVkL2FjaC8wL2EwAAAAAVBQUP9I-dg=.jpg",
270
+ "unlocked": ""
271
+ },
272
+ "description": "Open 30 Tears.",
273
+ "gamerscore": 25,
274
+ "secret": false,
275
+ "unlocked": true,
276
+ "unlockdate": "1370742085"
277
+ },
278
+ {
279
+ "id": 5,
280
+ "title": "Secret Achievement",
281
+ "artwork": {
282
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
283
+ "unlocked": ""
284
+ },
285
+ "description": "This is a secret achievement. Unlock it to find out more.",
286
+ "gamerscore": 10,
287
+ "secret": true,
288
+ "unlocked": true,
289
+ "unlockdate": "1370740665"
290
+ },
291
+ {
292
+ "id": 39,
293
+ "title": "David &amp;amp; Goliath",
294
+ "artwork": {
295
+ "locked": "https://live.xbox.com/tiles/fL/+F/1jc8P2NhbC9FAhoEGlxTWTVkL2FjaC8wLzgxAAAAAVBQUPmqv2A=.jpg",
296
+ "unlocked": ""
297
+ },
298
+ "description": "Kill 20 &amp;quot;Heavy Hitter&amp;quot; enemies.",
299
+ "gamerscore": 10,
300
+ "secret": false,
301
+ "unlocked": true,
302
+ "unlockdate": "1370740250"
303
+ },
304
+ {
305
+ "id": 4,
306
+ "title": "Secret Achievement",
307
+ "artwork": {
308
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
309
+ "unlocked": ""
310
+ },
311
+ "description": "This is a secret achievement. Unlock it to find out more.",
312
+ "gamerscore": 10,
313
+ "secret": true,
314
+ "unlocked": true,
315
+ "unlockdate": "1370671703"
316
+ },
317
+ {
318
+ "id": 22,
319
+ "title": "On a Clear Day...",
320
+ "artwork": {
321
+ "locked": "https://live.xbox.com/tiles/Mw/Li/1jc8P2NhbC9MWxoEGlxTWTVkL2FjaC8wL2E4AAAAAVBQUPnNAi8=.jpg",
322
+ "unlocked": ""
323
+ },
324
+ "description": "Kill 30 enemies with the Bird&amp;#039;s Eye Sniper Rifle.",
325
+ "gamerscore": 5,
326
+ "secret": false,
327
+ "unlocked": true,
328
+ "unlockdate": "1370669978"
329
+ },
330
+ {
331
+ "id": 24,
332
+ "title": "Master of Pyrotechnics",
333
+ "artwork": {
334
+ "locked": "https://live.xbox.com/tiles/cf/RG/0jc8P2NhbC9HWxoEGlxTWTVkL2FjaC8wL2EzAAAAAVBQUP1p9G0=.jpg",
335
+ "unlocked": ""
336
+ },
337
+ "description": "Kill 20 enemies with the Barnstormer RPG.",
338
+ "gamerscore": 5,
339
+ "secret": false,
340
+ "unlocked": true,
341
+ "unlockdate": "1370669783"
342
+ },
343
+ {
344
+ "id": 27,
345
+ "title": "Vigorous Opposition",
346
+ "artwork": {
347
+ "locked": "https://live.xbox.com/tiles/07/9O/0jc8P2NhbC8QWxoEGlxTWTVkL2FjaC8wL2FkAAAAAVBQUP1hv88=.jpg",
348
+ "unlocked": ""
349
+ },
350
+ "description": "Kill 75 enemies either with a Vigor or while the enemy is under the effects of a Vigor.",
351
+ "gamerscore": 50,
352
+ "secret": false,
353
+ "unlocked": true,
354
+ "unlockdate": "1370668598"
355
+ },
356
+ {
357
+ "id": 3,
358
+ "title": "Secret Achievement",
359
+ "artwork": {
360
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
361
+ "unlocked": ""
362
+ },
363
+ "description": "This is a secret achievement. Unlock it to find out more.",
364
+ "gamerscore": 10,
365
+ "secret": true,
366
+ "unlocked": true,
367
+ "unlockdate": "1370668548"
368
+ },
369
+ {
370
+ "id": 41,
371
+ "title": "Dress for Success",
372
+ "artwork": {
373
+ "locked": "https://live.xbox.com/tiles/cq/SJ/1zc8P2NhbC9BAxoEGlxTWTVkL2FjaC8wLzk1AAAAAVBQUPimpG4=.jpg",
374
+ "unlocked": ""
375
+ },
376
+ "description": "Equip a piece of Gear in each of the four slots.",
377
+ "gamerscore": 5,
378
+ "secret": false,
379
+ "unlocked": true,
380
+ "unlockdate": "1370663072"
381
+ },
382
+ {
383
+ "id": 49,
384
+ "title": "Coins in the Cushion",
385
+ "artwork": {
386
+ "locked": "https://live.xbox.com/tiles/Ze/ag/1Tc8P2NhbC8VAxoEGlxTWTVkL2FjaC8wLzlhAAAAAVBQUPqP5nk=.jpg",
387
+ "unlocked": ""
388
+ },
389
+ "description": "Loot 200 containers.",
390
+ "gamerscore": 10,
391
+ "secret": false,
392
+ "unlocked": true,
393
+ "unlockdate": "1370661473"
394
+ },
395
+ {
396
+ "id": 2,
397
+ "title": "Secret Achievement",
398
+ "artwork": {
399
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
400
+ "unlocked": ""
401
+ },
402
+ "description": "This is a secret achievement. Unlock it to find out more.",
403
+ "gamerscore": 10,
404
+ "secret": true,
405
+ "unlocked": true,
406
+ "unlockdate": "1370657508"
407
+ },
408
+ {
409
+ "id": 17,
410
+ "title": "A Real Pistol",
411
+ "artwork": {
412
+ "locked": "https://live.xbox.com/tiles/Vw/WH/0Tc8P2NhbC9FWxoEGlxTWTVkL2FjaC8wL2ExAAAAAVBQUP6oBUs=.jpg",
413
+ "unlocked": ""
414
+ },
415
+ "description": "Kill 25 enemies with the Broadsider Pistol.",
416
+ "gamerscore": 5,
417
+ "secret": false,
418
+ "unlocked": true,
419
+ "unlockdate": "1370655838"
420
+ },
421
+ {
422
+ "id": 1,
423
+ "title": "Secret Achievement",
424
+ "artwork": {
425
+ "locked": "https://live.xbox.com/Content/Images/HiddenAchievement.png",
426
+ "unlocked": ""
427
+ },
428
+ "description": "This is a secret achievement. Unlock it to find out more.",
429
+ "gamerscore": 5,
430
+ "secret": true,
431
+ "unlocked": true,
432
+ "unlockdate": "1370646878"
433
+ },
434
+ {
435
+ "id": 13,
436
+ "title": "Auld Lang Syne",
437
+ "artwork": {
438
+ "locked": "https://live.xbox.com/tiles/hV/Qn/0zc8P2NhbC9CAhoEGlxTWTVkL2FjaC8wLzg2AAAAAVBQUPwIVJk=.jpg",
439
+ "unlocked": ""
440
+ },
441
+ "description": "Complete the game on 1999 mode.",
442
+ "gamerscore": 75,
443
+ "secret": false,
444
+ "unlocked": false
445
+ },
446
+ {
447
+ "id": 15,
448
+ "title": "Industrial Accident",
449
+ "artwork": {
450
+ "locked": "https://live.xbox.com/tiles/0O/+B/1zc8P2NhbC8WAxoEGlxTWTVkL2FjaC8wLzliAAAAAVBQUPiu78w=.jpg",
451
+ "unlocked": ""
452
+ },
453
+ "description": "Kill 20 enemies with a Sky-Hook Execution.",
454
+ "gamerscore": 5,
455
+ "secret": false,
456
+ "unlocked": false
457
+ },
458
+ {
459
+ "id": 16,
460
+ "title": "Aerial Assassin",
461
+ "artwork": {
462
+ "locked": "https://live.xbox.com/tiles/Qx/dh/1jc8P2NhbC8XAxoEGlxTWTVkL2FjaC8wLzljAAAAAVBQUPlOF18=.jpg",
463
+ "unlocked": ""
464
+ },
465
+ "description": "Kill 20 enemies with a Sky-Line Strike.",
466
+ "gamerscore": 5,
467
+ "secret": false,
468
+ "unlocked": false
469
+ },
470
+ {
471
+ "id": 18,
472
+ "title": "Passionately Reciprocated",
473
+ "artwork": {
474
+ "locked": "https://live.xbox.com/tiles/KQ/Qj/0jc8P2NhbC8RAxoEGlxTWTVkL2FjaC8wLzllAAAAAVBQUP0MBDU=.jpg",
475
+ "unlocked": ""
476
+ },
477
+ "description": "Kill 150 enemies with the Founder Triple R Machine Gun or Vox Repeater.",
478
+ "gamerscore": 5,
479
+ "secret": false,
480
+ "unlocked": false
481
+ },
482
+ {
483
+ "id": 28,
484
+ "title": "More for Your Money",
485
+ "artwork": {
486
+ "locked": "https://live.xbox.com/tiles/QE/eu/0zc8P2NhbC8RWxoEGlxTWTVkL2FjaC8wL2FlAAAAAVBQUPyBR1w=.jpg",
487
+ "unlocked": ""
488
+ },
489
+ "description": "Lure 3 enemies into a single Vigor trap 5 times.",
490
+ "gamerscore": 25,
491
+ "secret": false,
492
+ "unlocked": false
493
+ },
494
+ {
495
+ "id": 29,
496
+ "title": "Combination Shock",
497
+ "artwork": {
498
+ "locked": "https://live.xbox.com/tiles/Kl/Ts/1zc8P2NhbC8XWxoEGlxTWTVkL2FjaC8wL2FjAAAAAVBQUPjDVDY=.jpg",
499
+ "unlocked": ""
500
+ },
501
+ "description": "Perform all 8 of the Vigor combinations.",
502
+ "gamerscore": 50,
503
+ "secret": false,
504
+ "unlocked": false
505
+ },
506
+ {
507
+ "id": 30,
508
+ "title": "Mind Over Matter",
509
+ "artwork": {
510
+ "locked": "https://live.xbox.com/tiles/uv/zD/0zc8P2NhbC8QAxoEGlxTWTVkL2FjaC8wLzlkAAAAAVBQUPzs-KY=.jpg",
511
+ "unlocked": ""
512
+ },
513
+ "description": "Kill 20 enemies using Possessed machines.",
514
+ "gamerscore": 10,
515
+ "secret": false,
516
+ "unlocked": false
517
+ },
518
+ {
519
+ "id": 33,
520
+ "title": "On the Fly",
521
+ "artwork": {
522
+ "locked": "https://live.xbox.com/tiles/PR/bF/1Tc8P2NhbC9DWxoEGlxTWTVkL2FjaC8wL2E3AAAAAVBQUPrqFiE=.jpg",
523
+ "unlocked": ""
524
+ },
525
+ "description": "Kill 30 enemies while riding a Sky-Line.",
526
+ "gamerscore": 10,
527
+ "secret": false,
528
+ "unlocked": false
529
+ },
530
+ {
531
+ "id": 34,
532
+ "title": "Bolt From the Blue",
533
+ "artwork": {
534
+ "locked": "https://live.xbox.com/tiles/ru/4l/1Dc8P2NhbC9CWxoEGlxTWTVkL2FjaC8wL2E2AAAAAVBQUPsK7rI=.jpg",
535
+ "unlocked": ""
536
+ },
537
+ "description": "Kill 5 enemies with a headshot while riding a Sky-Line.",
538
+ "gamerscore": 25,
539
+ "secret": false,
540
+ "unlocked": false
541
+ },
542
+ {
543
+ "id": 36,
544
+ "title": "Bon Voyage",
545
+ "artwork": {
546
+ "locked": "https://live.xbox.com/tiles/4g/ym/0zc8P2NhbC9GWxoEGlxTWTVkL2FjaC8wL2EyAAAAAVBQUPyJDP4=.jpg",
547
+ "unlocked": ""
548
+ },
549
+ "description": "Kill 20 enemies by knocking them off Columbia.",
550
+ "gamerscore": 25,
551
+ "secret": false,
552
+ "unlocked": false
553
+ },
554
+ {
555
+ "id": 37,
556
+ "title": "Skeet Shoot",
557
+ "artwork": {
558
+ "locked": "https://live.xbox.com/tiles/Wk/Fv/1zc8P2NhbC9MAxoEGlxTWTVkL2FjaC8wLzk4AAAAAVBQUPhAQUY=.jpg",
559
+ "unlocked": ""
560
+ },
561
+ "description": "Kill 5 enemies while they are falling.",
562
+ "gamerscore": 25,
563
+ "secret": false,
564
+ "unlocked": false
565
+ },
566
+ {
567
+ "id": 38,
568
+ "title": "Lost Weekend",
569
+ "artwork": {
570
+ "locked": "https://live.xbox.com/tiles/i0/AA/0Dc8P2NhbC9NAhoEGlxTWTVkL2FjaC8wLzg5AAAAAVBQUP8vQJc=.jpg",
571
+ "unlocked": ""
572
+ },
573
+ "description": "Kill 5 enemies while you are drunk.",
574
+ "gamerscore": 10,
575
+ "secret": false,
576
+ "unlocked": false
577
+ },
578
+ {
579
+ "id": 40,
580
+ "title": "Heartbreaker",
581
+ "artwork": {
582
+ "locked": "https://live.xbox.com/tiles/VF/VI/1Dc8P2NhbC9DAxoEGlxTWTVkL2FjaC8wLzk3AAAAAVBQUPtnVUg=.jpg",
583
+ "unlocked": ""
584
+ },
585
+ "description": "Kill a Handyman by only shooting his heart.",
586
+ "gamerscore": 50,
587
+ "secret": false,
588
+ "unlocked": false
589
+ },
590
+ {
591
+ "id": 43,
592
+ "title": "Raising the Bar",
593
+ "artwork": {
594
+ "locked": "https://live.xbox.com/tiles/nA/0C/0Dc8P2NhbC8SAxoEGlxTWTVkL2FjaC8wLzlmAAAAAVBQUP8tDYA=.jpg",
595
+ "unlocked": ""
596
+ },
597
+ "description": "Upgrade one attribute (Health, Shield, or Salts) to its maximum level.",
598
+ "gamerscore": 10,
599
+ "secret": false,
600
+ "unlocked": false
601
+ },
602
+ {
603
+ "id": 44,
604
+ "title": "Infused with Greatness",
605
+ "artwork": {
606
+ "locked": "https://live.xbox.com/tiles/70/dl/1zc8P2NhbC9EAhoEGlxTWTVkL2FjaC8wLzgwAAAAAVBQUPhKR-M=.jpg",
607
+ "unlocked": ""
608
+ },
609
+ "description": "Collect every Infusion upgrade in a single game.",
610
+ "gamerscore": 25,
611
+ "secret": false,
612
+ "unlocked": false
613
+ },
614
+ {
615
+ "id": 45,
616
+ "title": "Sightseer",
617
+ "artwork": {
618
+ "locked": "https://live.xbox.com/tiles/G+/cE/1jc8P2NhbC9BWxoEGlxTWTVkL2FjaC8wL2E1AAAAAVBQUPkr5wc=.jpg",
619
+ "unlocked": ""
620
+ },
621
+ "description": "Use all telescopes and Kinetoscopes in the game.",
622
+ "gamerscore": 50,
623
+ "secret": false,
624
+ "unlocked": false
625
+ },
626
+ {
627
+ "id": 47,
628
+ "title": "Eavesdropper",
629
+ "artwork": {
630
+ "locked": "https://live.xbox.com/tiles/yb/ak/1Dc8P2NhbC9GAhoEGlxTWTVkL2FjaC8wLzgyAAAAAVBQUPuLttU=.jpg",
631
+ "unlocked": ""
632
+ },
633
+ "description": "Collect every Voxophone.",
634
+ "gamerscore": 50,
635
+ "secret": false,
636
+ "unlocked": false
637
+ },
638
+ {
639
+ "id": 50,
640
+ "title": "Scavenger Hunt",
641
+ "artwork": {
642
+ "locked": "https://live.xbox.com/tiles/o6/Xm/0Dc8P2NhbC9AAhoEGlxTWTVkL2FjaC8wLzg0AAAAAVBQUP-Jpb8=.jpg",
643
+ "unlocked": ""
644
+ },
645
+ "description": "Complete the game in 1999 mode without purchasing anything from a Dollar Bill vending machine.",
646
+ "gamerscore": 75,
647
+ "secret": false,
648
+ "unlocked": false
649
+ }
650
+ ],
651
+ "freshness": "new"
652
+ },
653
+ "runtime": 2.122
654
+ }