Browse Source

kill/item costs

raylu 12 years ago
parent
commit
fbb64e5d89

+ 9 - 6
db/queries.py

@@ -13,10 +13,11 @@ def search(q):
 def corporation(corp_id):
 	with db.cursor() as c:
 		kills = db.query(c, '''
-			SELECT DISTINCT(kills.kill_id), kill_time,
+			SELECT DISTINCT(kills.kill_id), kill_time, cost,
 				solarSystemName as system_name, security, regionName as region
 			FROM kills
 			JOIN characters ON characters.kill_id = kills.kill_id
+			JOIN kill_costs ON kill_costs.kill_id = kills.kill_id
 			JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
 			JOIN eve.mapRegions ON mapSolarSystems.regionID = mapRegions.regionID
 			WHERE corporation_id = ?
@@ -56,9 +57,10 @@ def corporation(corp_id):
 def kill(kill_id):
 	with db.cursor() as c:
 		kill = db.get(c, '''
-			SELECT kill_time, solarSystemName, security FROM kills
+			SELECT kill_time, cost, solarSystemName, security FROM kills
+			JOIN kill_costs ON kill_costs.kill_id = kills.kill_id
 			JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
-			WHERE kill_id = ?
+			WHERE kills.kill_id = ?
 			''', kill_id)
 		kill['kill_time'] = _format_kill_time(kill['kill_time'])
 
@@ -82,10 +84,11 @@ def kill(kill_id):
 				attackers.append(char)
 
 		item_rows = db.query(c, '''
-			SELECT type_id, flag, dropped, destroyed, singleton,
-				typeName AS item_name, capacity
+			SELECT items.type_id, flag, dropped, destroyed, singleton,
+				cost, typeName AS item_name, capacity
 			FROM items
-			JOIN eve.invTypes ON type_id = typeID
+			JOIN item_costs ON item_costs.type_id = items.type_id
+			JOIN eve.invTypes ON items.type_id = typeID
 			WHERE kill_id = ? ORDER BY flag ASC
 			''', kill_id)
 		items = defaultdict(list)

+ 88 - 0
update_costs.py

@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+
+from decimal import Decimal
+from io import StringIO
+import operator
+import sys
+from xml.etree import ElementTree
+
+import requests
+
+import db
+
+def fetch_type_ids(c):
+	if len(sys.argv) > 1 and sys.argv[1] in ['-q', '--quick']:
+		type_ids = c.execute('''
+			SELECT i.type_id FROM items AS i
+				JOIN eve.invTypes AS t ON i.type_id = t.typeID
+				WHERE marketGroupID is NOT NULL
+			UNION SELECT ship_type_id FROM characters
+				JOIN eve.invTypes ON ship_type_id = typeID
+				WHERE victim AND marketGroupID is NOT NULL
+			''')
+	else:
+		type_ids = c.execute('SELECT typeID FROM eve.invTypes WHERE marketGroupID IS NOT NULL')
+	return set(map(operator.itemgetter(0), c.fetchall()))
+
+rs = requests.session()
+jita_system = 30000142
+def query(type_id):
+	params = {'typeid': type_id, 'usesystem': jita_system}
+	r = rs.get('http://api.eve-central.com/api/marketstat', params=params)
+	try:
+		tree = ElementTree.parse(StringIO(r.text))
+	except ElementTree.ParseError:
+		return 0
+	value = tree.getroot().find('marketstat').find('type').find('sell').find('percentile').text
+	return int(Decimal(value) * 100)
+
+def update_kill(kill_id):
+	with db.conn.cursor() as c:
+		c.execute('''
+			SELECT cost FROM characters
+			JOIN item_costs ON ship_type_id = item_costs.type_id
+			WHERE kill_id = ? AND victim
+			''', (kill_id,))
+		r = c.fetchone()
+		if r:
+			cost = r[0]
+			c.nextset()
+		else:
+			cost = 0
+		c.execute('''
+			SELECT SUM(cost * (dropped + destroyed)) FROM items AS i
+			JOIN item_costs AS ic ON i.type_id = ic.type_id WHERE kill_id = ?
+			''', (kill_id,))
+		r = c.fetchone()
+		c.nextset()
+		if r[0]:
+			cost += r[0]
+		c.execute('UPDATE kill_costs SET cost = ? WHERE kill_id = ?', (cost, kill_id))
+
+def main():
+	with db.conn.cursor() as c:
+		print('getting items')
+		type_ids = fetch_type_ids(c)
+
+		print('updating items')
+		parambatch = []
+		for type_id in type_ids:
+			value = query(type_id)
+			parambatch.append((type_id, value, value))
+		c.executemany('''
+			INSERT INTO item_costs (type_id, cost) VALUES(?, ?)
+			ON DUPLICATE KEY UPDATE cost = ?
+			''', parambatch)
+
+		print('getting kills')
+		c.execute('SELECT kill_id from kills')
+
+		print('updating kills')
+		while True:
+			r = c.fetchone()
+			if r is None:
+				break
+			update_kill(r[0])
+
+if __name__ == '__main__':
+	main()

+ 5 - 0
web/static/css/corporation.ccss

@@ -17,3 +17,8 @@ table#kills:
 		width: 64px
 	th.killer:
 		width: 250px
+	th.value:
+		width: 62px
+
+	td:nth-child(7):
+		text-align: right

+ 6 - 1
web/static/css/kill.ccss

@@ -117,9 +117,11 @@ table#items:
 	th:nth-child(1):
 		width: 33px
 	th:nth-child(2):
-		width: 417px
+		width: 300px
 	th:nth-child(3):
 		width: 50px
+	th:nth-child(4):
+		width: 117px
 
 	.slot:
 		background-color: #222
@@ -134,6 +136,9 @@ table#items:
 		text-align: right
 		font-weight: bold
 		padding-right: 8px
+	td:nth-child(4):
+		text-align: right
+		padding-right: 8px
 	.dropped:
 		background-color: #041
 	.destroyed:

+ 6 - 2
web/static/js/common.js

@@ -1,16 +1,20 @@
 Object.append(window.ykill, {
-	'api': function (path, cb) {
+	'api': function(path, cb) {
 		new Request.JSON({
 			'url': ykill.api_host + path,
 			'onSuccess': cb,
 		}).get();
 	},
 
-	'portrait': function (id, text, img_dir, img_suffix) {
+	'portrait': function(id, text, img_dir, img_suffix) {
 		var img = new Element('img', {
 			'src': '//image.eveonline.com/' + img_dir + '/' + id + img_suffix,
 			'alt': text,
 		});
 		return img;
 	},
+
+	'format_isk': function(isk) {
+		return isk.toLocaleString('en-US', {'minimumFractionDigits': 2, 'maximumFractionDigits': 2});
+	},
 });

+ 5 - 0
web/static/js/corporation.js

@@ -59,6 +59,11 @@ window.addEvent('domready', function() {
 				td.appendText(' / ' + final_blow['faction_name']);
 			tr.grab(td);
 
+			td = new Element('td');
+			var millions = kill['cost'] / (100 * 1000000);
+			td.appendText(ykill.format_isk(millions));
+			tr.grab(td);
+
 			table.grab(tr);
 		});
 	});

+ 14 - 8
web/static/js/kill.js

@@ -1,7 +1,6 @@
 window.addEvent('domready', function() {
 	var kill_id = document.location.pathname.split('/').getLast();
 	ykill.api('/kill/' + kill_id, function(data) {
-
 		var kill = data['kill'];
 		var victim = data['victim'];
 		document.title += ' - ' + victim['character_name'] + ' - ' + victim['ship_name'];
@@ -43,12 +42,18 @@ window.addEvent('domready', function() {
 				),
 				new Element('td', {'html': victim['faction_name']})
 			));
-		table.grab(new Element('tr').adopt(
-			new Element('td').grab(
-				ykill.portrait(victim['ship_type_id'], victim['ship_name'], 'type', '_64.png')
+		table.adopt(
+			new Element('tr').adopt(
+				new Element('td').grab(
+					ykill.portrait(victim['ship_type_id'], victim['ship_name'], 'type', '_64.png')
+				),
+				new Element('td', {'html': victim['ship_name']})
 			),
-			new Element('td', {'html': victim['ship_name']})
-		));
+			new Element('tr').adopt(
+				new Element('td', {'html': 'cost'}),
+				new Element('td', {'html': ykill.format_isk(kill['cost'] / 100)})
+			)
+		);
 
 		var items = data['items'];
 		var div = $('ship');
@@ -98,7 +103,7 @@ window.addEvent('domready', function() {
 			if (!items[slot])
 				return;
 			table.grab(new Element('tr').grab(
-				new Element('td', {'html': slot, 'colspan': 3, 'class': 'slot'})
+				new Element('td', {'html': slot, 'colspan': 4, 'class': 'slot'})
 			));
 			if (slot == 'high') {
 				var highs = {'dropped': {}, 'destroyed': {}};
@@ -129,7 +134,8 @@ window.addEvent('domready', function() {
 						})
 					),
 					new Element('td', {'html': item['item_name']}),
-					new Element('td', {'html': count, 'class': item_class})
+					new Element('td', {'html': count, 'class': item_class}),
+					new Element('td', {'html': ykill.format_isk(item['cost'] / 100)})
 				));
 			});
 		});

+ 1 - 0
web/templates/corporation.html

@@ -18,6 +18,7 @@
 		<th class="victim">victim</th>
 		<th class="killer_portrait"></th>
 		<th class="killer">killer(s)</th>
+		<th class="value">value</th>
 	</tr>
 </table>
 

+ 1 - 0
web/templates/kill.html

@@ -69,6 +69,7 @@
 		<th></th>
 		<th></th>
 		<th></th>
+		<th></th>
 	</tr></thead>
 </table>