honstats 0.0.7
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.
- data/README +120 -0
- data/lib/honstats.rb +241 -0
- data/lib/honstats/ban.rb +37 -0
- data/lib/honstats/character.rb +225 -0
- data/lib/honstats/game.rb +71 -0
- data/lib/honstats/ignore.rb +37 -0
- data/lib/honstats/server.rb +20 -0
- metadata +62 -0
data/README
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
Returns an object which contains all the player statistics avaialable for
|
2
|
+
the user specified. You must specify a username rather than an account ID
|
3
|
+
for this to function correctly.
|
4
|
+
|
5
|
+
=== Examples
|
6
|
+
|
7
|
+
This will return all the player statistics for the player named "Limi"
|
8
|
+
|
9
|
+
require 'honstats'
|
10
|
+
honstats = HonStats::API.new
|
11
|
+
char = honstats.get_character("Limi")
|
12
|
+
char.class.to_s
|
13
|
+
=> HonStats::Classes::Character
|
14
|
+
|
15
|
+
If you were to call <tt>to_s</tt> or <tt>to_i</tt> to the <tt>char</tt> variable
|
16
|
+
you would get the character account name and account id respectively.
|
17
|
+
|
18
|
+
From there you can access inidividual statistics by sections...
|
19
|
+
|
20
|
+
char.account.inspect
|
21
|
+
char.building.inspect
|
22
|
+
char.creep.inspect
|
23
|
+
char.hero.inspect
|
24
|
+
char.gamestats.inspect
|
25
|
+
char.lastmatch.inspect
|
26
|
+
char.neutral.inspect
|
27
|
+
|
28
|
+
...or by querying them directly...
|
29
|
+
|
30
|
+
char.hero.kills
|
31
|
+
=> 304
|
32
|
+
char.creep.kills
|
33
|
+
=> 5329
|
34
|
+
|
35
|
+
Each individual section holds different statistics...
|
36
|
+
|
37
|
+
Account
|
38
|
+
:id Account ID number
|
39
|
+
:name Account name
|
40
|
+
:created_at Account creation date
|
41
|
+
:last_login Account last login date
|
42
|
+
:last_activity Account last activity date
|
43
|
+
|
44
|
+
Building
|
45
|
+
:damage Damage done to buildings
|
46
|
+
:xp XP gained from raizing buildings (currently 0)
|
47
|
+
:raized Number of buildings raized
|
48
|
+
:gold Gold earned from buildings raized
|
49
|
+
|
50
|
+
Clan
|
51
|
+
:id Clan ID number
|
52
|
+
:name Clan name
|
53
|
+
:tag Clan tag
|
54
|
+
:rank Clan rank
|
55
|
+
:icon Clan logo?
|
56
|
+
|
57
|
+
Creep
|
58
|
+
:kills Number of creep kills
|
59
|
+
:damage Damage done to creep
|
60
|
+
:xp XP gained from killing creeps
|
61
|
+
:gold Gold earned from killing creeps
|
62
|
+
:denies Number of denied creeps
|
63
|
+
:denied_xp XP denied due to denied creeps
|
64
|
+
:kills_per_minute Number of creep kills per minute
|
65
|
+
:xp_per_minute Amount of XP earned per minute from creep kills
|
66
|
+
:denies_per_minute Number of denied creep kills per minute
|
67
|
+
:denied_xp_per_minute Amount of XP denied per minute from creep denies
|
68
|
+
|
69
|
+
Hero
|
70
|
+
:kills Number of hero kills
|
71
|
+
:damage Damage done to enemy heroes
|
72
|
+
:xp XP gained from killing heroes
|
73
|
+
:gold Gold earned from killing heroes
|
74
|
+
:assists Number of hero kills assisted in
|
75
|
+
:deaths Number of hero deaths
|
76
|
+
:gold_lost Amount of gold lost due to hero deaths
|
77
|
+
:seconds_dead Number of seconds spent dead
|
78
|
+
:buybacks Number of hero buybacks
|
79
|
+
:kills_per_minute Number of hero kills per minute
|
80
|
+
:xp_per_minute XP gained per minute from hero kills
|
81
|
+
:time_dead_percentage Percentage of the time spent dead
|
82
|
+
:assists_per_minute Number of hero kill assists per minute
|
83
|
+
:kill_death_ratio Hero kill to death ratio
|
84
|
+
|
85
|
+
GameStats
|
86
|
+
:wins Number of games won
|
87
|
+
:losses Number of games lost
|
88
|
+
:win_percentage Percentage of games won
|
89
|
+
:disconnects Number of game disconnects
|
90
|
+
:time_played Time played in seconds
|
91
|
+
:level Account Level
|
92
|
+
:gold_earned Gold earned overall
|
93
|
+
:gold_spent Gold spent overall
|
94
|
+
:xp_earned XP earned overall
|
95
|
+
:actions_made Number of actions made
|
96
|
+
:average_score ?? - Unknown
|
97
|
+
:xp_earned_per_minute XP earned per minute
|
98
|
+
:gold_earned_per_minute Gold earned per minute
|
99
|
+
:actions_per_minute Number of actions per minute
|
100
|
+
:average_game_length_in_seconds Average Number of seconds per game
|
101
|
+
:played Number of games played
|
102
|
+
:average_kills_per_game Average number of hero kills per game
|
103
|
+
:average_deaths_per_game Average number of hero deaths per game
|
104
|
+
:average_assists_per_game Average number of hero assists per game
|
105
|
+
:disconnect_percentage Percentage of number of games disconnected
|
106
|
+
:average_xp_earned_per_game Average amount of XP earned per game
|
107
|
+
:average_creep_kills_per_game Average number of creep kills per game
|
108
|
+
:average_creep_denies_per_game Average number of creep denies per game
|
109
|
+
|
110
|
+
Last_Match
|
111
|
+
:id Game ID of the last match
|
112
|
+
:date Date of the last match played
|
113
|
+
|
114
|
+
Neutral
|
115
|
+
:kills Number of neutral creep kills
|
116
|
+
:damage Damage done to neutral creeps
|
117
|
+
:xp XP earned from neutral creep kills
|
118
|
+
:gold Gold earned from neutral creep kills
|
119
|
+
:kills_per_minute Number of neutral creep kills per minute
|
120
|
+
:xp_per_minute XP earned per minute from neutral creep kills
|
data/lib/honstats.rb
ADDED
@@ -0,0 +1,241 @@
|
|
1
|
+
#
|
2
|
+
# honstats - Heroes of Newerth Statistics Ruby Library
|
3
|
+
# Written by Lloyd Pick
|
4
|
+
# http://gibhub.com/lloydpick
|
5
|
+
# May not be used for commercial applications without prior concent
|
6
|
+
#
|
7
|
+
|
8
|
+
# usual requirements
|
9
|
+
require 'rubygems'
|
10
|
+
require 'activesupport'
|
11
|
+
require 'net/http'
|
12
|
+
require 'uri'
|
13
|
+
require 'fileutils'
|
14
|
+
|
15
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
16
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
17
|
+
|
18
|
+
require 'honstats/character.rb'
|
19
|
+
require 'honstats/server.rb'
|
20
|
+
require 'honstats/game.rb'
|
21
|
+
require 'honstats/clan.rb'
|
22
|
+
require 'honstats/ban.rb'
|
23
|
+
require 'honstats/ignore.rb'
|
24
|
+
|
25
|
+
module HonStats
|
26
|
+
class API
|
27
|
+
VERSION = '0.0.1'
|
28
|
+
|
29
|
+
@@stats_url_base = "masterserver.hon.s2games.com/"
|
30
|
+
@@requester_file = "client_requester.php"
|
31
|
+
|
32
|
+
@@search_types = {
|
33
|
+
:character => 'character'
|
34
|
+
}
|
35
|
+
|
36
|
+
cattr_accessor :stats_base_url, :requester_file
|
37
|
+
attr_accessor :character_name, :cookie
|
38
|
+
|
39
|
+
# Constructor
|
40
|
+
# Accepts an optional hash of parameters to create defaults for all API requests
|
41
|
+
# * options (Hash) - Hash used to set default values for all API requests
|
42
|
+
def initialize(options = {})
|
43
|
+
@character_name = options[:character_name]
|
44
|
+
@debug = options[:debug] || false
|
45
|
+
end
|
46
|
+
|
47
|
+
# As more API's are created, we might need a place to search for items/guilds/players etc
|
48
|
+
# but for now, it's just for players
|
49
|
+
def search(string, options = {})
|
50
|
+
|
51
|
+
if (string.is_a?(Hash))
|
52
|
+
options = string
|
53
|
+
else
|
54
|
+
options.merge!(:search => string)
|
55
|
+
end
|
56
|
+
|
57
|
+
options = merge_defaults(options)
|
58
|
+
|
59
|
+
if options[:search].nil? || options[:search].empty?
|
60
|
+
raise "no search string"
|
61
|
+
end
|
62
|
+
|
63
|
+
if !@@search_types.has_value?(options[:type])
|
64
|
+
raise "invalid search type"
|
65
|
+
end
|
66
|
+
|
67
|
+
results = []
|
68
|
+
|
69
|
+
case options[:type]
|
70
|
+
when @@search_types[:character]
|
71
|
+
url = self.base_url + @@requester_file
|
72
|
+
character_names = Net::HTTP.post_form(URI.parse(url), {"f"=>"autocompleteNicks", "nickname"=>"#{options[:search]}"})
|
73
|
+
character_names = character_names.body.split('"')
|
74
|
+
character_names.each_index do |d|
|
75
|
+
if character_names[d].include?(";")
|
76
|
+
character_names.delete_at(d)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
character_names.delete_at(0)
|
80
|
+
|
81
|
+
character_names.each do |character|
|
82
|
+
sheet = self.get_character(character)
|
83
|
+
if sheet.account.id > 0
|
84
|
+
results << self.get_character(character)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
return results
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
def search_characters(name, options = {})
|
95
|
+
if (name.is_a?(Hash))
|
96
|
+
options = name
|
97
|
+
else
|
98
|
+
options.merge!(:search => name)
|
99
|
+
end
|
100
|
+
|
101
|
+
options.merge!(:type => @@search_types[:character])
|
102
|
+
return search(options)
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
def get_character(name = @character_name, options = {})
|
107
|
+
if (name.is_a?(Hash))
|
108
|
+
options = name
|
109
|
+
else
|
110
|
+
options.merge!(:character_name => name)
|
111
|
+
options = {:character_name => @character_name}.merge(options) if (!@character_name.nil?)
|
112
|
+
end
|
113
|
+
|
114
|
+
options = merge_defaults(options)
|
115
|
+
|
116
|
+
if options[:character_name].nil? || options[:character_name] == ""
|
117
|
+
raise "characer name not specified"
|
118
|
+
end
|
119
|
+
|
120
|
+
if options[:character_name].is_a?(String)
|
121
|
+
url = self.base_url + @@requester_file
|
122
|
+
character_account_id = Net::HTTP.post_form(URI.parse(url), {"f"=>"nick2id", "nickname[0]"=>"#{options[:character_name]}"})
|
123
|
+
character_account_id = character_account_id.body
|
124
|
+
elsif options[:character_name].is_a?(Integer)
|
125
|
+
character_account_id = options[:character_name]
|
126
|
+
end
|
127
|
+
return HonStats::Classes::Character.new(character_account_id, self)
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_servers(options = { :gametype => 90 })
|
131
|
+
options = merge_defaults(options)
|
132
|
+
options[:type] = HonStats::Classes::Server
|
133
|
+
return server_browser(options)
|
134
|
+
end
|
135
|
+
|
136
|
+
def get_games(options = { :gametype => 10 })
|
137
|
+
options = merge_defaults(options)
|
138
|
+
options[:type] = HonStats::Classes::Game
|
139
|
+
return server_browser(options)
|
140
|
+
end
|
141
|
+
|
142
|
+
def get_active_games(options = { :gametype => 32 })
|
143
|
+
options = merge_defaults(options)
|
144
|
+
options[:type] = HonStats::Classes::Game
|
145
|
+
return server_browser(options)
|
146
|
+
end
|
147
|
+
|
148
|
+
def server_browser(options = {})
|
149
|
+
options = merge_defaults(options)
|
150
|
+
if @cookie
|
151
|
+
url = self.base_url + @@requester_file
|
152
|
+
data = Net::HTTP.post_form(URI.parse(url), {"f"=>"server_list", "gametype"=>"#{options[:gametype]}", "cookie"=>@cookie})
|
153
|
+
data = data.body.split('s:9:"server_id";s:')
|
154
|
+
data.delete_at(0)
|
155
|
+
data.map! {|d| 's:9:"server_id";s:' + d }
|
156
|
+
output = []
|
157
|
+
data.each do |d|
|
158
|
+
output << options[:type].new(d)
|
159
|
+
end
|
160
|
+
output
|
161
|
+
else
|
162
|
+
raise "unable to access server browser data without an auth cookie, use login() first"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def get_clan(options = {})
|
167
|
+
options = merge_defaults(options)
|
168
|
+
url = self.base_url + @@requester_file
|
169
|
+
data = Net::HTTP.post_form(URI.parse(url), {"f"=>"clan_list", "clan_id"=>"#{options[:clan_id]}"})
|
170
|
+
data = data.body.split(';a:6:{s:10:"account_id";s:')
|
171
|
+
data.delete_at(0)
|
172
|
+
data.map! {|d| 's:10:"account_id";s:' + d }
|
173
|
+
return HonStats::Classes::Clan.new(data)
|
174
|
+
end
|
175
|
+
|
176
|
+
def get_banlist(options = {})
|
177
|
+
options = merge_defaults(options)
|
178
|
+
url = self.base_url + @@requester_file
|
179
|
+
data = Net::HTTP.post_form(URI.parse(url), {"f"=>"banned_list", "account_id[0]"=>"#{options[:account_id]}"})
|
180
|
+
data = data.body.split(';a:3:{s:10:"account_id";s:')
|
181
|
+
data.delete_at(0)
|
182
|
+
data.map! {|d| 's:10:"account_id";s:' + d }
|
183
|
+
return HonStats::Classes::Banlist::Banlist.new(data)
|
184
|
+
end
|
185
|
+
|
186
|
+
def get_ignorelist(options = {})
|
187
|
+
options = merge_defaults(options)
|
188
|
+
url = self.base_url + @@requester_file
|
189
|
+
data = Net::HTTP.post_form(URI.parse(url), {"f"=>"ignored_list", "account_id[0]"=>"#{options[:account_id]}"})
|
190
|
+
data = data.body.split(';a:3:{s:10:"account_id";s:')
|
191
|
+
data.delete_at(0)
|
192
|
+
data.map! {|d| 's:10:"account_id";s:' + d }
|
193
|
+
return HonStats::Classes::Ignorelist::Ignorelist.new(data)
|
194
|
+
end
|
195
|
+
|
196
|
+
def login(username, password)
|
197
|
+
url = self.base_url + @@requester_file
|
198
|
+
data = Net::HTTP.post_form(URI.parse(url), {"f"=>"auth", "login"=>"#{username}", "password"=>"#{password}"})
|
199
|
+
|
200
|
+
@cookie = HonStats::API.get_data("cookie", data.body).to_s
|
201
|
+
end
|
202
|
+
|
203
|
+
def base_url(options = {})
|
204
|
+
str = ""
|
205
|
+
|
206
|
+
if (options[:secure] == true)
|
207
|
+
str += 'https://'
|
208
|
+
else
|
209
|
+
str += 'http://'
|
210
|
+
end
|
211
|
+
|
212
|
+
str += @@stats_url_base
|
213
|
+
|
214
|
+
return str
|
215
|
+
end
|
216
|
+
|
217
|
+
# Used to fetch the data from the messy JSON type string sent back from the
|
218
|
+
# server, might be a better/faster/cleaner way of doing this
|
219
|
+
def self.get_data(attribute, data)
|
220
|
+
data = data.split("\"#{attribute}\"")
|
221
|
+
if data[1]
|
222
|
+
data = data[1].split(";")
|
223
|
+
data = data[1].split("\"")
|
224
|
+
data[1]
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
protected
|
229
|
+
|
230
|
+
# Merge the defaults specified in the constructor with those supplied,
|
231
|
+
# overriding any defaults with those supplied
|
232
|
+
def merge_defaults(options = {})
|
233
|
+
defaults = {}
|
234
|
+
defaults[:debug] = @debug if @debug
|
235
|
+
|
236
|
+
# overwrite defaults with any given options
|
237
|
+
defaults.merge!(options)
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
data/lib/honstats/ban.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
module HonStats
|
5
|
+
module Classes
|
6
|
+
module Banlist
|
7
|
+
class Banlist
|
8
|
+
attr_reader :id, :bans
|
9
|
+
alias_method :to_i, :id
|
10
|
+
|
11
|
+
def initialize(data)
|
12
|
+
if bans[0]
|
13
|
+
bans = []
|
14
|
+
data.each do |ban|
|
15
|
+
bans << Ban.new(ban)
|
16
|
+
end
|
17
|
+
@bans = bans
|
18
|
+
@id = HonStats::API.get_data("account_id", bans[0]).to_i
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Ban
|
25
|
+
attr_reader :account_id, :banned_id, :nickname, :reason, :banned_at
|
26
|
+
|
27
|
+
def initialize(data)
|
28
|
+
@account_id = HonStats::API.get_data("account_id", data).to_i
|
29
|
+
@banned_id = HonStats::API.get_data("banned_id", data).to_i
|
30
|
+
@nickname = HonStats::API.get_data("nickname", data).to_s
|
31
|
+
# @reason = HonStats::API.get_data("reason", data).to_s
|
32
|
+
# @banned_at = Time.parse(HonStats::API.get_data("ban_date", data).to_s)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
module HonStats
|
5
|
+
module Classes
|
6
|
+
class Character
|
7
|
+
attr_reader :account_id, :character_name, :account, :building, :clan,
|
8
|
+
:creep, :gamestats, :hero, :last_match, :neutral
|
9
|
+
|
10
|
+
alias_method :to_s, :character_name
|
11
|
+
alias_method :to_i, :account_id
|
12
|
+
|
13
|
+
def initialize(data, api = nil)
|
14
|
+
@api = api
|
15
|
+
|
16
|
+
if data.is_a?(String)
|
17
|
+
output = data.split(";")
|
18
|
+
|
19
|
+
split = output[3].split("\"")
|
20
|
+
@account_id = split[1].to_i
|
21
|
+
|
22
|
+
elsif data.is_a?(Integer)
|
23
|
+
@account_id = data
|
24
|
+
end
|
25
|
+
|
26
|
+
url = base + @api.requester_file
|
27
|
+
data = Net::HTTP.post_form(URI.parse(url), {"f"=>"get_all_stats", "account_id[0]"=>"#{@account_id}"})
|
28
|
+
if data.class.to_s == "Net::HTTPOK"
|
29
|
+
data = data.body
|
30
|
+
@account_id = HonStats::API.get_data("account_id", data).to_i
|
31
|
+
@character_name = HonStats::API.get_data("nickname", data).to_s
|
32
|
+
@account = Account.new(data)
|
33
|
+
@building = Building.new(data)
|
34
|
+
@clan = SimpleClan.new(data)
|
35
|
+
@creep = Creep.new(data)
|
36
|
+
@hero = Hero.new(data)
|
37
|
+
@gamestats = GameStats.new(data, @hero, @creep)
|
38
|
+
@last_match = LastMatch.new(data)
|
39
|
+
@neutral = Neutral.new(data)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
# Return the base_url of the API if available, otherwise send back the default
|
46
|
+
def base
|
47
|
+
if @api
|
48
|
+
return @api.base_url
|
49
|
+
else
|
50
|
+
return 'http://masterserver.hon.s2games.com/'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
# Consilidated Account stats
|
57
|
+
class Account
|
58
|
+
attr_reader :id, :name, :created_at, :last_login, :last_activity
|
59
|
+
|
60
|
+
def initialize(data)
|
61
|
+
@id = HonStats::API.get_data("account_id", data).to_i
|
62
|
+
@name = HonStats::API.get_data("nickname", data).to_s
|
63
|
+
@created_at = Time.parse(HonStats::API.get_data("create_date", data).to_s)
|
64
|
+
@last_login = Time.parse(HonStats::API.get_data("last_login", data).to_s)
|
65
|
+
@last_activity = Time.parse(HonStats::API.get_data("last_activity", data).to_s)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Consilidated game stats
|
70
|
+
class GameStats
|
71
|
+
attr_reader :wins, :losses, :win_percentage, :disconnects, :time_played,
|
72
|
+
:level, :gold_earned, :gold_spent, :xp_earned, :actions_made,
|
73
|
+
:average_score, :xp_earned_per_minute, :gold_earned_per_minute,
|
74
|
+
:actions_per_minute, :average_game_length_in_seconds, :played,
|
75
|
+
:average_kills_per_game, :average_deaths_per_game,
|
76
|
+
:average_assists_per_game, :disconnect_percentage,
|
77
|
+
:average_xp_earned_per_game, :average_creep_kills_per_game,
|
78
|
+
:average_creep_denies_per_game, :concedes, :concede_votes,
|
79
|
+
:kicked, :pub_skill
|
80
|
+
|
81
|
+
def initialize(data, hero_stats, creep_stats)
|
82
|
+
@wins = HonStats::API.get_data("acc_wins", data).to_i
|
83
|
+
@losses = HonStats::API.get_data("acc_losses", data).to_i
|
84
|
+
@disconnects = HonStats::API.get_data("acc_discos", data).to_i
|
85
|
+
@played = @wins + @losses
|
86
|
+
@disconnect_percentage = "%.02f" % ((@disconnects.to_f / @played) * 100)
|
87
|
+
@win_percentage = "%.02f" % ((@wins.to_f / @played) * 100)
|
88
|
+
@time_played = HonStats::API.get_data("acc_secs", data).to_i
|
89
|
+
@level = HonStats::API.get_data("level", data).to_i
|
90
|
+
@gold_earned = HonStats::API.get_data("acc_gold", data).to_i
|
91
|
+
@gold_spent = HonStats::API.get_data("acc_gold_spent", data).to_i
|
92
|
+
@xp_earned = HonStats::API.get_data("acc_exp", data).to_i
|
93
|
+
@actions_made = HonStats::API.get_data("acc_actions", data).to_i
|
94
|
+
@average_score = HonStats::API.get_data("acc_avg_score", data).to_f
|
95
|
+
@concedes = HonStats::API.get_data("acc_concedes", data).to_i
|
96
|
+
@concede_votes = HonStats::API.get_data("acc_concedevotes", data).to_i
|
97
|
+
@kicked = HonStats::API.get_data("acc_kicked", data).to_i
|
98
|
+
@pub_skill = HonStats::API.get_data("acc_pub_skill", data).to_i
|
99
|
+
|
100
|
+
if @time_played > 0
|
101
|
+
minutes_played = @time_played / 60
|
102
|
+
@xp_earned_per_minute = "%.02f" % (@xp_earned.to_f / minutes_played.to_f)
|
103
|
+
@gold_earned_per_minute = "%.02f" % (@gold_earned.to_f / minutes_played.to_f)
|
104
|
+
@actions_per_minute = "%.02f" % (@actions_made.to_f / minutes_played.to_f)
|
105
|
+
|
106
|
+
@average_game_length_in_seconds = (@time_played.to_f / @played).to_i
|
107
|
+
|
108
|
+
@average_kills_per_game = "%.02f" % (hero_stats.kills.to_f / @played)
|
109
|
+
@average_deaths_per_game = "%.02f" % (hero_stats.deaths.to_f / @played)
|
110
|
+
@average_assists_per_game = "%.02f" % (hero_stats.assists.to_f / @played)
|
111
|
+
|
112
|
+
@average_xp_earned_per_game = "%.02f" % (@xp_earned.to_f / @played)
|
113
|
+
|
114
|
+
@average_creep_kills_per_game = "%.02f" % (creep_stats.kills.to_f / @played)
|
115
|
+
@average_creep_denies_per_game = "%.02f" % (creep_stats.denies.to_f / @played)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Consilidated clan info
|
121
|
+
class SimpleClan
|
122
|
+
attr_reader :id, :name, :tag, :rank, :icon
|
123
|
+
|
124
|
+
def initialize(data)
|
125
|
+
@id = HonStats::API.get_data("clan_id", data).to_i
|
126
|
+
@name = HonStats::API.get_data("name", data).to_s
|
127
|
+
@tag = HonStats::API.get_data("tag", data).to_s
|
128
|
+
@rank = HonStats::API.get_data("rank", data).to_s
|
129
|
+
@icon = HonStats::API.get_data("file_name", data).to_s
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Consilidated creep stats
|
134
|
+
class Creep
|
135
|
+
attr_reader :kills, :damage, :xp, :gold, :denies, :denied_xp, :kills_per_minute,
|
136
|
+
:xp_per_minute, :denies_per_minute, :denied_xp_per_minute
|
137
|
+
|
138
|
+
def initialize(data)
|
139
|
+
@kills = HonStats::API.get_data("acc_teamcreepkills", data).to_i
|
140
|
+
@damage = HonStats::API.get_data("acc_teamcreepdmg", data).to_i
|
141
|
+
@xp = HonStats::API.get_data("acc_teamcreepexp", data).to_i
|
142
|
+
@gold = HonStats::API.get_data("acc_teamcreepgold", data).to_i
|
143
|
+
@denies = HonStats::API.get_data("acc_denies", data).to_i
|
144
|
+
@denied_xp = HonStats::API.get_data("acc_exp_denied", data).to_i
|
145
|
+
|
146
|
+
minutes_played = HonStats::API.get_data("acc_secs", data).to_i / 60
|
147
|
+
@kills_per_minute = "%.02f" % (@kills.to_f / minutes_played.to_f)
|
148
|
+
@xp_per_minute = "%.02f" % (@xp.to_f / minutes_played.to_f)
|
149
|
+
@denies_per_minute = "%.02f" % (@denies.to_f / minutes_played.to_f)
|
150
|
+
@denied_xp_per_minute = "%.02f" % (@denied_xp.to_f / minutes_played.to_f)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Consilidated neutral creep stats
|
155
|
+
class Neutral
|
156
|
+
attr_reader :kills, :damage, :xp, :gold, :kills_per_minute, :xp_per_minute
|
157
|
+
|
158
|
+
def initialize(data)
|
159
|
+
@kills = HonStats::API.get_data("acc_neutralcreepkills", data).to_i
|
160
|
+
@damage = HonStats::API.get_data("acc_neutralcreepdmg", data).to_i
|
161
|
+
@xp = HonStats::API.get_data("acc_neutralcreepexp", data).to_i
|
162
|
+
@gold = HonStats::API.get_data("acc_neutralcreepgold", data).to_i
|
163
|
+
|
164
|
+
minutes_played = HonStats::API.get_data("acc_secs", data).to_i / 60
|
165
|
+
@kills_per_minute = "%.02f" % (@kills.to_f / minutes_played.to_f)
|
166
|
+
@xp_per_minute = "%.02f" % (@xp.to_f / minutes_played.to_f)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
# Consilidated hero stats
|
171
|
+
class Hero
|
172
|
+
attr_reader :kills, :damage, :xp, :gold, :assists, :deaths, :gold_lost,
|
173
|
+
:seconds_dead, :buybacks, :kills_per_minute, :xp_per_minute,
|
174
|
+
:time_dead_percentage, :assists_per_minute, :kill_death_ratio,
|
175
|
+
:consumables, :wards
|
176
|
+
|
177
|
+
def initialize(data)
|
178
|
+
@kills = HonStats::API.get_data("acc_herokills", data).to_i
|
179
|
+
@damage = HonStats::API.get_data("acc_herodmg", data).to_i
|
180
|
+
@xp = HonStats::API.get_data("acc_heroexp", data).to_i
|
181
|
+
@gold = HonStats::API.get_data("acc_herokillsgold", data).to_i
|
182
|
+
@assists = HonStats::API.get_data("acc_heroassists", data).to_i
|
183
|
+
@deaths = HonStats::API.get_data("acc_deaths", data).to_i
|
184
|
+
@gold_lost = HonStats::API.get_data("acc_goldlost2death", data).to_i
|
185
|
+
@seconds_dead = HonStats::API.get_data("acc_secs_dead", data).to_i
|
186
|
+
@buybacks = HonStats::API.get_data("acc_buybacks", data).to_i
|
187
|
+
@consumables = HonStats::API.get_data("acc_consumables", data).to_i
|
188
|
+
@wards = HonStats::API.get_data("acc_wards", data).to_i
|
189
|
+
|
190
|
+
seconds_played = HonStats::API.get_data("acc_secs", data).to_i
|
191
|
+
minutes_played = seconds_played / 60
|
192
|
+
@kills_per_minute = "%.02f" % (@kills.to_f / minutes_played.to_f)
|
193
|
+
@assists_per_minute = "%.02f" % (@assists.to_f / minutes_played.to_f)
|
194
|
+
@xp_per_minute = "%.02f" % (@xp.to_f / minutes_played.to_f)
|
195
|
+
@time_dead_percentage = "%.02f" % ((@seconds_dead.to_f / seconds_played.to_f) * 100)
|
196
|
+
@kill_death_ratio = "%.02f" % (@kills.to_f / @deaths.to_f)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Consilidated neutral creep stats
|
201
|
+
class Building
|
202
|
+
attr_reader :damage, :xp, :raized, :gold
|
203
|
+
|
204
|
+
def initialize(data)
|
205
|
+
@damage = HonStats::API.get_data("acc_bdmg", data).to_i
|
206
|
+
@xp = HonStats::API.get_data("acc_bdmgexp", data).to_i
|
207
|
+
@raized = HonStats::API.get_data("acc_razed", data).to_i
|
208
|
+
@gold = HonStats::API.get_data("acc_bgold", data).to_i
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Consilidated last match stats
|
213
|
+
class LastMatch
|
214
|
+
attr_reader :id, :date
|
215
|
+
|
216
|
+
def initialize(data)
|
217
|
+
@id = HonStats::API.get_data("match_id", data).to_i
|
218
|
+
@date = Time.parse(HonStats::API.get_data("mdt", data).to_s)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
class SearchCharacter < Character
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
module HonStats
|
5
|
+
module Classes
|
6
|
+
class Game
|
7
|
+
attr_reader :server_id, :session, :name, :class, :private, :modes,
|
8
|
+
:max_players, :tier, :official, :ip, :port, :players, :state,
|
9
|
+
:last_update, :location
|
10
|
+
|
11
|
+
alias_method :to_i, :server_id
|
12
|
+
alias_method :to_s, :name
|
13
|
+
|
14
|
+
def initialize(data)
|
15
|
+
@server_id = HonStats::API.get_data("server_id", data).to_i
|
16
|
+
@session = HonStats::API.get_data("session", data).to_s
|
17
|
+
@name = HonStats::API.get_data("mname", data).to_s
|
18
|
+
@class = HonStats::API.get_data("class", data).to_i
|
19
|
+
@private = HonStats::API.get_data("private", data).to_i
|
20
|
+
@max_players = (HonStats::API.get_data("max_players", data).to_i * 2)
|
21
|
+
@tier = HonStats::API.get_data("tier", data).to_i
|
22
|
+
@official = HonStats::API.get_data("officl", data).to_i
|
23
|
+
@ip = HonStats::API.get_data("ip", data).to_s
|
24
|
+
@port = HonStats::API.get_data("port", data).to_i
|
25
|
+
@players = HonStats::API.get_data("num_conn", data).to_i
|
26
|
+
@state = HonStats::API.get_data("c_state", data).to_i
|
27
|
+
@last_update = Time.parse(HonStats::API.get_data("last_upd", data).to_s)
|
28
|
+
@location = HonStats::API.get_data("location", data).to_s
|
29
|
+
@modes = Modes.new(data)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# Consilidated modes
|
35
|
+
class Modes
|
36
|
+
attr_reader :normal_mode, :single_draft, :random_draft, :death_match,
|
37
|
+
:league, :no_repick, :no_agility, :item_drop, :no_respawn_timer,
|
38
|
+
:no_swap, :no_intelligence, :alternate_picking, :no_strength,
|
39
|
+
:no_powerups, :duplicate_hero, :all_pick, :all_random,
|
40
|
+
:easy_mode, :rs, :no_leavers, :reverse_hero, :veto,
|
41
|
+
:shuffle_players
|
42
|
+
|
43
|
+
def initialize(data)
|
44
|
+
@normal_mode = HonStats::API.get_data("nm", data).to_i
|
45
|
+
@single_draft = HonStats::API.get_data("sd", data).to_i
|
46
|
+
@random_draft = HonStats::API.get_data("rd", data).to_i
|
47
|
+
@death_match = HonStats::API.get_data("dm", data).to_i
|
48
|
+
@league = HonStats::API.get_data("league", data).to_i
|
49
|
+
@no_repick = HonStats::API.get_data("no_repick", data).to_i
|
50
|
+
@no_agility = HonStats::API.get_data("no_agi", data).to_i
|
51
|
+
@item_drop = HonStats::API.get_data("drp_itm", data).to_i
|
52
|
+
@no_respawn_timer = HonStats::API.get_data("no_timer", data).to_i
|
53
|
+
@no_swapping = HonStats::API.get_data("no_swap", data).to_i
|
54
|
+
@no_intelligence = HonStats::API.get_data("no_int", data).to_i
|
55
|
+
@alternate_picking = HonStats::API.get_data("alt_pick", data).to_i
|
56
|
+
@no_strength = HonStats::API.get_data("no_str", data).to_i
|
57
|
+
@no_powerups = HonStats::API.get_data("no_pups", data).to_i
|
58
|
+
@duplicate_hero = HonStats::API.get_data("dup_h", data).to_i
|
59
|
+
@all_pick = HonStats::API.get_data("ap", data).to_i
|
60
|
+
@all_random = HonStats::API.get_data("ar", data).to_i
|
61
|
+
@easy_mode = HonStats::API.get_data("em", data).to_i
|
62
|
+
@rs = HonStats::API.get_data("rs", data).to_i
|
63
|
+
@no_leavers = HonStats::API.get_data("nl", data).to_i
|
64
|
+
@reverse_hero = HonStats::API.get_data("rev_hs", data).to_i
|
65
|
+
@veto = HonStats::API.get_data("veto", data).to_i
|
66
|
+
@shuffle_players = HonStats::API.get_data("shuf", data).to_i
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
module HonStats
|
5
|
+
module Classes
|
6
|
+
module Ignorelist
|
7
|
+
class Ignorelist
|
8
|
+
attr_reader :id, :ignores
|
9
|
+
alias_method :to_i, :id
|
10
|
+
|
11
|
+
def initialize(data)
|
12
|
+
if data[0]
|
13
|
+
ignores = []
|
14
|
+
data.each do |ignore|
|
15
|
+
ignores << Ignore.new(ignore)
|
16
|
+
end
|
17
|
+
@ignores = ignores
|
18
|
+
@id = HonStats::API.get_data("account_id", data[0]).to_i
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Ignore
|
25
|
+
attr_reader :account_id, :ignored_id, :nickname
|
26
|
+
|
27
|
+
def initialize(data)
|
28
|
+
@account_id = HonStats::API.get_data("account_id", data).to_i
|
29
|
+
@ignored_id = HonStats::API.get_data("ignored_id", data).to_i
|
30
|
+
@nickname = HonStats::API.get_data("nickname", data).to_s
|
31
|
+
# @reason = HonStats::API.get_data("reason", data).to_s
|
32
|
+
# @ignored_at = Time.parse(HonStats::API.get_data("ignore_date", data).to_s)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
module HonStats
|
5
|
+
module Classes
|
6
|
+
class Server
|
7
|
+
attr_reader :id, :session, :ip, :port
|
8
|
+
|
9
|
+
alias_method :to_i, :id
|
10
|
+
|
11
|
+
def initialize(data)
|
12
|
+
@id = HonStats::API.get_data("server_id", data).to_i
|
13
|
+
@session = HonStats::API.get_data("session", data).to_s
|
14
|
+
@ip = HonStats::API.get_data("ip", data).to_s
|
15
|
+
@port = HonStats::API.get_data("port", data).to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: honstats
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.7
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lloyd Pick
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-07-28 00:00:00 -03:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: HonStats is a Ruby library for extracting player statistics and other information from the Heroes of Newerth master server.
|
17
|
+
email: lloydpick@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- README
|
26
|
+
- lib/honstats.rb
|
27
|
+
- lib/honstats/character.rb
|
28
|
+
- lib/honstats/game.rb
|
29
|
+
- lib/honstats/server.rb
|
30
|
+
- lib/honstats/ban.rb
|
31
|
+
- lib/honstats/ignore.rb
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: https://github.com/lloydpick/hon-stats
|
34
|
+
licenses: []
|
35
|
+
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options:
|
38
|
+
- --inline-source
|
39
|
+
- --charset=UTF-8
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
version:
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
54
|
+
requirements: []
|
55
|
+
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 1.3.5
|
58
|
+
signing_key:
|
59
|
+
specification_version: 3
|
60
|
+
summary: HonStats is a Ruby Gem for extracting player statistics and other information from the Heroes of Newerth master server.
|
61
|
+
test_files: []
|
62
|
+
|