Exemplo n.º 1
0
 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
Exemplo n.º 2
0
    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))
Exemplo n.º 3
0
 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