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)
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)
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'))
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)
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()
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'))
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)
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()
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.")
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()
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
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()
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')
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)
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']), }
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': []}
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')
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')