bnet 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- data/README.md +11 -4
- data/TODO.md +7 -6
- data/fixtures/cassettes/Bnet_Starcraft2_Match/_all_profile_/returns_a_collection_of_matches_for_a_given_profile.yml +40 -0
- data/fixtures/cassettes/SC2_Matches_for_Naniwa_Profile_found.yml +197 -0
- data/fixtures/cassettes/SC2_Naniwa_profile_found.yml +1260 -0
- data/lib/bnet.rb +5 -1
- data/lib/bnet/diablo3/career.rb +39 -35
- data/lib/bnet/diablo3/follower.rb +42 -0
- data/lib/bnet/diablo3/hero.rb +18 -23
- data/lib/bnet/diablo3/item.rb +9 -1
- data/lib/bnet/diablo3/skill.rb +6 -2
- data/lib/bnet/starcraft2/career.rb +21 -0
- data/lib/bnet/starcraft2/match.rb +48 -0
- data/lib/bnet/starcraft2/profile.rb +39 -18
- data/lib/bnet/version.rb +1 -1
- data/spec/bnet/diablo3/follower_spec.rb +56 -0
- data/spec/bnet/diablo3/hero_spec.rb +41 -0
- data/spec/bnet/diablo3/item_spec.rb +14 -0
- data/spec/bnet/starcraft2/career_spec.rb +40 -0
- data/spec/bnet/starcraft2/match_spec.rb +17 -0
- data/spec/bnet/starcraft2/profile_spec.rb +42 -2
- metadata +14 -2
data/lib/bnet.rb
CHANGED
@@ -22,8 +22,12 @@ require 'bnet/diablo3/career'
|
|
22
22
|
require 'bnet/diablo3/item'
|
23
23
|
require 'bnet/diablo3/hero'
|
24
24
|
require 'bnet/diablo3/skill'
|
25
|
-
|
25
|
+
require 'bnet/diablo3/follower'
|
26
|
+
# require 'bnet/community' #TODO remove?
|
26
27
|
require 'bnet/starcraft2'
|
28
|
+
# require 'bnet/starcraft2/ladder'
|
29
|
+
require 'bnet/starcraft2/match'
|
30
|
+
require 'bnet/starcraft2/career'
|
27
31
|
require 'bnet/starcraft2/profile'
|
28
32
|
require 'bnet/wow'
|
29
33
|
require 'bnet/wow/data'
|
data/lib/bnet/diablo3/career.rb
CHANGED
@@ -2,18 +2,18 @@ class Bnet::Diablo3::Career < Bnet::BnetResource
|
|
2
2
|
|
3
3
|
attr_accessor :heroes, :last_hero_played, :last_updated, :kills, :time_played,
|
4
4
|
:fallen_heroes, :paragon_level, :paragon_level_hardcore, :battle_tag,
|
5
|
-
:progression, :region
|
5
|
+
:progression, :region, :raw_attributes
|
6
6
|
|
7
7
|
PARAMS_MAPPING = {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
"lastHeroPlayed" => :last_hero_played,
|
9
|
+
"lastUpdated" => :last_updated,
|
10
|
+
"kills" => :kills,
|
11
|
+
"timePlayed" => :time_played,
|
12
|
+
"fallenHeroes" => :fallen_heroes,
|
13
|
+
"paragonLevel" => :paragon_level,
|
14
|
+
"paragonLevelHardcore" => :paragon_level_hardcore,
|
15
|
+
"battleTag" => :battle_tag,
|
16
|
+
"progression" => :progression
|
17
17
|
}
|
18
18
|
|
19
19
|
def battle_tag
|
@@ -50,42 +50,46 @@ class Bnet::Diablo3::Career < Bnet::BnetResource
|
|
50
50
|
base_api = Bnet::Diablo3.new(region: region)
|
51
51
|
call_url = base_api.url + "profile/#{battle_tag}/?apikey=#{api_key}&locale=#{locale}"
|
52
52
|
|
53
|
-
|
54
|
-
|
53
|
+
begin
|
54
|
+
data = open(call_url)
|
55
|
+
raw_response = JSON.parse(data.read)
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
if Bnet::API.valid_call?(data.status, raw_response)
|
58
|
+
career = from_api(raw_response)
|
59
|
+
career.raw_attributes = raw_response
|
60
|
+
career.region = region
|
58
61
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
+
assign_heroes_from_raw_heroes(career, raw_response["heroes"]) if raw_response["heroes"]
|
63
|
+
else
|
64
|
+
career = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
rescue OpenURI::HTTPError => e
|
62
68
|
career = nil
|
63
69
|
end
|
64
|
-
# NOTE end of common tasks
|
65
70
|
|
66
|
-
|
67
|
-
|
68
|
-
career.region = region
|
71
|
+
return career
|
72
|
+
end
|
69
73
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
hero.battle_tag = career.battle_tag
|
76
|
-
hero.region = career.region
|
77
|
-
hero.reload
|
78
|
-
hero
|
79
|
-
end
|
74
|
+
def self.from_api(response)
|
75
|
+
career = super(response)
|
76
|
+
career.raw_attributes = response
|
77
|
+
return career
|
78
|
+
end
|
80
79
|
|
81
|
-
|
82
|
-
end
|
83
|
-
# End of association tasks
|
80
|
+
private
|
84
81
|
|
82
|
+
def self.assign_heroes_from_raw_heroes(career, raw_heroes)
|
83
|
+
career.heroes = raw_heroes.collect do |raw_hero_attrs|
|
84
|
+
hero = Bnet::Diablo3::Hero.from_api(raw_hero_attrs)
|
85
|
+
hero.career = career
|
86
|
+
hero.battle_tag = career.battle_tag
|
87
|
+
hero.region = career.region
|
88
|
+
hero.reload
|
89
|
+
hero
|
85
90
|
end
|
86
91
|
|
87
92
|
return career
|
88
93
|
end
|
89
94
|
|
90
|
-
|
91
95
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Bnet::Diablo3::Follower < Bnet::BnetResource
|
2
|
+
attr_accessor :follower_type, :level, :raw_attributes,
|
3
|
+
:magic_find, :gold_find, :experience_bonus,
|
4
|
+
|
5
|
+
#associations
|
6
|
+
:items, :skills
|
7
|
+
|
8
|
+
def self.from_api(follower_type, raw_response)
|
9
|
+
follower = new(follower_type: follower_type)
|
10
|
+
follower.raw_attributes = raw_response
|
11
|
+
follower.level = raw_response["level"]
|
12
|
+
|
13
|
+
assign_items_from_raw_items(follower, raw_response["items"]) if raw_response["items"]
|
14
|
+
assign_skills_from_raw_skills(follower, raw_response["skills"]) if raw_response["skills"]
|
15
|
+
|
16
|
+
follower.magic_find = raw_response["stats"]["magicFind"]
|
17
|
+
follower.gold_find = raw_response["stats"]["goldFind"]
|
18
|
+
follower.experience_bonus = raw_response["stats"]["experienceBonus"]
|
19
|
+
|
20
|
+
return follower
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def self.assign_items_from_raw_items(follower, raw_items)
|
26
|
+
follower.items = raw_items.collect do |location, item_props|
|
27
|
+
Bnet::Diablo3::Item.from_api(location, item_props)
|
28
|
+
end
|
29
|
+
|
30
|
+
return follower
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.assign_skills_from_raw_skills(follower, raw_skills)
|
34
|
+
follower.skills = raw_skills.collect do |raw_skill|
|
35
|
+
Bnet::Diablo3::Skill.from_api(raw_skill) unless raw_skill.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
follower.skills = follower.skills.compact
|
39
|
+
|
40
|
+
return follower
|
41
|
+
end
|
42
|
+
end
|
data/lib/bnet/diablo3/hero.rb
CHANGED
@@ -3,7 +3,7 @@ class Bnet::Diablo3::Hero < Bnet::BnetResource
|
|
3
3
|
attr_accessor :paragon_level, :seasonal, :name, :hero_id,
|
4
4
|
:level, :hardcore, :gender, :dead, :hero_class, :last_update,
|
5
5
|
:active_skills, :passive_skills, :region, :battle_tag, :career,
|
6
|
-
:items,
|
6
|
+
:items, :followers, :raw_attributes,
|
7
7
|
|
8
8
|
# stats
|
9
9
|
:life, :damage, :attack_speed, :armor, :strength, :dexterity, :vitality,
|
@@ -24,7 +24,7 @@ class Bnet::Diablo3::Hero < Bnet::BnetResource
|
|
24
24
|
"gender" => :gender,
|
25
25
|
"dead" => :dead,
|
26
26
|
"class" => :hero_class,
|
27
|
-
"last-updated" => :last_updated
|
27
|
+
"last-updated" => :last_updated
|
28
28
|
}
|
29
29
|
|
30
30
|
|
@@ -111,10 +111,13 @@ class Bnet::Diablo3::Hero < Bnet::BnetResource
|
|
111
111
|
def self.from_api(response)
|
112
112
|
hero = super(response)
|
113
113
|
|
114
|
+
hero.raw_attributes = response
|
115
|
+
|
114
116
|
if hero
|
115
117
|
assign_skills_from_raw_skills(hero, response["skills"]) if response["skills"]
|
116
118
|
assign_stats_from_raw_stats(hero, response["stats"]) if response["stats"]
|
117
119
|
assign_items_from_raw_items(hero, response["items"]) if response["items"]
|
120
|
+
assign_followers_from_raw_followers(hero, response["followers"]) if response["followers"]
|
118
121
|
end
|
119
122
|
|
120
123
|
return hero
|
@@ -122,37 +125,29 @@ class Bnet::Diablo3::Hero < Bnet::BnetResource
|
|
122
125
|
|
123
126
|
private
|
124
127
|
|
128
|
+
def self.assign_followers_from_raw_followers(hero, raw_followers)
|
129
|
+
hero.followers = raw_followers.collect do |follower_type, follower_props|
|
130
|
+
Bnet::Diablo3::Follower.from_api(follower_type, follower_props)
|
131
|
+
end
|
132
|
+
|
133
|
+
return hero
|
134
|
+
end
|
135
|
+
|
125
136
|
def self.assign_items_from_raw_items(hero, raw_items)
|
126
137
|
hero.items = raw_items.collect do |location, item_props|
|
127
|
-
|
128
|
-
item.location = location
|
129
|
-
item.item_id = item_props["id"]
|
130
|
-
item.name = item_props["name"]
|
131
|
-
item
|
138
|
+
Bnet::Diablo3::Item.from_api(location, item_props)
|
132
139
|
end
|
133
140
|
|
134
141
|
return hero
|
135
142
|
end
|
136
143
|
|
137
144
|
def self.assign_skills_from_raw_skills(hero, raw_skills)
|
138
|
-
hero.active_skills = raw_skills["active"].collect do |
|
139
|
-
|
140
|
-
if active["skill"]
|
141
|
-
skill.name = active["skill"]["name"]
|
142
|
-
end
|
143
|
-
if active["rune"]
|
144
|
-
skill.rune = active["rune"]["name"]
|
145
|
-
end
|
146
|
-
|
147
|
-
skill
|
145
|
+
hero.active_skills = raw_skills["active"].collect do |active_skill|
|
146
|
+
Bnet::Diablo3::Skill.from_api(active_skill) unless active_skill.empty?
|
148
147
|
end
|
149
148
|
|
150
|
-
hero.passive_skills = raw_skills["passive"].collect do |
|
151
|
-
|
152
|
-
if passive["skill"]
|
153
|
-
skill.name = passive["skill"]["name"]
|
154
|
-
end
|
155
|
-
skill
|
149
|
+
hero.passive_skills = raw_skills["passive"].collect do |passive_skill|
|
150
|
+
Bnet::Diablo3::Skill.from_api(passive_skill) unless passive_skill.empty?
|
156
151
|
end
|
157
152
|
|
158
153
|
return hero
|
data/lib/bnet/diablo3/item.rb
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
-
class Bnet::Diablo3::Item
|
1
|
+
class Bnet::Diablo3::Item < Bnet::BnetResource
|
2
2
|
attr_accessor :item_id, :location, :name
|
3
|
+
|
4
|
+
def self.from_api(location, raw_response)
|
5
|
+
item = new(location: location)
|
6
|
+
item.item_id = raw_response["id"]
|
7
|
+
item.name = raw_response["name"]
|
8
|
+
|
9
|
+
return item
|
10
|
+
end
|
3
11
|
end
|
data/lib/bnet/diablo3/skill.rb
CHANGED
@@ -11,9 +11,13 @@ class Bnet::Diablo3::Skill < Bnet::BnetResource
|
|
11
11
|
#
|
12
12
|
# Returns:
|
13
13
|
#
|
14
|
-
# #<Bnet::Diablo3::Skill:0x007fd111396360 @name: "", @rune
|
14
|
+
# #<Bnet::Diablo3::Skill:0x007fd111396360 @name: "", @rune: "">
|
15
15
|
def self.from_api(response)
|
16
|
-
|
16
|
+
skill = new
|
17
|
+
skill.name = response['skill']['name']
|
18
|
+
skill.rune = response['rune']['name'] if response["rune"]
|
19
|
+
|
20
|
+
return skill
|
17
21
|
end
|
18
22
|
|
19
23
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Bnet::Starcraft2::Career < Bnet::BnetResource
|
2
|
+
attr_accessor :primary_race, :terran_wins, :protoss_wins, :zerg_wins,
|
3
|
+
:highest_1v1_rank, :highest_team_rank, :season_total_games,
|
4
|
+
:career_total_games
|
5
|
+
|
6
|
+
PARAMS_MAPPING = {
|
7
|
+
'primaryRace' => :primary_race,
|
8
|
+
'terranWins' => :terran_wins,
|
9
|
+
'protosswins' => :protoss_wins,
|
10
|
+
'zergWins' => :zerg_wins,
|
11
|
+
'highest1v1Rank' => :highest_1v1_rank,
|
12
|
+
'highestTeamRank' => :highest_team_rank,
|
13
|
+
"seasonTotalGames" => :season_total_games,
|
14
|
+
"careerTotalGames" => :career_total_games
|
15
|
+
}
|
16
|
+
|
17
|
+
def self.from_api(raw_response)
|
18
|
+
career = super(raw_response)
|
19
|
+
return career
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Bnet::Starcraft2::Match < Bnet::BnetResource
|
2
|
+
attr_accessor :map, :match_type, :decision, :speed, :date, :raw_attributes
|
3
|
+
|
4
|
+
PARAMS_MAPPING = {
|
5
|
+
"map" => :map,
|
6
|
+
"type" => :match_type,
|
7
|
+
"decision" => :decision,
|
8
|
+
"speed" => :speed,
|
9
|
+
"date" => :date
|
10
|
+
}
|
11
|
+
|
12
|
+
def self.all(profile, args = {})
|
13
|
+
profile_id = profile.profile_id
|
14
|
+
name = profile.name
|
15
|
+
realm = profile.realm || '1'
|
16
|
+
locale = args[:locale] || 'en_US'
|
17
|
+
api_key = args[:api_key] || Bnet.configuration.api_key
|
18
|
+
|
19
|
+
client = Bnet::Starcraft2.new(region: profile.region)
|
20
|
+
call_url = client.url + "profile/#{profile_id}/#{realm}/#{name}/matches?apikey=#{api_key}&locale=#{locale}"
|
21
|
+
|
22
|
+
begin
|
23
|
+
data = open(call_url)
|
24
|
+
raw_collection_response = JSON.parse(data.read)
|
25
|
+
|
26
|
+
if Bnet::API.valid_call?(data.status, raw_collection_response)
|
27
|
+
matches = raw_collection_response["matches"].collect do |raw_response|
|
28
|
+
match = from_api(raw_response)
|
29
|
+
match
|
30
|
+
end
|
31
|
+
else
|
32
|
+
matches = []
|
33
|
+
end
|
34
|
+
|
35
|
+
rescue OpenURI::HTTPError => e
|
36
|
+
matches = []
|
37
|
+
end
|
38
|
+
|
39
|
+
return matches
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.from_api(raw_response)
|
44
|
+
match = super(raw_response)
|
45
|
+
match.raw_attributes = raw_response
|
46
|
+
match
|
47
|
+
end
|
48
|
+
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# TODO: Associations for career, current_season
|
2
2
|
class Bnet::Starcraft2::Profile < Bnet::BnetResource
|
3
3
|
|
4
|
-
attr_accessor :profile_id, :realm, :
|
4
|
+
attr_accessor :profile_id, :realm, :name, :clan_name, :clan_tag,
|
5
5
|
:achievement_points, :swarm_level, :terran_level, :zerg_level,
|
6
|
-
:protoss_level, :acievement_points
|
6
|
+
:protoss_level, :acievement_points, :career, :region,
|
7
|
+
:raw_attributes
|
7
8
|
|
8
9
|
PARAMS_MAPPING = {
|
9
10
|
"id" => :profile_id,
|
10
11
|
"realm" => :realm,
|
11
|
-
"displayName" => :
|
12
|
+
"displayName" => :name,
|
12
13
|
"clanName" => :clan_name,
|
13
|
-
"clanTag" => :clan_tag
|
14
|
-
"career" => :career
|
14
|
+
"clanTag" => :clan_tag
|
15
15
|
}
|
16
16
|
|
17
17
|
def initialize args
|
@@ -25,13 +25,14 @@ class Bnet::Starcraft2::Profile < Bnet::BnetResource
|
|
25
25
|
#
|
26
26
|
# Hash Params:
|
27
27
|
# Required
|
28
|
-
# :realm
|
29
|
-
# :profile_id
|
30
|
-
#
|
31
|
-
# :name
|
28
|
+
# :realm - (required but defaults to '1')
|
29
|
+
# :profile_id - ID (Honestly i do not know why Blizzard still needs this if
|
30
|
+
# localized Battletag is unique enough)
|
31
|
+
# :name - Just the name string in the Battle tag.
|
32
|
+
#
|
32
33
|
# Optional
|
33
|
-
# :locale
|
34
|
-
# :api_key
|
34
|
+
# :locale - (defaults to 'en_US')
|
35
|
+
# :api_key - the api key
|
35
36
|
#
|
36
37
|
# Example: If US account 'Playerone#1309' the profile can be accessible via
|
37
38
|
# web from 'http://us.battle.net/sc2/en/profile/2143215/1/PlayerOne/'
|
@@ -40,16 +41,16 @@ class Bnet::Starcraft2::Profile < Bnet::BnetResource
|
|
40
41
|
#
|
41
42
|
# Returns a Profile object with the following attributes
|
42
43
|
#
|
43
|
-
# :profile_id, :realm, :
|
44
|
+
# :profile_id, :realm, :name, :clan_name, :clan_tag,
|
44
45
|
# :achievement_points, :swarm_level, :terran_level, :zerg_level,
|
45
46
|
# :protoss_level, :acievement_points
|
46
47
|
def self.find args
|
47
|
-
region = args
|
48
|
-
profile_id = args
|
49
|
-
name = args
|
50
|
-
realm = args
|
51
|
-
locale = args
|
52
|
-
api_key = args
|
48
|
+
region = args[:region]
|
49
|
+
profile_id = args[:profile_id]
|
50
|
+
name = args[:name]
|
51
|
+
realm = args[:realm] || '1'
|
52
|
+
locale = args[:locale] || 'en_US'
|
53
|
+
api_key = args[:api_key] || Bnet.configuration.api_key
|
53
54
|
|
54
55
|
base_api = Bnet::Starcraft2.new(region: region)
|
55
56
|
call_url = base_api.url + "profile/#{profile_id}/#{realm}/#{name}/?locale=#{locale}&apikey=#{api_key}"
|
@@ -60,6 +61,8 @@ class Bnet::Starcraft2::Profile < Bnet::BnetResource
|
|
60
61
|
|
61
62
|
if Bnet::API.valid_call?(data.status, raw_response)
|
62
63
|
bnet_object = from_api(raw_response)
|
64
|
+
bnet_object.raw_attributes = raw_response
|
65
|
+
bnet_object.region = region
|
63
66
|
else
|
64
67
|
bnet_object = nil
|
65
68
|
end
|
@@ -76,6 +79,14 @@ class Bnet::Starcraft2::Profile < Bnet::BnetResource
|
|
76
79
|
@career ||= []
|
77
80
|
end
|
78
81
|
|
82
|
+
def matches
|
83
|
+
@matches ||= Bnet::Starcraft2::Match.all(self)
|
84
|
+
end
|
85
|
+
|
86
|
+
def ladders
|
87
|
+
# @ladders ||=
|
88
|
+
end
|
89
|
+
|
79
90
|
def self.from_api(response)
|
80
91
|
bnet_resource = super(response)
|
81
92
|
if bnet_resource && response["achievements"]
|
@@ -89,6 +100,16 @@ class Bnet::Starcraft2::Profile < Bnet::BnetResource
|
|
89
100
|
bnet_resource.zerg_level = response["swarmLevels"]["zerg"]["level"]
|
90
101
|
end
|
91
102
|
|
103
|
+
assign_career_from_raw_career(bnet_resource, response["career"]) if response["career"]
|
104
|
+
|
92
105
|
bnet_resource
|
93
106
|
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def self.assign_career_from_raw_career(profile, raw_career)
|
111
|
+
profile.career = Bnet::Starcraft2::Career.from_api(raw_career)
|
112
|
+
return profile
|
113
|
+
end
|
114
|
+
|
94
115
|
end
|