|
|
@@ -0,0 +1,122 @@
|
|
|
+#!/usr/bin/env python
|
|
|
+
|
|
|
+import oursql
|
|
|
+import urllib2
|
|
|
+from xml.dom import minidom
|
|
|
+
|
|
|
+system_name = 'amarr'
|
|
|
+#system_name = 'jita'
|
|
|
+conn = oursql.connect(db='eve', user='root')
|
|
|
+
|
|
|
+def get_systemid(name):
|
|
|
+ curs = conn.cursor()
|
|
|
+ try:
|
|
|
+ #SELECT regionID FROM mapRegions WHERE regionName
|
|
|
+ curs.execute('''
|
|
|
+ SELECT solarSystemID
|
|
|
+ FROM mapSolarSystems
|
|
|
+ WHERE solarSystemName LIKE ?;
|
|
|
+ ''', (name,))
|
|
|
+ return curs.fetchone()[0]
|
|
|
+ finally:
|
|
|
+ curs.close()
|
|
|
+
|
|
|
+def iter_blueprints():
|
|
|
+ curs = conn.cursor()
|
|
|
+ try:
|
|
|
+ curs.execute('''
|
|
|
+ SELECT b.productTypeID, t.typeName FROM invBlueprintTypes as b
|
|
|
+ INNER JOIN invTypes AS t ON b.productTypeID = t.typeID
|
|
|
+ ''')
|
|
|
+ while True:
|
|
|
+ r = curs.fetchone()
|
|
|
+ if r is None:
|
|
|
+ break
|
|
|
+ yield r
|
|
|
+ finally:
|
|
|
+ curs.close()
|
|
|
+
|
|
|
+def get_mats(typeid):
|
|
|
+ curs = conn.cursor()
|
|
|
+ try:
|
|
|
+ # base mats
|
|
|
+ curs.execute('''
|
|
|
+ SELECT t.typeID, m.quantity
|
|
|
+ FROM invTypeMaterials AS m
|
|
|
+ INNER JOIN invTypes AS t ON m.materialTypeID = t.typeID
|
|
|
+ WHERE m.typeID = ?;
|
|
|
+ ''', (typeid,))
|
|
|
+ mats = dict(curs.fetchall())
|
|
|
+ # extra mats
|
|
|
+ curs.execute('''
|
|
|
+ SELECT blueprintTypeID FROM invBlueprintTypes
|
|
|
+ WHERE productTypeID = ?
|
|
|
+ ''', (typeid,))
|
|
|
+ blueprint_typeid = curs.fetchall()[0][0]
|
|
|
+ curs.execute('''
|
|
|
+ SELECT t.typeID, r.quantity
|
|
|
+ FROM ramTypeRequirements AS r
|
|
|
+ INNER JOIN invTypes AS t ON r.requiredTypeID = t.typeID
|
|
|
+ INNER JOIN invGroups AS g ON t.groupID = g.groupID
|
|
|
+ WHERE r.typeID = ? AND r.activityID = 1 AND g.categoryID != 16;
|
|
|
+ ''', (blueprint_typeid,))
|
|
|
+ while True:
|
|
|
+ r = curs.fetchone()
|
|
|
+ if r is None:
|
|
|
+ break
|
|
|
+ mat_typeid, quantity = r
|
|
|
+ if mat_typeid not in minerals.keys():
|
|
|
+ return None
|
|
|
+ try:
|
|
|
+ mats[mat_typeid] += quantity
|
|
|
+ except KeyError:
|
|
|
+ mats[mat_typeid] = quantity
|
|
|
+ return mats
|
|
|
+ finally:
|
|
|
+ curs.close()
|
|
|
+
|
|
|
+def get_prices(typeid, systemid):
|
|
|
+ # ®ionlimit=%d
|
|
|
+ url = 'http://api.eve-central.com/api/marketstat?typeid=%d&usesystem=%d' % (typeid, systemid)
|
|
|
+ xml = minidom.parse(urllib2.urlopen(url))
|
|
|
+ buy = xml.getElementsByTagName('buy')[0]
|
|
|
+ buy_max = buy.getElementsByTagName('max')[0]
|
|
|
+ buy_price = float(buy_max.childNodes[0].data)
|
|
|
+ sell = xml.getElementsByTagName('sell')[0]
|
|
|
+ sell_min = sell.getElementsByTagName('min')[0]
|
|
|
+ sell_price = float(sell_min.childNodes[0].data)
|
|
|
+ return buy_price, sell_price
|
|
|
+
|
|
|
+def calc_margin(typeid, systemid):
|
|
|
+ mats = get_mats(typeid)
|
|
|
+ cost = 0
|
|
|
+ for mtypeid, quantity in mats.iteritems():
|
|
|
+ try:
|
|
|
+ cost += prices[mtypeid][1] * quantity
|
|
|
+ except KeyError:
|
|
|
+ return
|
|
|
+ if cost == 0:
|
|
|
+ return
|
|
|
+ sell_value = get_prices(typeid, systemid)[0]
|
|
|
+ profit = sell_value - cost
|
|
|
+ margin = profit / cost
|
|
|
+ return margin
|
|
|
+
|
|
|
+minerals = {
|
|
|
+ 34: 'Tritanium',
|
|
|
+ 35: 'Pyerite',
|
|
|
+ 36: 'Mexallon',
|
|
|
+ 40: 'Megacyte',
|
|
|
+ 37: 'Isogen',
|
|
|
+ 38: 'Nocxium',
|
|
|
+ 39: 'Zydrine',
|
|
|
+ }
|
|
|
+prices = {}
|
|
|
+
|
|
|
+systemid = get_systemid(system_name)
|
|
|
+for typeid in minerals.iterkeys():
|
|
|
+ prices[typeid] = get_prices(typeid, systemid)
|
|
|
+for typeid, name in iter_blueprints():
|
|
|
+ margin = calc_margin(typeid, systemid)
|
|
|
+ if margin is not None:
|
|
|
+ print '%0.2f\t%s' % (margin, name)
|