| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/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()
|