From 5cc2de004bd9f4f64d28a10e0dc3532a3660f62e Mon Sep 17 00:00:00 2001 From: Sorrel Bri Date: Sun, 13 Oct 2019 10:15:03 -0700 Subject: [PATCH] join two players in game --- api/games/api_games.py | 13 ++++++++++--- app.py | 3 ++- manage.py | 8 +++++--- .../{45f01fb15e26_.py => 77a6ccbab312_.py} | 6 +++--- models/Game.py | 16 +++++++++------- models/Message.py | 2 +- models/Move.py | 2 +- models/User.py | 8 +++++--- requirements.txt | 3 ++- websockets/roomSocket.py | 18 +++++++++++++++--- 10 files changed, 53 insertions(+), 26 deletions(-) rename migrations/versions/{45f01fb15e26_.py => 77a6ccbab312_.py} (98%) diff --git a/api/games/api_games.py b/api/games/api_games.py index b04c9b4..a038c6b 100644 --- a/api/games/api_games.py +++ b/api/games/api_games.py @@ -9,23 +9,30 @@ import os import json from websockets.roomSocket import new_game_notice, join_game_notice +from marshmallow import pprint + api_games = Blueprint('api_games', __name__, url_prefix='/api/games') @api_games.route('/', methods=['GET']) def get_room(game_id): print(game_id) game = Game.query.filter_by(id=game_id).first() - response = game_schema.dumps(game) # TODO create decorator that returns user from header auth_header = request.headers.get('Authorization') user = jwt.decode(auth_header.split(" ")[1], os.environ.get('SECRET_KEY'))['user'] user = json.loads(user) - if not game.player_black and game.player_white != user['id']: + # add user to game if open position available + if user and not game.player_black and game.player_white != user['id']: game.player_black = user['id'] db.session.add(game) db.session.commit() - print(game_schema.dumps(game)) join_game_notice(game_id, user) + response = {'game': game_schema.dumps(game)} + if game.player_black: + response['black'] = user_schema.dumps(User.query.filter_by(id=game.player_black).first()) + else: + response['black'] = '' + response['white'] = user_schema.dumps(User.query.filter_by(id=game.player_white).first()) return jsonify(response) @api_games.route('/', methods=['POST']) diff --git a/app.py b/app.py index c5f1062..bc61392 100644 --- a/app.py +++ b/app.py @@ -17,7 +17,8 @@ app.config.from_object(os.getenv('CONFIGURATION_OBJECT')) # ! Environment Variable # TODO export ALLOWED_ORIGIN= whatever the react server is -socketio = SocketIO(app, cors_allowed_origins=os.getenv('ALLOWED_ORIGIN')) +# TODO cors_allowed_origins=os.getenv('ALLOWED_ORIGIN') +socketio = SocketIO(app, cors_allowed_origins=['http://localhost:3000', 'http://localhost:3001']) def create_app(): CORS(app, resources={ diff --git a/manage.py b/manage.py index e990a80..9d4590a 100644 --- a/manage.py +++ b/manage.py @@ -8,19 +8,21 @@ from database import db from app import create_app app = create_app() + migrate = Migrate(app, db) manager = Manager(app) +# migrations +manager.add_command('db', MigrateCommand) + from models.Game import Game from models.GameRoom import GameRoom from models.Message import Message from models.Move import Move from models.User import User -# migrations -manager.add_command('db', MigrateCommand) - +app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/browser-go' @manager.command def test(): """Runs the unit tests without test coverage.""" diff --git a/migrations/versions/45f01fb15e26_.py b/migrations/versions/77a6ccbab312_.py similarity index 98% rename from migrations/versions/45f01fb15e26_.py rename to migrations/versions/77a6ccbab312_.py index 29db1f3..f4b2209 100644 --- a/migrations/versions/45f01fb15e26_.py +++ b/migrations/versions/77a6ccbab312_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 45f01fb15e26 +Revision ID: 77a6ccbab312 Revises: -Create Date: 2019-10-10 17:50:40.846864 +Create Date: 2019-10-12 19:28:48.173762 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '45f01fb15e26' +revision = '77a6ccbab312' down_revision = None branch_labels = None depends_on = None diff --git a/models/Game.py b/models/Game.py index 3789042..4f0c873 100644 --- a/models/Game.py +++ b/models/Game.py @@ -1,7 +1,7 @@ from app import db, ma -from marshmallow import fields +from marshmallow import fields, Schema, pre_dump import enum -from models.User import user_schema +from models.User import UserSchema, user_schema, User # ! Games >-< Users join table games_users = db.Table('games_users', @@ -55,9 +55,9 @@ class Game(db.Model): overtime_length = db.Column(db.Integer) # seconds # foreign keys - game_room = db.Column(db.Integer, db.ForeignKey("game_rooms.id")) - player_black = db.Column(db.Integer, db.ForeignKey("users.id")) - player_white = db.Column(db.Integer, db.ForeignKey("users.id")) + game_room = db.Column(db.ForeignKey("game_rooms.id")) + player_black = db.Column(db.ForeignKey("users.id")) + player_white = db.Column(db.ForeignKey("users.id")) def __init__( self, name, description, board_size, game_room, player_white, @@ -73,15 +73,17 @@ class Game(db.Model): self.main_time = main_time self.overtime = overtime -class GameSchema(ma.ModelSchema): +class GameSchema(ma.Schema): id = fields.Int() name = fields.Str() description = fields.Str() board_size = fields.Int() - player = fields.Nested(user_schema) game_room = fields.Int() + # TODO change players to fields.Nested(UserSchema) + # TODO when you figure out why it's not working player_black = fields.Int() player_white = fields.Int() + game_schema = GameSchema() games_schema = GameSchema(many=True) \ No newline at end of file diff --git a/models/Message.py b/models/Message.py index c093ba9..636921b 100644 --- a/models/Message.py +++ b/models/Message.py @@ -15,7 +15,7 @@ class Message(db.Model): content = db.Column(db.String(200), nullable=False) # foreign key - move = db.Column(db.Integer, db.ForeignKey("moves.id"), nullable=False) + move = db.Column(db.ForeignKey("moves.id"), nullable=False) def __init__(self): pass \ No newline at end of file diff --git a/models/Move.py b/models/Move.py index 351b38e..5cf1321 100644 --- a/models/Move.py +++ b/models/Move.py @@ -19,7 +19,7 @@ class Move(db.Model): is_main = db.Column(db.Boolean, nullable=False, default=True) # foreign keys - game = db.Column(db.Integer, db.ForeignKey("games.id"), nullable=False) + game = db.Column(db.ForeignKey("games.id"), nullable=False) preceding_move = db.Column(db.Integer, db.ForeignKey("moves.id")) succeeding_moves = db.relationship( diff --git a/models/User.py b/models/User.py index 5ee165b..310be88 100644 --- a/models/User.py +++ b/models/User.py @@ -1,5 +1,5 @@ from database import db, ma -from marshmallow import fields +from marshmallow import fields, Schema from app import bcrypt from configuration import config import datetime @@ -63,7 +63,7 @@ class User(db.Model): rank_certainty = db.Column(db.Boolean, nullable=False, default=False) - def __init__(self, username, email, password, rank=Ranks.K1, admin=False): + def __init__(self, username, email, password, rank=Ranks.UR, admin=False): self.username = username self.email = email self.password = bcrypt.generate_password_hash( @@ -107,7 +107,7 @@ class User(db.Model): except jwt.InvalidTokenError: return 'Invalid token. Please log in again.' -class UserSchema(ma.ModelSchema): +class UserSchema(Schema): id = fields.Int() username = fields.Str() email = fields.Str() @@ -116,6 +116,8 @@ class UserSchema(ma.ModelSchema): rank_certainty = fields.Bool() elo = fields.Int() + class Meta: + register=True user_schema = UserSchema() users_schema = UserSchema(many=True) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 432ba18..1835c55 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,13 +15,14 @@ Flask-SocketIO==4.2.1 Flask-SQLAlchemy==2.4.1 Flask-Testing==0.7.1 greenlet==0.4.15 +gunicorn==19.9.0 isort==4.3.21 itsdangerous==1.1.0 Jinja2==2.10.1 lazy-object-proxy==1.4.2 Mako==1.1.0 MarkupSafe==1.1.1 -marshmallow==3.2.0 +marshmallow==3.2.1 marshmallow-sqlalchemy==0.19.0 mccabe==0.6.1 monotonic==1.5 diff --git a/websockets/roomSocket.py b/websockets/roomSocket.py index a707602..57a1fd2 100644 --- a/websockets/roomSocket.py +++ b/websockets/roomSocket.py @@ -1,6 +1,8 @@ from app import socketio from flask_socketio import send, emit, join_room, leave_room import json +from models.Game import Game +from models.User import User, user_schema def join_room_notice(room): @socketio.on('join room', namespace=f'/{room}') @@ -18,7 +20,17 @@ def new_room_notice(room): def join_game_notice(game_id, user): @socketio.on('join game') - def return_join_game_notice(data): - game = data['game'] - join_room(game) + def handle_join_game(data): + print(data) + game_id = data['game'] + user_id = data['user'] + game = Game.query.filter_by(id=game_id).first() + print('join game') + print(game) + print(game['player_black']) + join_room(game_id) + if not game['player_black']: + game['player_black'] = user + user = user_schema.dumps(User.query.filter_by(id=user_id).first()) + emit('new player', {'black': user}, broadcast=True) emit('join game', data, room=f'game')