overlook-csgo 0.2.9 → 0.3.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87a7cd83f7ad143ebf6ce47b5cf32fb9e43769f0
4
- data.tar.gz: 37b4c303d2e4c3893f3b81eb7ebd581464c18d81
3
+ metadata.gz: ebb21e76a090cdede06e6dee594ef17bb3fb0b06
4
+ data.tar.gz: 24ba1f70ca0140d1a3809bc2b413acacbab47733
5
5
  SHA512:
6
- metadata.gz: 30216334445101d00fbb60ab18b8e0edc4db471cab11fbfc6e0152311f298c73045c5383d28b720a0c9471d0aac05affbeaf6e59dd41df8fc19c875b60fbc8eb
7
- data.tar.gz: 59c971f5ebb5069d6eefcc7217225d16a861637f5dacb1bdf06016c24f8008ec799823544abf67a516f6d04c11ddd05ff2b8d61a8892683803d2a741703d647e
6
+ metadata.gz: b478a8594315996bb718f0e8bdf458f66f5ed7658178dcdec6f4beec31bc8dc5ac969b36230d6cbd1227df909cd76e5d8f00cb699542ea3659f9dc2a3f9eef2b
7
+ data.tar.gz: a52bffacb6a71bb6e259983d1b7c9a912c6f5cf3fba47a5dc0f90e33b2e2f2601d1c06fd5b8292c3bbce13df5a8a333e1313ff456b7d1b29262955b7c4917fe7
data/.travis.yml CHANGED
@@ -17,4 +17,4 @@ before_install:
17
17
  - git-lfs/bin/git-lfs pull | cat
18
18
  install:
19
19
  - bundle
20
- script: rake spec:all
20
+ script: rake compile && rake spec:all
data/Rakefile CHANGED
@@ -6,3 +6,7 @@ load './lib/tasks/spec.rake'
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
8
  task default: 'spec:fast'
9
+
10
+ require 'rake/extensiontask'
11
+ spec = Gem::Specification.load('overlook-csgo.gemspec')
12
+ Rake::ExtensionTask.new('fast_byte_reader', spec)
data/bin/benchmark ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'overlook'
5
+ require 'benchmark'
6
+
7
+ class Subscriber
8
+ end
9
+
10
+ def parse
11
+ raise "give demo file as argument usage: ./bin/benchmark mydemo.dem" unless ARGV.first
12
+ @subscriber = Subscriber.new
13
+
14
+ @parser = Overlook::Csgo::Demo.open(File.open(ARGV.first))
15
+ @parser.subscribe(@subscriber)
16
+ @parser.parse
17
+ end
18
+
19
+ benchmark = Benchmark.realtime do
20
+ 50.times { parse }
21
+ end
22
+ puts benchmark
@@ -0,0 +1,4 @@
1
+ require 'mkmf'
2
+ extension_name = 'fast_byte_reader'
3
+ dir_config(extension_name)
4
+ create_makefile(extension_name)
@@ -0,0 +1,90 @@
1
+ #include <ruby.h>
2
+
3
+ static VALUE fast_byte_reader_initialize(VALUE fbr, VALUE io);
4
+ static VALUE fast_byte_reader_read(VALUE fbr, int len);
5
+ static VALUE fast_byte_reader_seek(VALUE fbr, VALUE pos);
6
+ static VALUE fast_byte_reader_byte(VALUE fbr);
7
+ static VALUE fast_byte_reader_var_int32(VALUE fbr);
8
+ static VALUE fast_byte_reader_eof(VALUE fbr);
9
+ static VALUE fast_byte_reader_close(VALUE fbr);
10
+
11
+ static ID id_read, id_write;
12
+
13
+ VALUE fast_byte_reader_initialize(VALUE obj, VALUE arg) {
14
+ if(rb_respond_to(arg, rb_intern("read"))) {
15
+ rb_funcall(arg, rb_intern("binmode"), 0);
16
+ rb_iv_set(obj, "@io", arg);
17
+ } else {
18
+ rb_raise(rb_eTypeError, "IO required to init FastByteReader");
19
+ }
20
+ return obj;
21
+ }
22
+
23
+ VALUE fast_byte_reader_read(VALUE obj, int len) {
24
+ VALUE io = rb_iv_get(obj, "@io");
25
+ VALUE string = rb_funcall(io, id_read, 1, len);
26
+ return string;
27
+ }
28
+
29
+ VALUE fast_byte_reader_byte(VALUE obj) {
30
+ VALUE io = rb_iv_get(obj, "@io");
31
+ VALUE string = rb_funcall(io, rb_intern("getbyte"), 0);
32
+ return string;
33
+ }
34
+
35
+ VALUE fast_byte_reader_seek(VALUE obj, VALUE pos) {
36
+ VALUE io = rb_iv_get(obj, "@io");
37
+ return rb_funcall(io, rb_intern("seek"), 2, pos, INT2FIX(1));
38
+ }
39
+
40
+ static VALUE fast_byte_reader_var_int32(VALUE fbr) {
41
+ unsigned long long int_val = 0;
42
+ unsigned shift = 0;
43
+ unsigned char byte;
44
+ unsigned int count = 0;
45
+
46
+ while (1) {
47
+ if((count + 1) == 4) {
48
+ return INT2NUM(int_val);
49
+ }
50
+ if (shift >= 64) {
51
+ rb_raise(rb_eArgError, "too many bytes when decoding varint");
52
+ }
53
+ byte = (unsigned char)NUM2INT(fast_byte_reader_byte(fbr));
54
+ int_val |= ((unsigned long long)(byte & 0x7f)) << shift;
55
+ shift += 7;
56
+ count = count + 1;
57
+ if ((byte & 0x80) == 0) {
58
+ return INT2NUM(int_val);
59
+ }
60
+ }
61
+ }
62
+
63
+ VALUE fast_byte_reader_eof(VALUE obj) {
64
+ VALUE io = rb_iv_get(obj, "@io");
65
+ VALUE eof = rb_funcall(io, rb_intern("eof?"), 0);
66
+ return eof;
67
+ }
68
+
69
+ VALUE fast_byte_reader_close(VALUE obj) {
70
+ VALUE io = rb_iv_get(obj, "@io");
71
+ VALUE close = rb_funcall(io, rb_intern("close"), 0);
72
+ return close;
73
+ }
74
+
75
+ void Init_fast_byte_reader()
76
+ {
77
+ id_read = rb_intern("read");
78
+ static VALUE klass;
79
+
80
+ klass = rb_define_class("FastByteReader", rb_cObject);
81
+
82
+ rb_define_attr(klass, "io", 1, 1);
83
+ rb_define_method(klass, "initialize", fast_byte_reader_initialize, 1);
84
+ rb_define_method(klass, "read", fast_byte_reader_read, 1);
85
+ rb_define_method(klass, "byte", fast_byte_reader_byte, 0);
86
+ rb_define_method(klass, "seek", fast_byte_reader_seek, 1);
87
+ rb_define_method(klass, "var_int32", fast_byte_reader_var_int32, 0);
88
+ rb_define_method(klass, "eof?", fast_byte_reader_eof, 0);
89
+ rb_define_method(klass, "close", fast_byte_reader_close, 0);
90
+ }
Binary file
@@ -54,5 +54,6 @@ module Overlook
54
54
  def_delegator :@io, :read, :read
55
55
  def_delegator :@io, :tell, :tell
56
56
  def_delegator :@io, :lineno, :lineno
57
+ def_delegator :@io, :close, :close
57
58
  end
58
59
  end
@@ -19,7 +19,7 @@ module Overlook
19
19
  end
20
20
 
21
21
  def handle(packet)
22
- reader = BitReader.new(packet.data)
22
+ reader = FastByteReader.new(packet.data)
23
23
 
24
24
  loop do
25
25
  message_type = reader.var_int32
@@ -27,19 +27,22 @@ module Overlook
27
27
 
28
28
  handler = handlers[message_type]
29
29
  if handler && handle?(handler)
30
- handler.handle(reader.bytes(message_size))
30
+ handler.handle(reader.read(message_size))
31
31
  else
32
- reader.skip(message_size)
32
+ reader.seek(message_size)
33
33
  end
34
34
 
35
- break if reader.eof?
35
+ if reader.eof?
36
+ reader.close
37
+ break
38
+ end
36
39
  end
37
40
  end
38
41
 
39
42
  private
40
43
 
41
44
  def handlers
42
- {
45
+ @handlers ||= {
43
46
  ::Csgo::SVC_Messages::Svc_UserMessage => UserMessageMessageHandler.new(parser),
44
47
  ::Csgo::SVC_Messages::Svc_GameEventList => GameEventListMessageHandler.new(parser),
45
48
  ::Csgo::SVC_Messages::Svc_GameEvent => GameEventMessageHandler.new(parser),
@@ -39,6 +39,7 @@ module Overlook
39
39
 
40
40
  def done
41
41
  emit(:done)
42
+ @reader.close
42
43
  true
43
44
  end
44
45
 
@@ -1,3 +1,3 @@
1
1
  module Overlook
2
- VERSION = '0.2.9'.freeze
2
+ VERSION = '0.3.0.pre1'.freeze
3
3
  end
data/lib/overlook.rb CHANGED
@@ -9,6 +9,8 @@ require 'overlook/bit_buffer'
9
9
  require 'overlook/bit_reader'
10
10
  require 'overlook/byte_reader'
11
11
 
12
+ require 'fast_byte_reader'
13
+
12
14
  module Overlook
13
15
  def self.decode_share_code(code)
14
16
  decoder = Csgo::SharecodeDecoder.new(code)
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
22
+ spec.extensions << "ext/fast_byte_reader/extconf.rb"
23
+
22
24
  spec.required_ruby_version = '>= 2.3.1'
23
25
 
24
26
  # For protobuf
@@ -39,4 +41,5 @@ Gem::Specification.new do |spec|
39
41
  spec.add_development_dependency 'pry', '~> 0.10.4'
40
42
  spec.add_development_dependency 'yard', '~> 0.9.5'
41
43
  spec.add_development_dependency 'rubycritic', '~> 3.0'
44
+ spec.add_development_dependency 'rake-compiler'
42
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: overlook-csgo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.3.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taylor Finnell
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-11-26 00:00:00.000000000 Z
11
+ date: 2017-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: beefcake
@@ -150,11 +150,26 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '3.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rake-compiler
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  description: Ruby access to CS:GO demo files.
154
168
  email:
155
169
  - tmfinnell@gmail.com
156
170
  executables: []
157
- extensions: []
171
+ extensions:
172
+ - ext/fast_byte_reader/extconf.rb
158
173
  extra_rdoc_files: []
159
174
  files:
160
175
  - ".gitattributes"
@@ -165,8 +180,12 @@ files:
165
180
  - LICENSE
166
181
  - README.md
167
182
  - Rakefile
183
+ - bin/benchmark
168
184
  - bin/console
169
185
  - bin/setup
186
+ - ext/fast_byte_reader/extconf.rb
187
+ - ext/fast_byte_reader/fast_byte_reader.c
188
+ - lib/fast_byte_reader.bundle
170
189
  - lib/overlook.rb
171
190
  - lib/overlook/bit_buffer.rb
172
191
  - lib/overlook/bit_reader.rb
@@ -206,9 +225,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
206
225
  version: 2.3.1
207
226
  required_rubygems_version: !ruby/object:Gem::Requirement
208
227
  requirements:
209
- - - ">="
228
+ - - ">"
210
229
  - !ruby/object:Gem::Version
211
- version: '0'
230
+ version: 1.3.1
212
231
  requirements: []
213
232
  rubyforge_project:
214
233
  rubygems_version: 2.5.1