demo-reader 0.2.3 → 0.2.4

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/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