1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
#!/usr/bin/env python
import oursql
import requests
import urllib2
from xml.dom import minidom
import xml.parsers.expat
system_name = 'jita'
conn = oursql.connect(db='eve', user='eve', passwd='eve')
rs = requests.session(headers={'User-Agent': 'http://git.raylu.net/eve/'})
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:
# metaGroupID's:
# NULL or 1: Tech I
# 2: Tech II
# 14: Tech III
# filtering for these excludes storyline (3), faction (4), officer (5), and deadspace (6)
curs.execute('''
SELECT b.productTypeID, t.typeName FROM invBlueprintTypes as b
INNER JOIN invTypes AS t ON b.productTypeID = t.typeID
LEFT JOIN invMetaTypes AS m ON m.typeID = b.productTypeID
WHERE m.metaGroupID IS NULL or m.metaGroupID in (1,2,14)
''')
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
try:
mats[mat_typeid] += quantity
except KeyError:
mats[mat_typeid] = quantity
return mats
finally:
curs.close()
systemid = get_systemid(system_name)
prices = {}
def get_prices(typeid):
global prices
if typeid in prices:
return prices[typeid]
# ®ionlimit=%d
url = 'http://api.eve-central.com/api/marketstat?typeid=%d&usesystem=%d' % (typeid, systemid)
xml = minidom.parseString(rs.get(url).text)
buy = xml.getElementsByTagName('buy')[0]
buy_max = buy.getElementsByTagName('max')[0]
bid = float(buy_max.childNodes[0].data)
sell = xml.getElementsByTagName('sell')[0]
sell_min = sell.getElementsByTagName('min')[0]
ask = float(sell_min.childNodes[0].data)
prices[typeid] = (bid, ask)
return bid, ask
def calc_margin(typeid):
mats = get_mats(typeid)
if mats is None:
return
cost = 0
for mtypeid, quantity in mats.iteritems():
cost += get_prices(mtypeid)[1] * quantity
if cost == 0:
return
sell_value = get_prices(typeid)[0]
profit = sell_value - cost
margin = profit / cost
return margin
with open(system_name, 'w') as f:
for typeid, name in iter_blueprints():
try:
margin = calc_margin(typeid)
except xml.parsers.expat.ExpatError:
pass
else:
if margin is not None:
line = '%0.2f\t%s' % (margin, name)
print line
f.write(line + '\n')
|