adam 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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