overlook-csgo 0.2.0

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +2 -0
  3. data/.gitignore +5 -0
  4. data/.rspec +2 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +3 -0
  7. data/Gemfile.lock +115 -0
  8. data/README.md +77 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +7 -0
  11. data/bin/setup +7 -0
  12. data/lib/overlook.rb +20 -0
  13. data/lib/overlook/bit_buffer.rb +52 -0
  14. data/lib/overlook/bit_reader.rb +64 -0
  15. data/lib/overlook/byte_reader.rb +58 -0
  16. data/lib/overlook/csgo.rb +9 -0
  17. data/lib/overlook/csgo/demo.rb +33 -0
  18. data/lib/overlook/csgo/demo/base.rb +20 -0
  19. data/lib/overlook/csgo/demo/command.rb +67 -0
  20. data/lib/overlook/csgo/demo/command_factory.rb +15 -0
  21. data/lib/overlook/csgo/demo/encrypted_data_handler.rb +16 -0
  22. data/lib/overlook/csgo/demo/game_event_list_message_handler.rb +19 -0
  23. data/lib/overlook/csgo/demo/game_event_message_handler.rb +35 -0
  24. data/lib/overlook/csgo/demo/header.rb +45 -0
  25. data/lib/overlook/csgo/demo/key_reader.rb +18 -0
  26. data/lib/overlook/csgo/demo/packet.rb +16 -0
  27. data/lib/overlook/csgo/demo/packet_factory.rb +22 -0
  28. data/lib/overlook/csgo/demo/packet_handler.rb +50 -0
  29. data/lib/overlook/csgo/demo/parser.rb +66 -0
  30. data/lib/overlook/csgo/demo/user_message_message_handler.rb +43 -0
  31. data/lib/overlook/csgo/match_info_decoder.rb +92 -0
  32. data/lib/overlook/csgo/sharecode_decoder.rb +83 -0
  33. data/lib/overlook/version.rb +3 -0
  34. data/lib/proto/.gitkeep +0 -0
  35. data/lib/proto/compiled/cstrike15_gcmessages.pb.rb +1382 -0
  36. data/lib/proto/compiled/cstrike15_usermessages.pb.rb +702 -0
  37. data/lib/proto/compiled/descriptor.pb.rb +280 -0
  38. data/lib/proto/compiled/netmessages.pb.rb +687 -0
  39. data/lib/proto/compiled/steammessages.pb.rb +798 -0
  40. data/overlook-csgo.gemspec +36 -0
  41. metadata +209 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4315287d2d511f86432769b0502b8c577f01f224
4
+ data.tar.gz: d01328bc2470a355e6518211c3edb7b44b9517a8
5
+ SHA512:
6
+ metadata.gz: 96719088e5dee74f35585db2972f95909004a068eaf351b5db4399f6985b3f2d6d3adfc7301eb326cabeb0d6575871032cc8a4ca0d5cb28549fec83d123cf9e2
7
+ data.tar.gz: ed622e5f5992827ddc2c2473a8183f2dcd5b55b5224c08c297fc5b97d6ae955e148ffbfb3639a248294e78f964c246afff232750d3f015a761026560e352a04b
data/.gitattributes ADDED
@@ -0,0 +1,2 @@
1
+ *.dem filter=lfs diff=lfs merge=lfs -text
2
+ *.dem.info filter=lfs diff=lfs merge=lfs -text
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ pkg/*
2
+ tmp/*
3
+ lib/proto/downloaded/*
4
+ .DS_Store
5
+ spec/.DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format progress
2
+ --color
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.3
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,115 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ overlook-csgo (0.2.0)
5
+ beefcake
6
+ steamidlib
7
+ wisper
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ addressable (2.4.0)
13
+ ast (2.2.0)
14
+ axiom-types (0.1.1)
15
+ descendants_tracker (~> 0.0.4)
16
+ ice_nine (~> 0.11.0)
17
+ thread_safe (~> 0.3, >= 0.3.1)
18
+ beefcake (1.1.0)
19
+ codeclimate-engine-rb (0.3.1)
20
+ virtus (~> 1.0)
21
+ coderay (1.1.1)
22
+ coercible (1.0.0)
23
+ descendants_tracker (~> 0.0.1)
24
+ colorize (0.7.7)
25
+ descendants_tracker (0.0.4)
26
+ thread_safe (~> 0.3, >= 0.3.1)
27
+ diff-lcs (1.2.5)
28
+ equalizer (0.0.11)
29
+ erubis (2.7.0)
30
+ ffi (1.9.10-java)
31
+ flay (2.7.0)
32
+ erubis (~> 2.7.0)
33
+ ruby_parser (~> 3.0)
34
+ sexp_processor (~> 4.0)
35
+ flog (4.3.2)
36
+ ruby_parser (~> 3.1, > 3.1.0)
37
+ sexp_processor (~> 4.4)
38
+ ice_nine (0.11.2)
39
+ launchy (2.4.3)
40
+ addressable (~> 2.3)
41
+ launchy (2.4.3-java)
42
+ addressable (~> 2.3)
43
+ spoon (~> 0.0.1)
44
+ method_source (0.8.2)
45
+ parser (2.3.0.6)
46
+ ast (~> 2.2)
47
+ pry (0.10.3)
48
+ coderay (~> 1.1.0)
49
+ method_source (~> 0.8.1)
50
+ slop (~> 3.4)
51
+ pry (0.10.3-java)
52
+ coderay (~> 1.1.0)
53
+ method_source (~> 0.8.1)
54
+ slop (~> 3.4)
55
+ spoon (~> 0.0)
56
+ rainbow (2.1.0)
57
+ rake (10.5.0)
58
+ reek (3.11)
59
+ codeclimate-engine-rb (~> 0.3.1)
60
+ parser (~> 2.3, >= 2.3.0.6)
61
+ rainbow (~> 2.0)
62
+ rspec (3.4.0)
63
+ rspec-core (~> 3.4.0)
64
+ rspec-expectations (~> 3.4.0)
65
+ rspec-mocks (~> 3.4.0)
66
+ rspec-core (3.4.3)
67
+ rspec-support (~> 3.4.0)
68
+ rspec-expectations (3.4.0)
69
+ diff-lcs (>= 1.2.0, < 2.0)
70
+ rspec-support (~> 3.4.0)
71
+ rspec-mocks (3.4.1)
72
+ diff-lcs (>= 1.2.0, < 2.0)
73
+ rspec-support (~> 3.4.0)
74
+ rspec-support (3.4.1)
75
+ ruby_parser (3.8.1)
76
+ sexp_processor (~> 4.1)
77
+ rubycritic (2.8.0)
78
+ colorize
79
+ flay (= 2.7.0)
80
+ flog (= 4.3.2)
81
+ launchy (= 2.4.3)
82
+ parser (~> 2.3)
83
+ reek (= 3.11)
84
+ ruby_parser (~> 3.8)
85
+ virtus (~> 1.0)
86
+ sexp_processor (4.7.0)
87
+ slop (3.6.0)
88
+ spoon (0.0.4)
89
+ ffi
90
+ steamidlib (1.0.1)
91
+ thread_safe (0.3.5)
92
+ thread_safe (0.3.5-java)
93
+ virtus (1.0.5)
94
+ axiom-types (~> 0.1)
95
+ coercible (~> 1.0)
96
+ descendants_tracker (~> 0.0, >= 0.0.3)
97
+ equalizer (~> 0.0, >= 0.0.9)
98
+ wisper (1.6.1)
99
+ yard (0.8.7.6)
100
+
101
+ PLATFORMS
102
+ java
103
+ ruby
104
+
105
+ DEPENDENCIES
106
+ bundler (~> 1.10)
107
+ overlook-csgo!
108
+ pry
109
+ rake (~> 10.0)
110
+ rspec
111
+ rubycritic
112
+ yard
113
+
114
+ BUNDLED WITH
115
+ 1.11.2
data/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # Overlook
2
+
3
+ Ruby access to CS:GO demo files.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'overlook'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install overlook
20
+
21
+ ## Usage
22
+
23
+ You can suscribe a plain ruby class to the parser to act on events
24
+ in the demo. Only a few events have been implemented.
25
+
26
+ ```ruby
27
+ class ReplayAnalyzerSubscriber
28
+ attr_reader :rank_events
29
+
30
+ def initialize()
31
+ @rank_events = []
32
+ end
33
+
34
+ # Fired whenever a rank change happens.
35
+ # The update event comes in the form
36
+ # { community_id: 'ABC', rank: 12 }
37
+ def rank_update(event)
38
+ self.rank_events << event
39
+ end
40
+
41
+ # Write the header to the db when it is fired from Overlook.
42
+ # The header contains the map name
43
+ #
44
+ # The header event comes in the form
45
+ # { map_name: 'cs_office' }
46
+ def header(header)
47
+ # do something with the header.map_name
48
+ end
49
+
50
+ # Called when the replay has been parsed successfully.
51
+ # Flush the user ranks to the repository
52
+ def done(data)
53
+ rank_events.each do |rank_update|
54
+ # do something
55
+ end
56
+ end
57
+ end
58
+
59
+
60
+ subscriber = ReplayAnalyzerSubscriber.new
61
+
62
+ demo = Overlook::Csgo::Demo.new(File.open('demo.dem'))
63
+ demo.subscribe(subscriber)
64
+ demo.parse
65
+ ```
66
+
67
+ You may also decompose sharecodes
68
+
69
+ ```ruby
70
+ Overlook.decode_share_code('CSGO-MXzcE-vo6oX-LuOhB-Vhn7m-xiHeB')
71
+ => {:matchid=>"3004024506927808536", :outcomeid=>"3004030760400191518", :tokenid=>"34492"}
72
+ ```
73
+
74
+ ## Contributing
75
+
76
+ Bug reports and pull requests are welcome on GitHub at https://github.com/taylorfinnell/overlook.
77
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'overlook'
5
+
6
+ require 'pry'
7
+ Pry.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/lib/overlook.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'overlook/version'
2
+ require 'overlook/csgo'
3
+
4
+ require 'overlook/bit_buffer'
5
+ require 'overlook/bit_reader'
6
+ require 'overlook/byte_reader'
7
+
8
+ require 'proto/compiled/descriptor.pb'
9
+ require 'proto/compiled/netmessages.pb'
10
+ require 'proto/compiled/cstrike15_usermessages.pb'
11
+ require 'proto/compiled/cstrike15_gcmessages.pb'
12
+
13
+ require 'steamidlib'
14
+
15
+ module Overlook
16
+ def self.decode_share_code(code)
17
+ decoder = Csgo::SharecodeDecoder.new(code)
18
+ decoder.decode
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ module Overlook
2
+ class BitBuffer
3
+ def initialize(io)
4
+ @io = io
5
+ @buffer = 0
6
+ @available = 0
7
+ end
8
+
9
+ def bytes(num)
10
+ @io.read(num)
11
+ end
12
+
13
+ def bits(numbits)
14
+ if numbits == 8 && @available == 0
15
+ byte = refresh_buffer
16
+ @available = 0
17
+ return byte
18
+ end
19
+
20
+ numbits.times.reduce(0) do |result, index|
21
+ refresh_buffer unless available_bits?
22
+ result |= getbit << index
23
+ end
24
+ end
25
+
26
+ def eof?
27
+ @io.eof?
28
+ end
29
+
30
+ def skip(n)
31
+ @io.seek(n, IO::SEEK_CUR)
32
+ end
33
+
34
+ private
35
+
36
+ def getbit
37
+ bit = (@buffer >> (8 - @available)) & 1
38
+ @available = @available.pred
39
+ bit
40
+ end
41
+
42
+ def available_bits?
43
+ @available != 0
44
+ end
45
+
46
+ def refresh_buffer
47
+ @buffer = @io.getbyte
48
+ @available = 8
49
+ @buffer
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,64 @@
1
+ module Overlook
2
+ class BitReader
3
+ def initialize(_buffer)
4
+ @buffer = BitBuffer.new(_buffer)
5
+ end
6
+
7
+ def bytes(n)
8
+ @buffer.bytes(n)
9
+ end
10
+
11
+ def bit
12
+ bits(1)
13
+ end
14
+
15
+ def byte
16
+ bits(8)
17
+ end
18
+
19
+ def skip(n)
20
+ @buffer.skip(n)
21
+ end
22
+
23
+ def short
24
+ ret = byte
25
+ ret |= byte << 8
26
+ end
27
+
28
+ def int32
29
+ ret = byte
30
+ ret |= byte << 8
31
+ ret |= byte << 16
32
+ ret |= byte << 24
33
+ end
34
+
35
+ def eof?
36
+ @buffer.eof?
37
+ end
38
+
39
+ def var_int32
40
+ var_int(4)
41
+ end
42
+
43
+ def var_int(max_len)
44
+ _byte = 0
45
+ count = 0
46
+ result = 0
47
+
48
+ loop do
49
+ return result if count + 1 == max_len
50
+ _byte = self.byte
51
+ result |= (_byte & 0x7F) << (7 * count)
52
+ count = count + 1
53
+ break if _byte & 0x80 == 0
54
+ end
55
+ result
56
+ end
57
+
58
+ private
59
+
60
+ def bits(numbits)
61
+ @buffer.bits(numbits)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,58 @@
1
+ require 'forwardable'
2
+
3
+ module Overlook
4
+ # Reads bytes from a given IO object.
5
+ class ByteReader
6
+ extend Forwardable
7
+
8
+ attr_reader :io
9
+
10
+ def initialize(io)
11
+ @io = io
12
+ end
13
+
14
+ def read_int64
15
+ io.read(8).unpack("C*").each_with_index.reduce(0) do |sum, (byte, index)|
16
+ sum + byte * (256 ** index)
17
+ end
18
+ end
19
+ alias :int64 :read_int64
20
+
21
+ def read_short
22
+ io.read(2).unpack('S*').first
23
+ end
24
+ alias :short :read_short
25
+
26
+ def string(len)
27
+ io.read(len)
28
+ end
29
+
30
+ def seek(len, type = IO::SEEK_CUR)
31
+ io.seek(len, type)
32
+ end
33
+
34
+ def float
35
+ @io.read(4).unpack('<e').first
36
+ end
37
+
38
+ def byte
39
+ io.read(1).ord
40
+ end
41
+
42
+ def char
43
+ byte.chr
44
+ end
45
+
46
+ def signed_int32
47
+ io.read(4).unpack('<l*').first
48
+ end
49
+
50
+ def signed_int16
51
+ io.read(2).unpack('<s*').first
52
+ end
53
+
54
+ def_delegator :@io, :read, :read
55
+ def_delegator :@io, :tell, :tell
56
+ def_delegator :@io, :lineno, :lineno
57
+ end
58
+ end