| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #!/usr/bin/env python3
- from collections import defaultdict
- import json
- import operator
- import os
- import cleancss
- import tornado.httpclient
- import tornado.ioloop
- import tornado.web
- from config import web as config
- import db
- class BaseHandler(tornado.web.RequestHandler):
- def render(self, *args, **kwargs):
- kwargs['host'] = config.host
- return super(BaseHandler, self).render(*args, **kwargs)
- def render_string(self, *args, **kwargs):
- s = super(BaseHandler, self).render_string(*args, **kwargs)
- return s.replace(b'\n', b'') # this is like Django's {% spaceless %}
- class MainHandler(BaseHandler):
- def get(self):
- self.render('home.html')
- class SearchHandler(BaseHandler):
- def get(self):
- q = self.get_argument('q')
- with db.cursor() as c:
- corps = db.query(c, '''
- SELECT DISTINCT corporation_id, corporation_name FROM characters
- WHERE corporation_name LIKE ?
- ''', '%{}%'.format(q))
- self.render('search.html', corps=corps)
- class CorporationHandler(BaseHandler):
- def get(self, corp_id):
- with db.cursor() as c:
- kills = db.query(c, '''
- SELECT DISTINCT(kills.kill_id), kill_time FROM kills
- JOIN characters on characters.kill_id = kills.kill_id
- WHERE corporation_id = ?
- ''', corp_id)
- kill_ids = list(map(operator.itemgetter('kill_id'), kills))
- char_rows = db.query(c, '''
- SELECT
- kill_id, victim, final_blow,
- character_id, character_name, corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name
- FROM characters
- WHERE kill_id IN ({})
- '''.format(','.join(map(str, kill_ids))))
- characters = defaultdict(dict)
- for char in char_rows:
- kill_id = char['kill_id']
- if char['victim']:
- characters[kill_id]['victim'] = char
- elif char['final_blow']:
- characters[kill_id]['final_blow'] = char
- for kill in kills:
- chars = characters[kill['kill_id']]
- kill['victim'] = chars['victim']
- kill['final_blow'] = chars['final_blow']
- self.render('corporation.html', kills=kills)
- class KillHandler(BaseHandler):
- def get(self, kill_id):
- with db.cursor() as c:
- kill = db.get(c, '''
- SELECT kill_time, solarSystemName, security FROM kills
- JOIN eve.mapSolarSystems on solar_system_id = solarSystemID
- WHERE kill_id = ?
- ''', kill_id)
- characters = db.query(c, '''
- SELECT ship_type_id, character_id, character_name,
- corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name
- typeName
- FROM characters
- JOIN eve.invTypes on ship_type_id = typeID
- WHERE kill_id = ?
- ''', kill_id)
- self.render('kill.html', kill=kill, characters=characters)
- class CSSHandler(tornado.web.RequestHandler):
- def get(self, css_path):
- css_path = os.path.join(os.path.dirname(__file__), 'web', 'static', css_path) + '.ccss'
- with open(css_path, 'r') as f:
- self.set_header('Content-Type', 'text/css')
- self.write(cleancss.convert(f))
- if __name__ == '__main__':
- tornado.web.Application(
- handlers=[
- (r'/', MainHandler),
- (r'/search', SearchHandler),
- (r'/corporation/(.+)', CorporationHandler),
- (r'/kill/(.+)', KillHandler),
- (r'/(css/.+)\.css', CSSHandler),
- ],
- template_path=os.path.join(os.path.dirname(__file__), 'web/templates'),
- cookie_secret=config.cookie_secret,
- debug=config.debug,
- ).listen(config.port)
- print('listening on :%d' % config.port)
- tornado.ioloop.IOLoop.instance().start()
|