adam 1.1.2 → 1.2.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.
data/README.md CHANGED
@@ -8,9 +8,9 @@ Adam is a library for all things [EVE](http://www.eveonline.com/).
8
8
 
9
9
  ## Features
10
10
 
11
- * Killmail parser
12
- * Kill log parser
13
- * EDK-compatible killboard importer
11
+ * Parses killmails
12
+ * Parses kill logs
13
+ * Imports killmails from EDK-compatible feeds
14
14
 
15
15
  ## Synopsis
16
16
 
@@ -2,4 +2,4 @@ adapter: mysql
2
2
  database: eve_arena_development
3
3
  username: root
4
4
  password: frkt
5
- host: localhost
5
+ host: localhost
@@ -1,5 +1,5 @@
1
1
  module Adam
2
- VERSION = '1.1.2'
2
+ VERSION = '1.2.0'
3
3
 
4
4
  autoload :Killmail, 'adam/killmail'
5
5
  autoload :KillLog, 'adam/kill_log'
@@ -2,6 +2,16 @@ require 'digest'
2
2
 
3
3
  module Adam
4
4
 
5
+ # Instances of the Kill class represent a kill in the EVE Online universe.
6
+ #
7
+ # Accessors:
8
+ # * +eve_id+ - The EVE ID of the killmail. This is only populated if the kill was derived from a kill log.
9
+ # * +time+ - A time object set to the time of the kill.
10
+ # * +solar_system+ - A solar system object (see the SolarSystem class).
11
+ # * +victim+ - A victim object (see the Victim class).
12
+ # * +solar_system+ - A solar system object (see the SolarSystem class).
13
+ # * +involved_parties+ - An array of involved party objects (see the InvolvedParty class).
14
+ # * +loot+ - An array of loot objects (see the Loot class).
5
15
  class Kill
6
16
  attr_accessor :eve_id, :time, :solar_system, :victim, :involved_parties, :loot
7
17
 
@@ -9,6 +19,8 @@ module Adam
9
19
  yield self if block_given?
10
20
  end
11
21
 
22
+ # Reverse-engineer the killmail. This is particularly useful if it
23
+ # was originally derived from a kill log.
12
24
  def to_killmail
13
25
 
14
26
  killmail = ""
@@ -17,9 +29,9 @@ module Adam
17
29
  killmail << "Victim: #{victim.pilot}\n"
18
30
  killmail << "Corp: #{victim.corporation}\n"
19
31
  killmail << "Alliance: #{victim.alliance}\n" if victim.alliance
20
- killmail << "Alliance: Unknown\n" unless victim.alliance
32
+ killmail << "Alliance: Unknown\n" if victim.alliance.nil?
21
33
  killmail << "Faction: #{victim.faction}\n" if victim.faction
22
- killmail << "Faction: NONE\n" unless victim.faction
34
+ killmail << "Faction: NONE\n" if victim.faction.nil?
23
35
  killmail << "Destroyed: #{victim.ship}\n"
24
36
  killmail << "System: #{solar_system.name}\n"
25
37
  killmail << "Security: #{solar_system.security_status.round(2)}\n"
@@ -38,9 +50,9 @@ module Adam
38
50
  killmail << "Security: #{involved_party.security_status.round(2)}\n"
39
51
  killmail << "Corp: #{involved_party.corporation}\n"
40
52
  killmail << "Alliance: #{involved_party.alliance}\n" if involved_party.alliance
41
- killmail << "Alliance: NONE\n" unless involved_party.alliance
53
+ killmail << "Alliance: NONE\n" if involved_party.alliance.nil?
42
54
  killmail << "Faction: #{involved_party.faction}\n" if involved_party.faction
43
- killmail << "Faction: NONE\n" unless involved_party.faction
55
+ killmail << "Faction: NONE\n" if involved_party.faction.nil?
44
56
  killmail << "Ship: #{involved_party.ship}\n"
45
57
  killmail << "Weapon: #{involved_party.weapon}\n"
46
58
  killmail << "Damage Done: #{involved_party.damage_done}\n"
@@ -66,7 +78,7 @@ module Adam
66
78
  destroyed_items.each do |loot|
67
79
  killmail << "#{loot.name}"
68
80
  killmail << ", Qty: #{loot.quantity}" if loot.quantity > 1
69
- killmail << " (Cargo)" if loot.cargo
81
+ killmail << " (Cargo)" if loot.cargo_hold
70
82
  killmail << " (Drone Bay)" if loot.drone_bay
71
83
  killmail << "\n"
72
84
  end
@@ -80,7 +92,7 @@ module Adam
80
92
  dropped_items.each do |loot|
81
93
  killmail << "#{loot.name}"
82
94
  killmail << ", Qty: #{loot.quantity}" if loot.quantity > 1
83
- killmail << " (Cargo)" if loot.cargo
95
+ killmail << " (Cargo)" if loot.cargo_hold
84
96
  killmail << " (Drone Bay)" if loot.drone_bay
85
97
  killmail << "\n"
86
98
  end
@@ -91,6 +103,7 @@ module Adam
91
103
 
92
104
  alias_method :to_s, :to_killmail
93
105
 
106
+ # Calculates the message digest of the killmail.
94
107
  def digest
95
108
  string = "#{time}#{victim.pilot}#{victim.ship}#{solar_system.name}#{victim.damage_taken}"
96
109
  involved_parties.sort! { |x, y| x.damage_done <=> y.damage_done }
@@ -100,39 +113,87 @@ module Adam
100
113
 
101
114
  end
102
115
 
116
+ # Instances of the SolarSystem class represent a solar system in the EVE universe.
117
+ #
118
+ # Accessors:
119
+ # * +name+ - A string describing the name of the solar system.
120
+ # * +security_status+ - A floating-point number describing the security status of the solar system.
103
121
  class Kill::SolarSystem
104
122
  attr_accessor :name, :security_status
105
123
 
106
124
  def initialize
107
125
  yield self if block_given?
108
126
  end
109
-
110
127
  end
111
128
 
129
+ # Instances of the Kill class represent a victim of a kill.
130
+ #
131
+ # Accessors:
132
+ # * +pilot+ - A string describing the name of the pilot.
133
+ # * +corporation+ - A string describing the name of the corporation the pilot is enrolled in.
134
+ # * +alliance+ - A string describing the name of the alliance the corporation is a member of. May be +nil+ if the corporation is not in an alliance.
135
+ # * +faction+ - A string describing the name of the faction the pilot is involved in. May be +nil+ if the pilot is not in a faction.
136
+ # * +ship+ - A string describing the name of the ship that was destroyed.
137
+ # * +damage_taken+ - An integer describing damage taken.
112
138
  class Kill::Victim
113
139
  attr_accessor :pilot, :corporation, :alliance, :faction, :ship, :damage_taken
114
140
 
115
141
  def initialize
116
142
  yield self if block_given?
117
143
  end
118
-
119
144
  end
120
145
 
146
+ # Instances of the InvolvedParty class represent an involved party in a kill.
147
+ #
148
+ # Accessors:
149
+ # * +type+ - A symbol describing whether the pilot was player-controlled (:PC) or non-player controlled (:NPC).
150
+ # * +pilot+ - A string describing the name of the pilot. For NPCs, this is +nil+.
151
+ # * +security_status+ - A floating-point number describing the security status of the pilot. For NPCs, this is +nil+.
152
+ # * +corporation+ - A string describing the name of the corporation the pilot is enrolled in. For NPCs, this may be nil.
153
+ # * +alliance+ - A string describing the name of the alliance the corporation is a member of. May be +nil+ if the corporation is not in an alliance.
154
+ # * +faction+ - A string describing the name of the faction the pilot is involved in. May be +nil+ if the pilot is not in a faction.
155
+ # * +ship+ - A string describing the name of the ship that the pilot was flying.
156
+ # * +weapon+ - A string describing the name of the weapon that was last fired by this pilot.
157
+ # * +damage_done+ - An integer describing damage done by this pilot.
158
+ # * +final_blow+ - A boolean describing whether or not this pilot made the final blow.
121
159
  class Kill::InvolvedParty
122
160
  attr_accessor :type, :pilot, :security_status, :corporation, :alliance, :faction, :ship, :weapon, :damage_done, :final_blow
123
161
 
162
+ def pc?
163
+ type == :PC
164
+ end
165
+
166
+ def npc?
167
+ type == :NPC
168
+ end
169
+
124
170
  def initialize
125
171
  yield self if block_given?
126
172
  end
127
-
128
173
  end
129
174
 
175
+ # Instances of the Loot class represent a piece of loot of a kill.
176
+ #
177
+ # Accessors:
178
+ # * +name+ - A string describing the name of the item.
179
+ # * +quantity+ - An integer describing the quantity of the item.
180
+ # * +cargo_hold+ - A boolean describing whether or not this item was in the cargo hold.
181
+ # * +drone_bay+ - A boolean describing whether or not this item was in the drone bay.
182
+ # * +dropped+ - A boolean describing whether or not this item was dropped.
130
183
  class Kill::Loot
131
- attr_accessor :name, :quantity, :cargo, :drone_bay, :dropped
184
+ attr_accessor :name, :quantity, :cargo_hold, :drone_bay, :dropped
185
+
186
+ def cargo_hold?
187
+ cargo_hold
188
+ end
189
+
190
+ def dropped?
191
+ dropped
192
+ end
132
193
 
133
194
  def initialize
134
195
  yield self if block_given?
135
196
  end
136
197
  end
137
198
 
138
- end
199
+ end
@@ -9,7 +9,11 @@ module Adam
9
9
  module KillLog
10
10
 
11
11
  extend self
12
-
12
+
13
+ # Parses a kill log and returns an array of Kill objects.
14
+ #
15
+ # Parameters:
16
+ # * +source+ - A kill log as returned by the EVE Online API.
13
17
  def parse(source)
14
18
  document = Hpricot.XML(source)
15
19
 
@@ -27,6 +31,10 @@ module Adam
27
31
 
28
32
  private
29
33
 
34
+ # Parses a single element of a kill log.
35
+ #
36
+ # Parameters:
37
+ # * +kill_element+ - A single kill element.
30
38
  def parse_single(kill_element)
31
39
 
32
40
  Adam::Kill.new do |k|
@@ -48,8 +56,8 @@ module Adam
48
56
 
49
57
  v.pilot = victim_element['characterName']
50
58
  v.corporation = victim_element['corporatioNname']
51
- v.alliance = victim_element['allianceName'] == '' ? false : victim_element['allianceName']
52
- v.faction = victim_element['factionName'] == '' ? false: victim_element['factionName']
59
+ v.alliance = victim_element['allianceName'] == '' ? nil : victim_element['allianceName']
60
+ v.faction = victim_element['factionName'] == '' ? nil: victim_element['factionName']
53
61
  v.ship = Item.find(victim_element['shipTypeID']).name
54
62
  v.damage_taken = victim_element['damageTaken'].to_i
55
63
  end
@@ -62,11 +70,11 @@ module Adam
62
70
  raise ValidationError, "Involved party corporation no longer exists" if involved_party_element['corporationName'].empty?
63
71
  raise ValidationError, "Involved party alliance no longer exists" if involved_party_element['allianceName'].empty?
64
72
 
65
- ip.type = involved_party_element['characterName'].empty? ? 'NPC' : 'PC'
73
+ ip.type = involved_party_element['characterName'].empty? ? :NPC : :PC
66
74
  ip.pilot = involved_party_element['characterName'] unless involved_party_element['characterName'].empty?
67
75
  ip.corporation = involved_party_element['corporationName']
68
- ip.alliance = involved_party_element['allianceName'] == '' ? false : involved_party_element['allianceName']
69
- ip.faction = involved_party_element['factionName'] == '' ? false : involved_party_element['factionName']
76
+ ip.alliance = involved_party_element['allianceName'] == '' ? nil : involved_party_element['allianceName']
77
+ ip.faction = involved_party_element['factionName'] == '' ? nil : involved_party_element['factionName']
70
78
  ip.security_status = involved_party_element['securityStatus'].to_f
71
79
  ip.ship = Item.find(involved_party_element['shipTypeID']).name
72
80
  ip.weapon = Item.find(involved_party_element['weaponTypeID']).name
@@ -82,7 +90,7 @@ module Adam
82
90
  k.loot << Adam::Kill::Loot.new do |l|
83
91
  l.name = Item.find(loot_element['typeID']).name
84
92
  l.quantity = loot_element['qtyDropped'].to_i
85
- l.cargo = loot_element['flag'] == '5' ? true : false
93
+ l.cargo_hold = loot_element['flag'] == '5' ? true : false
86
94
  l.drone_bay = loot_element['flag'] == '87' ? true : false
87
95
  l.dropped = true
88
96
  end
@@ -92,7 +100,7 @@ module Adam
92
100
  k.loot << Adam::Kill::Loot.new do |l|
93
101
  l.name = Item.find(loot_element['typeID']).name
94
102
  l.quantity = loot_element['qtyDestroyed'].to_i
95
- l.cargo = loot_element['flag'] == '5' ? true : false
103
+ l.cargo_hold = loot_element['flag'] == '5' ? true : false
96
104
  l.drone_bay = loot_element['flag'] == '87' ? true : false
97
105
  l.dropped = false
98
106
  end
@@ -105,4 +113,4 @@ module Adam
105
113
 
106
114
  end
107
115
 
108
- end
116
+ end
@@ -2,4 +2,4 @@ module Adam
2
2
  module KillLog
3
3
  class ValidationError < RuntimeError; end
4
4
  end
5
- end
5
+ end
@@ -15,7 +15,7 @@ module Adam
15
15
  @uri, @feed_uri = options[:uri], options[:feed_uri]
16
16
  end
17
17
 
18
- # Loads an array of killmails from an EDK-compatible feed.
18
+ # Parses an EDK-compatible feed and returns an array of killmail strings.
19
19
  #
20
20
  # +options+ is a hash with these keys:
21
21
  # * +week+ - An integer determining which week to import. Defaults to current week.
@@ -49,4 +49,4 @@ module Adam
49
49
 
50
50
  end
51
51
 
52
- end
52
+ end
@@ -12,4 +12,4 @@ module Adam
12
12
 
13
13
  end
14
14
 
15
- end
15
+ end
@@ -9,6 +9,10 @@ module Adam
9
9
 
10
10
  extend self
11
11
 
12
+ # Parses killmails and populates corresponding Kill objects.
13
+ #
14
+ # Parameters:
15
+ # * +source+ - A string containing the killmail to parse.
12
16
  def parse(source)
13
17
  raise ValidationError.new(source), "Killmail is empty" if source.empty?
14
18
 
@@ -40,9 +44,9 @@ module Adam
40
44
  # Set pilot to nil if it's a moon
41
45
  v.pilot = nil if v.pilot =~ /[a-zA-Z0-9\- ]+ - Moon [0-9]+/
42
46
 
43
- # Convert alliance/faction from "unknown" or "none" to false
44
- v.alliance = false if v.alliance =~ /unknown|none/i
45
- v.faction = false if v.faction =~ /unknown|none/i
47
+ # Convert alliance/faction from "unknown" or "none" to nil
48
+ v.alliance = nil if v.alliance =~ /unknown|none/i
49
+ v.faction = nil if v.faction =~ /unknown|none/i
46
50
  end
47
51
 
48
52
  raise ValidationError.new(source), "No faction called '#{kill.victim.faction}' exists" if kill.victim.faction and !Faction.exists? :name => kill.victim.faction
@@ -60,7 +64,7 @@ module Adam
60
64
 
61
65
  when 8
62
66
  involved_party = Adam::Kill::InvolvedParty.new do |ip|
63
- ip.type = "PC"
67
+ ip.type = :PC
64
68
  ip.pilot = snippet[/Name: ([a-zA-Z0-9]{1}[a-zA-Z0-9'. -]{1,48}[a-zA-Z0-9.]{1})/, 1] or raise ValidationError.new(source), "Involved party #{i+1} pilot malformed"
65
69
  ip.security_status = snippet[/Security: ([\-\.0-9]+)/, 1].to_f or raise ValidationError.new(source), "Involved party #{i+1} security malformed"
66
70
  ip.corporation = snippet[/Corp: ([a-zA-Z0-9]{1}[a-zA-Z0-9'. -]{1,48}[a-zA-Z0-9.]{1})/, 1] or raise ValidationError.new(source), "Involved party #{i+1} corporation malformed"
@@ -71,14 +75,14 @@ module Adam
71
75
  ip.damage_done = (snippet[/Damage Done: ([0-9]+)/, 1] or raise ValidationError.new(source), "Involved party #{i+1} damage malformed").to_i
72
76
  ip.final_blow = snippet =~ /\(laid the final blow\)/ ? true : false
73
77
 
74
- # Convert alliance/faction from "unknown" or "none" to false
75
- ip.alliance = false if ip.alliance =~ /unknown|none/i
76
- ip.faction = false if ip.faction =~ /unknown|none/i
78
+ # Convert alliance/faction from "unknown" or "none" to nil
79
+ ip.alliance = nil if ip.alliance =~ /unknown|none/i
80
+ ip.faction = nil if ip.faction =~ /unknown|none/i
77
81
  end
78
82
 
79
83
  when 2
80
84
  involved_party = Adam::Kill::InvolvedParty.new do |ip|
81
- ip.type = "NPC"
85
+ ip.type = :NPC
82
86
  ip.ship = snippet[/Name: ([a-zA-Z0-9]{1}[a-zA-Z0-9'. -]{1,48}[a-zA-Z0-9.]{1})/, 1] or raise ValidationError.new(source), "Involved party #{i+1} ship malformed"
83
87
  ip.damage_done = (snippet[/Damage Done: ([0-9]+)/, 1] or raise ValidationError.new(source), "Involved party #{i+1} damage malformed").to_i
84
88
  ip.final_blow = snippet =~ /\(laid the final blow\)/ ? true : false
@@ -110,11 +114,11 @@ module Adam
110
114
  loot = Adam::Kill::Loot.new do |l|
111
115
  l.name = snippet[/([^,\(\)]+)/, 1] or raise ValidationError.new(source), "Destroyed item #{i+1} name malformed"
112
116
  l.quantity = snippet =~ /Qty: ([0-9]+)/ ? snippet[/Qty: ([0-9]+)/, 1].to_i : 1
113
- l.cargo = snippet[/(Cargo)/] ? true : false
117
+ l.cargo_hold = snippet[/(Cargo)/] ? true : false
114
118
  l.drone_bay = snippet[/(Drone Bay)/] ? true : false
115
119
  l.dropped = false
116
120
  end
117
- existing_loot = kill.loot.select { |el| el.name.eql?(loot.name) and el.cargo.eql?(loot.cargo) and el.drone_bay.eql?(loot.drone_bay) and el.dropped.eql?(loot.dropped) }[0]
121
+ existing_loot = kill.loot.select { |el| el.name.eql?(loot.name) and el.cargo_hold.eql?(loot.cargo_hold) and el.drone_bay.eql?(loot.drone_bay) and el.dropped.eql?(loot.dropped) }[0]
118
122
  existing_loot ? existing_loot.quantity += loot.quantity : kill.loot << loot
119
123
  end
120
124
  end
@@ -124,11 +128,11 @@ module Adam
124
128
  loot = Adam::Kill::Loot.new do |l|
125
129
  l.name = snippet[/([^,\(\)]+)/, 1] or raise ValidationError.new(source), "Dropped item #{i+1} name malformed"
126
130
  l.quantity = snippet =~ /Qty: ([0-9]+)/ ? snippet[/Qty: ([0-9]+)/, 1].to_i : 1
127
- l.cargo = snippet[/(Cargo)/] ? true : false
131
+ l.cargo_hold = snippet[/(Cargo)/] ? true : false
128
132
  l.drone_bay = snippet[/(Drone Bay)/] ? true : false
129
133
  l.dropped = true
130
134
  end
131
- existing_loot = kill.loot.select { |el| el.name.eql?(loot.name) and el.cargo.eql?(loot.cargo) and el.drone_bay.eql?(loot.drone_bay) and el.dropped.eql?(loot.dropped) }[0]
135
+ existing_loot = kill.loot.select { |el| el.name.eql?(loot.name) and el.cargo_hold.eql?(loot.cargo_hold) and el.drone_bay.eql?(loot.drone_bay) and el.dropped.eql?(loot.dropped) }[0]
132
136
  existing_loot ? existing_loot.quantity += loot.quantity : kill.loot << loot
133
137
  end
134
138
  end
@@ -139,4 +143,4 @@ module Adam
139
143
 
140
144
  end
141
145
 
142
- end
146
+ end
@@ -12,4 +12,4 @@ module Adam
12
12
 
13
13
  end
14
14
 
15
- end
15
+ end
@@ -5,4 +5,4 @@ ActiveRecord::Base.establish_connection(database_configuration)
5
5
 
6
6
  class Item < ActiveRecord::Base; end
7
7
  class SolarSystem < ActiveRecord::Base; end
8
- class Faction < ActiveRecord::Base; end
8
+ class Faction < ActiveRecord::Base; end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 1
8
7
  - 2
9
- version: 1.1.2
8
+ - 0
9
+ version: 1.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Johannes Gorset