summaryrefslogtreecommitdiffhomepage
path: root/scrap.py
blob: 2f81aa0185d367ad5c148f35e8651c153e91a80b (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
import argparse
import json
import re
import sys
import time

from salvager import esi
from salvager import zkill


SYSTEM_AND_DATE = re.compile(r"/(\d+)/(\d+)/?$")


def expand_hashes(snapshot):
	"""
	Expands killmails in *snapshot* IN PLACE by adding their hash based on information from Zkillboard.
	"""
	for killmail in snapshot['killmails']:
		time.sleep(1.05)  # Zkillboard is very sensitive.
		killmail['hash'] = zkill.hash(killmail['killmail_id'])
	return snapshot


def expand_details(snapshot):
	"""
	Expands killmails in *snapshot* IN PLACE by adding details from EVE ESI. Some data is dropped in process as e.g.,
	full information on attackers is not important in context of the visualizations.
	"""
	for killmail in snapshot['killmails']:
		details = esi.killmail(killmail['killmail_id'], killmail['hash'])
		killmail.update(details)
	return snapshot


def get_ships(snapshot):
	ships = {x['victim']['ship_type_id'] for x in snapshot['killmails']}
	return [esi.type(x) for x in ships]


def output_name(args):
	"""
	Generates name of the output file based on the CLI *args*.
	"""
	if args.output:
		return args.output
	match = SYSTEM_AND_DATE.search(args.url)
	if match:
		return "{}_{}.json".format(*match.groups())
	return "a.json"


def main():
	parser = argparse.ArgumentParser()
	parser.add_argument("url")
	parser.add_argument("-o", "--output")
	parser.add_argument("--pretty", action='store_true')
	args = parser.parse_args()
	snapshot = zkill.parse_battle_report(args.url)
	expand_hashes(snapshot)
	expand_details(snapshot)
	snapshot['ships'] = get_ships(snapshot)
	filename = output_name(args)
	with open(filename, 'w') as fd:
		opts = {'indent': 4} if args.pretty else {}
		fd.write(json.dumps(snapshot, **opts))
		fd.write("\n")


if __name__ == "__main__":
	main()