def _move(self, username, msg): redis = tornadoredis.Client(options.redis_host, options.redis_port) game, winner = referee.move(self.gid, username, **msg) for name in game.players: s = sockets.get(name) if s: s.write_message( dict(reply='move', name=username, side=game.players[username].side, **msg )) if winner: if s: s.write_message( dict(reply='finish', winner=winner, )) if winner == 'draw': yield tornado.gen.Task(redis.zincrby, 'draw', name, 1) elif winner == name: yield tornado.gen.Task(redis.zincrby, 'win', name, 1) else: yield tornado.gen.Task(redis.zincrby, 'lose', name, 1) yield tornado.gen.Task(redis.zincrby, 'games', name, 1) yield tornado.gen.Task(redis.srem, 'playing', name) if winner: yield tornado.gen.Task(redis.delete, 'game'+self.gid) self.gid = None
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 _surrender(self, username, msg): redis = tornadoredis.Client(options.redis_host, options.redis_port) game = referee.get_game(self.gid) winner = None for name in game.players: s = sockets.get(name) if s and name != username: winner = name s.write_message( dict(reply='finish', winner=winner, )) yield tornado.gen.Task(redis.zincrby, 'win', name, 1) else: yield tornado.gen.Task(redis.zincrby, 'lose', name, 1) yield tornado.gen.Task(redis.zincrby, 'games', name, 1) yield tornado.gen.Task(redis.srem, 'playing', name) yield tornado.gen.Task(redis.delete, 'game'+self.gid) self.gid = None