From 8ec7f5368232d59f344e1067e1bad5e48dbcb7ae Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sat, 7 Sep 2024 20:20:07 -0700 Subject: get "cats" up there --- kennel/kennel.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 4 deletions(-) (limited to 'kennel/kennel.py') diff --git a/kennel/kennel.py b/kennel/kennel.py index b4d7b7b..7123b7f 100644 --- a/kennel/kennel.py +++ b/kennel/kennel.py @@ -1,18 +1,27 @@ +import asyncio import uuid +import time from typing import List, Optional from kennel.config import config from kennel.engine.components.component import ComponentType from kennel.engine.entities.entity import Entity, EntityManager from kennel.engine.entities.laser import Laser +from kennel.engine.entities.cat import Cat from kennel.engine.game import Game +from kennel.engine.systems.markov_transition_state_system import ( + MarkovTransitionStateSystem, +) from kennel.engine.systems.network import ( EntityPositionUpdateEvent, + EntityBornEvent, + EntityDeathEvent, Event, EventType, NetworkSystem, UpstreamEventProcessor, ) +from kennel.kennelcats import KennelCatService, KennelCat from kennel.engine.systems.system import SystemManager from kennel.engine.systems.world import WorldSystem @@ -58,12 +67,76 @@ class KennelEventProcessor(UpstreamEventProcessor): return event -system_manager.add_system(WorldSystem(config.WORLD_WIDTH, config.WORLD_HEIGHT)) -system_manager.add_system( - NetworkSystem(KennelEventProcessor()), -) +class KennelCatsManager: + kennel_cat_service: KennelCatService + entity_manager: EntityManager + network_system: NetworkSystem + last_seen: set[str] + poll_interval_sec: int + running: bool + + def __init__( + self, + kennel_cat_service: KennelCatService, + entity_manager: EntityManager, + network_system: NetworkSystem, + poll_interval_sec: int, + ): + self.kennel_cat_service = kennel_cat_service + self.entity_manager = entity_manager + self.network_system = network_system + self.poll_interval_sec = poll_interval_sec + + self.last_seen = set() + self.running = False + + async def start(self) -> None: + logger.info("starting kennel cats manager") + if self.running: + return + + self.running = True + while self.running: + logger.info("polling kennel cats service") + cats = self.kennel_cat_service.get_kennel() + cats_table = {cat.id: cat for cat in cats} + cat_ids = set([cat.id for cat in cats]) + + removed_cats = [cats_table[id] for id in self.last_seen.difference(cat_ids)] + added_cats = [cats_table[id] for id in cat_ids.difference(self.last_seen)] + logger.info(f"removing {removed_cats}") + logger.info(f"adding {added_cats}") + + for removed in removed_cats: + self.entity_manager.remove_entity(removed) + entity_death = EntityDeathEvent(removed.id) + self.network_system.server_global_event(entity_death) + + for added in added_cats: + new_cat = Cat(added.id) + self.entity_manager.add_entity(new_cat) + entity_born = EntityBornEvent(new_cat) + self.network_system.server_global_event(entity_born) + + self.last_seen = cat_ids + await asyncio.sleep(self.poll_interval_sec) + + def stop(self) -> None: + logger.info("stopping kennel cats manager") + self.running = False + + +network_system = NetworkSystem(KennelEventProcessor()) +world_system = WorldSystem(config.WORLD_WIDTH, config.WORLD_HEIGHT) +markov_transition_state_system = MarkovTransitionStateSystem(network_system) +system_manager.add_system(network_system) +system_manager.add_system(world_system) kennel = Game(entity_manager, system_manager, config.MIN_TIME_STEP) +kennel_cat_service = KennelCatService(config.HATECOMPUTERS_ENDPOINT) +kennel_cats_manager = KennelCatsManager( + kennel_cat_service, entity_manager, network_system, config.KENNEL_CATS_POLL_SEC +) def create_session_controllable_entities(session: str) -> List[Entity]: -- cgit v1.3