urbanterror_stats 0.0.1

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.
@@ -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