demo-reader 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.2.4
data/demo-reader.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{demo-reader}
8
- s.version = "0.2.3"
8
+ s.version = "0.2.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["aekym"]
12
- s.date = %q{2010-11-01}
12
+ s.date = %q{2010-12-19}
13
13
  s.description = %q{A library to read warsow demo files (.wd8, .wd9, .wd10, .wd11 files) and q3 demo files (*.dm68)}
14
14
  s.email = %q{me@aekym.com}
15
15
  s.extensions = ["ext/dm68/extconf.rb"]
@@ -42,6 +42,7 @@ Gem::Specification.new do |s|
42
42
  "lib/demo_reader_warsow.rb",
43
43
  "test/fixtures/defrag/dm_68/cpm/pornchronostar_mdf.cpm_00.49.216_tyaz.germany.dm_68",
44
44
  "test/fixtures/defrag/dm_68/cpm/puremotion_df.cpm_00.10.600_eS-Rody.russia.dm_68",
45
+ "test/fixtures/defrag/dm_68/vq3/cyfio-df_mdf.vq3_06.25.832_rlxmini.CountryHere.dm_68",
45
46
  "test/fixtures/defrag/dm_68/vq3/runkull2_df.vq3_01.05.904_XunderBIRD.Germany.dm_68",
46
47
  "test/fixtures/defrag/dm_68/vq3/un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru.dm_68",
47
48
  "test/fixtures/warsow/wd10/racesow_0.42.b2/dinirun2_racesow_0.42.b2.wd10",
@@ -1,5 +1,6 @@
1
1
  require 'yaml'
2
2
  require 'dm68'
3
+ require 'active_support/core_ext/object'
3
4
 
4
5
  class DemoReaderDefrag
5
6
  attr_reader :filename, :version, :mapname, :time, :playernames, :scoreboards, :game, :gamemode, :player, :basegamedir, :gamedir, :valid
@@ -37,15 +38,17 @@ class DemoReaderDefrag
37
38
  @version = @raw['server_info']['protocol'].to_i
38
39
  @mapname = @raw['server_info']['mapname'].downcase
39
40
 
40
- # @playernames = []
41
41
  @scoreboards = @raw['prints']
42
42
  @basegamedir = @raw['server_info']['gamename']
43
43
  @gamedir = @raw['system_info']['fs_game']
44
44
 
45
45
  if @raw['server_info']['defrag_vers'].to_i > 0
46
46
  @gamemode = @raw['server_info']['df_promode'].to_i.zero? ? 'vq3' : 'cpm'
47
- @time = extract_time(@raw['prints'])
48
- @player = extract_player(@raw['prints'])
47
+
48
+ time_hint = extract_time_from_filename(@filename)
49
+ @time = extract_time(@raw['prints'], time_hint)
50
+
51
+ @player = extract_player(@raw['prints'], @time)
49
52
  @playernames << @player # just support one player atm
50
53
  end
51
54
 
@@ -68,40 +71,71 @@ class DemoReaderDefrag
68
71
 
69
72
  protected
70
73
 
74
+ def guessable_time(time)
75
+ time = time.sub(/^[0:\.]*/, "") # remove empty min, sec, etc
76
+ parts = time.split(/\.|:/).map(&:to_i)
77
+
78
+ format_str = case parts.size
79
+ when 3 then "%d:%02d:%03d"
80
+ when 2 then "%02d:%03d"
81
+ end
82
+
83
+ format_str % parts
84
+ end
85
+
71
86
  # extract player from server prints
72
87
  # supports only one player atm otherwise raises an exception
73
88
  #
74
- def extract_player(prints)
89
+ def extract_player(prints, time)
90
+ time = guessable_time(time)
91
+
75
92
  players = prints.inject([]) do |arr,p|
76
- arr << $1 if p =~ /^(.+)\^7 reached the finish line/
77
- arr << $1 if p =~ /^Time performed by (.+)\^7 :/
93
+ arr << $1 if p =~ /^(.+)\^7 reached the finish line in \^\d#{time}/
94
+ arr << $1 if p =~ /^Time performed by (.+)\^7 : \^\d#{time}/
78
95
  arr
79
96
  end
80
97
 
81
- raise "Not only one player was found #{players.inspect}." if players.length != 1
98
+ raise "No player was found." if players.empty?
99
+ raise "Not only one player was found #{players.inspect}." if players.size > 1
82
100
 
83
101
  players.first
84
102
  end
85
103
 
104
+
105
+ def extract_time_from_filename(filename)
106
+ $1 if File.basename(filename) =~ /(\d{2}\.\d{2}\.\d{3})/
107
+ end
108
+
86
109
  # extract time from server prints
87
110
  # supports only one time atm otherwise raises an exception
88
111
  #
89
- def extract_time(prints)
112
+ def extract_time(prints, time_hint)
90
113
  times = prints.inject([]) do |arr,p|
91
- arr << $1 if p =~ /(\^[0-9]+:[\^:0-9]+)/
114
+ arr << normalize_time(plain_text($1)) if p =~ /(\^[0-9]+:[\^:0-9]+)/
92
115
  arr
93
116
  end
94
117
 
95
- raise "Not only one time was found #{times.inspect}." if times.length != 1
118
+ raise "No time was found." if times.empty?
119
+ return times.first if times.one?
96
120
 
97
- time = plain_text(times.first)
121
+ # multiple times found
122
+ # try to guess time by hint
123
+ #
124
+ time_hint = normalize_time(time_hint) if time_hint.present?
125
+ return time_hint if times.member?(time_hint)
98
126
 
99
- time = "0:#{time}" if time.count(":") < 2
100
- "%02d:%02d.%03d" % time.split(":").map(&:to_i)
127
+ raise "Not only one time was found #{times.inspect}."
101
128
  end
102
129
 
103
130
  def plain_text(text)
104
131
  text.gsub(/\^\d/, '')
105
132
  end
133
+
134
+ def normalize_time(time_str)
135
+ parts = time_str.split(/\.|:/)
136
+ parts.unshift(0) if parts.size < 3
137
+
138
+ "%02d:%02d.%03d" % parts.map(&:to_i)
139
+ end
106
140
  end
107
141
 
@@ -15,7 +15,7 @@ class DemoReaderDefragDm68CpmTest < Test::Unit::TestCase
15
15
 
16
16
  file, map, time, player = entry
17
17
 
18
- define_method "test_warsow_wd#{version}_demo_#{file.gsub(/[^a-z_0-9]/, "_")}" do
18
+ define_method "test_defrag_dm_#{version}_demo_#{file.gsub(/[^a-z_0-9]/, "_")}" do
19
19
  demo = DemoReader.parse("test/fixtures/defrag/dm_#{version}/#{gamemode}/#{file}.dm_#{version}")
20
20
 
21
21
  assert demo.valid
@@ -9,12 +9,13 @@ class DemoReaderDefragDm68Vq3Test < Test::Unit::TestCase
9
9
 
10
10
  [
11
11
  %w(runkull2_df.vq3_01.05.904_XunderBIRD.Germany runkull2 01:05.904 ^2XunderBIRD),
12
- %w(un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru un-dead029 00:16.912 ^2uN-DeaD!WiNTeR)
12
+ %w(un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru un-dead029 00:16.912 ^2uN-DeaD!WiNTeR),
13
+ %w(cyfio-df_mdf.vq3_06.25.832_rlxmini.CountryHere cyfio-df 06:25.832 r^1l^7x^0|^7m^1i^7n^1i)
13
14
  ].each do |entry|
14
15
 
15
16
  file, map, time, player = entry
16
17
 
17
- define_method "test_warsow_wd#{version}_demo_#{file.gsub(/[^a-z_0-9]/, "_")}" do
18
+ define_method "test_defrag_dm_#{version}_demo_#{file.gsub(/[^a-z_0-9]/, "_")}" do
18
19
  demo = DemoReader.parse("test/fixtures/defrag/dm_#{version}/#{gamemode}/#{file}.dm_#{version}")
19
20
 
20
21
  assert demo.valid
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: demo-reader
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 3
10
- version: 0.2.3
9
+ - 4
10
+ version: 0.2.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - aekym
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-01 00:00:00 +01:00
18
+ date: 2010-12-19 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -53,6 +53,7 @@ files:
53
53
  - lib/demo_reader_warsow.rb
54
54
  - test/fixtures/defrag/dm_68/cpm/pornchronostar_mdf.cpm_00.49.216_tyaz.germany.dm_68
55
55
  - test/fixtures/defrag/dm_68/cpm/puremotion_df.cpm_00.10.600_eS-Rody.russia.dm_68
56
+ - test/fixtures/defrag/dm_68/vq3/cyfio-df_mdf.vq3_06.25.832_rlxmini.CountryHere.dm_68
56
57
  - test/fixtures/defrag/dm_68/vq3/runkull2_df.vq3_01.05.904_XunderBIRD.Germany.dm_68
57
58
  - test/fixtures/defrag/dm_68/vq3/un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru.dm_68
58
59
  - test/fixtures/warsow/wd10/racesow_0.42.b2/dinirun2_racesow_0.42.b2.wd10