server.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #!/usr/bin/env python3
  2. from collections import defaultdict
  3. import json
  4. import operator
  5. import os
  6. import cleancss
  7. import tornado.httpclient
  8. import tornado.ioloop
  9. import tornado.web
  10. from config import web as config
  11. import db
  12. class BaseHandler(tornado.web.RequestHandler):
  13. def render(self, *args, **kwargs):
  14. kwargs['host'] = config.host
  15. return super(BaseHandler, self).render(*args, **kwargs)
  16. def render_string(self, *args, **kwargs):
  17. s = super(BaseHandler, self).render_string(*args, **kwargs)
  18. return s.replace(b'\n', b'') # this is like Django's {% spaceless %}
  19. class MainHandler(BaseHandler):
  20. def get(self):
  21. self.render('home.html')
  22. class SearchHandler(BaseHandler):
  23. def get(self):
  24. q = self.get_argument('q')
  25. with db.cursor() as c:
  26. corps = db.query(c, '''
  27. SELECT DISTINCT corporation_id, corporation_name FROM characters
  28. WHERE corporation_name LIKE ?
  29. ''', '%{}%'.format(q))
  30. self.render('search.html', corps=corps)
  31. class CorporationHandler(BaseHandler):
  32. def get(self, corp_id):
  33. with db.cursor() as c:
  34. kills = db.query(c, '''
  35. SELECT DISTINCT(kills.kill_id), kill_time FROM kills
  36. JOIN characters on characters.kill_id = kills.kill_id
  37. WHERE corporation_id = ?
  38. ''', corp_id)
  39. kill_ids = list(map(operator.itemgetter('kill_id'), kills))
  40. char_rows = db.query(c, '''
  41. SELECT
  42. kill_id, victim, final_blow,
  43. character_id, character_name, corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name
  44. FROM characters
  45. WHERE kill_id IN ({})
  46. '''.format(','.join(map(str, kill_ids))))
  47. characters = defaultdict(dict)
  48. for char in char_rows:
  49. kill_id = char['kill_id']
  50. if char['victim']:
  51. characters[kill_id]['victim'] = char
  52. elif char['final_blow']:
  53. characters[kill_id]['final_blow'] = char
  54. for kill in kills:
  55. chars = characters[kill['kill_id']]
  56. kill['victim'] = chars['victim']
  57. kill['final_blow'] = chars['final_blow']
  58. self.render('corporation.html', kills=kills)
  59. class KillHandler(BaseHandler):
  60. def get(self, kill_id):
  61. with db.cursor() as c:
  62. kill = db.get(c, '''
  63. SELECT kill_time, solarSystemName, security FROM kills
  64. JOIN eve.mapSolarSystems on solar_system_id = solarSystemID
  65. WHERE kill_id = ?
  66. ''', kill_id)
  67. characters = db.query(c, '''
  68. SELECT ship_type_id, character_id, character_name,
  69. corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name
  70. typeName
  71. FROM characters
  72. JOIN eve.invTypes on ship_type_id = typeID
  73. WHERE kill_id = ?
  74. ''', kill_id)
  75. self.render('kill.html', kill=kill, characters=characters)
  76. class CSSHandler(tornado.web.RequestHandler):
  77. def get(self, css_path):
  78. css_path = os.path.join(os.path.dirname(__file__), 'web', 'static', css_path) + '.ccss'
  79. with open(css_path, 'r') as f:
  80. self.set_header('Content-Type', 'text/css')
  81. self.write(cleancss.convert(f))
  82. if __name__ == '__main__':
  83. tornado.web.Application(
  84. handlers=[
  85. (r'/', MainHandler),
  86. (r'/search', SearchHandler),
  87. (r'/corporation/(.+)', CorporationHandler),
  88. (r'/kill/(.+)', KillHandler),
  89. (r'/(css/.+)\.css', CSSHandler),
  90. ],
  91. template_path=os.path.join(os.path.dirname(__file__), 'web/templates'),
  92. cookie_secret=config.cookie_secret,
  93. debug=config.debug,
  94. ).listen(config.port)
  95. print('listening on :%d' % config.port)
  96. tornado.ioloop.IOLoop.instance().start()