update_costs.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python3
  2. from decimal import Decimal
  3. from io import StringIO
  4. import operator
  5. import sys
  6. from xml.etree import ElementTree
  7. import requests
  8. import db
  9. def fetch_type_ids(c):
  10. if len(sys.argv) > 1 and sys.argv[1] in ['-q', '--quick']:
  11. type_ids = c.execute('''
  12. SELECT i.type_id FROM items AS i
  13. JOIN eve.invTypes AS t ON i.type_id = t.typeID
  14. WHERE marketGroupID is NOT NULL
  15. UNION SELECT ship_type_id FROM characters
  16. JOIN eve.invTypes ON ship_type_id = typeID
  17. WHERE victim AND marketGroupID is NOT NULL
  18. ''')
  19. else:
  20. type_ids = c.execute('SELECT typeID FROM eve.invTypes WHERE marketGroupID IS NOT NULL')
  21. return set(map(operator.itemgetter(0), c.fetchall()))
  22. rs = requests.session()
  23. jita_system = 30000142
  24. def query(type_id):
  25. params = {'typeid': type_id, 'usesystem': jita_system}
  26. r = rs.get('http://api.eve-central.com/api/marketstat', params=params)
  27. try:
  28. tree = ElementTree.parse(StringIO(r.text))
  29. except ElementTree.ParseError:
  30. return 0
  31. value = tree.getroot().find('marketstat').find('type').find('sell').find('percentile').text
  32. return int(Decimal(value) * 100)
  33. au79_cost = None
  34. def update_kill(kill_id):
  35. with db.conn.cursor() as c:
  36. c.execute('''
  37. SELECT ship_type_id, cost FROM characters
  38. LEFT JOIN item_costs ON ship_type_id = item_costs.type_id
  39. WHERE kill_id = ? AND victim
  40. ''', (kill_id,))
  41. r = c.fetchone()
  42. if r[1] is not None:
  43. cost = r[1]
  44. else:
  45. cost = 0
  46. c.nextset()
  47. if r[0] == 33328: # Capsule - Genolution 'Auroral' 197-variant
  48. cost -= au79_cost
  49. # singleton is 0 normally and for BPOs and 2 for BPCs
  50. # we want to divide by 1 for BPOs and by 1000 for BPCs
  51. c.execute('''
  52. SELECT SUM(cost * (dropped + destroyed) / (singleton * 499.5 + 1))
  53. FROM items AS i
  54. JOIN item_costs AS ic ON i.type_id = ic.type_id WHERE kill_id = ?
  55. ''', (kill_id,))
  56. r = c.fetchone()
  57. c.nextset()
  58. if r[0]:
  59. cost += int(r[0])
  60. if cost < 0:
  61. cost += au79_cost
  62. print('goddamnit CCP', kill_id)
  63. c.execute('UPDATE kill_costs SET cost = ? WHERE kill_id = ?', (cost, kill_id))
  64. def main():
  65. with db.conn.cursor() as c:
  66. print('getting items')
  67. type_ids = fetch_type_ids(c)
  68. print('updating items')
  69. parambatch = []
  70. for type_id in type_ids:
  71. value = query(type_id)
  72. parambatch.append((type_id, value, value))
  73. c.executemany('''
  74. INSERT INTO item_costs (type_id, cost) VALUES(?, ?)
  75. ON DUPLICATE KEY UPDATE cost = ?
  76. ''', parambatch)
  77. c.execute('SELECT cost FROM item_costs WHERE type_id = 33329') # Genolution 'Auroral' AU-79
  78. global au79_cost
  79. au79_cost = c.fetchone()[0]
  80. c.nextset()
  81. print('getting kills')
  82. c.execute('SELECT kill_id FROM kills')
  83. print('updating kills')
  84. while True:
  85. r = c.fetchone()
  86. if r is None:
  87. break
  88. update_kill(r[0])
  89. if __name__ == '__main__':
  90. main()