def handle (self): token = self.token.data character = models.SessionCharacter.query.filter_by(token = token).first() if not character: return error_response('Invalid token') State.add_client(self.websocket, character.game_session_id, character.id) self.group_call_client_action("CharacterJoined", {'character': character.as_dict()}, include_sender = False) return {'success': True, 'is_authorized': True}
def run (settings): host = '0.0.0.0' # settings.get('connection', 'host') port = settings.getint('connection', 'port') State.init_settings(web_url = settings.get('main', 'web_url')) db.init(sqlalchemy.engine_from_config({ 'sqlalchemy.url': settings.get('database', 'url'), }), {}) logger.info("listening on ws://%s:%s", host, port) websocket_server = gevent.pywsgi.WSGIServer((host, port), websocket_app, handler_class = QuietWebSocketHandler) websocket_server.set_environ({ 'server': websocket_server, }) websocket_server.start() try: websocket_server.serve_forever() except KeyboardInterrupt: logger.info("interrupted") else: logger.info("[!] stopped due to error")
def websocket_app (environ, start_response): try: if environ['PATH_INFO'] == '/playground': websocket = environ['wsgi.websocket'] while True: try: data = websocket.receive() if not data: State.forget_client(websocket) break else: utils.handle_message(websocket, data) except WebSocketError: raise finally: DBSession.remove() except Exception: logger.warn("Playfield: uncaught error is occured.", exc_info = True)