diff options
| author | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-08-24 19:11:26 -0700 |
|---|---|---|
| committer | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-08-24 19:16:22 -0700 |
| commit | a0a2068b66204d7d06eb3c3b4aa61b28469121f6 (patch) | |
| tree | e9706970af1ce8b4d12df9c0a3f64fa17ca74b97 /kennel/main.py | |
| parent | b144ad5df76e458297bd6dc030cad4af0f344901 (diff) | |
| download | kennel.hatecomputers.club-a0a2068b66204d7d06eb3c3b4aa61b28469121f6.tar.gz kennel.hatecomputers.club-a0a2068b66204d7d06eb3c3b4aa61b28469121f6.zip | |
improve event parsing and begin sending events from the client
Diffstat (limited to 'kennel/main.py')
| -rw-r--r-- | kennel/main.py | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/kennel/main.py b/kennel/main.py index 6f661cb..fc0fd0e 100644 --- a/kennel/main.py +++ b/kennel/main.py @@ -11,7 +11,14 @@ from fastapi import ( from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles from kennel.engine.systems.system import SystemType -from kennel.engine.systems.network import Event, Publishable, EventType +from kennel.engine.systems.network import ( + Event, + Publishable, + EventType, + InitialStateEvent, + SetControllableEvent, + EntityBornEvent, +) from typing import Annotated, Optional from kennel.kennel import ( kennel, @@ -76,7 +83,7 @@ class WebSocketClient(Publishable): self.websocket = websocket async def publish(self, event: Event): - await self.websocket.send_json(event.dict()) + await self.websocket.send_json([event.event_type, event.data]) @app.websocket("/ws") @@ -85,19 +92,16 @@ async def websocket_endpoint( session: Annotated[str, Depends(get_cookie_or_token)], ): await websocket.accept() + client = WebSocketClient(websocket) logger.info(f"Websocket connection established for session {session}") - await websocket.send_json( - { - "event_type": EventType.INITIAL_STATE, - "data": { - "world": {"width": config.WORLD_WIDTH, "height": config.WORLD_HEIGHT}, - "entities": kennel.entity_manager.to_dict(), - }, - } + initial_state = InitialStateEvent( + config.WORLD_WIDTH, config.WORLD_HEIGHT, kennel.entity_manager.to_dict() ) + await client.publish(initial_state) session_entities = create_session_controllable_entities(session) + logger.info(f"Creating {len(session_entities)} entities for session {session}") try: network_system = system_manager.get_system(SystemType.NETWORK) if network_system is None: @@ -106,14 +110,26 @@ async def websocket_endpoint( for entity in session_entities: logger.info(f"Adding entity {entity.id} for session {session}") entity_manager.add_entity(entity) - network_system.add_event(Event(EventType.ENTITY_BORN, {"id": entity.id})) + network_system.add_event(EntityBornEvent(entity)) + + set_controllable_event = SetControllableEvent(entity.id, session) + await client.publish(set_controllable_event) network_system.add_client(session, WebSocketClient(websocket)) while True: message = await websocket.receive_json() - network_system.client_event(session, Event.from_dict(message)) + if type(message) is not list: + message = [message] + events = [Event.from_dict(event) for event in message] + if not all([event is not None for event in events]): + logger.info(f"Invalid events in: {message}"[:100]) + continue + for event in events: + network_system.client_event(session, event) + except WebSocketDisconnect as e: + logger.info(f"Websocket connection closed by client: {session}") except Exception as e: - logger.error(f"WebSocket exception {e}") + logger.error("Exception occurred", exc_info=e) finally: logger.info("Websocket connection closed") for entity in session_entities: |
