queries.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. from collections import defaultdict
  2. import operator
  3. import db
  4. def search(q):
  5. with db.cursor() as c:
  6. corps = db.query(c, '''
  7. SELECT DISTINCT corporation_id, corporation_name FROM characters
  8. WHERE corporation_name LIKE ?
  9. ''', '%{}%'.format(q))
  10. return {'corporations': corps}
  11. def corporation(corp_id):
  12. with db.cursor() as c:
  13. kills = db.query(c, '''
  14. SELECT DISTINCT(kills.kill_id), kill_time, cost,
  15. solarSystemName as system_name, security, regionName as region
  16. FROM kills
  17. JOIN characters ON characters.kill_id = kills.kill_id
  18. JOIN kill_costs ON kill_costs.kill_id = kills.kill_id
  19. JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
  20. JOIN eve.mapRegions ON mapSolarSystems.regionID = mapRegions.regionID
  21. WHERE corporation_id = ?
  22. ''', corp_id)
  23. kill_ids = list(map(operator.itemgetter('kill_id'), kills))
  24. char_rows = db.query(c, '''
  25. SELECT
  26. kill_id, victim, final_blow,
  27. character_id, character_name, corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name,
  28. ship_type_id, typeName AS ship_name
  29. FROM characters
  30. JOIN eve.invTypes ON ship_type_id = typeID
  31. WHERE kill_id IN ({})
  32. '''.format(','.join(map(str, kill_ids))))
  33. characters = defaultdict(dict)
  34. corp_name = None
  35. for kill_id in kill_ids:
  36. characters[kill_id]['attackers'] = 1 # count final_blow now
  37. for char in char_rows:
  38. kill_id = char['kill_id']
  39. if char['victim']:
  40. characters[kill_id]['victim'] = char
  41. elif char['final_blow']:
  42. characters[kill_id]['final_blow'] = char
  43. else:
  44. characters[kill_id]['attackers'] += 1
  45. if corp_name is None and char['corporation_id'] == corp_id:
  46. corp_name = char['corporation_name']
  47. for kill in kills:
  48. kill['kill_time'] = _format_kill_time(kill['kill_time'])
  49. chars = characters[kill['kill_id']]
  50. kill['victim'] = chars['victim']
  51. kill['final_blow'] = chars['final_blow']
  52. kill['attackers'] = chars['attackers']
  53. return {'corporation_name': corp_name, 'kills': kills}
  54. def kill(kill_id):
  55. with db.cursor() as c:
  56. kill = db.get(c, '''
  57. SELECT kill_time, cost, solarSystemName, security FROM kills
  58. JOIN kill_costs ON kill_costs.kill_id = kills.kill_id
  59. JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
  60. WHERE kills.kill_id = ?
  61. ''', kill_id)
  62. kill['kill_time'] = _format_kill_time(kill['kill_time'])
  63. characters = db.query(c, '''
  64. SELECT character_id, character_name, damage, victim, final_blow,
  65. corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name,
  66. ship_type_id, weapon_type_id,
  67. ship.typeName AS ship_name, weapon.typeName AS weapon_name
  68. FROM characters
  69. JOIN eve.invTypes AS ship ON ship_type_id = ship.typeID
  70. LEFT JOIN eve.invTypes AS weapon ON weapon_type_id = weapon.typeID
  71. WHERE kill_id = ?
  72. ''', kill_id)
  73. attackers = []
  74. for char in characters:
  75. if char['victim']:
  76. victim = char
  77. elif char['final_blow']:
  78. final_blow = char
  79. else:
  80. attackers.append(char)
  81. item_rows = db.query(c, '''
  82. SELECT items.type_id, flag, dropped, destroyed, singleton,
  83. cost, typeName AS item_name, capacity
  84. FROM items
  85. JOIN item_costs ON item_costs.type_id = items.type_id
  86. JOIN eve.invTypes ON items.type_id = typeID
  87. WHERE kill_id = ? ORDER BY flag ASC
  88. ''', kill_id)
  89. items = defaultdict(list)
  90. for item in item_rows:
  91. flag = item['flag']
  92. if 125 <= flag <= 132:
  93. slot = 'subsystem'
  94. elif 27 <= flag <= 34:
  95. slot = 'high'
  96. elif 19 <= flag <= 26:
  97. slot = 'medium'
  98. elif 11 <= flag <= 18:
  99. slot = 'low'
  100. elif 92 <= flag <= 99:
  101. slot = 'rig'
  102. elif flag == 87:
  103. slot = 'drone bay'
  104. elif flag == 5:
  105. slot = 'cargo'
  106. elif 133 <= flag <= 143:
  107. slot = 'special hold'
  108. elif flag == 89:
  109. slot = 'implant'
  110. else:
  111. slot = '???'
  112. items[slot].append(item)
  113. slot_rows = db.query(c, '''
  114. SELECT attributeID, valueInt, valueFloat FROM eve.dgmTypeAttributes
  115. WHERE typeID = ? AND attributeID IN (12, 13, 14, 1137, 1367)
  116. AND (valueInt != 0 OR valueFloat != 0.0)
  117. ''', victim['ship_type_id'])
  118. slot_mapping = {12: 'low', 13: 'medium', 14: 'high', 1137: 'rig', 1367: 'subsystem'}
  119. slots = dict.fromkeys(slot_mapping.values(), 0)
  120. for attr in slot_rows:
  121. slot = slot_mapping[attr['attributeID']]
  122. slots[slot] = attr['valueInt'] or int(attr['valueFloat']) # wtf CCP
  123. if slots['subsystem']:
  124. sub_ids = map(lambda s: str(s['type_id']), items['subsystem'])
  125. modifier_rows = db.query(c, '''
  126. SELECT attributeID, valueFloat FROM eve.dgmTypeAttributes
  127. WHERE typeID IN ({}) AND attributeID in (1374, 1375, 1376) and valueFloat != 0.0
  128. '''.format(','.join(sub_ids)))
  129. slot_mapping = {1374: 'high', 1375: 'medium', 1376: 'low'} # that's right, it's backwards for subs!
  130. for modifier in modifier_rows:
  131. slot = slot_mapping[modifier['attributeID']]
  132. slots[slot] += int(modifier['valueFloat']) # strangely, an improvement
  133. return {
  134. 'kill': kill,
  135. 'victim': victim,
  136. 'final_blow': final_blow,
  137. 'attackers': attackers,
  138. 'items': items,
  139. 'slots': slots,
  140. }
  141. def _format_kill_time(kill_time):
  142. return kill_time.strftime('%Y-%m-%d %H:%m')