summaryrefslogtreecommitdiffstats
path: root/manufacturing.py
blob: f3ee03d2183198a2a9c74c7b815816741551e682 (plain)
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
#!/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:
		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
			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]

	# &regionlimit=%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')