summaryrefslogtreecommitdiffstats
path: root/importer.py
blob: 8e25e0f6fbab4ef595cf9c5b5e87b57a33c1e20e (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
125
126
127
128
129
130
#!/usr/bin/env python3

import json
import operator
import sys
import time

import oursql
import requests

import db

def insert_kill(c, kill):
	try:
		db.execute(c, 'INSERT INTO kills (kill_id, solar_system_id, kill_time, moon_id) VALUES(?, ?, ?, ?)',
				kill['killID'], kill['solarSystemID'], kill['killTime'], kill['moonID'])
	except oursql.IntegrityError as e:
		if e.args[0] == oursql.errnos['ER_DUP_ENTRY']:
			return False
		raise

	victim = kill['victim']
	parambatch = [(
		kill['killID'], 1, victim['characterID'], victim['characterName'], victim['shipTypeID'],
		victim['allianceID'], victim['allianceName'], victim['corporationID'], victim['corporationName'], victim['factionID'], victim['factionName'],
		victim['damageTaken'], None, None, None,
	)]
	for attacker in kill['attackers']:
		parambatch.append((
			kill['killID'], 0, attacker['characterID'], attacker['characterName'], attacker['shipTypeID'],
			attacker['allianceID'], attacker['allianceName'], attacker['corporationID'], attacker['corporationName'], attacker['factionID'], attacker['factionName'],
			attacker['damageDone'], attacker['finalBlow'], attacker['securityStatus'], attacker['weaponTypeID'],
		))
	c.executemany('''
		INSERT INTO characters (
			kill_id, victim, character_id, character_name, ship_type_id,
			alliance_id, alliance_name, corporation_id, corporation_name, faction_id, faction_name,
			damage, final_blow, security_status, weapon_type_id
		) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
		''', parambatch
	)

	parambatch = []
	for item in kill['items']:
		parambatch.append((kill['killID'], item['typeID'], item['flag'],
			item['qtyDropped'], item['qtyDestroyed'], item['singleton']))
	c.executemany('''
		INSERT INTO items (
			kill_id, type_id, flag, dropped, destroyed, singleton
		) VALUES(?, ?, ?, ?, ?, ?)
		''', parambatch
	)

	try:
		result = db.get(c, 'SELECT cost FROM item_costs WHERE type_id = ?', (victim['shipTypeID']))
		cost = result['cost']
	except db.NoRowsException:
		cost = 0
	result = db.get(c, '''
		SELECT SUM(cost * (dropped + destroyed)) AS item_cost
		FROM items
		JOIN item_costs ON items.type_id = item_costs.type_id
		WHERE kill_id = ?
		''', kill['killID'])
	if result['item_cost'] is not None:
		cost += result['item_cost']
	db.execute(c, 'INSERT INTO kill_costs (kill_id, cost) VALUES(?, ?)', kill['killID'], cost)

	return True

def main():
	rs = requests.session()
	with db.cursor() as c:
		if len(sys.argv) == 2:
			kill_id = sys.argv[1]
			response = rs.get('http://api.whelp.gg/kill/' + kill_id)
			character_id = response.json()['victim']['character_id']
			url = 'https://zkillboard.com/api/losses/characterID/{}/beforeKillID/{}/limit/1'
			response = rs.get(url.format(character_id, int(kill_id) + 1))
			data = response.json()
			if len(data) != 1:
				raise Exception('got {} kills'.format(len(data)))
			if insert_kill(c, data[0]):
				print('inserted!')
			else:
				print('duplicate')
			return

		groups = db.query(c, 'SELECT groupID FROM eve.invGroups WHERE categoryID = ?', 6)
		groups = list(map(operator.itemgetter('groupID'), groups))
		last_kill_ids = {}
		for i in range(0, len(groups), 10):
			query_groups = ','.join(map(str, groups[i:i+10]))
			last_kill_ids[query_groups] = None
		last_request_time = 0
		while True:
			for query_group in last_kill_ids:
				path = '/api/losses/api-only/groupID/' + query_group
				last_kill_id = last_kill_ids[query_group]
				if last_kill_id is not None:
					path += '/beforeKillID/' + str(last_kill_id)
				now = time.time()
				if now - last_request_time < 12:
					sleep_secs = 12 - (now - last_request_time)
					print('sleeping', sleep_secs)
					time.sleep(sleep_secs)
				last_request_time = time.time()
				try:
					r = rs.get('https://zkillboard.com' + path)
					kills = r.json()
				except Exception as e:
					print(repr(e))
					break
				print('inserting', len(kills), 'kills', end='... ')
				sys.stdout.flush()
				inserted = 0
				try:
					for kill in kills:
						if insert_kill(c, kill):
							inserted += 1
				except TypeError as e:
					print(repr(e), kills)
					break
				db.conn.commit()
				print(len(kills) - inserted, 'dupes')
				last_kill_id = kills[-1]['killID']
				last_kill_ids[query_group] = last_kill_id

if __name__ == '__main__':
	main()