From 348e8ae7862962f4e62e783f1150abd3842dccb2 Mon Sep 17 00:00:00 2001 From: Joshua Higgins Date: Thu, 20 Nov 2025 14:54:32 -0500 Subject: [PATCH] fix: python keep alive --- example_client.py | 49 ++++++++++++++++++++++------------------------- src/main.rs | 3 +++ 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/example_client.py b/example_client.py index 79a2903..b086b6e 100644 --- a/example_client.py +++ b/example_client.py @@ -1,15 +1,13 @@ import asyncio +import itertools + import websockets from enum import Enum - -class Slot(Enum): - NONE = 0 - RED = 1 - BLUE = 2 +from websockets import ConnectionClosed -def calculate_move(opponent_move, board, our_color, opponent_color): +def calculate_move(opponent_move, board): if opponent_move is not None: print(f"Opponent played column {opponent_move}") # TODO: Implement your move calculation logic here instead @@ -18,9 +16,7 @@ def calculate_move(opponent_move, board, our_color, opponent_color): async def gameloop(socket): - board = [[Slot.NONE] * 5 for _ in range(6)] - our_color = Slot.NONE - opponent_color = Slot.NONE + board = [[None] * 5 for _ in range(6)] while True: # While game is active, continually anticipate messages message = (await socket.recv()).split(':') # Receive message from server @@ -31,40 +27,41 @@ async def gameloop(socket): case 'GAME': if message[1] == 'START': if message[2] == '1': - our_color = Slot.RED - opponent_color = Slot.BLUE - col = calculate_move(None, board, our_color, - opponent_color) # calculate_move is some arbitrary function you have created to figure out the next move + col = calculate_move(None, board) # calculate_move is some arbitrary function you have created to figure out the next move await socket.send(f'PLAY:{col}') # Send your move to the sever - else: - our_color = Slot.BLUE - opponent_color = Slot.RED if (message[1] == 'WINS') | (message[1] == 'LOSS') | (message[1] == 'DRAW') | (message[1] == 'TERMINATED'): # Game has ended - print(message[0]) - board = [[Slot.NONE] * 5 for _ in range(6)] + print(message[0]+message[1]) + board = [[None] * 5 for _ in range(6)] our_color = None opponent_color = None await socket.send('READY') case 'OPPONENT': # Opponent has gone; calculate next move - col = calculate_move(message[1], board, our_color, opponent_color) # Give your function your opponent's move + col = calculate_move(message[1], board) # Give your function your opponent's move await socket.send(f'PLAY:{col}') # Send your move to the sever - # case 'KICK': - # print("You have been kicked from the game") - # break - case 'ERROR': print(f"{message[0]}: {':'.join(message[1:])}") break await socket.close() +async def keepalive(websocket, ping_interval=30): + for ping in itertools.count(): + await asyncio.sleep(ping_interval) + try: + await websocket.send("PING") + except ConnectionClosed: + break async def join_server(username): - async with websockets.connect(f'wss://connect4.abunchofknowitalls.com') as socket: # Establish websocket connection - await socket.send(f'CONNECT:{username}') - await gameloop(socket) + async with websockets.connect(f'wss://connect4.abunchofknowitalls.com') as socket: # Establish websocket connection + keepalive_task = asyncio.create_task(keepalive(socket)) + try: + await socket.send(f'CONNECT:{username}') + await gameloop(socket) + finally: + keepalive_task.cancel() if __name__ == '__main__': # Program entrypoint diff --git a/src/main.rs b/src/main.rs index 2aa466f..3c420c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -486,6 +486,9 @@ async fn handle_connection( // TODO: Start tournaments + else if text == "PING" { + let _ = send(&tx, "PONG"); + } else { let _ = send(&tx, "ERROR:UNKNOWN"); }