australium 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6fd3f83b9c9d4e08cb36d103b67037fd12f8d8c3
4
+ data.tar.gz: 8f942fa3c40bc628ef4582d2ec04a9c64ee148db
5
+ SHA512:
6
+ metadata.gz: 25969f141083f537faba752bf9916596bce276c87d99557012bf0de6ba91561ac809de48760bc9316158175d2094e805c6877d2a095b3a279cfe11c56a11081e
7
+ data.tar.gz: ab1a4982f7a2722feea7ab262b466130f1556cb663c8883295ce32df9522bb20547c90bcc8be9b08a26a747d535d71f2f60cabfe2193da8c8fa12227a17ac58b
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .idea
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ data/
@@ -0,0 +1,2 @@
1
+ --title "Australium"
2
+ --exclude data --exclude test --exclude tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in australium.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 awkisopen
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,52 @@
1
+ [![Code Climate](https://codeclimate.com/github/awkisopen/australium.png)](https://codeclimate.com/github/awkisopen/australium)
2
+ # Australium
3
+
4
+ <img src="http://i.imgur.com/IpOgnjO.png" align="right" />
5
+ Australium is a powerful TF2 game log parser. It allows access to all game events and player data in a hierarchical,
6
+ rubyified manner. The timestamp and state of the game are stored within every event for easy access.
7
+
8
+ <br clear="all" />
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'australium'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install australium
23
+
24
+ ## Example Usage
25
+
26
+ ```ruby
27
+ require 'australium'
28
+
29
+ # Load game data from logfile
30
+ games = Australium::parse_file('/tmp/tf2game.log')
31
+
32
+ # Logfiles may contain multiple games, but chances are good your logfile will only have one.
33
+ game = games.first
34
+
35
+ # Print the name of each player and the team they were on.
36
+ game.players.each do |player|
37
+ puts "#{p.nick} - #{p.team.empty? ? 'None' : p.team}"
38
+ end
39
+
40
+ # Count the number of backstabs that took place during the game.
41
+ puts 'Backstabs: ' + game.kills.select { |e| e.customkill == 'backstab' }.count.to_s
42
+ ```
43
+
44
+ Check [the documentation](http://rubydoc.info/github/awkisopen/australium/master/frames) for more information on how to access game events.
45
+
46
+ ## Contributing
47
+
48
+ 1. Fork it
49
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
50
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
51
+ 4. Push to the branch (`git push origin my-new-feature`)
52
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'australium/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "australium"
8
+ spec.version = Australium::VERSION
9
+ spec.authors = %w[awk]
10
+ spec.email = %w[awkisopen@shutupandwrite.net]
11
+ spec.description = %q[TF2 log parser]
12
+ spec.summary = %q[TF2 log parser]
13
+ spec.homepage = "http://training.tf"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.required_ruby_version = "~> 2.1"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+ end
@@ -0,0 +1,29 @@
1
+ path = File.dirname(__FILE__)
2
+
3
+ require 'ostruct'
4
+ require 'date'
5
+
6
+ Dir["#{path}/australium/ref/*.rb"].each { |f| require f }
7
+
8
+ require "#{path}/australium/event.rb"
9
+ Dir["#{path}/australium/events/*.rb"].each { |f| require f }
10
+
11
+ Dir["#{path}/australium/*.rb"].each { |f| require f }
12
+
13
+ module Australium
14
+
15
+ # Parses a file located at the given path and returns an array of {Game}s.
16
+ # @param [String] logfile the location of the logfile.
17
+ # @return [Array<Game>] the parsed game data.
18
+ def self.parse_file(logfile)
19
+ log = File.read(logfile)
20
+ Parser::parse(log.split("\n"))
21
+ end
22
+
23
+ # Future expansion: #parse should be able to determine the kind of input given and parse accordingly - i.e.
24
+ # a past logfile vs a logfile currently being written to vs a network stream.
25
+ class << self
26
+ alias_method :parse, :parse_file
27
+ end
28
+
29
+ end
@@ -0,0 +1,47 @@
1
+ module Australium
2
+
3
+ # Represents a generic Event that occurs during a Game.
4
+ class Event < OpenStruct
5
+ using MatchDataToHash
6
+
7
+ # @!attribute raw
8
+ # @return [String] the raw log message.
9
+
10
+ TIMESTAMP_REGEX = %r(L [0-9]{2}/[0-9]{2}/[0-9]{4} - [0-9]{2}:[0-9]{2}:[0-9]{2})
11
+ PROPERTY_REGEX = /\(([^ ]+) "([^"]+)"\)/
12
+
13
+ class << self
14
+ attr_accessor :event_classes
15
+ def inherited(by)
16
+ @event_classes ||= []
17
+ @event_classes << by
18
+ end
19
+ end
20
+
21
+ def initialize(data)
22
+ super(data)
23
+
24
+ # Replace anything matching a Player string with a Player object.
25
+ self.each_pair do |key, value|
26
+ if value =~ Player::LOG_REGEX && key != :raw
27
+ player_data = Player::LOG_REGEX.match(value).to_h
28
+ self[key] = Player.new(player_data)
29
+ end
30
+ end
31
+
32
+ # If we're being stateful, make sure referenced Players are included in the GameState
33
+ unless self.state.nil?
34
+ self.to_h.select { |_, v| v.is_a?(Player) }.each_pair do |key, value|
35
+ if self.state.players.include?(value)
36
+ self[key] = self.state.players.find { |p| p == value }
37
+ else
38
+ self.state.players << value
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ def to_s ; raw end
45
+
46
+ end
47
+ end
@@ -0,0 +1,10 @@
1
+ module Australium
2
+ class MapLoad < Event
3
+
4
+ LOG_REGEX = /Loading map "(?<map_name>.+)"/
5
+
6
+ # @!attribute map_name
7
+ # @return [String] the name of the loaded map.
8
+
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ module Australium
2
+ class MapStart < Event
3
+
4
+ LOG_REGEX = /Started map "(?<map_name>.+)" \(CRC "(?<crc>.+)"\)/
5
+
6
+ # @!attribute map_name
7
+ # @return [String] the name of the map that was started.
8
+
9
+ # @!attribute crc
10
+ # @return [String] CRC of the map.
11
+
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module Australium
2
+ class PlayerConnect < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" connected, address "(?<address>.+)"/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} who connected to the server.
8
+ # @!attribute address
9
+ # @return [String] the IP address of the connecting player.
10
+
11
+ def initialize(data)
12
+ super(data)
13
+ player.address = address
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module Australium
2
+ class PlayerDisconnect < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" disconnected"/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} who disconnected from the server.
8
+
9
+ def initialize(data)
10
+ super(data)
11
+ state.players.delete(player) unless state.nil?
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Australium
2
+ class PlayerEnterGame < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" entered the game/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} who entered the game. This event always takes place after a corresponding
8
+ # {PlayerConnect} event.
9
+
10
+ def initialize(data)
11
+ super(data)
12
+ state.players.find { |p| p == player }[:in_game?] = true
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module Australium
2
+ class PlayerJoinTeam < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" joined team "(?<team>.+)"/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} who joined the team.
8
+ # @!attribute team
9
+ # @return [String] the name of the team the player joined.
10
+
11
+ def initialize(data)
12
+ super(data)
13
+ unless state.nil?
14
+ player = state.players.find { |p| p.nick == self.player.nick }
15
+ player.team = team
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module Australium
2
+ class PlayerKill < Event
3
+
4
+ LOG_REGEX = /"(?<attacker>.+)" killed "(?<victim>.+)" with "(?<weapon>[^"]+)"/
5
+
6
+ # @!attribute attacker
7
+ # @return [Player] the {player} responsible for the kill.
8
+ # @!attribute victim
9
+ # @return [Player] the {player} who was killed.
10
+ # @!attribute weapon
11
+ # @return [String] the name of the weapon used to kill (can be World).
12
+
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module Australium
2
+ class PlayerNameChange < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" changed name to "(?<new_name>.+)"/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} whose name changed.
8
+ # @!attribute new_name
9
+ # @return [String] the name the player changed to.
10
+
11
+ def initialize(data)
12
+ super(data)
13
+ player.nick = new_name
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module Australium
2
+ class PlayerRoleChange < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" changed role to "(?<role>.+)"/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} who changed role.
8
+ # @!attribute role
9
+ # @return [String] the name of the role the player changed to.
10
+
11
+ def initialize(data)
12
+ super(data)
13
+ unless state.nil?
14
+ player = state.players.find { |p| p.nick == self.player.nick }
15
+ player.role = role
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module Australium
2
+ class PlayerSay < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" say(?<team>_team)? "(?<message>.+)"/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} who spoke in chat.
8
+ # @!attribute message
9
+ # @return [String] the message spoken.
10
+
11
+ def initialize(data)
12
+ super(data)
13
+ self[:team] = team.eql?('_team')
14
+ end
15
+
16
+ # Checks if the message was a team-only message.
17
+ # @return [Boolean] true if the message was a team message.
18
+ def team? ; team end
19
+
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ module Australium
2
+ class PlayerSuicide < Event
3
+
4
+ LOG_REGEX = /"(?<player>.+)" committed suicide with "(?<weapon>[^"]+)"/
5
+
6
+ # @!attribute player
7
+ # @return [Player] the {Player} who committed suicide.
8
+ # @!attribute weapon
9
+ # @return [String] the name of the weapon the player committed suicide with (can be World).
10
+
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module Australium
2
+ # A Trigger Event is a very general Event. Triggers occur on point capture, round end, even damage and healing
3
+ # with plugins installed. Depending on the kind of trigger, it could involve one player, two players, or no
4
+ # players at all (in the case of 'World' triggering an event, such as a round end).
5
+ class Trigger < Event
6
+
7
+ LOG_REGEX = /: "?(?<initiator>.*(World|>))"? triggered "(?<action>[^"]+)"(?: against "(?<target>.+>)")?/
8
+
9
+ # @!attribute initiator
10
+ # @return [Player, String] the {Player} who triggered the event, or the string 'World'
11
+ # @!attribute action
12
+ # @return [String] the name of the triggered action.
13
+ # @!attribute target
14
+ # @return [Player, NilClass] the {Player} who received the action, or nil if no {Player} received the action.
15
+
16
+ end
17
+ end
@@ -0,0 +1,61 @@
1
+ module Australium
2
+
3
+ # Represents a full game of TF2, comprised of individual {Event}s.
4
+ class Game
5
+
6
+ class << self
7
+ private
8
+ # Creates shortcuts for returning events of a certain type.
9
+ # @param [Symbol] event_name the friendly name of the event category
10
+ # @param [Class] event_class the class name corresponding to the event
11
+ # @!macro [attach] event_selector
12
+ # @!method $1
13
+ # @return [Array<$2>] Returns all {$2 $2} events.
14
+ def event_selector(event_name, event_class)
15
+ define_method(event_name) { @events.select { |e| e.is_a?(event_class) } }
16
+ end
17
+ end
18
+
19
+ # @!attribute [r] events
20
+ # @return [Array<Events>] events that took place during the game, in chronological order
21
+ attr_reader :events
22
+
23
+ # @param events [Array<Events>] events that took place during the game
24
+ def initialize(events)
25
+ @events = events
26
+ end
27
+
28
+ # Returns an array of all {Player Players} who connected to the server during this game.
29
+ # Caches the return value after the first call.
30
+ # @return [Array<Player>] players who participated in the game
31
+ def players
32
+ @players ||= @events.reverse.each_with_object([]) do |event, all_players|
33
+ break all_players if event.state.nil? || event.state.players.nil?
34
+ all_players.concat event.state.players.reject { |p| all_players.include?(p) }
35
+ end
36
+ end
37
+
38
+ # Returns the name of the map that was played.
39
+ # @return [String] map name
40
+ def map_name
41
+ @events.select { |e| e.is_a?(MapStart) }.last.map_name
42
+ end
43
+
44
+ # @!group Event filters
45
+ event_selector :connects, PlayerConnect
46
+ event_selector :disconnects, PlayerDisconnect
47
+ event_selector :role_changes, PlayerRoleChange
48
+ event_selector :team_joins, PlayerJoinTeam
49
+ event_selector :kills, PlayerKill
50
+ event_selector :name_changes, PlayerNameChange
51
+ event_selector :chat_messages, PlayerSay
52
+ event_selector :suicides, PlayerSuicide
53
+ event_selector :triggers, Trigger
54
+ # @!endgroup
55
+
56
+ # Hide instance variables from #inspect to prevent clutter on interactive terminals.
57
+ # @return [String]
58
+ def inspect ; self.to_s end
59
+
60
+ end
61
+ end
@@ -0,0 +1,20 @@
1
+ module Australium
2
+
3
+ # Represents the state of the game at a particular time.
4
+ class GameState < OpenStruct
5
+
6
+ def initialize(*args)
7
+ super(*args)
8
+
9
+ # @!attribute players
10
+ # @return [Array<Player>] player data at this state
11
+ self.players ||= []
12
+
13
+ # @!attribute timestamp
14
+ # @return [DateTime]
15
+ end
16
+
17
+ def inspect; "<GameState:#{timestamp}>" end
18
+
19
+ end
20
+ end
@@ -0,0 +1,63 @@
1
+ module Australium
2
+
3
+ class Parser
4
+ using MatchDataToHash
5
+ using OpenStructDeepClone
6
+
7
+ # Parses a full TF2 log.
8
+ # @param [Array<String>] lines the lines to parse
9
+ # @return [Array<Game>] the game(s) data
10
+ def self.parse(lines)
11
+ games = [] ; state = GameState.new ; events = []
12
+
13
+ lines.each_with_index do |line, index|
14
+ event = parse_line(line, state)
15
+
16
+ if event.is_a?(MapLoad) || index == lines.count - 1
17
+ games << Game.new(events) unless events.empty?
18
+ events = []
19
+ event = parse_line(line, GameState.new) # Parse a second time with the correct GameState
20
+ end
21
+
22
+ unless event.nil?
23
+ events << event
24
+ state = event.state.deep_clone
25
+ end
26
+ end
27
+
28
+ games
29
+ end
30
+
31
+ # Parses a single line of TF2 log in the context of a game (if a {GameState} is passed).
32
+ # @param [String] line the line to be parsed
33
+ # @param [GameState] the {GameState} containing the game context.
34
+ # @return [Event, NilClass] event if an event has been recognized; nil otherwise.
35
+ def self.parse_line(line, state = nil)
36
+ Event::event_classes.each do |event_class|
37
+ if event_class::LOG_REGEX =~ line
38
+ # Get timestamp data & timestamp GameState if we are being stateful
39
+ timestamp = DateTime.strptime(Event::TIMESTAMP_REGEX.match(line)[0], 'L %m/%d/%Y - %H:%M:%S')
40
+ state.timestamp = timestamp unless state.nil?
41
+
42
+ # Get the meat of the event data
43
+ data = event_class::LOG_REGEX.match(line).to_h
44
+
45
+ # Get supplemental property data, if any exists
46
+ property_data = line.scan(Event::PROPERTY_REGEX).map { |x| [x.first.to_sym, x.last] }.to_h
47
+ data.merge!(property_data)
48
+
49
+ # Add other useful data
50
+ data[:state] = state
51
+ data[:raw] = line
52
+ data[:timestamp] = timestamp
53
+
54
+ # Construct and return the new Event
55
+ return event_class.new(data)
56
+ end
57
+ end
58
+ nil
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,79 @@
1
+ module Australium
2
+
3
+ # Represents a Player playing a Game.
4
+ class Player < OpenStruct
5
+
6
+ LOG_REGEX = /(?<nick>.*)<(?<won_id>.*)><(?<steam_id>.*)><(?<team>.*)>/
7
+
8
+ # @!attribute nick
9
+ # @return [String] the player's in-game nickname.
10
+ # @!attribute won_id
11
+ # @return [String] the player's {http://wiki.hlsw.net/index.php/WONID WONID}.
12
+ # @!attribute steam_id
13
+ # @return [String] the player's unique Steam ID, or 'BOT' if this player is a bot.
14
+ # @!attribute team
15
+ # @return [String] the name of the team the player is on (can be an empty string).
16
+
17
+ def initialize(*args)
18
+ super(*args)
19
+
20
+ # @!attribute address
21
+ # @return [String, NilClass] the player's IP address, or nil if not known
22
+ self[:address] = nil
23
+
24
+ # @!attribute in_game?
25
+ # @return [Boolean] true if the player is in the game (as determined by a triggered {PlayerEnterGame} event).
26
+ self[:in_game?] = false
27
+
28
+ # @!attribute role
29
+ # @return [String, NilClass] the name of the role the player is playing, or nil if none yet
30
+ self[:role] = nil
31
+
32
+ end
33
+
34
+ # Compares players by steam IDs and bots by nicks.
35
+ # @param player [Player] the player to compare against
36
+ # @return [Boolean]
37
+ def ==(player)
38
+ if [self, player].all?(&:bot?)
39
+ self.nick == player.nick
40
+ else
41
+ self.steam_id == player.steam_id
42
+ end
43
+ end
44
+
45
+ # (see #==)
46
+ def eql?(player)
47
+ if [self, player].all?(&:bot?)
48
+ self.nick.eql?(player.nick)
49
+ else
50
+ self.steam_id.eql?(player.steam_id)
51
+ end
52
+ end
53
+
54
+ # Checks if the player is a bot.
55
+ # @return [Boolean] true if the player is a bot
56
+ def bot? ; self.steam_id == 'BOT' end
57
+
58
+ # Checks if the player is on the BLU team.
59
+ # @return [Boolean] true if the player is on the BLU team
60
+ def blu? ; self.team == 'Blue' end
61
+
62
+ # Checks if the player is on the RED team.
63
+ # @return [Boolean] true if the player is on the RED team
64
+ def red? ; self.team == 'Red' end
65
+
66
+ # Checks if the player is a spectator.
67
+ # @return [Boolean] true if the player is a spectator
68
+ def spectator? ; self.team == 'Spectator' end
69
+
70
+ # Checks if the player is not assigned to any team. (This can be considered a fourth team in some contexts.)
71
+ # @return [Boolean] true if the player is unassigned
72
+ def unassigned? ; self.team == 'Unassigned' end
73
+
74
+ # Checks if the player is in the game as either a RED or BLU player.
75
+ # @return [Boolean] true if the player is either on RED or BLU
76
+ def has_team? ; blu? || red? end
77
+
78
+ end
79
+ end
@@ -0,0 +1,11 @@
1
+ module Australium
2
+ module MatchDataToHash
3
+
4
+ refine MatchData do
5
+ def to_h
6
+ Hash[(self.names.empty? ? 1..self.captures.count : self.names.map { |x| x.to_sym }).zip(self.captures)]
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ module Australium
2
+ module OpenStructDeepClone
3
+
4
+ refine OpenStruct do
5
+ def deep_clone
6
+ dup = self.dup
7
+ dup.each_pair do |key, value|
8
+ dup[key] = value.deep_clone if value.is_a?(OpenStruct)
9
+ end
10
+ dup
11
+ end
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module Australium
2
+ VERSION = "1.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: australium
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - awk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: TF2 log parser
42
+ email:
43
+ - awkisopen@shutupandwrite.net
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - ".yardopts"
50
+ - Gemfile
51
+ - LICENSE.txt
52
+ - README.md
53
+ - Rakefile
54
+ - australium.gemspec
55
+ - lib/australium.rb
56
+ - lib/australium/event.rb
57
+ - lib/australium/events/map_load.rb
58
+ - lib/australium/events/map_start.rb
59
+ - lib/australium/events/player_connect.rb
60
+ - lib/australium/events/player_disconnect.rb
61
+ - lib/australium/events/player_enter_game.rb
62
+ - lib/australium/events/player_join_team.rb
63
+ - lib/australium/events/player_kill.rb
64
+ - lib/australium/events/player_name_change.rb
65
+ - lib/australium/events/player_role_change.rb
66
+ - lib/australium/events/player_say.rb
67
+ - lib/australium/events/player_suicide.rb
68
+ - lib/australium/events/trigger.rb
69
+ - lib/australium/game.rb
70
+ - lib/australium/game_state.rb
71
+ - lib/australium/parser.rb
72
+ - lib/australium/player.rb
73
+ - lib/australium/ref/match_data_to_hash.rb
74
+ - lib/australium/ref/open_struct_deep_clone.rb
75
+ - lib/australium/version.rb
76
+ homepage: http://training.tf
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.1'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.2.2
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: TF2 log parser
100
+ test_files: []
101
+ has_rdoc: