Exemplo n.º 1
0
def lobby():
    if g.player is not None:
        return redirect(url_for('auth.room'))

    db = get_db()

    if request.method == 'POST':
        username = request.form['username']
        error = None

        if not username:
            error = 'Please provide a username.'
        elif db.execute('SELECT id FROM player WHERE username = ?',
                        (username, )).fetchone() is not None:
            error = f"'{username}' is already taken."

        if error is None:
            cursor = db.execute('INSERT INTO player (username) VALUES (?)',
                                (username, ))
            db.commit()
            session['player_id'] = cursor.lastrowid

            print(f"Player '{username}' joined the game.")
            return redirect(url_for('auth.room'))

        flash(error)

    players = db.execute(
        'SELECT COUNT(id) FROM player WHERE active = 1').fetchone()[0]

    return render_template('game/lobby.html', players=players)
Exemplo n.º 2
0
def handle_try_letter(letter):
    parsed_letter = letter.upper()
    db = get_db()
    game = get_game_state()
    letters = game['letters']

    if parsed_letter not in letters:
        letters.append(parsed_letter)

        db.execute('UPDATE game SET letters = ? WHERE id = ?',
                   (''.join(letters), session['game_id']))

        if parsed_letter not in game['word']:
            game['chances'] -= 1
            db.execute('UPDATE game SET chances = ? WHERE id = ?',
                       (game['chances'], session['game_id']))

    db.commit()

    emit('game state', game, broadcast=True)

    load_player()
    winner = not any([letter not in letters
                      for letter in game['word']]) and g.player['username']
    if winner or game['chances'] == 0:
        game = start_round()
        game['winner'] = winner or None
        emit('game state', game, broadcast=True)
Exemplo n.º 3
0
def delete(id):
    # Implement use case 3.
    get_post(id)
    db = get_db()
    db.execute('DELETE FROM word WHERE id = ?', (id, ))
    db.commit()
    return redirect(url_for('game.index'))
Exemplo n.º 4
0
def index():
    # Implement use case 5.
    db = get_db()
    games = db.execute('SELECT g.id, word, created, player_id, username'
                       ' FROM game g JOIN user u ON g.player_id = u.id'
                       ' ORDER BY created DESC').fetchall()
    return render_template('game/index.html', games=games)
Exemplo n.º 5
0
def load_logged_in_user():
    user_id = session.get('user_id')

    if user_id is None:
        g.user = None
    else:
        g.user = get_db().execute(
            'SELECT * FROM user WHERE id = ?', (user_id,)
        ).fetchone()
Exemplo n.º 6
0
def leave():
    db = get_db()
    db.execute('DELETE FROM player WHERE id = ?', (g.player['id'], ))
    db.commit()

    print(f"Player '{g.player['username']}' left the game.")

    check_end_game()

    return redirect(url_for('auth.lobby'))
Exemplo n.º 7
0
def handle_fetch_game_state():
    db = get_db()

    players = db.execute('SELECT COUNT(id) FROM player').fetchone()[0]

    if players == 1:
        game = start_round(new_game=True)
    else:
        game = get_game_state()

    emit('game state', game)
Exemplo n.º 8
0
def disconnect():
    load_player()

    if g.player is not None:
        db = get_db()
        db.execute('UPDATE player SET active = 0'
                   ' WHERE id = ?', (g.player['id'], ))
        db.commit()
        print(f"Player '{g.player['username']}' is inactive.")

    check_end_game()
Exemplo n.º 9
0
def connect():
    load_player()

    if g.player is None:
        raise ConnectionRefusedError()

    db = get_db()
    db.execute('UPDATE player SET active = 1'
               ' WHERE id = ?', (g.player['id'], ))
    db.commit()
    print(f"Player '{g.player['username']}' is active.")
Exemplo n.º 10
0
def load_player():
    player_id = session.get('player_id')

    if player_id is None:
        g.player = None
    else:
        g.player = get_db().execute('SELECT * FROM player WHERE id = ?',
                                    (player_id, )).fetchone()

        # Clear invalid session.
        if g.player is None:
            session.clear()
Exemplo n.º 11
0
def get_post(id, check_player=True):
    # Implement use case 4.
    post = get_db().execute(
        'SELECT g.id, word, created, player_id, username'
        ' FROM game g JOIN user u ON g.id = u.id'
        ' WHERE g.id = ?', (id, )).fetchone()

    if post is None:
        abort(404, "Game id {0} doesn't exist.".format(id))

    if check_player and post['player_id'] != g.user['id']:
        abort(403)

    return post
Exemplo n.º 12
0
def check_end_game():
    db = get_db()

    # Clear inactive players
    db.execute("DELETE FROM player"
               " WHERE active = 0"
               " AND joined < DATETIME('now', '-1 day')")

    # Count remaining players
    players = db.execute('SELECT COUNT(id) FROM player').fetchone()[0]

    # Set game end timestamp
    game_id = session.get('game_id')
    if players == 1 and game_id is not None:
        db.execute(
            'UPDATE game SET ended = CURRENT_TIMESTAMP'
            ' WHERE id = ?;', (game_id, ))

    db.commit()
Exemplo n.º 13
0
def create():
    # Implement use case 1.
    if request.method == 'POST':
        word = request.form['word']
        error = None

        if not word:
            error = 'A word is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute('INSERT INTO game (word, player_id)'
                       ' VALUES (?, ?)', (word, g.user['id']))
            db.commit()
            return redirect(url_for('game.index'))

    return render_template('game/create.html')
Exemplo n.º 14
0
def update(id):
    # Implement use case 2.
    game = get_post(id)

    if request.method == 'POST':
        word = request.form['word']
        error = None

        if not word:
            error = 'A word is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute('UPDATE game SET word = ?' ' WHERE id = ?', (game, id))
            db.commit()
            return redirect(url_for('game.index'))

    return render_template('game/update.html', game=game)
Exemplo n.º 15
0
def get_game_state():
    db = get_db()

    if 'game_id' in session:
        game = db.execute('SELECT chances, letters FROM game WHERE id = ?',
                          (session['game_id'], )).fetchone()
    else:
        game = db.execute(
            'SELECT id, chances, letters FROM game ORDER BY id DESC').fetchone(
            )
        session['game_id'] = game['id']

    word = db.execute(
        'SELECT word FROM word WHERE game_id = ? ORDER BY id DESC',
        (session['game_id'], )).fetchone()

    return {
        'word': list(word['word']),
        'chances': game['chances'],
        'letters': list(game['letters']),
    }
Exemplo n.º 16
0
def start_round(new_game=False):
    db = get_db()

    if new_game:
        cursor = db.execute('INSERT INTO game DEFAULT VALUES')
        game_id = cursor.lastrowid
        session['game_id'] = game_id
    else:
        db.execute(
            'UPDATE game SET chances = 6,'
            ' letters = "",'
            ' rounds = rounds + 1'
            ' WHERE id = ?', (session['game_id'], ))

    word = get_word()

    db.execute('INSERT INTO word (game_id, word)'
               ' VALUES (?, ?)', (session['game_id'], word))
    db.commit()

    return {'word': list(word), 'chances': 6, 'letters': []}
Exemplo n.º 17
0
def login():
    # Implement use case 5.
    if request.method == 'POST':
        username = request.form['username']
        db = get_db()
        error = None
        user = db.execute(
            'SELECT * FROM user WHERE username = ?', (username,)
        ).fetchone()

        if user is None:
            error = 'Incorrect username.'

        if error is None:
            session.clear()
            session['user_id'] = user['id']
            return redirect(url_for('index'))

        flash(error)

    return render_template('auth/login.html')
Exemplo n.º 18
0
def register():
    # Implement se case 5.
    if request.method == 'POST':
        username = request.form['username']
        db = get_db()
        error = None

        if not username:
            error = 'Username is required.'
        elif db.execute(
            'SELECT id FROM user WHERE username = ?', (username,)
        ).fetchone() is not None:
            error = 'User {} is already registered.'.format(username)

        if error is None:
            db.execute(
                'INSERT INTO user (username) VALUES (?)', (username,)
            )
            db.commit()
            return redirect(url_for('auth.login'))

        flash(error)

    return render_template('auth/register.html')