feat: complete connection scene
This commit is contained in:
@@ -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"]))
|
||||
|
||||
Reference in New Issue
Block a user