Source code for bot_api.internal.internal_event_handlers
"""Internal event handler support."""
from typing import Any, Dict, Type
from ..events import EventABC
from ..events import (
DisconnectedEvent,
GameEndedEvent,
RoundStartedEvent,
RoundEndedEvent,
DeathEvent,
HitBotEvent,
HitWallEvent,
BulletFiredEvent,
)
from .event_handler import EventHandler
[docs]
class InternalEventHandlers:
"""
Class used for instant event handling only used for updating the state of the API internals.
"""
[docs]
def __init__(self):
"""Initialize a new InternalEventHandlers instance."""
self.on_disconnected: EventHandler[DisconnectedEvent] = EventHandler()
self.on_game_ended: EventHandler[GameEndedEvent] = EventHandler()
self.on_game_aborted: EventHandler[Any] = EventHandler()
self.on_round_started: EventHandler[RoundStartedEvent] = EventHandler()
self.on_round_ended: EventHandler[RoundEndedEvent] = EventHandler()
self.on_death: EventHandler[DeathEvent] = EventHandler()
self.on_hit_bot: EventHandler[HitBotEvent] = EventHandler()
self.on_hit_wall: EventHandler[HitWallEvent] = EventHandler()
self.on_bullet_fired: EventHandler[BulletFiredEvent] = EventHandler()
# Virtual (fake) event handler
self.on_next_turn: EventHandler[Any] = EventHandler()
# Map event types to their handlers
self._event_handler_map: Dict[Type[EventABC], EventHandler[Any]] = {}
self._initialize_event_handlers()
def _initialize_event_handlers(self) -> None:
"""Initialize the mapping between event types and their handlers."""
self._event_handler_map[DisconnectedEvent] = self.on_disconnected
self._event_handler_map[GameEndedEvent] = self.on_game_ended
self._event_handler_map[self.GameAbortedEvent] = self.on_game_aborted
self._event_handler_map[RoundStartedEvent] = self.on_round_started
self._event_handler_map[RoundEndedEvent] = self.on_round_ended
self._event_handler_map[DeathEvent] = self.on_death
self._event_handler_map[HitBotEvent] = self.on_hit_bot
self._event_handler_map[HitWallEvent] = self.on_hit_wall
self._event_handler_map[BulletFiredEvent] = self.on_bullet_fired
self._event_handler_map[self.NextTurnEvent] = self.on_next_turn
[docs]
def fire_event(self, event: EventABC) -> None:
"""
Fire an event to its registered handler.
Args:
event: The event to fire.
Note:
If there is no registered event handler for the event type,
the event is ignored.
"""
handler = self._event_handler_map.get(type(event))
if handler is not None:
handler.publish(event)
# ignore if there is no registered event handler
# Virtual (fake) events:
[docs]
class GameAbortedEvent(EventABC):
"""Virtual event class representing a game aborted event."""
pass
[docs]
class NextTurnEvent(EventABC):
"""Private virtual event class representing a next turn event."""
pass