importer.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env python3
  2. import json
  3. import operator
  4. import time
  5. import oursql
  6. import requests
  7. import db
  8. def insert_kill(c, kill):
  9. try:
  10. db.execute(c, 'INSERT INTO kills (kill_id, solar_system_id, kill_time, moon_id) VALUES(?, ?, ?, ?)',
  11. kill['killID'], kill['solarSystemID'], kill['killTime'], kill['moonID'])
  12. except oursql.IntegrityError as e:
  13. if e.args[0] == oursql.errnos['ER_DUP_ENTRY']:
  14. print('duplicate:', kill['killID'])
  15. return
  16. raise
  17. except TypeError:
  18. print(kill)
  19. raise
  20. victim = kill['victim']
  21. parambatch = [(
  22. kill['killID'], 1, victim['characterID'], victim['characterName'], victim['shipTypeID'],
  23. victim['allianceID'], victim['allianceName'], victim['corporationID'], victim['corporationName'], victim['factionID'], victim['factionName'],
  24. victim['damageTaken'], None, None, None,
  25. )]
  26. for attacker in kill['attackers']:
  27. parambatch.append((
  28. kill['killID'], 0, attacker['characterID'], attacker['characterName'], attacker['shipTypeID'],
  29. attacker['allianceID'], attacker['allianceName'], attacker['corporationID'], attacker['corporationName'], attacker['factionID'], attacker['factionName'],
  30. attacker['damageDone'], attacker['finalBlow'], attacker['securityStatus'], attacker['weaponTypeID'],
  31. ))
  32. c.executemany('''
  33. INSERT INTO characters (
  34. kill_id, victim, character_id, character_name, ship_type_id,
  35. alliance_id, alliance_name, corporation_id, corporation_name, faction_id, faction_name,
  36. damage, final_blow, security_status, weapon_type_id
  37. ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  38. ''', parambatch
  39. )
  40. parambatch = []
  41. for item in kill['items']:
  42. parambatch.append((kill['killID'], item['typeID'], item['flag'],
  43. item['qtyDropped'], item['qtyDestroyed'], item['singleton']))
  44. c.executemany('''
  45. INSERT INTO items (
  46. kill_id, type_id, flag, dropped, destroyed, singleton
  47. ) VALUES(?, ?, ?, ?, ?, ?)
  48. ''', parambatch
  49. )
  50. try:
  51. result = db.get(c, 'SELECT cost FROM item_costs WHERE type_id = ?', (victim['shipTypeID']))
  52. cost = result['cost']
  53. except db.NoRowsException:
  54. cost = 0
  55. result = db.get(c, '''
  56. SELECT SUM(cost * (dropped + destroyed)) AS item_cost
  57. FROM items
  58. JOIN item_costs ON items.type_id = item_costs.type_id
  59. WHERE kill_id = ?
  60. ''', kill['killID'])
  61. if result['item_cost'] is not None:
  62. cost += result['item_cost']
  63. db.execute(c, 'INSERT INTO kill_costs (kill_id, cost) VALUES(?, ?)', kill['killID'], cost)
  64. def main():
  65. rs = requests.session()
  66. with db.cursor() as c:
  67. groups = db.query(c, 'SELECT groupID FROM eve.invGroups WHERE categoryID = ?', 6)
  68. groups = list(map(operator.itemgetter('groupID'), groups))
  69. for i in range(0, len(groups), 10):
  70. query_groups = list(map(str, groups[i:i+10]))
  71. last_kill_id = None
  72. last_request_time = 0
  73. while True:
  74. path = '/api/losses/api-only/groupID/{}'.format(','.join(query_groups))
  75. if last_kill_id is not None:
  76. path += '/beforeKillID/' + str(last_kill_id)
  77. now = time.time()
  78. if now - last_request_time < 10:
  79. print('sleeping', 10 - (now - last_request_time))
  80. time.sleep(10 - (now - last_request_time))
  81. try:
  82. r = rs.get('https://zkillboard.com' + path)
  83. kills = r.json()
  84. except Exception as e:
  85. print(repr(e))
  86. break
  87. print('inserting', len(kills), 'kills')
  88. for kill in kills:
  89. insert_kill(c, kill)
  90. db.conn.commit()
  91. last_kill_id = kills[-1]['killID']
  92. last_request_time = now
  93. if __name__ == '__main__':
  94. main()