Example #1
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))
Example #2
0
    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')