feat: complete connection scene

This commit is contained in:
Giovani
2021-07-14 19:38:55 -04:00
parent 20738f1c5a
commit d8a310d9fe
4 changed files with 84 additions and 8 deletions

View File

@@ -10,9 +10,14 @@ class MultiplayerService():
_thread = None
_receive_piece_queue = queue.Queue()
_send_piece_queue = queue.Queue()
_receive_message_queue = queue.Queue()
_send_message_queue = queue.Queue()
_current_game_id = None
_client_id = str(uuid.uuid4())
WAIT_FOR_OPPONENT = "wait_for_opponent"
START_GAME = "start_game"
@classmethod
def init(cls) -> None:
thread = Thread(target=asyncio.get_event_loop().run_until_complete,\
@@ -28,12 +33,28 @@ class MultiplayerService():
def send_piece(cls, piece: "PieceDto") -> None:
cls._send_piece_queue.put(piece)
@classmethod
def send_message(cls, message: str) -> None:
cls._send_message_queue.put(message)
@classmethod
def try_receive_piece(cls) -> "PieceDto":
if cls._receive_piece_queue.empty():
return None
result = cls._receive_piece_queue.get()
cls._receive_piece_queue.task_done()
return result
@classmethod
def try_receive_message(cls) -> str:
if cls._receive_message_queue.empty():
return None
result = cls._receive_message_queue.get()
cls._receive_message_queue.task_done()
return result
@classmethod
def quit(cls) -> None:
_NetworkConnectionService.close_connection()
@@ -61,6 +82,7 @@ class _NetworkConnectionService():
await cls._try_enter_game()
await cls._try_send_piece()
await cls._try_send_message()
await cls._try_receive_message()
# if conection is closed, exit loop
@@ -97,6 +119,18 @@ class _NetworkConnectionService():
await cls._websocket.send(json_message)
MultiplayerService._send_piece_queue.task_done()
@classmethod
async def _try_send_message(cls) -> None:
# if no messages to proccess, return
if MultiplayerService._send_message_queue.empty():
return
# get next message to send and send to server
message = MultiplayerService._send_message_queue.get()
await cls._websocket.send(message)
MultiplayerService._send_message_queue.task_done()
@classmethod
async def _try_receive_message(cls) -> None:
try:
@@ -104,13 +138,19 @@ class _NetworkConnectionService():
done, pending = await asyncio.wait({task}, timeout=8e-3) # TODO experiment with the timeout
if task in done:
data = json.loads(await task)
json_str = await task
if json_str == "pong":
print("pong")
cls._pending_receive_task = None
return
data = json.loads(json_str)
print(data)
if data["type"] == "wait_for_opponent":
print("Wait for my opponent!")
MultiplayerService._receive_message_queue.put(MultiplayerService.WAIT_FOR_OPPONENT)
if data["type"] == "start_game":
print("Start the game!")
MultiplayerService._receive_message_queue.put(MultiplayerService.START_GAME)
if data["type"] == "receive_piece":
print("Receive a piece!")
MultiplayerService._receive_piece_queue.put(PieceDto.create(data["piece"]))