tf2_line_parser 0.3.2 → 0.4.0
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/tf2_line_parser/events/airshot.rb +2 -2
- data/lib/tf2_line_parser/events/built_object.rb +29 -0
- data/lib/tf2_line_parser/events/charge_ended.rb +25 -0
- data/lib/tf2_line_parser/events/charge_ready.rb +20 -0
- data/lib/tf2_line_parser/events/damage.rb +26 -6
- data/lib/tf2_line_parser/events/empty_uber.rb +20 -0
- data/lib/tf2_line_parser/events/entered_game.rb +20 -0
- data/lib/tf2_line_parser/events/event.rb +3 -3
- data/lib/tf2_line_parser/events/first_heal_after_spawn.rb +25 -0
- data/lib/tf2_line_parser/events/headshot_damage.rb +20 -1
- data/lib/tf2_line_parser/events/intermission_win_limit.rb +21 -0
- data/lib/tf2_line_parser/events/joined_team.rb +21 -0
- data/lib/tf2_line_parser/events/killed_object.rb +54 -0
- data/lib/tf2_line_parser/events/lost_uber_advantage.rb +25 -0
- data/lib/tf2_line_parser/events/mini_round_selected.rb +17 -0
- data/lib/tf2_line_parser/events/mini_round_start.rb +9 -0
- data/lib/tf2_line_parser/events/player_extinguished.rb +30 -0
- data/lib/tf2_line_parser/events/round_setup_begin.rb +9 -0
- data/lib/tf2_line_parser/events/round_setup_end.rb +9 -0
- data/lib/tf2_line_parser/version.rb +1 -1
- data/spec/lib/tf2_line_parser/parser_spec.rb +205 -4
- metadata +16 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 154268d4f08d4e2884a89fa90b3a18b901c6cafbd846fa58636e84fb2b59822f
|
|
4
|
+
data.tar.gz: 4056b354a1d1b3f98b1920250a80b7dc9541042588319510e48d9378bfa7422a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e154de1385eb0fd25814f087f53578590af635aaff826d6a9a9df822e288359254834c14b0a99170c25dc61bdea57b8712b22913bfe38998fccc07d172b22c8b
|
|
7
|
+
data.tar.gz: f8d7bcd26fb42e81b4de558d302e3574754542e0e1d65593bb925b92749453a64f706a41253df9a4eced5579fed7230f75b6aeb31db03615bbc5877f7e1ae1ea
|
data/Gemfile.lock
CHANGED
|
@@ -4,11 +4,11 @@ module TF2LineParser
|
|
|
4
4
|
module Events
|
|
5
5
|
class Airshot < Damage
|
|
6
6
|
def self.regex
|
|
7
|
-
@regex ||= /#{regex_time} #{regex_player} triggered "damage" #{regex_damage_against}\(damage "(?'value'\d+)"\)
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "damage" #{regex_damage_against}\(damage "(?'value'\d+)"\)#{regex_realdamage}#{regex_weapon}#{regex_healing}#{regex_crit}#{regex_headshot} #{regex_airshot}$/.freeze
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def self.regex_airshot
|
|
11
|
-
@regex_airshot ||=
|
|
11
|
+
@regex_airshot ||= '\(airshot "(?\'airshot\'\w*)"\)'
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def self.attributes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class BuiltObject < Event
|
|
4
|
+
attr_reader :time, :player, :object
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "builtobject" #{regex_object_info}#{regex_position}?/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.regex_object_info
|
|
11
|
+
@regex_object_info ||= '\(object "(?\'object\'[^"]+)"\)'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.regex_position
|
|
15
|
+
@regex_position ||= / \(position "[^"]+"\)/
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.attributes
|
|
19
|
+
@attributes ||= %i[time player_section object]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def initialize(time, name, uid, steam_id, team, object)
|
|
23
|
+
@time = parse_time(time)
|
|
24
|
+
@player = Player.new(name, uid, steam_id, team)
|
|
25
|
+
@object = object
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class ChargeEnded < Event
|
|
4
|
+
attr_reader :time, :player, :duration
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "chargeended" #{regex_duration}/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.regex_duration
|
|
11
|
+
@regex_duration ||= '\(duration "(?\'duration\'[0-9.]+)"\)'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.attributes
|
|
15
|
+
@attributes ||= %i[time player_section duration]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def initialize(time, name, uid, steam_id, team, duration)
|
|
19
|
+
@time = parse_time(time)
|
|
20
|
+
@player = Player.new(name, uid, steam_id, team)
|
|
21
|
+
@duration = duration.to_f
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class ChargeReady < Event
|
|
4
|
+
attr_reader :time, :player
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "chargeready"/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.attributes
|
|
11
|
+
@attributes ||= %i[time player_section]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize(time, name, uid, steam_id, team)
|
|
15
|
+
@time = parse_time(time)
|
|
16
|
+
@player = Player.new(name, uid, steam_id, team)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
module TF2LineParser
|
|
4
4
|
module Events
|
|
5
5
|
class Damage < Event
|
|
6
|
+
attr_reader :crit, :headshot, :healing
|
|
7
|
+
|
|
6
8
|
def self.regex
|
|
7
|
-
@regex ||= /#{regex_time} #{regex_player} triggered "damage" #{regex_damage_against}\(damage "(?'value'\d+)"\)
|
|
9
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "damage" #{regex_damage_against}\(damage "(?'value'\d+)"\)#{regex_realdamage}#{regex_weapon}#{regex_healing}#{regex_crit}#{regex_headshot}/.freeze
|
|
8
10
|
end
|
|
9
11
|
|
|
10
12
|
def self.regex_damage_against
|
|
@@ -12,15 +14,27 @@ module TF2LineParser
|
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
def self.regex_realdamage
|
|
15
|
-
@regex_realdamage ||= /(\(realdamage "(?'realdamage'\
|
|
17
|
+
@regex_realdamage ||= /(?: \(realdamage "(?'realdamage'\d*)"\))?/.freeze
|
|
16
18
|
end
|
|
17
19
|
|
|
18
20
|
def self.regex_weapon
|
|
19
|
-
@regex_weapon ||= /(\(weapon "(?'weapon'
|
|
21
|
+
@regex_weapon ||= /(?: \(weapon "(?'weapon'[^"]*)"\))?/.freeze
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.regex_healing
|
|
25
|
+
@regex_healing ||= /(?: \(healing "(?'healing'\d*)"\))?/.freeze
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.regex_crit
|
|
29
|
+
@regex_crit ||= /(?: \(crit "(?'crit'[^"]*)"\))?/.freeze
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.regex_headshot
|
|
33
|
+
@regex_headshot ||= /(?: \(headshot "(?'headshot'\d*)"\))?/.freeze
|
|
20
34
|
end
|
|
21
35
|
|
|
22
36
|
def self.attributes
|
|
23
|
-
@attributes ||= %i[time player_section target_section value weapon]
|
|
37
|
+
@attributes ||= %i[time player_section target_section value weapon healing crit headshot]
|
|
24
38
|
end
|
|
25
39
|
|
|
26
40
|
def self.regex_results(matched_line)
|
|
@@ -29,6 +43,9 @@ module TF2LineParser
|
|
|
29
43
|
target_section = matched_line['target_section']
|
|
30
44
|
value = matched_line['value']
|
|
31
45
|
weapon = matched_line['weapon']
|
|
46
|
+
healing = matched_line['healing']
|
|
47
|
+
crit = matched_line['crit']
|
|
48
|
+
headshot = matched_line['headshot']
|
|
32
49
|
|
|
33
50
|
# Parse player section
|
|
34
51
|
player_name, player_uid, player_steamid, player_team = parse_player_section(player_section)
|
|
@@ -39,15 +56,18 @@ module TF2LineParser
|
|
|
39
56
|
target_name, target_uid, target_steamid, target_team = parse_target_section(target_section)
|
|
40
57
|
end
|
|
41
58
|
|
|
42
|
-
[time, player_name, player_uid, player_steamid, player_team, target_name, target_uid, target_steamid, target_team, value, weapon]
|
|
59
|
+
[time, player_name, player_uid, player_steamid, player_team, target_name, target_uid, target_steamid, target_team, value, weapon, healing, crit, headshot]
|
|
43
60
|
end
|
|
44
61
|
|
|
45
|
-
def initialize(time, player_name, player_uid, player_steamid, player_team, target_name, target_uid, target_steamid, target_team, value, weapon)
|
|
62
|
+
def initialize(time, player_name, player_uid, player_steamid, player_team, target_name, target_uid, target_steamid, target_team, value, weapon, healing, crit, headshot)
|
|
46
63
|
@time = parse_time(time)
|
|
47
64
|
@player = Player.new(player_name, player_uid, player_steamid, player_team)
|
|
48
65
|
@target = Player.new(target_name, target_uid, target_steamid, target_team) if target_name
|
|
49
66
|
@value = value.to_i
|
|
50
67
|
@weapon = weapon
|
|
68
|
+
@healing = healing.to_i if healing
|
|
69
|
+
@crit = crit
|
|
70
|
+
@headshot = (headshot == '1') if headshot
|
|
51
71
|
end
|
|
52
72
|
end
|
|
53
73
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class EmptyUber < Event
|
|
4
|
+
attr_reader :time, :player
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "empty_uber"/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.attributes
|
|
11
|
+
@attributes ||= %i[time player_section]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize(time, name, uid, steam_id, team)
|
|
15
|
+
@time = parse_time(time)
|
|
16
|
+
@player = Player.new(name, uid, steam_id, team)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class EnteredGame < Event
|
|
4
|
+
attr_reader :time, :player
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} entered the game/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.attributes
|
|
11
|
+
@attributes ||= %i[time player_section]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize(time, name, uid, steam_id, team)
|
|
15
|
+
@time = parse_time(time)
|
|
16
|
+
@player = Player.new(name, uid, steam_id, team)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -36,9 +36,9 @@ module TF2LineParser
|
|
|
36
36
|
|
|
37
37
|
def self.types
|
|
38
38
|
# ordered by how common the messages are
|
|
39
|
-
@types ||= [Damage, Heal, PickupItem, Assist, Kill, CaptureBlock, PointCapture, ChargeDeployed,
|
|
40
|
-
MedicDeath, MedicDeathEx,
|
|
41
|
-
RoundLength, RoundStart, Connect, Disconnect, RconCommand, ConsoleSay, MatchEnd, FinalScore,
|
|
39
|
+
@types ||= [HeadshotDamage, Airshot, Damage, Heal, PickupItem, Assist, Kill, CaptureBlock, PointCapture, ChargeDeployed,
|
|
40
|
+
MedicDeath, MedicDeathEx, EmptyUber, ChargeReady, ChargeEnded, FirstHealAfterSpawn, LostUberAdvantage, BuiltObject, PlayerExtinguished, JoinedTeam, EnteredGame, RoleChange, Spawn, Suicide, KilledObject, Say, TeamSay, Domination, Revenge, RoundWin, CurrentScore,
|
|
41
|
+
RoundLength, RoundStart, RoundSetupBegin, RoundSetupEnd, MiniRoundStart, MiniRoundSelected, IntermissionWinLimit, Connect, Disconnect, RconCommand, ConsoleSay, MatchEnd, FinalScore,
|
|
42
42
|
RoundStalemate, Unknown].freeze
|
|
43
43
|
end
|
|
44
44
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class FirstHealAfterSpawn < Event
|
|
4
|
+
attr_reader :time, :player, :heal_time
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "first_heal_after_spawn" #{regex_heal_time}/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.regex_heal_time
|
|
11
|
+
@regex_heal_time ||= '\(time "(?\'heal_time\'[0-9.]+)"\)'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.attributes
|
|
15
|
+
@attributes ||= %i[time player_section heal_time]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def initialize(time, name, uid, steam_id, team, heal_time)
|
|
19
|
+
@time = parse_time(time)
|
|
20
|
+
@player = Player.new(name, uid, steam_id, team)
|
|
21
|
+
@heal_time = heal_time.to_f
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -4,7 +4,7 @@ module TF2LineParser
|
|
|
4
4
|
module Events
|
|
5
5
|
class HeadshotDamage < Damage
|
|
6
6
|
def self.regex
|
|
7
|
-
@regex ||= /#{regex_time} #{regex_player} triggered "damage" #{regex_damage_against}\(damage "(?'value'\d+)"\)
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "damage" #{regex_damage_against}\(damage "(?'value'\d+)"\)#{regex_realdamage}#{regex_weapon}#{regex_healing}#{regex_crit} #{regex_headshot}$/.freeze
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def self.regex_headshot
|
|
@@ -15,6 +15,25 @@ module TF2LineParser
|
|
|
15
15
|
@attributes ||= %i[time player_section target_section value weapon]
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
def self.regex_results(matched_line)
|
|
19
|
+
time = matched_line['time']
|
|
20
|
+
player_section = matched_line['player_section']
|
|
21
|
+
target_section = matched_line['target_section']
|
|
22
|
+
value = matched_line['value']
|
|
23
|
+
weapon = matched_line['weapon']
|
|
24
|
+
|
|
25
|
+
# Parse player section
|
|
26
|
+
player_name, player_uid, player_steamid, player_team = parse_player_section(player_section)
|
|
27
|
+
|
|
28
|
+
# Parse target section if present
|
|
29
|
+
target_name, target_uid, target_steamid, target_team = nil, nil, nil, nil
|
|
30
|
+
if target_section
|
|
31
|
+
target_name, target_uid, target_steamid, target_team = parse_target_section(target_section)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
[time, player_name, player_uid, player_steamid, player_team, target_name, target_uid, target_steamid, target_team, value, weapon]
|
|
35
|
+
end
|
|
36
|
+
|
|
18
37
|
def initialize(time, player_name, player_uid, player_steamid, player_team, target_name, target_uid, target_steamid, target_team, value, weapon)
|
|
19
38
|
@time = parse_time(time)
|
|
20
39
|
@player = Player.new(player_name, player_uid, player_steamid, player_team)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class IntermissionWinLimit < Event
|
|
4
|
+
attr_reader :time, :team, :reason
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} Team "(?'team'Red|Blue|RED|BLUE)" triggered "Intermission_Win_Limit" due to (?'reason'.*)/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.attributes
|
|
11
|
+
@attributes ||= %i[time team reason]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize(time, team, reason)
|
|
15
|
+
@time = parse_time(time)
|
|
16
|
+
@team = team
|
|
17
|
+
@reason = reason
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class JoinedTeam < PlayerActionEvent
|
|
4
|
+
def self.action_text
|
|
5
|
+
@action_text ||= 'joined team'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.regex_action
|
|
9
|
+
@regex_team ||= '\"(?\'team_name\'.*)\"'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.item
|
|
13
|
+
:team_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.attributes
|
|
17
|
+
@attributes ||= %i[time player_section team_name]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class KilledObject < Event
|
|
4
|
+
attr_reader :time, :player, :object, :weapon, :objectowner
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "killedobject" #{regex_object_info}#{regex_attacker_position}?/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.regex_object_info
|
|
11
|
+
@regex_object_info ||= '\(object "(?\'object\'[^"]+)"\) \(weapon "(?\'weapon\'[^"]+)"\) \(objectowner "(?\'objectowner_section\'.*?)"\)'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.regex_attacker_position
|
|
15
|
+
@regex_attacker_position ||= / \(attacker_position "[^"]+"\)/
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.attributes
|
|
19
|
+
@attributes ||= %i[time player_section object weapon objectowner_section]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.regex_results(matched_line)
|
|
23
|
+
out = []
|
|
24
|
+
attributes.each do |attribute|
|
|
25
|
+
case attribute
|
|
26
|
+
when :player_section
|
|
27
|
+
if matched_line['player_section']
|
|
28
|
+
out.concat(parse_player_section(matched_line['player_section']))
|
|
29
|
+
else
|
|
30
|
+
out.concat([nil, nil, nil, nil])
|
|
31
|
+
end
|
|
32
|
+
when :objectowner_section
|
|
33
|
+
if matched_line['objectowner_section']
|
|
34
|
+
out.concat(parse_player_section(matched_line['objectowner_section']))
|
|
35
|
+
else
|
|
36
|
+
out.concat([nil, nil, nil, nil])
|
|
37
|
+
end
|
|
38
|
+
else
|
|
39
|
+
out << matched_line[attribute]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
out
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def initialize(time, player_name, player_uid, player_steam_id, player_team, object, weapon, objectowner_name, objectowner_uid, objectowner_steam_id, objectowner_team)
|
|
46
|
+
@time = parse_time(time)
|
|
47
|
+
@player = Player.new(player_name, player_uid, player_steam_id, player_team)
|
|
48
|
+
@object = object
|
|
49
|
+
@weapon = weapon
|
|
50
|
+
@objectowner = Player.new(objectowner_name, objectowner_uid, objectowner_steam_id, objectowner_team)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class LostUberAdvantage < Event
|
|
4
|
+
attr_reader :time, :player, :advantage_time
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "lost_uber_advantage" #{regex_advantage_time}/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.regex_advantage_time
|
|
11
|
+
@regex_advantage_time ||= '\(time "(?\'advantage_time\'[0-9.]+)"\)'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.attributes
|
|
15
|
+
@attributes ||= %i[time player_section advantage_time]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def initialize(time, name, uid, steam_id, team, advantage_time)
|
|
19
|
+
@time = parse_time(time)
|
|
20
|
+
@player = Player.new(name, uid, steam_id, team)
|
|
21
|
+
@advantage_time = advantage_time.to_f
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class MiniRoundSelected < RoundEventWithVariables
|
|
4
|
+
def self.round_variable_regex
|
|
5
|
+
@round_variable_regex ||= /\(round "(?'round'.*)"\)/.freeze
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.round_type
|
|
9
|
+
'Mini_Round_Selected'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.round_variable
|
|
13
|
+
@round_variable ||= :round
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module TF2LineParser
|
|
2
|
+
module Events
|
|
3
|
+
class PlayerExtinguished < Event
|
|
4
|
+
attr_reader :time, :player, :target, :weapon
|
|
5
|
+
|
|
6
|
+
def self.regex
|
|
7
|
+
@regex ||= /#{regex_time} #{regex_player} triggered "player_extinguished" against #{regex_target} with #{regex_weapon}#{regex_positions}?/.freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.regex_weapon
|
|
11
|
+
@regex_weapon ||= '"(?\'weapon\'[^"]+)"'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.regex_positions
|
|
15
|
+
@regex_positions ||= / \(attacker_position "[^"]+"\) \(victim_position "[^"]+"\)/
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.attributes
|
|
19
|
+
@attributes ||= %i[time player_section target_section weapon]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def initialize(time, player_name, player_uid, player_steam_id, player_team, target_name, target_uid, target_steam_id, target_team, weapon)
|
|
23
|
+
@time = parse_time(time)
|
|
24
|
+
@player = Player.new(player_name, player_uid, player_steam_id, player_team)
|
|
25
|
+
@target = Player.new(target_name, target_uid, target_steam_id, target_team)
|
|
26
|
+
@weapon = weapon
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -39,8 +39,11 @@ module TF2LineParser
|
|
|
39
39
|
player_team = 'Red'
|
|
40
40
|
value = '69'
|
|
41
41
|
weapon = nil
|
|
42
|
+
healing = nil
|
|
43
|
+
crit = nil
|
|
44
|
+
headshot = nil
|
|
42
45
|
expect(Events::Damage).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, nil, nil,
|
|
43
|
-
nil, nil, value, weapon)
|
|
46
|
+
nil, nil, value, weapon, healing, crit, headshot)
|
|
44
47
|
parse(line)
|
|
45
48
|
end
|
|
46
49
|
|
|
@@ -56,8 +59,11 @@ module TF2LineParser
|
|
|
56
59
|
target_team = 'Red'
|
|
57
60
|
value = '78'
|
|
58
61
|
weapon = 'tf_projectile_rocket'
|
|
62
|
+
healing = nil
|
|
63
|
+
crit = nil
|
|
64
|
+
headshot = nil
|
|
59
65
|
expect(Events::Damage).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, target_name,
|
|
60
|
-
target_uid, target_steam_id, target_team, value, weapon)
|
|
66
|
+
target_uid, target_steam_id, target_team, value, weapon, healing, crit, headshot)
|
|
61
67
|
parse(line)
|
|
62
68
|
end
|
|
63
69
|
|
|
@@ -73,8 +79,11 @@ module TF2LineParser
|
|
|
73
79
|
target_team = 'Red'
|
|
74
80
|
value = '102'
|
|
75
81
|
weapon = 'tf_projectile_pipe'
|
|
82
|
+
healing = nil
|
|
83
|
+
crit = nil
|
|
84
|
+
headshot = nil
|
|
76
85
|
expect(Events::Damage).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, target_name,
|
|
77
|
-
target_uid, target_steam_id, target_team, value, weapon)
|
|
86
|
+
target_uid, target_steam_id, target_team, value, weapon, healing, crit, headshot)
|
|
78
87
|
parse(line)
|
|
79
88
|
end
|
|
80
89
|
|
|
@@ -107,8 +116,51 @@ module TF2LineParser
|
|
|
107
116
|
target_team = 'Red'
|
|
108
117
|
value = '98'
|
|
109
118
|
weapon = 'tf_projectile_pipe'
|
|
119
|
+
healing = nil
|
|
120
|
+
crit = nil
|
|
121
|
+
headshot = nil
|
|
110
122
|
expect(Events::Damage).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, target_name,
|
|
111
|
-
target_uid, target_steam_id, target_team, value, weapon)
|
|
123
|
+
target_uid, target_steam_id, target_team, value, weapon, healing, crit, headshot)
|
|
124
|
+
parse(line)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it 'recognizes damage with multiple optional fields' do
|
|
128
|
+
line = 'L 02/02/2014 - 22:25:43: "Aquila<15><STEAM_0:0:43087158><Red>" triggered "damage" against "A \"fake\" -AA-<21><STEAM_0:0:29650428><Blue>" (damage "150") (realdamage "100") (weapon "sniperrifle") (healing "25")'
|
|
129
|
+
player_name = 'Aquila'
|
|
130
|
+
player_uid = '15'
|
|
131
|
+
player_steam_id = 'STEAM_0:0:43087158'
|
|
132
|
+
player_team = 'Red'
|
|
133
|
+
target_name = 'A \"fake\" -AA-'
|
|
134
|
+
target_uid = '21'
|
|
135
|
+
target_steam_id = 'STEAM_0:0:29650428'
|
|
136
|
+
target_team = 'Blue'
|
|
137
|
+
value = '150'
|
|
138
|
+
weapon = 'sniperrifle'
|
|
139
|
+
healing = '25'
|
|
140
|
+
crit = nil
|
|
141
|
+
headshot = nil
|
|
142
|
+
expect(Events::Damage).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, target_name,
|
|
143
|
+
target_uid, target_steam_id, target_team, value, weapon, healing, crit, headshot)
|
|
144
|
+
parse(line)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it 'recognizes damage with crit' do
|
|
148
|
+
line = 'L 02/02/2014 - 22:28:30: "krafty<20><STEAM_0:1:31326039><Red>" triggered "damage" against "guilty<26><STEAM_0:0:47824702><Blue>" (damage "2") (weapon "degreaser") (crit "crit")'
|
|
149
|
+
player_name = 'krafty'
|
|
150
|
+
player_uid = '20'
|
|
151
|
+
player_steam_id = 'STEAM_0:1:31326039'
|
|
152
|
+
player_team = 'Red'
|
|
153
|
+
target_name = 'guilty'
|
|
154
|
+
target_uid = '26'
|
|
155
|
+
target_steam_id = 'STEAM_0:0:47824702'
|
|
156
|
+
target_team = 'Blue'
|
|
157
|
+
value = '2'
|
|
158
|
+
weapon = 'degreaser'
|
|
159
|
+
healing = nil
|
|
160
|
+
crit = 'crit'
|
|
161
|
+
headshot = nil
|
|
162
|
+
expect(Events::Damage).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, target_name,
|
|
163
|
+
target_uid, target_steam_id, target_team, value, weapon, healing, crit, headshot)
|
|
112
164
|
parse(line)
|
|
113
165
|
end
|
|
114
166
|
|
|
@@ -311,6 +363,39 @@ module TF2LineParser
|
|
|
311
363
|
parse(line)
|
|
312
364
|
end
|
|
313
365
|
|
|
366
|
+
it 'recognizes round setup begin' do
|
|
367
|
+
line = 'L 04/22/2013 - 19:56:12: World triggered "Round_Setup_Begin"'
|
|
368
|
+
expect(Events::RoundSetupBegin).to receive(:new).with(anything)
|
|
369
|
+
parse(line)
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
it 'recognizes round setup end' do
|
|
373
|
+
line = 'L 04/22/2013 - 19:57:21: World triggered "Round_Setup_End"'
|
|
374
|
+
expect(Events::RoundSetupEnd).to receive(:new).with(anything)
|
|
375
|
+
parse(line)
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
it 'recognizes mini round start' do
|
|
379
|
+
line = 'L 04/22/2013 - 19:56:12: World triggered "Mini_Round_Start"'
|
|
380
|
+
expect(Events::MiniRoundStart).to receive(:new).with(anything)
|
|
381
|
+
parse(line)
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
it 'recognizes mini round selected' do
|
|
385
|
+
line = 'L 04/22/2013 - 19:56:12: World triggered "Mini_Round_Selected" (round "round_a")'
|
|
386
|
+
round = 'round_a'
|
|
387
|
+
expect(Events::MiniRoundSelected).to receive(:new).with(anything, round)
|
|
388
|
+
parse(line)
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
it 'recognizes intermission win limit' do
|
|
392
|
+
line = 'L 02/07/2013 - 21:52:41: Team "RED" triggered "Intermission_Win_Limit" due to mp_windifference'
|
|
393
|
+
team = 'RED'
|
|
394
|
+
reason = 'mp_windifference'
|
|
395
|
+
expect(Events::IntermissionWinLimit).to receive(:new).with(anything, team, reason)
|
|
396
|
+
parse(line)
|
|
397
|
+
end
|
|
398
|
+
|
|
314
399
|
it 'recognizes ubercharges' do
|
|
315
400
|
line = log_lines[1416]
|
|
316
401
|
name = 'broder mirelin'
|
|
@@ -329,6 +414,106 @@ module TF2LineParser
|
|
|
329
414
|
parse(line)
|
|
330
415
|
end
|
|
331
416
|
|
|
417
|
+
it 'recognizes empty uber' do
|
|
418
|
+
line = 'L 02/02/2014 - 22:09:54: "Aquila<15><STEAM_0:0:43087158><Red>" triggered "empty_uber"'
|
|
419
|
+
name = 'Aquila'
|
|
420
|
+
uid = '15'
|
|
421
|
+
steam_id = 'STEAM_0:0:43087158'
|
|
422
|
+
team = 'Red'
|
|
423
|
+
expect(Events::EmptyUber).to receive(:new).with(anything, name, uid, steam_id, team)
|
|
424
|
+
parse(line)
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
it 'recognizes charge ready' do
|
|
428
|
+
line = 'L 02/02/2014 - 22:14:14: "flo ❤<24><STEAM_0:1:53945481><Blue>" triggered "chargeready"'
|
|
429
|
+
name = 'flo ❤'
|
|
430
|
+
uid = '24'
|
|
431
|
+
steam_id = 'STEAM_0:1:53945481'
|
|
432
|
+
team = 'Blue'
|
|
433
|
+
expect(Events::ChargeReady).to receive(:new).with(anything, name, uid, steam_id, team)
|
|
434
|
+
parse(line)
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
it 'recognizes charge ended' do
|
|
438
|
+
line = 'L 02/02/2014 - 22:14:27: "flo ❤<24><STEAM_0:1:53945481><Blue>" triggered "chargeended" (duration "6.3")'
|
|
439
|
+
name = 'flo ❤'
|
|
440
|
+
uid = '24'
|
|
441
|
+
steam_id = 'STEAM_0:1:53945481'
|
|
442
|
+
team = 'Blue'
|
|
443
|
+
duration = '6.3'
|
|
444
|
+
expect(Events::ChargeEnded).to receive(:new).with(anything, name, uid, steam_id, team, duration)
|
|
445
|
+
parse(line)
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
it 'recognizes first heal after spawn' do
|
|
449
|
+
line = 'L 02/02/2014 - 22:11:38: "Aquila<15><STEAM_0:0:43087158><Red>" triggered "first_heal_after_spawn" (time "54.7")'
|
|
450
|
+
name = 'Aquila'
|
|
451
|
+
uid = '15'
|
|
452
|
+
steam_id = 'STEAM_0:0:43087158'
|
|
453
|
+
team = 'Red'
|
|
454
|
+
heal_time = '54.7'
|
|
455
|
+
expect(Events::FirstHealAfterSpawn).to receive(:new).with(anything, name, uid, steam_id, team, heal_time)
|
|
456
|
+
parse(line)
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
it 'recognizes lost uber advantage' do
|
|
460
|
+
line = 'L 02/02/2014 - 22:16:50: "Aquila<15><STEAM_0:0:43087158><Red>" triggered "lost_uber_advantage" (time "12")'
|
|
461
|
+
name = 'Aquila'
|
|
462
|
+
uid = '15'
|
|
463
|
+
steam_id = 'STEAM_0:0:43087158'
|
|
464
|
+
team = 'Red'
|
|
465
|
+
advantage_time = '12'
|
|
466
|
+
expect(Events::LostUberAdvantage).to receive(:new).with(anything, name, uid, steam_id, team, advantage_time)
|
|
467
|
+
parse(line)
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
it 'recognizes built object' do
|
|
471
|
+
line = 'L 04/22/2013 - 19:56:20: "Overdosed /Charizard<22><STEAM_0:1:31473917><Red>" triggered "builtobject" (object "OBJ_TELEPORTER") (position "440 1249 576")'
|
|
472
|
+
name = 'Overdosed /Charizard'
|
|
473
|
+
uid = '22'
|
|
474
|
+
steam_id = 'STEAM_0:1:31473917'
|
|
475
|
+
team = 'Red'
|
|
476
|
+
object = 'OBJ_TELEPORTER'
|
|
477
|
+
expect(Events::BuiltObject).to receive(:new).with(anything, name, uid, steam_id, team, object)
|
|
478
|
+
parse(line)
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
it 'recognizes player extinguished' do
|
|
482
|
+
line = 'L 02/02/2014 - 22:28:51: "flo ❤<24><STEAM_0:1:53945481><Blue>" triggered "player_extinguished" against "splisplesplo<23><STEAM_0:1:38937830><Blue>" with "tf_weapon_medigun" (attacker_position "-1286 500 296") (victim_position "-1553 416 296")'
|
|
483
|
+
player_name = 'flo ❤'
|
|
484
|
+
player_uid = '24'
|
|
485
|
+
player_steam_id = 'STEAM_0:1:53945481'
|
|
486
|
+
player_team = 'Blue'
|
|
487
|
+
target_name = 'splisplesplo'
|
|
488
|
+
target_uid = '23'
|
|
489
|
+
target_steam_id = 'STEAM_0:1:38937830'
|
|
490
|
+
target_team = 'Blue'
|
|
491
|
+
weapon = 'tf_weapon_medigun'
|
|
492
|
+
expect(Events::PlayerExtinguished).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, target_name, target_uid, target_steam_id, target_team, weapon)
|
|
493
|
+
parse(line)
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
it 'recognizes joined team' do
|
|
497
|
+
line = 'L 02/07/2013 - 21:21:19: "Epsilon numlocked<4><STEAM_0:1:16347045><Unassigned>" joined team "Blue"'
|
|
498
|
+
name = 'Epsilon numlocked'
|
|
499
|
+
uid = '4'
|
|
500
|
+
steam_id = 'STEAM_0:1:16347045'
|
|
501
|
+
team = 'Unassigned'
|
|
502
|
+
team_name = 'Blue'
|
|
503
|
+
expect(Events::JoinedTeam).to receive(:new).with(anything, name, uid, steam_id, team, team_name)
|
|
504
|
+
parse(line)
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
it 'recognizes entered game' do
|
|
508
|
+
line = 'L 02/07/2013 - 21:21:16: "Epsilon numlocked<4><STEAM_0:1:16347045><>" entered the game'
|
|
509
|
+
name = 'Epsilon numlocked'
|
|
510
|
+
uid = '4'
|
|
511
|
+
steam_id = 'STEAM_0:1:16347045'
|
|
512
|
+
team = ''
|
|
513
|
+
expect(Events::EnteredGame).to receive(:new).with(anything, name, uid, steam_id, team)
|
|
514
|
+
parse(line)
|
|
515
|
+
end
|
|
516
|
+
|
|
332
517
|
it 'recognizes medic deaths' do
|
|
333
518
|
line = log_lines[1700]
|
|
334
519
|
medic_name = 'broder mirelin'
|
|
@@ -411,6 +596,22 @@ module TF2LineParser
|
|
|
411
596
|
parse(line)
|
|
412
597
|
end
|
|
413
598
|
|
|
599
|
+
it 'recognizes killed object' do
|
|
600
|
+
line = 'L 12/30/2025 - 03:08:01: "poo<5><[U:1:435117887]><Red>" triggered "killedobject" (object "OBJ_SENTRYGUN") (weapon "obj_attachment_sapper") (objectowner "ck<24><[U:1:161147993]><Blue>") (attacker_position "-192 1630 1646")'
|
|
601
|
+
player_name = 'poo'
|
|
602
|
+
player_uid = '5'
|
|
603
|
+
player_steam_id = '[U:1:435117887]'
|
|
604
|
+
player_team = 'Red'
|
|
605
|
+
object = 'OBJ_SENTRYGUN'
|
|
606
|
+
weapon = 'obj_attachment_sapper'
|
|
607
|
+
objectowner_name = 'ck'
|
|
608
|
+
objectowner_uid = '24'
|
|
609
|
+
objectowner_steam_id = '[U:1:161147993]'
|
|
610
|
+
objectowner_team = 'Blue'
|
|
611
|
+
expect(Events::KilledObject).to receive(:new).with(anything, player_name, player_uid, player_steam_id, player_team, object, weapon, objectowner_name, objectowner_uid, objectowner_steam_id, objectowner_team)
|
|
612
|
+
parse(line)
|
|
613
|
+
end
|
|
614
|
+
|
|
414
615
|
it 'recognizes spawns' do
|
|
415
616
|
line = log_lines[4541]
|
|
416
617
|
name = 'candyyou # Infinity Gaming'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tf2_line_parser
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Arie
|
|
@@ -96,8 +96,11 @@ files:
|
|
|
96
96
|
- lib/tf2_line_parser.rb
|
|
97
97
|
- lib/tf2_line_parser/events/airshot.rb
|
|
98
98
|
- lib/tf2_line_parser/events/assist.rb
|
|
99
|
+
- lib/tf2_line_parser/events/built_object.rb
|
|
99
100
|
- lib/tf2_line_parser/events/capture_block.rb
|
|
100
101
|
- lib/tf2_line_parser/events/charge_deployed.rb
|
|
102
|
+
- lib/tf2_line_parser/events/charge_ended.rb
|
|
103
|
+
- lib/tf2_line_parser/events/charge_ready.rb
|
|
101
104
|
- lib/tf2_line_parser/events/chat.rb
|
|
102
105
|
- lib/tf2_line_parser/events/connect.rb
|
|
103
106
|
- lib/tf2_line_parser/events/console_say.rb
|
|
@@ -105,16 +108,26 @@ files:
|
|
|
105
108
|
- lib/tf2_line_parser/events/damage.rb
|
|
106
109
|
- lib/tf2_line_parser/events/disconnect.rb
|
|
107
110
|
- lib/tf2_line_parser/events/domination.rb
|
|
111
|
+
- lib/tf2_line_parser/events/empty_uber.rb
|
|
112
|
+
- lib/tf2_line_parser/events/entered_game.rb
|
|
108
113
|
- lib/tf2_line_parser/events/event.rb
|
|
109
114
|
- lib/tf2_line_parser/events/final_score.rb
|
|
115
|
+
- lib/tf2_line_parser/events/first_heal_after_spawn.rb
|
|
110
116
|
- lib/tf2_line_parser/events/headshot_damage.rb
|
|
111
117
|
- lib/tf2_line_parser/events/heal.rb
|
|
118
|
+
- lib/tf2_line_parser/events/intermission_win_limit.rb
|
|
119
|
+
- lib/tf2_line_parser/events/joined_team.rb
|
|
112
120
|
- lib/tf2_line_parser/events/kill.rb
|
|
121
|
+
- lib/tf2_line_parser/events/killed_object.rb
|
|
122
|
+
- lib/tf2_line_parser/events/lost_uber_advantage.rb
|
|
113
123
|
- lib/tf2_line_parser/events/match_end.rb
|
|
114
124
|
- lib/tf2_line_parser/events/medic_death.rb
|
|
115
125
|
- lib/tf2_line_parser/events/medic_death_ex.rb
|
|
126
|
+
- lib/tf2_line_parser/events/mini_round_selected.rb
|
|
127
|
+
- lib/tf2_line_parser/events/mini_round_start.rb
|
|
116
128
|
- lib/tf2_line_parser/events/pickup_item.rb
|
|
117
129
|
- lib/tf2_line_parser/events/player_action_event.rb
|
|
130
|
+
- lib/tf2_line_parser/events/player_extinguished.rb
|
|
118
131
|
- lib/tf2_line_parser/events/point_capture.rb
|
|
119
132
|
- lib/tf2_line_parser/events/pvp_event.rb
|
|
120
133
|
- lib/tf2_line_parser/events/rcon_command.rb
|
|
@@ -123,6 +136,8 @@ files:
|
|
|
123
136
|
- lib/tf2_line_parser/events/round_event_with_variables.rb
|
|
124
137
|
- lib/tf2_line_parser/events/round_event_without_variables.rb
|
|
125
138
|
- lib/tf2_line_parser/events/round_length.rb
|
|
139
|
+
- lib/tf2_line_parser/events/round_setup_begin.rb
|
|
140
|
+
- lib/tf2_line_parser/events/round_setup_end.rb
|
|
126
141
|
- lib/tf2_line_parser/events/round_stalemate.rb
|
|
127
142
|
- lib/tf2_line_parser/events/round_start.rb
|
|
128
143
|
- lib/tf2_line_parser/events/round_win.rb
|