def update_event(message):
    r"""Handle Update.

    Args: \
        `message`: Game State
    """
    last_box = message["last_box"]
    game_id = message["game_id"]
    print(message)
    game.find_one_and_update(
        {"_id": ObjectId(game_id)},
        {
            "$set": {
                "state": message["data"],
                "last_box": last_box,
                "player1_win": message["games"]["player1"],
                "player2_win": message["games"]["player2"],
            }
        },
    )
    result = game.find_one({"_id": ObjectId(game_id)})
    player1_email = player.find_one({"_id": result["player1_id"]})["email"]
    player2_email = player.find_one({"_id": result["player2_id"]})["email"]
    message["player1_email"] = player1_email
    message["player2_email"] = player2_email
    emit("game_state", {"data": message}, broadcast=True)
def get_state(data):
    """Get state."""
    game_id = data["game_id"]
    current_game = dict(game.find_one({"_id": ObjectId(game_id)}))
    state = current_game["state"]
    last_box = current_game["last_box"]
    games = dict()
    games["player1"] = current_game["player1_win"]
    games["player2"] = current_game["player2_win"]
    status = current_game["winner"] if current_game["winner"] is not None else -1
    player_turn = 0
    if last_box is not None and state[last_box] == "X":
        player_turn = 1
    player1_email = player.find_one({"_id": current_game["player1_id"]})["email"]
    if current_game["player2_id"] is not None:
        player2_email = player.find_one({"_id": current_game["player2_id"]})["email"]
    else:
        player2_email = ""
    data = {
        "data": state,
        "player": player_turn,
        "game_id": game_id,
        "last_box": last_box,
        "games": games,
        "status": status,
        "player1_email": player1_email,
        "player2_email": player2_email,
    }
    emit("game_state", {"data": data}, broadcast=True)
Example #3
0
def create_game_post():
    """Create game."""
    if "name" in request.cookies and "email" in request.cookies:
        name = request.cookies.get("name")
        email = request.cookies.get("email")
    else:
        return redirect("/")
    game_type = request.form["game_type"]
    player_1 = dict(player.find_one({"email": email}))
    game_data = {
        "player1_id": ObjectId(player_1["_id"]),
        "player1_name": name,
        "player2_id": None,
        "public": True if game_type == "public" else False,
        "start_time": time.time(),
        "end_time": None,
        "winner": None,
        "player1_win": {},
        "player2_win": {},
        "state": ["" for _ in range(81)],
        "last_box": None,
    }
    result = game.insert_one(game_data)
    player1_games = player_1["games"]
    player1_games.append(result.inserted_id)
    player.find_one_and_update({"_id": ObjectId(player_1["_id"])},
                               {"$set": {
                                   "games": player1_games
                               }})
    socketio.emit("join", {"channel": str(result.inserted_id)})
    resp = make_response(redirect("/game"))
    resp.set_cookie("game_id", str(result.inserted_id))
    return resp
Example #4
0
def dashboard_get():
    """User dashboard."""
    if "name" in request.cookies and "email" in request.cookies:
        name = request.cookies.get("name")
        email = request.cookies.get("email")
    else:
        return redirect("/")
    game_list = []
    player_games_list = dict(player.find_one({"email": email}))["games"]
    public_games = game.find(
        {
            "public": True,
            "end_time": None,
            "player2_id": None
        },
        sort=[("start_time", pymongo.DESCENDING)],
    )
    player_games = game.find({
        "_id": {
            "$in": player_games_list
        },
        "end_time": None
    })
    for public_game in public_games:
        game_list.append(dict(public_game))
    for player_game in player_games:
        player_game = dict(player_game)
        if player_game not in game_list:
            game_list.append(player_game)
    return render_template(DASHBOARD_FILE,
                           data={
                               "name": name,
                               "email": email,
                               "public_games": game_list
                           })
Example #5
0
def register_post():
    r"""Register user.

    Returns: \
        HTML: Register HTML page
    """
    if "name" in request.cookies and "email" in request.cookies:
        return redirect("/dashboard")
    email = str(request.form["email"])
    password = str(request.form["password"])
    repassword = str(request.form["repassword"])
    name = str(request.form["name"])
    if player.find_one({"email": email}) is not None:
        print("email", email)
        return render_template(REGISTER_FILE,
                               data={"err_msg": "User already exists."})
    elif password != repassword:
        print("password", password, repassword)
        return render_template(REGISTER_FILE,
                               data={"err_msg": "Passwords does not match."})
    password = hashlib.md5(password.encode()).hexdigest()
    player_data = {
        "email": email,
        "password": password,
        "name": name,
        "games": [],
    }
    result = player.insert_one(player_data)
    result = dict(player.find_one({"_id": result.inserted_id}))
    pprint("New data added: {}".format(result))
    resp = make_response(redirect("/dashboard"))
    player_email = result["email"]
    player_name = result["name"]
    resp.set_cookie("email", player_email)
    resp.set_cookie("name", player_name)
    return resp
Example #6
0
def login_post():
    r"""Login post.

    Returns: \
        HTML: Login/Game page
    """
    if "name" in request.cookies and "email" in request.cookies:
        return redirect("/dashboard")
    password = hashlib.md5(request.form["password"].encode()).hexdigest()
    query = {"email": request.form["email"], "password": password}
    result = player.find_one(query)
    if result is None:
        return render_template(LOGIN_FILE,
                               data={"err_msg": "Invalid email/password"})
    player_email = result["email"]
    player_name = result["name"]
    resp = make_response(redirect("/dashboard"))
    resp.set_cookie("email", player_email)
    resp.set_cookie("name", player_name)
    return resp
Example #7
0
def join_game_post():
    """Join game."""
    if "email" in request.cookies:
        email = request.cookies.get("email")
    else:
        return redirect("/")
    game_id = ObjectId(request.form["game_id"])
    player_2 = dict(player.find_one({"email": email}))
    game_data = game.find_one({"_id": game_id})
    if game_data is None:
        return render_template(DASHBOARD_FILE,
                               data={"err_msg": "Invalid Game Id"})
    game_data = dict(game_data)
    if game_data["player2_id"] == player_2["_id"]:
        resp = make_response(redirect("/game"))
        resp.set_cookie("game_id", str(game_id))
        return resp
    if (game_data["player2_id"] is not None
            and game_data["player1_id"] != player_2["_id"]):
        return redirect("/dashboard")
    if game_data["player1_id"] != player_2["_id"]:
        player2_games = player_2["games"]
        player2_games.append(ObjectId(game_data["_id"]))
        player.find_one_and_update({"_id": ObjectId(player_2["_id"])},
                                   {"$set": {
                                       "games": player2_games
                                   }})
        game.find_one_and_update(
            {"_id": ObjectId(game_data["_id"])},
            {"$set": {
                "player2_id": ObjectId(player_2["_id"])
            }},
        )
    resp = make_response(redirect("/game"))
    resp.set_cookie("game_id", str(game_id))
    return resp