gamertag 1.1.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }