feat: add send piece event
This commit is contained in:
46
main.py
46
main.py
@@ -7,6 +7,7 @@ import json
|
|||||||
import websockets
|
import websockets
|
||||||
|
|
||||||
GAMES = {}
|
GAMES = {}
|
||||||
|
|
||||||
# EVENT RESPONSES
|
# EVENT RESPONSES
|
||||||
|
|
||||||
def wait_for_opponent_response():
|
def wait_for_opponent_response():
|
||||||
@@ -18,47 +19,74 @@ def start_game_response():
|
|||||||
def exit_game_response():
|
def exit_game_response():
|
||||||
return json.dumps({"type": "exit_game"})
|
return json.dumps({"type": "exit_game"})
|
||||||
|
|
||||||
|
def receive_opponent_piece(piece):
|
||||||
|
return json.dumps({"type": "receive_opponent_piece", "piece": piece})
|
||||||
|
|
||||||
# EVENTS
|
# EVENTS
|
||||||
|
|
||||||
async def enter_game(game_id, player_web_socket):
|
async def enter_game(game_id, player):
|
||||||
""" TODO fix asssumption that there will only be two players per game """
|
""" TODO fix asssumption that there will only be two players per game """
|
||||||
# if game does not exist, create it
|
# if game does not exist, create it
|
||||||
if game_id not in GAMES:
|
if game_id not in GAMES:
|
||||||
GAMES[game_id] = {"players": [player_web_socket], "game_id": game_id}
|
GAMES[game_id] = create_game(game_id, player)
|
||||||
message = wait_for_opponent_response()
|
message = wait_for_opponent_response()
|
||||||
await player_web_socket.send(message)
|
await player.send(message)
|
||||||
# if game exists, add player to game if they are not already in it
|
# if game exists, add player to game if they are not already in it
|
||||||
elif player_web_socket.remote_address[0] not in map(lambda p: p.remote_address[0], GAMES[game_id]["players"]):
|
elif player.remote_address[0] not in map(lambda p: p.remote_address[0], GAMES[game_id]["players"]):
|
||||||
GAMES[game_id]["players"].append(player_web_socket)
|
GAMES[game_id]["players"].append(player)
|
||||||
message = start_game_response()
|
message = start_game_response()
|
||||||
await asyncio.wait([player.send(message) for player in GAMES[game_id]["players"]])
|
await asyncio.wait([player.send(message) for player in GAMES[game_id]["players"]])
|
||||||
else:
|
else:
|
||||||
print("Already in game...")
|
print("Already in game...")
|
||||||
|
|
||||||
|
async def send_piece(game_id, player, piece):
|
||||||
|
# make sure game exists
|
||||||
|
if game_id not in GAMES:
|
||||||
|
print("Game does not exist...")
|
||||||
|
return
|
||||||
|
|
||||||
|
# get opponent player and send piece to opponent player
|
||||||
|
await get_opponent_player(game_id, player.remote_address[0])\
|
||||||
|
.send(receive_opponent_piece(piece))
|
||||||
|
|
||||||
async def exit_game(player_remote_address):
|
async def exit_game(player_remote_address):
|
||||||
# get game with player that is disconnecting
|
# get game with player that is disconnecting
|
||||||
result = list(filter(lambda g: player_remote_address in map(lambda p: p.remote_address[0], g["players"]), GAMES.values()))
|
result = list(filter(lambda g: player_remote_address in map(lambda p: p.remote_address[0], g["players"]), GAMES.values()))
|
||||||
|
game_with_player = result[0] if len(result) > 0 else None
|
||||||
|
|
||||||
# if game exists, delete game and remove opponent player from game
|
# if game exists, delete game and remove opponent player from game
|
||||||
if len(result):
|
if game_with_player:
|
||||||
game_with_player = result[0]
|
|
||||||
del GAMES[game_with_player["game_id"]]
|
del GAMES[game_with_player["game_id"]]
|
||||||
|
|
||||||
# remove opponent player from game
|
# remove opponent player from game
|
||||||
result = list(filter(lambda p: p.remote_address[0] != player_remote_address, game_with_player["players"]))
|
result = list(filter(lambda p: p.remote_address[0] != player_remote_address, game_with_player["players"]))
|
||||||
if len(result):
|
opponent_player = result[0] if len(result) > 0 else None
|
||||||
opponent_player = result[0]
|
if opponent_player:
|
||||||
message = exit_game_response()
|
message = exit_game_response()
|
||||||
await opponent_player.send(message)
|
await opponent_player.send(message)
|
||||||
|
|
||||||
# --------------------------
|
# --------------------------
|
||||||
|
|
||||||
|
# HELPER FUNCTIONS
|
||||||
|
|
||||||
|
def get_opponent_player(game_id, player_remote_address):
|
||||||
|
opponent_player = list(filter(lambda p: p.remote_address[0] != player_remote_address, GAMES[game_id]["players"]))[0];
|
||||||
|
return opponent_player
|
||||||
|
|
||||||
|
def create_game(game_id, player=None):
|
||||||
|
print("Creating game...")
|
||||||
|
return {"players": ([player] if player else []), "game_id": game_id}
|
||||||
|
|
||||||
|
# --------------------------
|
||||||
|
|
||||||
async def init(websocket, path):
|
async def init(websocket, path):
|
||||||
try:
|
try:
|
||||||
async for message in websocket:
|
async for message in websocket:
|
||||||
data = json.loads(message)
|
data = json.loads(message)
|
||||||
if data["action"] == "enter_game":
|
if data["action"] == "enter_game":
|
||||||
await enter_game(data["gameId"], websocket)
|
await enter_game(data["gameId"], websocket)
|
||||||
|
elif data["action"] == "send_piece":
|
||||||
|
await send_piece(data["gameId"], websocket, data["piece"])
|
||||||
else:
|
else:
|
||||||
print("Unsupported action...")
|
print("Unsupported action...")
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
Reference in New Issue
Block a user