lolreplay 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.
- data/Gemfile.lock +10 -0
- data/README.md +231 -0
- data/lib/lolreplay.rb +5 -0
- data/lib/lolreplay/game.rb +38 -0
- data/lib/lolreplay/hash_method_accessor.rb +10 -0
- data/lib/lolreplay/player.rb +30 -0
- data/lib/lolreplay/string.rb +3 -0
- data/lolreplay.gemspec +16 -0
- metadata +54 -0
data/Gemfile.lock
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# LoL Replay Library
|
|
2
|
+
|
|
3
|
+
Greetings, summoners! (too cheesy?)
|
|
4
|
+
|
|
5
|
+
This is a Ruby library for accessing the end game metadata in .lrf files (LoL
|
|
6
|
+
Replay files). It's pretty small and simple at the moment and just makes life a
|
|
7
|
+
bit easier if you want to run some stats analysis on your LoL Replay files.
|
|
8
|
+
|
|
9
|
+
# Installation
|
|
10
|
+
|
|
11
|
+
Provided you have Ruby with RubyGems installed, installation is the standard gem
|
|
12
|
+
one liner:
|
|
13
|
+
|
|
14
|
+
$ gem install lolreplay
|
|
15
|
+
|
|
16
|
+
# Usage
|
|
17
|
+
|
|
18
|
+
The program under the bin directory should give you a little idea as to how this
|
|
19
|
+
library works. Here's another short example:
|
|
20
|
+
|
|
21
|
+
``` ruby
|
|
22
|
+
game = LolReplay::Game.new "path/to/lrffile.lrf"
|
|
23
|
+
|
|
24
|
+
samwho = game.player "Samwho"
|
|
25
|
+
|
|
26
|
+
samwho.kills
|
|
27
|
+
#=> the number of kills I had
|
|
28
|
+
|
|
29
|
+
samwho.largest_crit
|
|
30
|
+
#=> the largest crit I did
|
|
31
|
+
|
|
32
|
+
samwho.gold
|
|
33
|
+
#=> the amount of gold I earned
|
|
34
|
+
|
|
35
|
+
samwho.killing_spree
|
|
36
|
+
#=> the largest killing spree I had
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
LoL Replay files contain JSON metadata in them, all this library
|
|
40
|
+
does is read that metadata and expose it through some classes. I took a bit of a
|
|
41
|
+
shortcut when exposing the JSON data and made the method names the hash keys. So
|
|
42
|
+
there isn't a single method for each bit of data, the method names are
|
|
43
|
+
dynamically translated from underscored_names to camelCase and then fed to the
|
|
44
|
+
hash as a key.
|
|
45
|
+
|
|
46
|
+
The upside is that the library should stand the test of time. Provided the guys
|
|
47
|
+
at LoL Replay don't change where the JSON data is located in the file, this
|
|
48
|
+
library should be able to get at any new metadata added to the files.
|
|
49
|
+
|
|
50
|
+
The downside is that RDocs won't represent the library very well. So I'll
|
|
51
|
+
explain how to know where to find the data you want.
|
|
52
|
+
|
|
53
|
+
# What data can I access?
|
|
54
|
+
|
|
55
|
+
Here's some JSON output of a recent game I had:
|
|
56
|
+
|
|
57
|
+
``` json
|
|
58
|
+
{
|
|
59
|
+
"accountID": 12345678,
|
|
60
|
+
"clientHash": "6f7t2dcaga7hfg64g9433408s8defy6y",
|
|
61
|
+
"clientVersion": "1.0.0.130",
|
|
62
|
+
"dataIndex": [
|
|
63
|
+
{
|
|
64
|
+
"Key": "stream",
|
|
65
|
+
"Value": {
|
|
66
|
+
"offset": 0,
|
|
67
|
+
"size": 4367077
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"Key": "s0",
|
|
72
|
+
"Value": {
|
|
73
|
+
"offset": 4367077,
|
|
74
|
+
"size": 84609
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"Key": "s1",
|
|
79
|
+
"Value": {
|
|
80
|
+
"offset": 4451686,
|
|
81
|
+
"size": 109687
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"Key": "s2",
|
|
86
|
+
"Value": {
|
|
87
|
+
"offset": 4561373,
|
|
88
|
+
"size": 112188
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"Key": "s3",
|
|
93
|
+
"Value": {
|
|
94
|
+
"offset": 4673561,
|
|
95
|
+
"size": 132680
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"Key": "s4",
|
|
100
|
+
"Value": {
|
|
101
|
+
"offset": 4806241,
|
|
102
|
+
"size": 93201
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"Key": "s5",
|
|
107
|
+
"Value": {
|
|
108
|
+
"offset": 4899442,
|
|
109
|
+
"size": 107907
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"Key": "s6",
|
|
114
|
+
"Value": {
|
|
115
|
+
"offset": 5007349,
|
|
116
|
+
"size": 113622
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"encryptionKey": "tPsrrs4l8e0qqe3ly6ouut4p",
|
|
121
|
+
"firstWinBonus": 0,
|
|
122
|
+
"gameMode": 1,
|
|
123
|
+
"map": 2,
|
|
124
|
+
"matchID": 263521613,
|
|
125
|
+
"matchLength": 1849,
|
|
126
|
+
"matchType": 3,
|
|
127
|
+
"name": "YouSummonerName - ChampionName",
|
|
128
|
+
"players": [
|
|
129
|
+
{
|
|
130
|
+
"accountID": 23608408,
|
|
131
|
+
"assists": 8,
|
|
132
|
+
"barracks": 0,
|
|
133
|
+
"champion": "XinZhao",
|
|
134
|
+
"damageDealt": 49554,
|
|
135
|
+
"damageTaken": 22591,
|
|
136
|
+
"deaths": 7,
|
|
137
|
+
"elo": 0,
|
|
138
|
+
"eloChange": 0,
|
|
139
|
+
"gold": 5860,
|
|
140
|
+
"healed": 3375,
|
|
141
|
+
"item1": 1055,
|
|
142
|
+
"item2": 3006,
|
|
143
|
+
"item3": 3072,
|
|
144
|
+
"item4": 3086,
|
|
145
|
+
"killingSpree": 2,
|
|
146
|
+
"kills": 2,
|
|
147
|
+
"largestCrit": 389,
|
|
148
|
+
"largestMultiKill": 1,
|
|
149
|
+
"leaver": false,
|
|
150
|
+
"leaves": 8,
|
|
151
|
+
"level": 13,
|
|
152
|
+
"losses": 143,
|
|
153
|
+
"magicDamageDealt": 965,
|
|
154
|
+
"magicDamageTaken": 8270,
|
|
155
|
+
"minions": 69,
|
|
156
|
+
"neutralMinionsKilled": 6,
|
|
157
|
+
"physicalDamageDealt": 48589,
|
|
158
|
+
"physicalDamageTaken": 13535,
|
|
159
|
+
"profileIconId": 23,
|
|
160
|
+
"spell1": 3,
|
|
161
|
+
"spell2": 4,
|
|
162
|
+
"summoner": "ASummonerName",
|
|
163
|
+
"summonerLevel": 30,
|
|
164
|
+
"team": 2,
|
|
165
|
+
"timeDead": 195,
|
|
166
|
+
"turrets": 0,
|
|
167
|
+
"wins": 153,
|
|
168
|
+
"won": false
|
|
169
|
+
}],
|
|
170
|
+
"queueType": "NORMAL",
|
|
171
|
+
"ranked": false,
|
|
172
|
+
"region": "EUW",
|
|
173
|
+
"replayID": -1,
|
|
174
|
+
"replayVersion": "0.7.4.12",
|
|
175
|
+
"screenshots": [
|
|
176
|
+
{
|
|
177
|
+
"name": "s0",
|
|
178
|
+
"timestamp": 30052,
|
|
179
|
+
"type": ".jpg"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "s1",
|
|
183
|
+
"timestamp": 329992,
|
|
184
|
+
"type": ".jpg"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"name": "s2",
|
|
188
|
+
"timestamp": 630036,
|
|
189
|
+
"type": ".jpg"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"name": "s3",
|
|
193
|
+
"timestamp": 930077,
|
|
194
|
+
"type": ".jpg"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"name": "s4",
|
|
198
|
+
"timestamp": 1230186,
|
|
199
|
+
"type": ".jpg"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"name": "s5",
|
|
203
|
+
"timestamp": 1530203,
|
|
204
|
+
"type": ".jpg"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"name": "s6",
|
|
208
|
+
"timestamp": 1830247,
|
|
209
|
+
"type": ".jpg"
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
"serverAddress": "31.186.224.155",
|
|
213
|
+
"serverPort": 5158,
|
|
214
|
+
"spectatorMode": false,
|
|
215
|
+
"summonerName": "YourSummerName",
|
|
216
|
+
"teams": null,
|
|
217
|
+
"timestamp": 1323233142,
|
|
218
|
+
"winningTeam": 1
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
I've scrubbed any sensitive data and the names and timestamps have all been
|
|
223
|
+
changed, just in case I get in trouble.
|
|
224
|
+
|
|
225
|
+
Basically, you can access all of this. The LolReplay::Game object you create
|
|
226
|
+
will have this JSON inside it and whenever a method comes in, it will convert
|
|
227
|
+
the method name from an underscore_name to a camelCase name and use it as a key
|
|
228
|
+
to this hash.
|
|
229
|
+
|
|
230
|
+
To access the players, use the `players` method. Then you can access all of the
|
|
231
|
+
stuff you see for the example player up there. That's all there is to it :)
|
data/lib/lolreplay.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/hash_method_accessor'
|
|
2
|
+
require 'json'
|
|
3
|
+
|
|
4
|
+
module LolReplay
|
|
5
|
+
class Game
|
|
6
|
+
include ::HashMethodAccessor
|
|
7
|
+
attr_accessor :json, :path, :players
|
|
8
|
+
|
|
9
|
+
# Constructor takes a path to a .lrf file. The file path that it is given
|
|
10
|
+
# is read and the meta data is extracted for later use.
|
|
11
|
+
def initialize path
|
|
12
|
+
@path = path
|
|
13
|
+
|
|
14
|
+
@data = File.open(path) do |f|
|
|
15
|
+
f.read(4) # skip first four bytes
|
|
16
|
+
size = f.read(4).unpack("L").first
|
|
17
|
+
JSON.parse f.read(size), symbolize_names: true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@players = @data[:players].map { |p| Player.new p }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Gets a player by name. If the player was not present in this game, nil
|
|
24
|
+
# is returned.
|
|
25
|
+
#
|
|
26
|
+
# Example:
|
|
27
|
+
#
|
|
28
|
+
# puts game.player "Samwho"
|
|
29
|
+
# #=> #<LolReplay::Player:0x8317074>
|
|
30
|
+
def player name
|
|
31
|
+
@players.each do |player|
|
|
32
|
+
return player if player.name == name
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
nil
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/hash_method_accessor'
|
|
2
|
+
|
|
3
|
+
module LolReplay
|
|
4
|
+
class Player
|
|
5
|
+
include ::HashMethodAccessor
|
|
6
|
+
|
|
7
|
+
def initialize data
|
|
8
|
+
@data = data
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Alias for summoner
|
|
12
|
+
def name
|
|
13
|
+
@data[:summoner]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Alias for leaver
|
|
17
|
+
def leaver?
|
|
18
|
+
@data[:leaver]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Alias for won
|
|
22
|
+
def won?
|
|
23
|
+
@data[:won]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_s
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
data/lolreplay.gemspec
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Gem::Specification.new do |s|
|
|
2
|
+
s.name = %q{lolreplay}
|
|
3
|
+
s.version = "0.1"
|
|
4
|
+
s.date = %q{2011-12-11}
|
|
5
|
+
s.authors = ["Sam Rose"]
|
|
6
|
+
s.email = %q{samwho@lbak.co.uk}
|
|
7
|
+
s.summary = %q{A library for accessing the metadata of LoL Replay .lrf files.}
|
|
8
|
+
s.homepage = %q{http://github.com/samwho/lolreplay}
|
|
9
|
+
s.description = %q{Allows for access of the metadata in a LoL Replay .lrf file.}
|
|
10
|
+
s.required_ruby_version = '>= 1.9.2'
|
|
11
|
+
s.license = 'GPL-2'
|
|
12
|
+
|
|
13
|
+
# Add all files to the files parameter.
|
|
14
|
+
s.files = []
|
|
15
|
+
Dir["**/*.*"].each { |path| s.files.push path }
|
|
16
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: lolreplay
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: '0.1'
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Sam Rose
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2011-12-11 00:00:00.000000000Z
|
|
13
|
+
dependencies: []
|
|
14
|
+
description: Allows for access of the metadata in a LoL Replay .lrf file.
|
|
15
|
+
email: samwho@lbak.co.uk
|
|
16
|
+
executables: []
|
|
17
|
+
extensions: []
|
|
18
|
+
extra_rdoc_files: []
|
|
19
|
+
files:
|
|
20
|
+
- lolreplay.gemspec
|
|
21
|
+
- README.md
|
|
22
|
+
- lib/lolreplay/game.rb
|
|
23
|
+
- lib/lolreplay/string.rb
|
|
24
|
+
- lib/lolreplay/player.rb
|
|
25
|
+
- lib/lolreplay/hash_method_accessor.rb
|
|
26
|
+
- lib/lolreplay.rb
|
|
27
|
+
- lolreplay-0.1.gem
|
|
28
|
+
- Gemfile.lock
|
|
29
|
+
homepage: http://github.com/samwho/lolreplay
|
|
30
|
+
licenses:
|
|
31
|
+
- GPL-2
|
|
32
|
+
post_install_message:
|
|
33
|
+
rdoc_options: []
|
|
34
|
+
require_paths:
|
|
35
|
+
- lib
|
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
37
|
+
none: false
|
|
38
|
+
requirements:
|
|
39
|
+
- - ! '>='
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: 1.9.2
|
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
|
+
none: false
|
|
44
|
+
requirements:
|
|
45
|
+
- - ! '>='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
requirements: []
|
|
49
|
+
rubyforge_project:
|
|
50
|
+
rubygems_version: 1.8.6
|
|
51
|
+
signing_key:
|
|
52
|
+
specification_version: 3
|
|
53
|
+
summary: A library for accessing the metadata of LoL Replay .lrf files.
|
|
54
|
+
test_files: []
|