Commit 4e24aafb authored by nanahira's avatar nanahira

Revert "buffer CTOS_UPDATE_DECK"

This reverts commit 05a4ccb7.
parent 05a4ccb7
...@@ -72,14 +72,13 @@ CTOS_EXTERNAL_ADDRESS = 0x17 ...@@ -72,14 +72,13 @@ CTOS_EXTERNAL_ADDRESS = 0x17
CTOS_HS_TODUELIST = 0x20 CTOS_HS_TODUELIST = 0x20
CTOS_HS_KICK = 0x24 CTOS_HS_KICK = 0x24
STOC_CHANGE_SIDE = 0x7
STOC_ERROR_MSG = 0x02 STOC_ERROR_MSG = 0x02
STOC_CHAT = 0x19 STOC_CHAT = 0x19
STOC_JOIN_GAME = 0x12 STOC_JOIN_GAME = 0x12
STOC_TYPE_CHANGE = 0x13 STOC_TYPE_CHANGE = 0x13
STOC_DUEL_START = 0x15
STOC_HS_PLAYER_ENTER = 0x20 STOC_HS_PLAYER_ENTER = 0x20
async def handle_client(reader: StreamReader, writer: StreamWriter): async def handle_client(reader: StreamReader, writer: StreamWriter):
remote_reader: StreamReader = None remote_reader: StreamReader = None
remote_writer: StreamWriter = None remote_writer: StreamWriter = None
...@@ -121,7 +120,6 @@ async def handle_client(reader: StreamReader, writer: StreamWriter): ...@@ -121,7 +120,6 @@ async def handle_client(reader: StreamReader, writer: StreamWriter):
class State: class State:
established = False established = False
changing_side = False
state = State() state = State()
...@@ -268,18 +266,12 @@ async def handle_client(reader: StreamReader, writer: StreamWriter): ...@@ -268,18 +266,12 @@ async def handle_client(reader: StreamReader, writer: StreamWriter):
async def pipe(src: StreamReader, dst: StreamWriter, direction: Union['STOC', 'CTOS']): async def pipe(src: StreamReader, dst: StreamWriter, direction: Union['STOC', 'CTOS']):
try: try:
buffered: bytes = None
while not src.at_eof(): while not src.at_eof():
header = await src.readexactly(3) header = await src.readexactly(3)
length = struct.unpack('<H', header[:2])[0] length = struct.unpack('<H', header[:2])[0]
packet_id = header[2] packet_id = header[2]
logger.info(f"Received {direction} packet ID {packet_id} with length {length} for {player_descriptor}") logger.info(f"Received {direction} packet ID {packet_id} with length {length} for {player_descriptor}")
payload = await src.readexactly(length - 1) payload = await src.readexactly(length - 1)
if direction == 'CTOS':
if packet_id == CTOS_UPDATE_DECK and not state.changing_side:
logger.info(f"Received CTOS_UPDATE_DECK for {player_descriptor}, but buffer it until the next packet")
buffered = header + payload
continue
if direction == 'STOC': if direction == 'STOC':
if packet_id == STOC_JOIN_GAME: if packet_id == STOC_JOIN_GAME:
state.established = True state.established = True
...@@ -292,18 +284,11 @@ async def handle_client(reader: StreamReader, writer: StreamWriter): ...@@ -292,18 +284,11 @@ async def handle_client(reader: StreamReader, writer: StreamWriter):
logger.warning(f"Received error message for {player_descriptor}: {msg} {code}") logger.warning(f"Received error message for {player_descriptor}: {msg} {code}")
await close_connection() await close_connection()
return return
if packet_id == STOC_CHANGE_SIDE: dst.write(header)
state.changing_side = True dst.write(payload)
logger.info(f"Changing side for {player_descriptor}") if not (direction == 'CTOS' and packet_id == CTOS_UPDATE_DECK):
if packet_id == STOC_DUEL_START and state.changing_side: # no drain after CTOS_UPDATE_DECK, because it's expected to glue with CTOS_READY
state.changing_side = False await dst.drain()
logger.info(f"Side finished for {player_descriptor}")
if buffered:
logger.info(f"Sending buffered CTOS_UPDATE_DECK for {player_descriptor}")
dst.write(buffered)
buffered = None
dst.write(header + payload)
await dst.drain()
except Exception as e: except Exception as e:
logger.warning(f"Error in pipe {direction} for {player_descriptor}: {e}") logger.warning(f"Error in pipe {direction} for {player_descriptor}: {e}")
pass pass
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment