import os.path from tornado import gen, web, websocket, escape, options from tornado.ioloop import IOLoop from tornado.httpserver import HTTPServer from tornado.options import parse_command_line import psycopg2 import momoko import json settings = { 'cookie_secret': '__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__', 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), 'static_path': os.path.join(os.path.dirname(__file__), 'static'), 'login_url': '/login', 'xsrf_cookies': True, 'debug': True, 'autoreload': True, 'server_traceback': True, } class BaseHandler(web.RequestHandler): @property def db(self): return self.application.db class ChatHandler(websocket.WebSocketHandler): @property def db(self): return self.application.db waiters = set() def open(self, *args, **kwargs): self.user_id = kwargs.get('user_id',1) self.waiters.add((self.user_id, self)) # @gen.coroutine def on_message(self, message): parsed = escape.json_decode(message) if 'dummy' in parsed: return self.add_message(parsed) def on_close(self): self.waiters.remove((self.user_id, self)) # waiter.write_message({'msg': message, 'answer_type': 'add_contact'}) # waiter.write_message({'msg': message, 'answer_type': 'add_order'}) @gen.coroutine def add_message(self, message_data): sender_id = message_data['data']['sender_id'] recipent_id = message_data['data']['recipent_id'] order_id = message_data['data'].get('order_id', None) team_id = message_data['data'].get('team_id', None) message = message_data['data'].get('chat_message', None) answer_type = message_data['format_type'] private_type = 'true' if not order_id and not team_id else 'false' team_value = "NULL" if team_id is None else team_id order_value = "NULL" if order_id is None else order_id insert_sql = "INSERT INTO chat_message (id,text,created, sender_id,recipent_id, private_type,team_id, order_id) " \ "VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5})".format(message, sender_id, recipent_id, private_type, team_value,order_value) yield self.db.execute(insert_sql) waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id) for waiter in waiters: waiter.write_message({'msg': message, 'answer_type': answer_type}) def check_origin(self, origin): return True class Application(web.Application): def __init__(self): handlers = [ (r"/chat/(?P\d+)/", ChatHandler), ] super().__init__(handlers=handlers, **settings) if __name__ == '__main__': parse_command_line() application = Application() ioloop = IOLoop.instance() application.db = momoko.Pool( dsn='dbname=archilance user=postgres password=postgres host=localhost', size=1, ioloop=ioloop, ) future = application.db.connect() ioloop.add_future(future, lambda f: ioloop.stop()) ioloop.start() future.result() http_server = HTTPServer(application) http_server.listen(8888, 'localhost') ioloop.start()