adam 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +83 -0
- data/config/database.yml +5 -0
- data/db/adam.sql +26726 -0
- data/lib/adam.rb +8 -0
- data/lib/adam/kill.rb +137 -0
- data/lib/adam/kill_log.rb +109 -0
- data/lib/adam/kill_log/validation_error.rb +5 -0
- data/lib/adam/killboard.rb +52 -0
- data/lib/adam/killboard/feed_error.rb +15 -0
- data/lib/adam/killmail.rb +130 -0
- data/lib/adam/killmail/validation_error.rb +15 -0
- data/lib/models.rb +7 -0
- metadata +75 -0
data/lib/adam.rb
ADDED
data/lib/adam/kill.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module Adam
|
4
|
+
|
5
|
+
class Kill
|
6
|
+
attr_accessor :eve_id, :time, :solar_system, :victim, :involved_parties, :loot
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
yield self if block_given?
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_killmail
|
13
|
+
|
14
|
+
killmail = ""
|
15
|
+
killmail << time.strftime("%Y.%m.%d %H:%M")
|
16
|
+
killmail << "\n"
|
17
|
+
killmail << "Victim: #{victim.pilot}\n"
|
18
|
+
killmail << "Corp: #{victim.corporation}\n"
|
19
|
+
killmail << "Alliance: #{victim.alliance}\n" if victim.alliance
|
20
|
+
killmail << "Alliance: Unknown\n" unless victim.alliance
|
21
|
+
killmail << "Faction: #{victim.faction}\n" if victim.faction
|
22
|
+
killmail << "Faction: NONE\n" unless victim.faction
|
23
|
+
killmail << "Destroyed: #{victim.ship}\n"
|
24
|
+
killmail << "System: #{solar_system.name}\n"
|
25
|
+
killmail << "Security: #{solar_system.security_status.round(2)}\n"
|
26
|
+
killmail << "Damage Taken: #{victim.damage_taken}\n"
|
27
|
+
killmail << "\n"
|
28
|
+
killmail << "Involved parties:\n"
|
29
|
+
killmail << "\n"
|
30
|
+
|
31
|
+
involved_parties.each do |involved_party|
|
32
|
+
|
33
|
+
case involved_party.type
|
34
|
+
|
35
|
+
when "PC"
|
36
|
+
killmail << "Name: #{involved_party.pilot} (laid the final blow)\n" if involved_party.final_blow
|
37
|
+
killmail << "Name: #{involved_party.pilot}\n" unless involved_party.final_blow
|
38
|
+
killmail << "Security: #{involved_party.security_status.round(2)}\n"
|
39
|
+
killmail << "Corp: #{involved_party.corporation}\n"
|
40
|
+
killmail << "Alliance: #{involved_party.alliance}\n" if involved_party.alliance
|
41
|
+
killmail << "Alliance: NONE\n" unless involved_party.alliance
|
42
|
+
killmail << "Faction: #{involved_party.faction}\n" if involved_party.faction
|
43
|
+
killmail << "Faction: NONE\n" unless involved_party.faction
|
44
|
+
killmail << "Ship: #{involved_party.ship}\n"
|
45
|
+
killmail << "Weapon: #{involved_party.weapon}\n"
|
46
|
+
killmail << "Damage Done: #{involved_party.damage_done}\n"
|
47
|
+
killmail << "\n"
|
48
|
+
|
49
|
+
when "NPC"
|
50
|
+
killmail << "Name: #{involved_party.ship} / #{involved_party.corporation or involved_party.faction} (laid the final blow)\n" if involved_party.final_blow
|
51
|
+
killmail << "Name: #{involved_party.ship} / #{involved_party.corporation or involved_party.faction}\n" unless involved_party.final_blow
|
52
|
+
killmail << "Damage Done: #{involved_party.damage_done}\n"
|
53
|
+
killmail << "\n"
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
killmail << "\n"
|
60
|
+
killmail << "\n"
|
61
|
+
|
62
|
+
destroyed_items = loot.select { |l| l.dropped == false }
|
63
|
+
unless destroyed_items.empty?
|
64
|
+
killmail << "Destroyed items:\n"
|
65
|
+
killmail << "\n"
|
66
|
+
destroyed_items.each do |loot|
|
67
|
+
killmail << "#{loot.name}"
|
68
|
+
killmail << ", Qty: #{loot.quantity}" if loot.quantity > 1
|
69
|
+
killmail << " (Cargo)" if loot.cargo
|
70
|
+
killmail << " (Drone Bay)" if loot.drone_bay
|
71
|
+
killmail << "\n"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
dropped_items = loot.select { |l| l.dropped == true }
|
76
|
+
unless dropped_items.empty?
|
77
|
+
killmail << "Dropped items:\n"
|
78
|
+
killmail << "\n"
|
79
|
+
dropped_items.each do |loot|
|
80
|
+
killmail << "#{loot.name}"
|
81
|
+
killmail << ", Qty: #{loot.quantity}" if loot.quantity > 1
|
82
|
+
killmail << " (Cargo)" if loot.cargo
|
83
|
+
killmail << " (Drone Bay)" if loot.drone_bay
|
84
|
+
killmail << "\n"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
killmail
|
89
|
+
end
|
90
|
+
|
91
|
+
alias_method :to_s, :to_killmail
|
92
|
+
|
93
|
+
def digest
|
94
|
+
string = time.to_s + victim.pilot.to_s + victim.ship.to_s + solar_system.to_s + victim.damage_taken.to_s
|
95
|
+
involved_parties.sort! { |x, y| x.damage_done <=> y.damage_done }
|
96
|
+
involved_parties.each { |p| string += p.pilot.to_s + p.damage_done.to_s }
|
97
|
+
Digest::MD5.hexdigest(string)
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
class Kill::SolarSystem
|
103
|
+
attr_accessor :name, :security_status
|
104
|
+
|
105
|
+
def initialize
|
106
|
+
yield self if block_given?
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class Kill::Victim
|
112
|
+
attr_accessor :pilot, :corporation, :alliance, :faction, :ship, :damage_taken
|
113
|
+
|
114
|
+
def initialize
|
115
|
+
yield self if block_given?
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
class Kill::InvolvedParty
|
121
|
+
attr_accessor :type, :pilot, :security_status, :corporation, :alliance, :faction, :ship, :weapon, :damage_done, :final_blow
|
122
|
+
|
123
|
+
def initialize
|
124
|
+
yield self if block_given?
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
class Kill::Loot
|
130
|
+
attr_accessor :name, :quantity, :cargo, :drone_bay, :dropped
|
131
|
+
|
132
|
+
def initialize
|
133
|
+
yield self if block_given?
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'adam/kill_log/validation_error'
|
2
|
+
require 'models' unless defined?(SolarSystem) and defined?(Item)
|
3
|
+
|
4
|
+
require 'hpricot'
|
5
|
+
require 'time'
|
6
|
+
|
7
|
+
module Adam
|
8
|
+
|
9
|
+
module KillLog
|
10
|
+
|
11
|
+
extend self
|
12
|
+
|
13
|
+
def parse(source)
|
14
|
+
document = Hpricot(source)
|
15
|
+
|
16
|
+
kill_logs = []
|
17
|
+
document.search("//rowset[@name=kills]/row").each do |kill_log|
|
18
|
+
begin
|
19
|
+
kill_logs << parse_single(kill_log)
|
20
|
+
rescue ValidationError
|
21
|
+
next
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
kill_logs
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def parse_single(kill_element)
|
31
|
+
|
32
|
+
kill = Adam::Kill.new do |kill|
|
33
|
+
|
34
|
+
kill.eve_id = kill_element['killid'].to_i
|
35
|
+
kill.time = Time.parse(kill_element['killtime']).utc
|
36
|
+
|
37
|
+
kill.solar_system = Adam::Kill::SolarSystem.new do |ss|
|
38
|
+
ss.name = SolarSystem.find(kill_element['solarsystemid']).name
|
39
|
+
ss.security_status = SolarSystem.find(kill_element['solarsystemid']).security_status
|
40
|
+
end
|
41
|
+
|
42
|
+
kill.victim = Adam::Kill::Victim.new do |v|
|
43
|
+
victim_element = kill_element.at('/victim')
|
44
|
+
|
45
|
+
raise ValidationError, "Victim pilot no longer exists" if victim_element['characterid'] != '0' and victim_element['charactername'].empty?
|
46
|
+
raise ValidationError, "Victim corporation no longer exists" if victim_element['corporationid'] != '0' and victim_element['corporationname'].empty?
|
47
|
+
raise ValidationError, "Victim alliance no longer exists" if victim_element['allianceid'] != '0' and victim_element['alliancename'].empty?
|
48
|
+
|
49
|
+
v.pilot = victim_element['charactername']
|
50
|
+
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']
|
53
|
+
v.ship = Item.find(victim_element['shiptypeid']).name
|
54
|
+
v.damage_taken = victim_element['damagetaken'].to_i
|
55
|
+
end
|
56
|
+
|
57
|
+
kill.involved_parties = []
|
58
|
+
kill_element.search('/rowset[@name=attackers]/row').each do |involved_party_element|
|
59
|
+
|
60
|
+
kill.involved_parties << Adam::Kill::InvolvedParty.new do |ip|
|
61
|
+
raise ValidationError, "Involved party pilot no longer exists" if involved_party_element['characterid'] != '0' and involved_party_element['charactername'].empty?
|
62
|
+
raise ValidationError, "Involved party corporation no longer exists" if involved_party_element['corporationid'] != '0' and involved_party_element['corporationname'].empty?
|
63
|
+
raise ValidationError, "Involved party alliance no longer exists" if involved_party_element['allianceid'] != '0' and involved_party_element['alliancename'].empty?
|
64
|
+
|
65
|
+
ip.type = involved_party_element['charactername'].empty? ? 'NPC' : 'PC'
|
66
|
+
ip.pilot = involved_party_element['charactername'] unless involved_party_element['charactername'].empty?
|
67
|
+
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']
|
70
|
+
ip.security_status = involved_party_element['securitystatus'].to_f
|
71
|
+
ip.ship = Item.find(involved_party_element['shiptypeid']).name
|
72
|
+
ip.weapon = Item.find(involved_party_element['weapontypeid']).name
|
73
|
+
ip.damage_done = involved_party_element['damagedone'].to_i
|
74
|
+
ip.final_blow = involved_party_element['finalblow'] == '1' ? true : false
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
kill.loot = []
|
80
|
+
kill_element.search('/rowset[@name=items]/row').each do |loot_element|
|
81
|
+
if loot_element['qtydropped'].to_i > 0
|
82
|
+
kill.loot << Adam::Kill::Loot.new do |l|
|
83
|
+
l.name = Item.find(loot_element['typeid']).name
|
84
|
+
l.quantity = loot_element['qtydropped'].to_i
|
85
|
+
l.cargo = loot_element['flag'] == '5' ? true : false
|
86
|
+
l.drone_bay = loot_element['flag'] == '87' ? true : false
|
87
|
+
l.dropped = true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if loot_element['qtydestroyed'].to_i > 0
|
92
|
+
kill.loot << Adam::Kill::Loot.new do |l|
|
93
|
+
l.name = Item.find(loot_element['typeid']).name
|
94
|
+
l.quantity = loot_element['qtydropped'].to_i
|
95
|
+
l.cargo = loot_element['flag'] == '5' ? true : false
|
96
|
+
l.drone_bay = loot_element['flag'] == '87' ? true : false
|
97
|
+
l.dropped = false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
return kill
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'adam/killboard/feed_error'
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
require 'net/http'
|
5
|
+
require 'uri'
|
6
|
+
require 'cgi'
|
7
|
+
require 'hpricot'
|
8
|
+
|
9
|
+
module Adam
|
10
|
+
|
11
|
+
class Killboard
|
12
|
+
attr_reader :uri, :feed_uri
|
13
|
+
|
14
|
+
def initialize(options = {})
|
15
|
+
@uri, @feed_uri = options[:uri], options[:feed_uri]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Loads an array of killmails from an EDK-compatible feed.
|
19
|
+
#
|
20
|
+
# +options+ is a hash with these keys:
|
21
|
+
# * +week+ - An integer determining which week to import. Defaults to current week.
|
22
|
+
# * +year+ - An integer determining which year to import the week from. Defaults to current year.
|
23
|
+
def killmails(options = {})
|
24
|
+
options = { :week => Date.today.cweek, :year => Date.today.year }.merge!(options)
|
25
|
+
|
26
|
+
uri = URI.parse(@feed_uri)
|
27
|
+
|
28
|
+
query_string = { 'week' => options[:week], 'year' => options[:year], 'nocache' => Time.now.to_i }.map{ |k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join("&")
|
29
|
+
|
30
|
+
response = nil
|
31
|
+
connection = Net::HTTP.new(uri.host, uri.port)
|
32
|
+
connection.start do |http|
|
33
|
+
tries = 0
|
34
|
+
begin
|
35
|
+
response = http.get(uri.path + '?' + uri.query + '&' + query_string)
|
36
|
+
rescue Timeout::Error
|
37
|
+
tries += 1
|
38
|
+
sleep 10
|
39
|
+
retry if tries < 3
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
xml = Hpricot.XML(response.body)
|
44
|
+
|
45
|
+
raise FeedError.new(response.body), "Feed malformed" unless xml.at('/rss')
|
46
|
+
|
47
|
+
killmails = xml.search("//item/description").collect { |element| element.inner_text }
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require "adam/killmail/validation_error"
|
2
|
+
|
3
|
+
require "time"
|
4
|
+
|
5
|
+
module Adam
|
6
|
+
|
7
|
+
module Killmail
|
8
|
+
|
9
|
+
extend self
|
10
|
+
|
11
|
+
def parse(source)
|
12
|
+
|
13
|
+
# Normalize line endings
|
14
|
+
source.encode! :universal_newline => true
|
15
|
+
|
16
|
+
kill = Adam::Kill.new do |kill|
|
17
|
+
|
18
|
+
time = source[/([0-9]{4}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2})/, 1] or raise ValidationError.new(source), "Time malformed"
|
19
|
+
time = Time.parse(time + " UTC")
|
20
|
+
|
21
|
+
kill.time = time
|
22
|
+
|
23
|
+
kill.solar_system = Adam::Kill::SolarSystem.new do |ss|
|
24
|
+
ss.name = source[/System: (.+)/, 1] or raise ValidationError.new(source), "Solar system malformed"
|
25
|
+
ss.security_status = source[/Security: ([\.0-9]+)/, 1].to_f or raise ValidationError.new(source), "Solar system security malformed"
|
26
|
+
end
|
27
|
+
|
28
|
+
kill.victim = Adam::Kill::Victim.new do |v|
|
29
|
+
v.pilot = source[/Victim: ([a-zA-Z0-9]{1}[a-zA-Z0-9'. -]{1,48}[a-zA-Z0-9.]{1})/, 1] or raise ValidationError.new(source), "Victim pilot malformed"
|
30
|
+
v.corporation = source[/Corp: ([a-zA-Z0-9]{1}[a-zA-Z0-9'. -]{1,48}[a-zA-Z0-9.]{1})/, 1] or raise ValidationError.new(source), "Victim corporation malformed"
|
31
|
+
v.alliance = source[/Alliance: ([a-zA-Z0-9]{1}[a-zA-Z0-9'. -]{1,48}[a-zA-Z0-9.]{1})/, 1] or raise ValidationError.new(source), "Victim alliance malformed"
|
32
|
+
v.faction = source[/Faction: ([a-zA-Z0-9]{1}[a-zA-Z0-9'. -]{1,48}[a-zA-Z0-9.]{1})/, 1] or raise ValidationError.new(source), "Victim faction malformed"
|
33
|
+
v.ship = source[/Destroyed: (.+)/, 1] or raise ValidationError.new(source), "Victim ship malformed"
|
34
|
+
v.damage_taken = source[/Damage Taken: ([0-9]+)/, 1].to_i or raise ValidationError.new(source), "Victim damage taken malformed"
|
35
|
+
|
36
|
+
# Set pilot to nil if it's a moon
|
37
|
+
v.pilot = nil if v.pilot =~ /[a-zA-Z0-9\- ]+ - Moon [0-9]+/
|
38
|
+
|
39
|
+
# Convert alliance/faction from "unknown" or "none" to false
|
40
|
+
v.alliance = false if v.alliance =~ /unknown|none/i
|
41
|
+
v.faction = false if v.faction =~ /unknown|none/i
|
42
|
+
end
|
43
|
+
|
44
|
+
kill.involved_parties = []
|
45
|
+
|
46
|
+
involved_parties = source[/Involved parties:\n\n(((.+\n){8}\n|(.+\n){2}\n)*)/, 1] or raise ValidationError.new(source), "Involved parties malformed"
|
47
|
+
involved_parties.split("\n\n").each_with_index do |snippet, i|
|
48
|
+
|
49
|
+
lines = 0 and snippet.each_line { |line| lines += 1 }
|
50
|
+
|
51
|
+
case lines
|
52
|
+
|
53
|
+
when 8
|
54
|
+
kill.involved_parties << Adam::Kill::InvolvedParty.new do |ip|
|
55
|
+
ip.type = "PC"
|
56
|
+
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"
|
57
|
+
ip.security_status = snippet[/Security: ([\-\.0-9]+)/, 1].to_f or raise ValidationError.new(source), "Involved party #{i+1} security malformed"
|
58
|
+
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"
|
59
|
+
ip.alliance = snippet[/Alliance: ([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} alliance malformed"
|
60
|
+
ip.faction = snippet[/Faction: ([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} faction malformed"
|
61
|
+
ip.ship = snippet[/Ship: (.+)/, 1] or raise ValidationError.new(source), "Involved party #{i+1} ship malformed"
|
62
|
+
ip.weapon = snippet[/Weapon: (.+)/, 1] or raise ValidationError.new(source), "Involved party #{i+1} weapon malformed"
|
63
|
+
ip.damage_done = (snippet[/Damage Done: ([0-9]+)/, 1] or raise ValidationError.new(source), "Involved party #{i+1} damage malformed").to_i
|
64
|
+
ip.final_blow = snippet =~ /\(laid the final blow\)/ ? true : false
|
65
|
+
|
66
|
+
# Convert alliance/faction from "unknown" or "none" to false
|
67
|
+
ip.alliance = false if ip.alliance =~ /unknown|none/i
|
68
|
+
ip.faction = false if ip.faction =~ /unknown|none/i
|
69
|
+
end
|
70
|
+
|
71
|
+
when 2
|
72
|
+
kill.involved_parties << Adam::Kill::InvolvedParty.new do |ip|
|
73
|
+
ip.type = "NPC"
|
74
|
+
ip.ship = snippet[/Name: ([^\/]+)/, 1] or raise ValidationError.new(source), "Involved party #{i+1} ship malformed"
|
75
|
+
ip.damage_done = (snippet[/Damage Done: ([0-9]+)/, 1] or raise ValidationError.new(source), "Involved party #{i+1} damage malformed").to_i
|
76
|
+
ip.final_blow = snippet =~ /\(laid the final blow\)/ ? true : false
|
77
|
+
|
78
|
+
# Determine whether allegiance is a faction or a corporation
|
79
|
+
allegiance = 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} allegiance malformed"
|
80
|
+
if allegiance =~ /^(Caldari State|Minmatar Republic|Amarr Empire|Gallente Federation|Jove Empire|CONCORD Assembly|Ammatar Mandate|Khanid Kingdom|The Syndicate|Guristas Pirates|Angel Cartel|The Blood Raider Covenant|The InterBus|ORE|Thukker Tribe|The Servant Sisters of EVE|The Society|Mordu's Legion Command|Sansha's Nation|Serpentis)$/
|
81
|
+
ip.faction = allegiance
|
82
|
+
elsif allegiance == 'Unknown'
|
83
|
+
ip.corporation = false
|
84
|
+
else
|
85
|
+
ip.corporation = allegiance
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
kill.loot = []
|
94
|
+
|
95
|
+
if source =~ /Destroyed items:/
|
96
|
+
source[/Destroyed items:\n\n(((.+)\n)*)/, 1].split("\n").each_with_index do |snippet, i|
|
97
|
+
loot = Adam::Kill::Loot.new do |l|
|
98
|
+
l.name = snippet[/([^,\(\)]+)/, 1] or raise ValidationError.new(source), "Destroyed item #{i+1} name malformed"
|
99
|
+
l.quantity = snippet =~ /Qty: ([0-9]+)/ ? snippet[/Qty: ([0-9]+)/, 1].to_i : 1
|
100
|
+
l.cargo = snippet[/(Cargo)/] ? true : false
|
101
|
+
l.drone_bay = snippet[/(Drone Bay)/] ? true : false
|
102
|
+
l.dropped = false
|
103
|
+
end
|
104
|
+
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]
|
105
|
+
existing_loot ? existing_loot.quantity += loot.quantity : kill.loot << loot
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
if source =~ /Dropped items:/
|
110
|
+
source[/Dropped items:\n\n(((.+)\n)*)/, 1].split("\n").each_with_index do |snippet, i|
|
111
|
+
loot = Adam::Kill::Loot.new do |l|
|
112
|
+
l.name = snippet[/([^,\(\)]+)/, 1] or raise ValidationError.new(source), "Dropped item #{i+1} name malformed"
|
113
|
+
l.quantity = snippet =~ /Qty: ([0-9]+)/ ? snippet[/Qty: ([0-9]+)/, 1].to_i : 1
|
114
|
+
l.cargo = snippet[/(Cargo)/] ? true : false
|
115
|
+
l.drone_bay = snippet[/(Drone Bay)/] ? true : false
|
116
|
+
l.dropped = true
|
117
|
+
end
|
118
|
+
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]
|
119
|
+
existing_loot ? existing_loot.quantity += loot.quantity : kill.loot << loot
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
return kill
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|