예제 #1
0
def games():
    from models import Game

    result = {
        'games': {
            'actives': [],
            'ended': [],
        }
    }
    if request.user:
        games = Game.select().where(
            Game.date_end == None,
            (Game.player_white == request.user) |
            (Game.player_black == request.user),
        )
        for game in games:
            if game.player_white == request.user:
                result['games']['actives'].append(game.white)
            else:
                result['games']['actives'].append(game.black)
        games = Game.select().where(
            Game.date_end != None,
            (Game.player_white == request.user) |
            (Game.player_black == request.user),
        ).limit(10)
        for game in games:
            if game.player_white == request.user:
                result['games']['ended'].append(game.white)
            else:
                result['games']['ended'].append(game.black)
    return send_data(result)
예제 #2
0
def invited(token):
    try:
        enemy_token, game_type, game_limit = get_cache(
            'invite_{}'.format(token))
    except:
        return send_error('game not found')
    enemy_user = None
    user_id = get_cache('user_{}'.format(enemy_token))
    if user_id:
        try:
            enemy_user = User.get(pk=user_id)
        except User.DoesNotExist:
            # TODO: if user not found game will be created with None as white player
            pass
    user_token = generate_token(True)
    game = Game.new_game(enemy_token,
                         user_token,
                         game_type,
                         game_limit,
                         white_user=enemy_user,
                         black_user=request.user)
    delete_cache('wait_{}'.format(enemy_token))
    result = {'game': user_token}
    result.update(game.get_info(consts.BLACK))
    return send_data(result)
예제 #3
0
def login(data):
    username = data['username']
    password = data['password']
    token = User.authenticate(username, password)
    if token:
        response = make_response(send_data({'auth': token}))
        expire_date = datetime.datetime.now() + datetime.timedelta(
            seconds=config.SESSION_TIME)
        response.set_cookie('auth', token, expires=expire_date)
        return response
    return send_error('username or password is incorrect')
예제 #4
0
 def _post(data):
     game_type = data['type']
     game_limit = data['limit']
     token = generate_token(True)
     pool = GamePool.create(
         player1=token,
         user1=request.user,
         type_game=game_type,
         time_limit=game_limit,
     )
     set_cache('wait_{}'.format(token), (game_type, game_limit))
     return send_data({'game': token})
예제 #5
0
def types():
    types = [{
        'name':
        t['name'],
        'description':
        t['description'],
        'periods': [{
            'name': k,
            'title': v[0],
        } for k, v in sorted(t['periods'].items(), key=lambda a: a[1][1])],
    } for t in consts.TYPES.values() if t['name'] != 'no limit']
    return send_data({'types': types})
예제 #6
0
def invite(data):
    game_type = data['type']
    game_limit = data['limit']
    if game_type != consts.TYPE_NOLIMIT and not game_limit:
        return send_error('game limit must be set for no limit game')
    token_game = generate_token(True)
    token_invite = generate_token(True)
    set_cache('invite_{}'.format(token_invite),
              (token_game, game_type, game_limit))
    if request.user:
        set_cache('user_{}'.format(token_game), request.user.pk, 3600)
    set_cache('wait_{}'.format(token_game),
              (game_type, game_limit, token_invite))
    return send_data({
        'game': token_game,
        'invite': token_invite,
    })
예제 #7
0
    def decorator(token, *args, **kwargs):
        from game import Game

        try:
            game = Game.load_game(token)
        except errors.GameNotStartedError as exc:
            data = {
                'type': consts.TYPES[exc.type]['name'],
                'limit': exc.limit,
            }
            if (exc.token):
                data['invite'] = exc.token
            return send_data(data)
        except errors.GameNotFoundError as exc:
            return send_error(exc.message)
        if game._loaded_by == consts.WHITE:
            if game.model.player_white is not None and game.model.player_white != request.user:
                return send_error('wrong user')
        else:
            if game.model.player_black is not None and game.model.player_black != request.user:
                return send_error('wrong user')
        return f(game, *args, **kwargs)
예제 #8
0
def new():
    @validated(GameNewValidator)
    def _post(data):
        game_type = data['type']
        game_limit = data['limit']
        token = generate_token(True)
        pool = GamePool.create(
            player1=token,
            user1=request.user,
            type_game=game_type,
            time_limit=game_limit,
        )
        set_cache('wait_{}'.format(token), (game_type, game_limit))
        return send_data({'game': token})

    if request.method == 'GET':
        result = []
        count = 0
        for pool in GamePool.select().where(
                GamePool.is_started == False,
                GamePool.is_lost == False,
                GamePool.player1 is not None,
        ).order_by(GamePool.date_created.desc()):
            if pool.user1 and pool.user1 == request.user:
                continue
            result.append({
                'id': pool.pk,
                'date_created': pool.date_created.isoformat(),
                'user': pool.user1.username if pool.user1 else None,
                'type': consts.TYPES[pool.type_game]['name'],
                'limit': pool.time_limit,
            })
            count += 1
            if count > 9:
                break
        return send_data({'games': result})
    elif request.method == 'POST':
        return _post()
예제 #9
0
def accept(game_id):
    try:
        pool = GamePool.get(GamePool.pk == game_id)
    except GamePool.DoesNotExist:
        return send_error('Game not found')
    except Exception as e:
        return send_error('Wrong format')
    if pool.user1 and pool.user1 == request.user:
        return send_error('You cannot start game with yourself')
    with config.DB.atomic():
        pool.player2 = generate_token(True)
        pool.user2 = request.user
        pool.is_started = True
        pool.save()
        game = Game.new_game(pool.player1,
                             pool.player2,
                             pool.type_game,
                             pool.time_limit,
                             white_user=pool.user1,
                             black_user=pool.user2)
        delete_cache('wait_{}'.format(pool.player1))
        result = {'game': pool.player2}
        result.update(game.get_info(consts.BLACK))
    return send_data(result)
예제 #10
0
def authorized():
    if request.user:
        return send_data({'username': request.user.username})
    return send_error('not authorized')
예제 #11
0
def info(game):
    return send_data(game.get_info())