urbanterror_stats 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ games.log
19
+ .DS_Store
20
+ *.swp
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@urbanterror_stats
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in urbanterror_stats.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Tommaso Visconti
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # UrbanterrorStats
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'urbanterror_stats'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install urbanterror_stats
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new('spec')
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.push File.join(File.dirname(__FILE__), "/../lib" )
3
+
4
+ require 'urbanterror_stats'
5
+
6
+ @ut_stats = UrbanterrorStats::Base.new(ARGV[0])
7
+ @ut_stats.start
@@ -0,0 +1,46 @@
1
+ Given /^I am started$/ do
2
+ @ut_stats = UrbanterrorStats::Base.new("spec/support/games.log")
3
+ end
4
+
5
+ When /^I find the logfile$/ do
6
+ @ut_stats.logfile.should_not be_nil
7
+ end
8
+
9
+ Then /^I start analyzing the logfile$/ do
10
+ @ut_stats.start
11
+ end
12
+
13
+ ########
14
+
15
+ Given /^I have a valid game log$/ do
16
+ @ut_stats = UrbanterrorStats::Base.new("spec/support/games.log")
17
+ @ut_stats.logfile.should_not be_nil
18
+ end
19
+
20
+ Given /^I start analysing it$/ do
21
+ @ut_stats.start
22
+ end
23
+
24
+ When /^I find a game$/ do
25
+ @ut_stats.game.should be_true
26
+ end
27
+
28
+ Then /^I find players$/ do
29
+ @ut_stats.players.size.should >= 2
30
+ end
31
+
32
+ ########
33
+
34
+ Given /^A started game$/ do
35
+ @ut_stats = UrbanterrorStats::Base.new("spec/support/games.log")
36
+ @ut_stats.start
37
+ end
38
+
39
+ When /^I read at least a round$/ do
40
+ @ut_stats.rounds.should > 0
41
+ end
42
+
43
+ Then /^I print the report$/ do
44
+ pending # express the regexp above with the code you wish you had
45
+ end
46
+
@@ -0,0 +1,2 @@
1
+ $: << File.join(File.dirname(__FILE__), "/../../lib" )
2
+ require 'urbanterror_stats'
@@ -0,0 +1,8 @@
1
+ Feature: UrbanterrorStats analyses a game log and prints hit stats
2
+ As UrbanTerrorStats
3
+ I want to read a game log
4
+ So that I can get stats of a game
5
+ Scenario: Print stats
6
+ Given A started game
7
+ When I read at least a round
8
+ Then I print the report
@@ -0,0 +1,9 @@
1
+ Feature: UrbanterrorStats analyses a game log and find a valid game
2
+ As UrbanTerrorStats
3
+ I want to read a game log
4
+ So that I can find a game
5
+ Scenario: Start analyse a game
6
+ Given I have a valid game log
7
+ And I start analysing it
8
+ When I find a game
9
+ Then I find players
@@ -0,0 +1,8 @@
1
+ Feature: UrbanterrorStats opens the log file
2
+ As UrbanTerrorStats
3
+ I want to open the logfile
4
+ So that I can analyze it
5
+ Scenario: Start reading logfile
6
+ Given I am started
7
+ When I find the logfile
8
+ Then I start analyzing the logfile
@@ -0,0 +1,6 @@
1
+ require "urbanterror_stats/version"
2
+ require "urbanterror_stats/constants"
3
+ require "urbanterror_stats/base"
4
+
5
+ module UrbanterrorStats
6
+ end
@@ -0,0 +1,130 @@
1
+ module UrbanterrorStats
2
+ class Base
3
+ attr_reader :logfile, :game, :players, :rounds
4
+
5
+ def initialize(logfile = nil)
6
+ @game = false
7
+ @players = {}
8
+ @rounds = 0
9
+ if logfile and File.exists?(logfile)
10
+ @logfile = logfile
11
+ else
12
+ puts "The logfile \"#{logfile}\" cannot be found"
13
+ end
14
+ end
15
+
16
+ def start
17
+ File.readlines(@logfile).each do |line|
18
+ @game = true if line.match /\s*\d{1,2}:\d{1,2}\sInitGame.*/
19
+
20
+ if @game
21
+ if res = line.match(/\s*\d{1,2}:\d{1,2}\sClientConnect:\s(\d*)/)
22
+ self.update_player(res[1].to_i)
23
+ end
24
+
25
+ if res = line.match(/\s*\d{1,2}:\d{1,2}\sClientUserinfo:\s(\d*)\s(.*)/)
26
+ values = res[2].split('\\')
27
+ values.shift
28
+ self.update_player(res[1].to_i, parse_attrs(values))
29
+ end
30
+
31
+ if res = line.match(/\s*\d{1,2}:\d{1,2}\sClientUserinfoChanged:\s(\d*)\sn\\(\w+)\\.*/)
32
+ self.update_player(res[1].to_i, {name: res[2]})
33
+ end
34
+
35
+ if @players.size >= 2
36
+ @rounds += 1 if line.match(/\s*\d{1,2}:\d{1,2}\sInitRound:\s.*/)
37
+ end
38
+
39
+ if @rounds > 0
40
+ if res = line.match(/\s*\d{1,2}:\d{1,2}\sHit:\s(\d+)\s(\d+)\s(\d+)\s(\d+).*/)
41
+ victim = res[1].to_i
42
+ attacker = res[2].to_i
43
+ location = res[3].to_i
44
+ weapon = res[4].to_i
45
+
46
+ add_hit(victim, attacker, location, weapon)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ unless @game
52
+ puts "A valid game cannot be found"
53
+ return false
54
+ end
55
+ if @players.size < 2
56
+ puts "Cannot find at least two players"
57
+ return false
58
+ end
59
+ if @rounds == 0
60
+ puts "Cannot find rounds"
61
+ return false
62
+ end
63
+
64
+ print_stats
65
+ end
66
+
67
+ def update_player(id, attributes = nil)
68
+ unless player_exists?(id)
69
+ @players[id.to_i] = {}
70
+ end
71
+ if attributes
72
+ attributes.each_pair do |key, value|
73
+ @players[id.to_i][key.to_sym] = value
74
+ end
75
+ end
76
+ end
77
+
78
+ def player_exists?(id)
79
+ @players[id.to_i] ? true : false
80
+ end
81
+
82
+ def parse_attrs(attrs)
83
+ ret = {}
84
+ while pair = attrs.slice!(0,2)
85
+ if pair.size == 2
86
+ ret[pair[0].to_sym] = pair[1]
87
+ else
88
+ break
89
+ end
90
+ end
91
+ return ret
92
+ end
93
+
94
+ def add_hit(victim, attacker, location, weapon)
95
+ @players[attacker][:hits] = [] unless @players[attacker].has_key?(:hits)
96
+ @players[attacker][:hits] << { victim: victim, location: location, weapon: weapon }
97
+ end
98
+
99
+ def print_stats
100
+ puts "\n\n### GAME STATS ###\n\n"
101
+ @players.each_pair do |id, player|
102
+ puts "~~ Stats for #{player[:name]} ~~"
103
+ puts "Hits: #{player[:hits].size}"
104
+
105
+ locations = {}
106
+ weapons = {}
107
+ player[:hits].each do |hit|
108
+ locations[hit[:location]] = 0 unless locations[hit[:location]]
109
+ locations[hit[:location]] += 1
110
+
111
+ weapons[hit[:weapon]] = 0 unless weapons[hit[:weapon]]
112
+ weapons[hit[:weapon]] += 1
113
+
114
+ end
115
+
116
+ puts "-- LOCATIONS"
117
+ locations.each_pair do |id, location|
118
+ puts " -- #{LOCATIONS[id]}: #{location} (#{(location.to_i*100/player[:hits].size).to_i}%)"
119
+ end
120
+
121
+ puts "-- WAPONS"
122
+ weapons.each_pair do |id, weapon|
123
+ puts " -- #{WEAPONS[id]}: #{weapon} (#{(weapon.to_i*100/player[:hits].size).to_i}%)"
124
+ end
125
+
126
+ puts
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,70 @@
1
+ module UrbanterrorStats
2
+ WEAPONS = {
3
+ 1 => 'knife',
4
+ 2 => 'beretta',
5
+ 3 => 'deagle',
6
+ 4 => 'spas',
7
+ 5 => 'mp5k',
8
+ 6 => 'ump',
9
+ 7 => 'hk69',
10
+ 8 => 'lr300',
11
+ 9 => 'g36',
12
+ 10 => 'psg1',
13
+ 11 => 'HE Gren',
14
+ 13 => 'Smoke Gren',
15
+ 14 => 'SR8',
16
+ 15 => 'AK',
17
+ 16 => 'bomb',
18
+ 17 => 'Negev',
19
+ 19 => 'M4'
20
+ }
21
+
22
+ LOCATIONS = {
23
+ 0 => 'Head',
24
+ 1 => 'Helmet',
25
+ 2 => 'Torso',
26
+ 3 => 'Kevlar',
27
+ 4 => 'Arms',
28
+ 5 => 'Legs',
29
+ 6 => 'Body',
30
+ }
31
+
32
+ # Kill: <killer> <victim> <weapon>
33
+ #
34
+ # <killer> = slot # of the killer
35
+ # <victim> = slot # of victim
36
+ #
37
+ # <weapon>
38
+ # 1 = Drowned
39
+ # 3 = Lava
40
+ # 5 = Telefrag
41
+ # 6 = Lemming
42
+ # 7 = Suicide
43
+ # 9 = Trigger Hurt
44
+ # 10 = Change Team
45
+ # 12 = Knife(slash)
46
+ # 13 = Knife(throwing)
47
+ # 14 = Beretta
48
+ # 15 = Desert Eagle
49
+ # 16 = Spas
50
+ # 17 = UMP
51
+ # 18 = MP5K
52
+ # 19 = LR300
53
+ # 20 = G36
54
+ # 21 = PSG1
55
+ # 22 = HK69
56
+ # 23 = Bled Out
57
+ # 24 = Boot O'Passion
58
+ # 25 = HE Grenade
59
+ # 28 = SR8
60
+ # 30 = AK103
61
+ # 31 = Sploded
62
+ # 32 = Slapped
63
+ # 33 = Bombed
64
+ # 34 = Nuked
65
+ # 35 = Negev
66
+ # 37 = Flying HK69 Grenade
67
+ # 38 = M4
68
+ # 39 = Flag
69
+ # 40 = Curb Stomp
70
+ end
@@ -0,0 +1,3 @@
1
+ module UrbanterrorStats
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ $: << File.join(File.dirname(__FILE__), "/../lib" )
2
+ require 'urbanterror_stats'
3
+
4
+ RSpec.configure do |config|
5
+ config.color_enabled = true
6
+ config.formatter = 'documentation'
7
+ end
@@ -0,0 +1,35 @@
1
+ 0:00 ------------------------------------------------------------
2
+ 0:00 Warmup:
3
+ 0:02 ClientConnect: 0
4
+ 0:02 ClientUserinfo: 0 \ip\192.168.10.37:27960\challenge\94224103\qport\2801\protocol\68\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\536CFA75FF2075F305817F29D518424D
5
+ 0:02 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
6
+ 0:06 ClientConnect: 1
7
+ 0:06 ClientUserinfo: 1 \ip\192.168.10.96:27960\challenge\-354123797\qport\857\protocol\68\name\Pizzuto\rate\8000\cg_predictitems\0\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504
8
+ 0:06 ClientUserinfoChanged: 1 n\Pizzuto\t\3\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
9
+ 0:14 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
10
+ 0:14 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
11
+ 0:14 ClientBegin: 0
12
+ 0:15 Kill: 0 0 10: TommyBlue killed TommyBlue by MOD_CHANGE_TEAM
13
+ 0:15 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
14
+ 0:15 ClientUserinfoChanged: 0 n\TommyBlue\t\2\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
15
+ 0:15 ClientBegin: 0
16
+ 0:32 ClientUserinfo: 1 \ip\192.168.10.96:27960\name\Pizzuto\racered\2\raceblue\2\rate\8000\ut_timenudge\0\cg_rgb\128 128 128\funred\viking\funblue\viking\cg_predictitems\0\cg_physics\1\gear\FMAARWT\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504\weapmodes\01000111210000020002
17
+ 0:32 ClientUserinfoChanged: 1 n\Pizzuto\t\3\r\2\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
18
+ 0:32 ClientBegin: 1
19
+ 0:40 Kill: 1 1 10: Pizzuto killed Pizzuto by MOD_CHANGE_TEAM
20
+ 0:40 ClientUserinfo: 1 \ip\192.168.10.96:27960\name\Pizzuto\racered\2\raceblue\2\rate\8000\ut_timenudge\0\cg_rgb\128 128 128\funred\viking\funblue\viking\cg_predictitems\0\cg_physics\1\gear\FMAARWT\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504\weapmodes\01000111210000020002
21
+ 0:40 ClientUserinfoChanged: 1 n\Pizzuto\t\1\r\2\tl\0\f0\viking\f1\\f2\\a0\128\a1\128\a2\128
22
+ 0:40 ClientBegin: 1
23
+ 0:54 ------------------------------------------------------------
24
+ 0:54 InitRound: \sv_allowdownload\0\g_matchmode\0\g_gametype\3\sv_maxclients\64\sv_floodprotect\1\g_warmup\15\capturelimit\0\sv_hostname\Marvin\g_followstrict\1\fraglimit\99\timelimit\10\g_cahtime\60\g_swaproles\0\g_roundtime\3\g_bombexplodetime\40\g_bombdefusetime\10\g_hotpotato\2\g_waverespawns\1\g_redwave\8\g_bluewave\8\g_respawndelay\5\g_suddendeath\1\g_maxrounds\0\g_friendlyfire\2\g_allowvote\536871039\g_armbands\0\g_survivorrule\0\g_teamnameblue\Checche\g_teamnamered\Froci\g_gear\0\g_deadchat\1\g_maxGameClients\0\sv_dlURL\marvin.dw\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_minRate\0\dmflags\0\version\ioq3 1.35urt linux-i386 Jan 28 2009\protocol\68\mapname\ut4_ftdicks\sv_privateClients\0\ Admin\adminname\ Email\xxx@xxx.xxx\gamename\q3ut4\g_needpass\0\g_enableDust\0\g_enableBreath\0\g_antilagvis\0\g_survivor\0\g_enablePrecip\0\g_modversion\4.1
25
+ 1:27 Hit: 1 0 3 9: TommyBlue hit Pizzuto in the Kevlar
26
+ 1:50 Hit: 1 0 3 9: TommyBlue hit Pizzuto in the Kevlar
27
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
28
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
29
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
30
+ 1:53 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
31
+ 1:53 Kill: 1 0 20: Pizzuto killed TommyBlue by UT_MOD_G36
32
+ 2:02 ClientDisconnect: 0
33
+ 2:05 ClientDisconnect: 1
34
+ 2:11 ShutdownGame:
35
+ 2:11 ------------------------------------------------------------
@@ -0,0 +1,30 @@
1
+ 0:00 ------------------------------------------------------------
2
+ 0:00 InitGame: \sv_allowdownload\0\g_matchmode\0\g_gametype\3\sv_maxclients\64\sv_floodprotect\1\g_warmup\15\capturelimit\0\sv_hostname\Marvin\g_followstrict\1\fraglimit\99\timelimit\10\g_cahtime\60\g_swaproles\0\g_roundtime\3\g_bombexplodetime\40\g_bombdefusetime\10\g_hotpotato\2\g_waverespawns\1\g_redwave\8\g_bluewave\8\g_respawndelay\5\g_suddendeath\1\g_maxrounds\0\g_friendlyfire\2\g_allowvote\536871039\g_armbands\0\g_survivorrule\0\g_teamnameblue\Checche\g_teamnamered\Froci\g_gear\0\g_deadchat\1\g_maxGameClients\0\sv_dlURL\marvin.dw\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_minRate\0\dmflags\0\version\ioq3 1.35urt linux-i386 Jan 28 2009\protocol\68\mapname\ut4_ftdicks\sv_privateClients\0\ Admin\adminname\ Email\xxx@xxx.xxx\gamename\q3ut4\g_needpass\0\g_enableDust\0\g_enableBreath\0\g_antilagvis\0\g_survivor\0\g_enablePrecip\0\g_modversion\4.1
3
+ 0:00 Warmup:
4
+ 0:02 ClientConnect: 0
5
+ 0:02 ClientUserinfo: 0 \ip\192.168.10.37:27960\challenge\94224103\qport\2801\protocol\68\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\536CFA75FF2075F305817F29D518424D
6
+ 0:02 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
7
+ 0:06 ClientConnect: 1
8
+ 0:06 ClientUserinfo: 1 \ip\192.168.10.96:27960\challenge\-354123797\qport\857\protocol\68\name\Pizzuto\rate\8000\cg_predictitems\0\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504
9
+ 0:06 ClientUserinfoChanged: 1 n\Pizzuto\t\3\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
10
+ 0:14 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
11
+ 0:14 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
12
+ 0:14 ClientBegin: 0
13
+ 0:15 Kill: 0 0 10: TommyBlue killed TommyBlue by MOD_CHANGE_TEAM
14
+ 0:15 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
15
+ 0:15 ClientUserinfoChanged: 0 n\TommyBlue\t\2\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
16
+ 0:15 ClientBegin: 0
17
+ 0:32 ClientUserinfo: 1 \ip\192.168.10.96:27960\name\Pizzuto\racered\2\raceblue\2\rate\8000\ut_timenudge\0\cg_rgb\128 128 128\funred\viking\funblue\viking\cg_predictitems\0\cg_physics\1\gear\FMAARWT\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504\weapmodes\01000111210000020002
18
+ 0:32 ClientUserinfoChanged: 1 n\Pizzuto\t\3\r\2\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
19
+ 0:32 ClientBegin: 1
20
+ 0:40 Kill: 1 1 10: Pizzuto killed Pizzuto by MOD_CHANGE_TEAM
21
+ 0:40 ClientUserinfo: 1 \ip\192.168.10.96:27960\name\Pizzuto\racered\2\raceblue\2\rate\8000\ut_timenudge\0\cg_rgb\128 128 128\funred\viking\funblue\viking\cg_predictitems\0\cg_physics\1\gear\FMAARWT\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504\weapmodes\01000111210000020002
22
+ 0:40 ClientUserinfoChanged: 1 n\Pizzuto\t\1\r\2\tl\0\f0\viking\f1\\f2\\a0\128\a1\128\a2\128
23
+ 0:40 ClientBegin: 1
24
+ 0:54 ------------------------------------------------------------
25
+ 0:54 InitRound: \sv_allowdownload\0\g_matchmode\0\g_gametype\3\sv_maxclients\64\sv_floodprotect\1\g_warmup\15\capturelimit\0\sv_hostname\Marvin\g_followstrict\1\fraglimit\99\timelimit\10\g_cahtime\60\g_swaproles\0\g_roundtime\3\g_bombexplodetime\40\g_bombdefusetime\10\g_hotpotato\2\g_waverespawns\1\g_redwave\8\g_bluewave\8\g_respawndelay\5\g_suddendeath\1\g_maxrounds\0\g_friendlyfire\2\g_allowvote\536871039\g_armbands\0\g_survivorrule\0\g_teamnameblue\Checche\g_teamnamered\Froci\g_gear\0\g_deadchat\1\g_maxGameClients\0\sv_dlURL\marvin.dw\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_minRate\0\dmflags\0\version\ioq3 1.35urt linux-i386 Jan 28 2009\protocol\68\mapname\ut4_ftdicks\sv_privateClients\0\ Admin\adminname\ Email\xxx@xxx.xxx\gamename\q3ut4\g_needpass\0\g_enableDust\0\g_enableBreath\0\g_antilagvis\0\g_survivor\0\g_enablePrecip\0\g_modversion\4.1
26
+ 1:53 Kill: 1 0 20: Pizzuto killed TommyBlue by UT_MOD_G36
27
+ 2:02 ClientDisconnect: 0
28
+ 2:05 ClientDisconnect: 1
29
+ 2:11 ShutdownGame:
30
+ 2:11 ------------------------------------------------------------
@@ -0,0 +1,26 @@
1
+ 0:00 ------------------------------------------------------------
2
+ 0:00 InitGame: \sv_allowdownload\0\g_matchmode\0\g_gametype\3\sv_maxclients\64\sv_floodprotect\1\g_warmup\15\capturelimit\0\sv_hostname\Marvin\g_followstrict\1\fraglimit\99\timelimit\10\g_cahtime\60\g_swaproles\0\g_roundtime\3\g_bombexplodetime\40\g_bombdefusetime\10\g_hotpotato\2\g_waverespawns\1\g_redwave\8\g_bluewave\8\g_respawndelay\5\g_suddendeath\1\g_maxrounds\0\g_friendlyfire\2\g_allowvote\536871039\g_armbands\0\g_survivorrule\0\g_teamnameblue\Checche\g_teamnamered\Froci\g_gear\0\g_deadchat\1\g_maxGameClients\0\sv_dlURL\marvin.dw\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_minRate\0\dmflags\0\version\ioq3 1.35urt linux-i386 Jan 28 2009\protocol\68\mapname\ut4_ftdicks\sv_privateClients\0\ Admin\adminname\ Email\xxx@xxx.xxx\gamename\q3ut4\g_needpass\0\g_enableDust\0\g_enableBreath\0\g_antilagvis\0\g_survivor\0\g_enablePrecip\0\g_modversion\4.1
3
+ 0:00 Warmup:
4
+ 0:02 ClientConnect: 0
5
+ 0:02 ClientUserinfo: 0 \ip\192.168.10.37:27960\challenge\94224103\qport\2801\protocol\68\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\536CFA75FF2075F305817F29D518424D
6
+ 0:02 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
7
+ 0:14 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
8
+ 0:14 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
9
+ 0:14 ClientBegin: 0
10
+ 0:15 Kill: 0 0 10: TommyBlue killed TommyBlue by MOD_CHANGE_TEAM
11
+ 0:15 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
12
+ 0:15 ClientUserinfoChanged: 0 n\TommyBlue\t\2\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
13
+ 0:15 ClientBegin: 0
14
+ 0:54 ------------------------------------------------------------
15
+ 0:54 InitRound: \sv_allowdownload\0\g_matchmode\0\g_gametype\3\sv_maxclients\64\sv_floodprotect\1\g_warmup\15\capturelimit\0\sv_hostname\Marvin\g_followstrict\1\fraglimit\99\timelimit\10\g_cahtime\60\g_swaproles\0\g_roundtime\3\g_bombexplodetime\40\g_bombdefusetime\10\g_hotpotato\2\g_waverespawns\1\g_redwave\8\g_bluewave\8\g_respawndelay\5\g_suddendeath\1\g_maxrounds\0\g_friendlyfire\2\g_allowvote\536871039\g_armbands\0\g_survivorrule\0\g_teamnameblue\Checche\g_teamnamered\Froci\g_gear\0\g_deadchat\1\g_maxGameClients\0\sv_dlURL\marvin.dw\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_minRate\0\dmflags\0\version\ioq3 1.35urt linux-i386 Jan 28 2009\protocol\68\mapname\ut4_ftdicks\sv_privateClients\0\ Admin\adminname\ Email\xxx@xxx.xxx\gamename\q3ut4\g_needpass\0\g_enableDust\0\g_enableBreath\0\g_antilagvis\0\g_survivor\0\g_enablePrecip\0\g_modversion\4.1
16
+ 1:27 Hit: 1 0 3 9: TommyBlue hit Pizzuto in the Kevlar
17
+ 1:50 Hit: 1 0 3 9: TommyBlue hit Pizzuto in the Kevlar
18
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
19
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
20
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
21
+ 1:53 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
22
+ 1:53 Kill: 1 0 20: Pizzuto killed TommyBlue by UT_MOD_G36
23
+ 2:02 ClientDisconnect: 0
24
+ 2:05 ClientDisconnect: 1
25
+ 2:11 ShutdownGame:
26
+ 2:11 ------------------------------------------------------------
@@ -0,0 +1,35 @@
1
+ 0:00 ------------------------------------------------------------
2
+ 0:00 InitGame: \sv_allowdownload\0\g_matchmode\0\g_gametype\3\sv_maxclients\64\sv_floodprotect\1\g_warmup\15\capturelimit\0\sv_hostname\Marvin\g_followstrict\1\fraglimit\99\timelimit\10\g_cahtime\60\g_swaproles\0\g_roundtime\3\g_bombexplodetime\40\g_bombdefusetime\10\g_hotpotato\2\g_waverespawns\1\g_redwave\8\g_bluewave\8\g_respawndelay\5\g_suddendeath\1\g_maxrounds\0\g_friendlyfire\2\g_allowvote\536871039\g_armbands\0\g_survivorrule\0\g_teamnameblue\Checche\g_teamnamered\Froci\g_gear\0\g_deadchat\1\g_maxGameClients\0\sv_dlURL\marvin.dw\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_minRate\0\dmflags\0\version\ioq3 1.35urt linux-i386 Jan 28 2009\protocol\68\mapname\ut4_ftdicks\sv_privateClients\0\ Admin\adminname\ Email\xxx@xxx.xxx\gamename\q3ut4\g_needpass\0\g_enableDust\0\g_enableBreath\0\g_antilagvis\0\g_survivor\0\g_enablePrecip\0\g_modversion\4.1
3
+ 0:00 Warmup:
4
+ 0:02 ClientConnect: 0
5
+ 0:02 ClientUserinfo: 0 \ip\192.168.10.37:27960\challenge\94224103\qport\2801\protocol\68\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\536CFA75FF2075F305817F29D518424D
6
+ 0:02 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
7
+ 0:06 ClientConnect: 1
8
+ 0:06 ClientUserinfo: 1 \ip\192.168.10.96:27960\challenge\-354123797\qport\857\protocol\68\name\Pizzuto\rate\8000\cg_predictitems\0\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504
9
+ 0:06 ClientUserinfoChanged: 1 n\Pizzuto\t\3\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
10
+ 0:14 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
11
+ 0:14 ClientUserinfoChanged: 0 n\TommyBlue\t\3\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
12
+ 0:14 ClientBegin: 0
13
+ 0:15 Kill: 0 0 10: TommyBlue killed TommyBlue by MOD_CHANGE_TEAM
14
+ 0:15 ClientUserinfo: 0 \ip\192.168.10.37:27960\name\TommyBlue\rate\8000\cg_predictitems\0\cl_voip\0\cl_anonymous\0\sex\male\handicap\100\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\teamtask\0\cl_guid\17C8682D7BF6FD556FD71A15AA6D2C06\racered\3\raceblue\3\ut_timenudge\0\cg_rgb\128 128 128\cg_physics\1\gear\GMIARWA\weapmodes\01000111210000020001
15
+ 0:15 ClientUserinfoChanged: 0 n\TommyBlue\t\2\r\3\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
16
+ 0:15 ClientBegin: 0
17
+ 0:32 ClientUserinfo: 1 \ip\192.168.10.96:27960\name\Pizzuto\racered\2\raceblue\2\rate\8000\ut_timenudge\0\cg_rgb\128 128 128\funred\viking\funblue\viking\cg_predictitems\0\cg_physics\1\gear\FMAARWT\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504\weapmodes\01000111210000020002
18
+ 0:32 ClientUserinfoChanged: 1 n\Pizzuto\t\3\r\2\tl\0\f0\\f1\\f2\\a0\128\a1\128\a2\128
19
+ 0:32 ClientBegin: 1
20
+ 0:40 Kill: 1 1 10: Pizzuto killed Pizzuto by MOD_CHANGE_TEAM
21
+ 0:40 ClientUserinfo: 1 \ip\192.168.10.96:27960\name\Pizzuto\racered\2\raceblue\2\rate\8000\ut_timenudge\0\cg_rgb\128 128 128\funred\viking\funblue\viking\cg_predictitems\0\cg_physics\1\gear\FMAARWT\snaps\20\model\sarge\headmodel\sarge\team_model\james\team_headmodel\*james\color1\4\color2\5\handicap\100\sex\male\cl_anonymous\0\teamtask\0\cl_guid\90BED6C46E6BDADA08BE139124DE0504\weapmodes\01000111210000020002
22
+ 0:40 ClientUserinfoChanged: 1 n\Pizzuto\t\1\r\2\tl\0\f0\viking\f1\\f2\\a0\128\a1\128\a2\128
23
+ 0:40 ClientBegin: 1
24
+ 0:54 ------------------------------------------------------------
25
+ 1:27 Hit: 1 0 3 9: TommyBlue hit Pizzuto in the Kevlar
26
+ 1:50 Hit: 1 0 3 9: TommyBlue hit Pizzuto in the Kevlar
27
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
28
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
29
+ 1:52 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
30
+ 1:53 Hit: 0 1 3 9: Pizzuto hit TommyBlue in the Kevlar
31
+ 1:53 Kill: 1 0 20: Pizzuto killed TommyBlue by UT_MOD_G36
32
+ 2:02 ClientDisconnect: 0
33
+ 2:05 ClientDisconnect: 1
34
+ 2:11 ShutdownGame:
35
+ 2:11 ------------------------------------------------------------
@@ -0,0 +1,84 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module UrbanterrorStats
4
+ describe Base do
5
+ context "starting up" do
6
+ before(:each) do
7
+ @ut_stats = Base.new("spec/support/games.log")
8
+ end
9
+
10
+ it "should give an error if can't find the log file" do
11
+ logfile = "unexistent_logfile.log"
12
+ $stdout.should_receive(:puts).with("The logfile \"#{logfile}\" cannot be found")
13
+ @ut_stats_err = Base.new(logfile)
14
+ end
15
+
16
+ it "should register the logfile if found" do
17
+ @ut_stats.logfile.should_not be_nil
18
+ end
19
+ end
20
+
21
+ context "finding a valid game" do
22
+ before(:each) do
23
+ @ut_stats = Base.new("spec/support/games.log")
24
+ end
25
+
26
+ it "should register a game if found" do
27
+ @ut_stats.start
28
+ @ut_stats.game.should be_true
29
+ end
30
+
31
+ it "should give an error if can't find a game" do
32
+ logfile = "spec/support/invalid_game.log"
33
+ $stdout.should_receive(:puts).with("A valid game cannot be found")
34
+ @ut_stats_err = Base.new(logfile)
35
+ @ut_stats_err.start
36
+ end
37
+ end
38
+
39
+ context "finding players" do
40
+ before(:each) do
41
+ @ut_stats = Base.new("spec/support/games.log")
42
+ end
43
+
44
+ it "should find at least two players" do
45
+ @ut_stats.start
46
+ @ut_stats.players.size.should >= 2
47
+ end
48
+
49
+ it "should give an error if can't find at least two players" do
50
+ logfile = "spec/support/invalid_players.log"
51
+ $stdout.should_receive(:puts).with("Cannot find at least two players")
52
+ @ut_stats_err = Base.new(logfile)
53
+ @ut_stats_err.start
54
+ end
55
+ end
56
+
57
+ context "register hits" do
58
+ before(:each) do
59
+ @ut_stats = Base.new("spec/support/games.log")
60
+ end
61
+
62
+ it "should find at least a round" do
63
+ @ut_stats.start
64
+ @ut_stats.rounds.should > 0
65
+ end
66
+
67
+ it "should give an error if can't find at least a round" do
68
+ logfile = "spec/support/invalid_rounds.log"
69
+ $stdout.should_receive(:puts).with("Cannot find rounds")
70
+ @ut_stats_err = Base.new(logfile)
71
+ @ut_stats_err.start
72
+ end
73
+
74
+ it "should find hits" do
75
+ @ut_stats.start
76
+ hits = 0
77
+ @ut_stats.players.each_pair do |id, player|
78
+ hits += 1 if player[:hits].size > 0
79
+ end
80
+ hits.should > 0
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/urbanterror_stats/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Tommaso Visconti"]
6
+ gem.email = ["tommaso.visconti@gmail.com"]
7
+ gem.description = %q{UrbanTerror game logs analyzer}
8
+ gem.summary = %q{The gem analyzes the log file of an UrbanTerror server, including Hits logs, and prints a cool report}
9
+ gem.homepage = "https://github.com/tommyblue/UrbanTerrorStats"
10
+
11
+ gem.add_development_dependency "rake"
12
+ gem.add_development_dependency "rspec"
13
+ gem.add_development_dependency "cucumber"
14
+
15
+ gem.files = `git ls-files`.split($\)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.name = "urbanterror_stats"
19
+ gem.require_paths = ["lib"]
20
+ gem.version = UrbanterrorStats::VERSION
21
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: urbanterror_stats
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tommaso Visconti
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: cucumber
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: UrbanTerror game logs analyzer
63
+ email:
64
+ - tommaso.visconti@gmail.com
65
+ executables:
66
+ - urbanterror_stats
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - .rvmrc
72
+ - Gemfile
73
+ - LICENSE
74
+ - README.md
75
+ - Rakefile
76
+ - bin/urbanterror_stats
77
+ - features/step_definitions/urbanterror_stats.rb
78
+ - features/support/env.rb
79
+ - features/urbanterror_stats_analyses_game.feature
80
+ - features/urbanterror_stats_finds_a_game.feature
81
+ - features/urbanterror_stats_opens_logfile.feature
82
+ - lib/urbanterror_stats.rb
83
+ - lib/urbanterror_stats/base.rb
84
+ - lib/urbanterror_stats/constants.rb
85
+ - lib/urbanterror_stats/version.rb
86
+ - spec/spec_helper.rb
87
+ - spec/support/games.log
88
+ - spec/support/invalid_game.log
89
+ - spec/support/invalid_hits.log
90
+ - spec/support/invalid_players.log
91
+ - spec/support/invalid_rounds.log
92
+ - spec/urbanterror_stats/base_spec.rb
93
+ - urbanterror_stats.gemspec
94
+ homepage: https://github.com/tommyblue/UrbanTerrorStats
95
+ licenses: []
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ segments:
107
+ - 0
108
+ hash: 723602888754842642
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ segments:
116
+ - 0
117
+ hash: 723602888754842642
118
+ requirements: []
119
+ rubyforge_project:
120
+ rubygems_version: 1.8.24
121
+ signing_key:
122
+ specification_version: 3
123
+ summary: The gem analyzes the log file of an UrbanTerror server, including Hits logs,
124
+ and prints a cool report
125
+ test_files:
126
+ - features/step_definitions/urbanterror_stats.rb
127
+ - features/support/env.rb
128
+ - features/urbanterror_stats_analyses_game.feature
129
+ - features/urbanterror_stats_finds_a_game.feature
130
+ - features/urbanterror_stats_opens_logfile.feature
131
+ - spec/spec_helper.rb
132
+ - spec/support/games.log
133
+ - spec/support/invalid_game.log
134
+ - spec/support/invalid_hits.log
135
+ - spec/support/invalid_players.log
136
+ - spec/support/invalid_rounds.log
137
+ - spec/urbanterror_stats/base_spec.rb