def create_rematch(hashid):
    game = CricketGame.query.filter_by(hashid=hashid).first_or_404()

    match_json = json.dumps({1: {1: cricket_leg_default.copy()}})

    rematch = CricketGame(
        player1=game.player1,
        player2=game.player2,
        bo_sets=game.bo_sets,
        bo_legs=game.bo_legs,
        two_clear_legs=game.two_clear_legs,
        p1_sets=0,
        p2_sets=0,
        p1_legs=0,
        p2_legs=0,
        p1_score=0,
        p2_score=0,
        begin=datetime.utcnow(),
        match_json=match_json,
        status='started',
        opponent_type=game.opponent_type,
        public_challenge=False,
        tournament=game.tournament,
        score_input_delay=game.score_input_delay,
        webcam=game.webcam,
        jitsi_hashid=secrets.token_urlsafe(8)[:8],
        variant='cricket',
    )
    rematch.p1_next_turn = True
    if game.closest_to_bull_json:
        closest_to_bull_json = json.dumps({1: [], 2: []})
        rematch.closest_to_bull_json = closest_to_bull_json
        rematch.closest_to_bull = True
    db.session.add(rematch)
    db.session.commit()  # needed to get a game id for the hashid
    rematch.set_hashid()
    db.session.commit()

    return rematch.hashid
Exemple #2
0
def create(mode='x01', opponent_name=None, tournament_hashid=None):
    if mode == 'x01':
        form = prepare_x01_form(opponent_name, tournament_hashid)
    else:
        form = prepare_cricket_form(opponent_name, tournament_hashid)

    webcam_query = WebcamSettings.query.filter_by(user=current_user.id).first()
    if not webcam_query or not webcam_query.activated:
        if form.webcam.data:
            return redirect(url_for('game.webcam_consent'))
        form.webcam.render_kw = {'disabled': 'disabled'}

    if form.validate_on_submit():
        player1 = current_user.id if current_user.is_authenticated else None
        if player1 and form.opponent.data == 'local':
            player2 = current_user.id
            status = 'started'
        elif player1 and form.opponent.data == 'online':
            if form.opponent_name.data:
                if form.public_challenge.data:
                    # Public challenge flag and player name specified is not allowed
                    flash(
                        gettext(
                            'Public challenges must be created without an opponent name.'
                        ), 'danger')
                    return render_template('game/create_game.html',
                                           form=form,
                                           opponent_name=opponent_name,
                                           title=lazy_gettext('Create Game'))
                player2 = (User.query.with_entities(User.id).filter(
                    func.lower(User.username) == func.lower(
                        form.opponent_name.data)).first_or_404())

                player2_settings = UserSettings.query.filter_by(
                    user=player2.id).first()
                if player2_settings and not player2_settings.allow_challenges:
                    # player 2 does not allow challenge requests
                    flash(gettext('Player does not allow challenges'),
                          'danger')
                    return render_template('game/create_game.html',
                                           form=form,
                                           opponent_name=opponent_name,
                                           title=lazy_gettext('Create Game'))

                message = gettext('New challenge')
                notification = Notification(user=player2,
                                            message=message,
                                            author=current_user.username,
                                            type='challenge')
                db.session.add(notification)
                send_notification(form.opponent_name.data,
                                  message,
                                  current_user.username,
                                  'challenge',
                                  webcam=form.webcam.data)
            else:
                player2 = None
            status = 'challenged'
        else:
            # computer as opponent
            player2 = None
            status = 'started'

        if form.webcam.data:
            if player2:
                webcam_player2 = WebcamSettings.query.filter_by(
                    user=player2).first()
                if not webcam_player2 or not webcam_player2.activated:
                    flash(
                        gettext(
                            'Player 2 does not have webcam games enabled.'),
                        'danger')
                    return render_template('game/create_game.html',
                                           form=form,
                                           opponent_name=opponent_name,
                                           title=lazy_gettext('Create Game'))
            else:
                webcam_player2 = None
            jitsi_hashid = secrets.token_urlsafe(8)[:8]
            webcam_player1 = WebcamSettings.query.filter_by(
                user=player1).first()
            jitsi_public_server = webcam_player1.jitsi_public_server or (
                webcam_player2 and webcam_player2.jitsi_public_server)
        else:
            jitsi_hashid = None
            jitsi_public_server = False

        tournament = form.tournament.data if form.tournament.data != '-' else None

        try:
            player2_id = player2.id
        except AttributeError:
            player2_id = player2

        if mode == 'x01':
            match_json = json.dumps({
                1: {
                    1: {
                        1: {
                            'scores': [],
                            'double_missed': []
                        },
                        2: {
                            'scores': [],
                            'double_missed': []
                        }
                    }
                }
            })
            game = Game(
                player1=player1,
                player2=player2_id,
                type=form.type.data,
                variant='x01',
                bo_sets=form.bo_sets.data,
                bo_legs=form.bo_legs.data,
                two_clear_legs=form.two_clear_legs.data,
                p1_sets=0,
                p2_sets=0,
                p1_legs=0,
                p2_legs=0,
                p1_score=int(form.type.data),
                p2_score=int(form.type.data),
                in_mode=form.in_mode.data,
                out_mode=form.out_mode.data,
                begin=datetime.utcnow(),
                match_json=match_json,
                status=status,
                opponent_type=form.opponent.data,
                public_challenge=form.public_challenge.data,
                tournament=tournament,
                score_input_delay=form.score_input_delay.data,
                webcam=form.webcam.data,
                jitsi_hashid=jitsi_hashid,
                jitsi_public_server=jitsi_public_server,
            )
        elif mode == 'cricket':
            match_json = json.dumps({
                1: {
                    1: cricket_leg_default.copy(),
                },
            }, )
            game = CricketGame(
                player1=player1,
                player2=player2_id,
                variant='cricket',
                bo_sets=form.bo_sets.data,
                bo_legs=form.bo_legs.data,
                two_clear_legs=form.two_clear_legs.data,
                p1_sets=0,
                p2_sets=0,
                p1_legs=0,
                p2_legs=0,
                p1_score=0,
                p2_score=0,
                begin=datetime.utcnow(),
                match_json=match_json,
                status=status,
                opponent_type=form.opponent.data,
                public_challenge=form.public_challenge.data,
                tournament=tournament,
                score_input_delay=form.score_input_delay.data,
                webcam=form.webcam.data,
                jitsi_hashid=jitsi_hashid,
                jitsi_public_server=jitsi_public_server,
            )
        else:
            pass

        # Preset saving
        if form.save_preset.data:
            if mode == 'x01':
                save_x01_preset(form)
            elif mode == 'cricket':
                save_cricket_preset(form)
            else:
                pass

        if game.opponent_type.startswith('computer'):
            game.opponent_type += form.level.data

        game.p1_next_turn = form.starter.data == 'me'
        if form.starter.data == 'closest_to_bull':
            game.p1_next_turn = True
            closest_to_bull_json = json.dumps({1: [], 2: []})
            game.closest_to_bull_json = closest_to_bull_json
            game.closest_to_bull = True
        db.session.add(game)
        db.session.commit()  # needed to get a game id for the hashid
        game.set_hashid()
        db.session.commit()
        return redirect(url_for('game.start', hashid=game.hashid))
    return render_template('game/create_game.html',
                           form=form,
                           opponent_name=opponent_name,
                           title=lazy_gettext('Create Game'))
Exemple #3
0
def process_leg_win(player_dict, match_json, current_values):
    # check if draws are possible
    set_draw_possible = (player_dict['bo_sets'] % 2) == 0
    leg_draw_possible = (player_dict['bo_legs'] % 2) == 0

    # amount of legs/sets needed to win
    legs_for_set = (player_dict['bo_legs'] /
                    2) + 1 if leg_draw_possible else math.ceil(
                        player_dict['bo_legs'] / 2)
    sets_for_match = (player_dict['bo_sets'] /
                      2) + 1 if set_draw_possible else math.ceil(
                          player_dict['bo_sets'] / 2)

    # leg count increase with check for set win
    if player_dict['two_clear_legs']:
        player_dict['p_legs'] += 1
    else:
        player_dict['p_legs'] = (player_dict['p_legs'] + 1) % legs_for_set
    # reset score to default value
    player_dict['p_score'] = 0

    # check if player won set
    if player_dict['p_legs'] == 0 or \
            (player_dict['two_clear_legs'] and
             player_dict['p_legs'] >= legs_for_set and
             player_dict['p_legs'] >= player_dict['o_legs'] + 2):
        player_dict['p_sets'] += 1

        # check if player won match or match drawn
        if player_dict['p_sets'] == sets_for_match or \
                (set_draw_possible and (player_dict['p_sets'] == player_dict['o_sets'] == (player_dict['bo_sets'] / 2))):
            # leg score is needed if best of 1 set
            if player_dict[
                    'bo_sets'] == 1 and not player_dict['two_clear_legs']:
                player_dict['p_legs'] = math.ceil(
                    (player_dict['bo_legs'] + 0.5) / 2)
            player_dict['status'] = 'completed'
            player_dict['p_score'] = 0  # end score 0 looks nicer
        else:  # match not over, new set
            player_dict['p_legs'] = 0
            player_dict['o_legs'] = 0
            current_values['set'] = str(int(current_values['set']) + 1)
            current_values['leg'] = '1'
            match_json[current_values['set']] = {
                current_values['leg']: cricket_leg_default.copy()
            }

    else:  # no new set unless drawn
        # check for drawn set
        if leg_draw_possible and (player_dict['p_legs'] ==
                                  player_dict['o_legs'] ==
                                  (player_dict['bo_legs'] / 2)):
            player_dict['p_sets'] += 1
            player_dict['o_sets'] += 1
            # check if a player won the match
            if player_dict['p_sets'] == sets_for_match or player_dict[
                    'o_sets'] == sets_for_match:
                player_dict['status'] = 'completed'
                player_dict['p_score'] = 0
            # check if match is drawn - redundant atm, could be merged with game win
            elif set_draw_possible and (player_dict['p_sets'] ==
                                        player_dict['o_sets'] ==
                                        (player_dict['bo_sets'] / 2)):
                player_dict['status'] = 'completed'
                player_dict['p_score'] = 0
            # no one won the match, new set
            else:
                player_dict['p_legs'] = 0
                player_dict['o_legs'] = 0
                current_values['set'] = str(
                    int(current_values['set']) +
                    2)  # + 2 because both players won a set
                current_values['leg'] = '1'
                match_json[current_values['set']] = {
                    current_values['leg']: cricket_leg_default.copy()
                }
        else:  # no draw, just new leg
            current_values['leg'] = str(int(current_values['leg']) + 1)
            match_json[current_values['set']][
                current_values['leg']] = cricket_leg_default.copy()

    return player_dict, match_json, current_values