def _join(self, username, msg): if not GAME_SERVERS: raise GameError("server_not_ready") if username in wait_games: raise GameError('already_wait') if not wait_games: raise GameError('no_waiting_games') creator, side = wait_games.pop_random() cr_soc = sockets.get(creator) if cr_soc is None: raise GameError('creation_error') redis = tornadoredis.Client(options.redis_host, options.redis_port) in_game = yield tornado.gen.Task(redis.sadd, 'playing', username) if in_game == 0: raise GameError('in_game') i = hash(username) % len(GAME_SERVERS) url = GAME_SERVERS[i] gid = get_sid() key = 'game:' + gid pipe = redis.pipeline() pipe.hmset(key, {'creator': creator, 'opponent': username, 'side': side, 'url': url}) pipe.expire(key, EXPIRE) yield tornado.gen.Task(pipe.execute) self.write_message(dict(reply='joined', gid=gid, url=url)) cr_soc.write_message(dict(reply='joined', gid=gid, url=url))
def post(self, uri=None): if uri == 'login': log.debug('login {}'.format(self.request.arguments)) redis = tornadoredis.Client(options.redis_host, options.redis_port) login = self.request.arguments['login'][0] password = self.request.arguments['password'][0] cpassword = yield tornado.gen.Task(redis.hget, 'users', login) if password != cpassword: self.render('template.html', error= "Wrong login or password") else: sid = get_sid() pipe = redis.pipeline() pipe.set(sid, login) pipe.expire(sid, EXPIRE) yield tornado.gen.Task(pipe.execute) self.redirect('/game#{}'.format(sid), permanent=True) elif uri == 'register': log.debug('register {}'.format(self.request.arguments)) redis = tornadoredis.Client(options.redis_host, options.redis_port) login = self.request.arguments['login'][0] password = self.request.arguments['password'][0] cpassword = self.request.arguments['cpassword'][0] if password != cpassword: self.render('template.html', error='Passwords not same') if len(login) < 1: self.render('template.html', error='Empty login') result = yield tornado.gen.Task(redis.hsetnx, 'users', login, password) if result == 1: sid = get_sid() pipe = redis.pipeline() pipe.set(sid, login) pipe.expire(sid, EXPIRE) yield tornado.gen.Task(pipe.execute) self.redirect('/game#{}'.format(sid), permanent=True) else: self.render('template.html', error='Login used')