lloydpick-honstats 0.0.6

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 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
@@ -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,217 @@
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
79
+
80
+ def initialize(data, hero_stats, creep_stats)
81
+ @wins = HonStats::API.get_data("acc_wins", data).to_i
82
+ @losses = HonStats::API.get_data("acc_losses", data).to_i
83
+ @disconnects = HonStats::API.get_data("acc_discos", data).to_i
84
+ @played = @wins + @losses
85
+ @disconnect_percentage = "%.02f" % ((@disconnects.to_f / @played) * 100)
86
+ @win_percentage = "%.02f" % ((@wins.to_f / @played) * 100)
87
+ @time_played = HonStats::API.get_data("acc_secs", data).to_i
88
+ @level = HonStats::API.get_data("level", data).to_i
89
+ @gold_earned = HonStats::API.get_data("acc_gold", data).to_i
90
+ @gold_spent = HonStats::API.get_data("acc_gold_spent", data).to_i
91
+ @xp_earned = HonStats::API.get_data("acc_exp", data).to_i
92
+ @actions_made = HonStats::API.get_data("acc_actions", data).to_i
93
+ @average_score = HonStats::API.get_data("acc_avg_score", data).to_f
94
+
95
+ if @time_played > 0
96
+ minutes_played = @time_played / 60
97
+ @xp_earned_per_minute = "%.02f" % (@xp_earned.to_f / minutes_played.to_f)
98
+ @gold_earned_per_minute = "%.02f" % (@gold_earned.to_f / minutes_played.to_f)
99
+ @actions_per_minute = "%.02f" % (@actions_made.to_f / minutes_played.to_f)
100
+
101
+ @average_game_length_in_seconds = (@time_played.to_f / @played).to_i
102
+
103
+ @average_kills_per_game = "%.02f" % (hero_stats.kills.to_f / @played)
104
+ @average_deaths_per_game = "%.02f" % (hero_stats.deaths.to_f / @played)
105
+ @average_assists_per_game = "%.02f" % (hero_stats.assists.to_f / @played)
106
+
107
+ @average_xp_earned_per_game = "%.02f" % (@xp_earned.to_f / @played)
108
+
109
+ @average_creep_kills_per_game = "%.02f" % (creep_stats.kills.to_f / @played)
110
+ @average_creep_denies_per_game = "%.02f" % (creep_stats.denies.to_f / @played)
111
+ end
112
+ end
113
+ end
114
+
115
+ # Consilidated clan info
116
+ class SimpleClan
117
+ attr_reader :id, :name, :tag, :rank, :icon
118
+
119
+ def initialize(data)
120
+ @id = HonStats::API.get_data("clan_id", data).to_i
121
+ @name = HonStats::API.get_data("name", data).to_s
122
+ @tag = HonStats::API.get_data("tag", data).to_s
123
+ @rank = HonStats::API.get_data("rank", data).to_s
124
+ @icon = HonStats::API.get_data("file_name", data).to_s
125
+ end
126
+ end
127
+
128
+ # Consilidated creep stats
129
+ class Creep
130
+ attr_reader :kills, :damage, :xp, :gold, :denies, :denied_xp, :kills_per_minute,
131
+ :xp_per_minute, :denies_per_minute, :denied_xp_per_minute
132
+
133
+ def initialize(data)
134
+ @kills = HonStats::API.get_data("acc_teamcreepkills", data).to_i
135
+ @damage = HonStats::API.get_data("acc_teamcreepdmg", data).to_i
136
+ @xp = HonStats::API.get_data("acc_teamcreepexp", data).to_i
137
+ @gold = HonStats::API.get_data("acc_teamcreepgold", data).to_i
138
+ @denies = HonStats::API.get_data("acc_denies", data).to_i
139
+ @denied_xp = HonStats::API.get_data("acc_exp_denied", data).to_i
140
+
141
+ minutes_played = HonStats::API.get_data("acc_secs", data).to_i / 60
142
+ @kills_per_minute = "%.02f" % (@kills.to_f / minutes_played.to_f)
143
+ @xp_per_minute = "%.02f" % (@xp.to_f / minutes_played.to_f)
144
+ @denies_per_minute = "%.02f" % (@denies.to_f / minutes_played.to_f)
145
+ @denied_xp_per_minute = "%.02f" % (@denied_xp.to_f / minutes_played.to_f)
146
+ end
147
+ end
148
+
149
+ # Consilidated neutral creep stats
150
+ class Neutral
151
+ attr_reader :kills, :damage, :xp, :gold, :kills_per_minute, :xp_per_minute
152
+
153
+ def initialize(data)
154
+ @kills = HonStats::API.get_data("acc_neutralcreepkills", data).to_i
155
+ @damage = HonStats::API.get_data("acc_neutralcreepdmg", data).to_i
156
+ @xp = HonStats::API.get_data("acc_neutralcreepexp", data).to_i
157
+ @gold = HonStats::API.get_data("acc_neutralcreepgold", data).to_i
158
+
159
+ minutes_played = HonStats::API.get_data("acc_secs", data).to_i / 60
160
+ @kills_per_minute = "%.02f" % (@kills.to_f / minutes_played.to_f)
161
+ @xp_per_minute = "%.02f" % (@xp.to_f / minutes_played.to_f)
162
+ end
163
+ end
164
+
165
+ # Consilidated hero stats
166
+ class Hero
167
+ attr_reader :kills, :damage, :xp, :gold, :assists, :deaths, :gold_lost,
168
+ :seconds_dead, :buybacks, :kills_per_minute, :xp_per_minute,
169
+ :time_dead_percentage, :assists_per_minute, :kill_death_ratio
170
+
171
+ def initialize(data)
172
+ @kills = HonStats::API.get_data("acc_herokills", data).to_i
173
+ @damage = HonStats::API.get_data("acc_herodmg", data).to_i
174
+ @xp = HonStats::API.get_data("acc_heroexp", data).to_i
175
+ @gold = HonStats::API.get_data("acc_herokillsgold", data).to_i
176
+ @assists = HonStats::API.get_data("acc_heroassists", data).to_i
177
+ @deaths = HonStats::API.get_data("acc_deaths", data).to_i
178
+ @gold_lost = HonStats::API.get_data("acc_goldlost2death", data).to_i
179
+ @seconds_dead = HonStats::API.get_data("acc_secs_dead", data).to_i
180
+ @buybacks = HonStats::API.get_data("acc_buybacks", data).to_i
181
+
182
+ seconds_played = HonStats::API.get_data("acc_secs", data).to_i
183
+ minutes_played = seconds_played / 60
184
+ @kills_per_minute = "%.02f" % (@kills.to_f / minutes_played.to_f)
185
+ @assists_per_minute = "%.02f" % (@assists.to_f / minutes_played.to_f)
186
+ @xp_per_minute = "%.02f" % (@xp.to_f / minutes_played.to_f)
187
+ @time_dead_percentage = "%.02f" % ((@seconds_dead.to_f / seconds_played.to_f) * 100)
188
+ @kill_death_ratio = "%.02f" % (@kills.to_f / @deaths.to_f)
189
+ end
190
+ end
191
+
192
+ # Consilidated neutral creep stats
193
+ class Building
194
+ attr_reader :damage, :xp, :raized, :gold
195
+
196
+ def initialize(data)
197
+ @damage = HonStats::API.get_data("acc_bdmg", data).to_i
198
+ @xp = HonStats::API.get_data("acc_bdmgexp", data).to_i
199
+ @raized = HonStats::API.get_data("acc_razed", data).to_i
200
+ @gold = HonStats::API.get_data("acc_bgold", data).to_i
201
+ end
202
+ end
203
+
204
+ # Consilidated last match stats
205
+ class LastMatch
206
+ attr_reader :id, :date
207
+
208
+ def initialize(data)
209
+ @id = HonStats::API.get_data("match_id", data).to_i
210
+ @date = Time.parse(HonStats::API.get_data("mdt", data).to_s)
211
+ end
212
+ end
213
+
214
+ class SearchCharacter < Character
215
+ end
216
+ end
217
+ 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
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
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lloydpick-honstats
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ platform: ruby
6
+ authors:
7
+ - Lloyd Pick
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-07-08 00:00:00 -07: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
28
+ - lib/honstats/character.rb
29
+ - lib/honstats/game.rb
30
+ - lib/honstats/server.rb
31
+ - lib/honstats/ban.rb
32
+ - lib/honstats/ignore.rb
33
+ has_rdoc: false
34
+ homepage: https://github.com/lloydpick/hon-stats
35
+ post_install_message:
36
+ rdoc_options:
37
+ - --inline-source
38
+ - --charset=UTF-8
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ requirements: []
54
+
55
+ rubyforge_project:
56
+ rubygems_version: 1.2.0
57
+ signing_key:
58
+ specification_version: 2
59
+ summary: HonStats is a Ruby Gem for extracting player statistics and other information from the Heroes of Newerth master server.
60
+ test_files: []
61
+