from __future__ import annotations from collections import deque from time import monotonic from app.dmx.engine import DmxEngine from app.effects.service import EffectService from app.models.schemas import TriggerRequest from app.scenes.service import SceneService class TriggerService: def __init__( self, engine: DmxEngine, effects: EffectService, scenes: SceneService, ) -> None: self.engine = engine self.effects = effects self.scenes = scenes self.queue: deque[dict[str, object]] = deque(maxlen=100) self._recent_ids: dict[str, float] = {} def enqueue(self, slug: str, payload: TriggerRequest) -> dict[str, object]: if payload.event_id: previous = self._recent_ids.get(payload.event_id) if previous and monotonic() - previous < 30: return {"accepted": False, "reason": "duplicate-event"} self._recent_ids[payload.event_id] = monotonic() item: dict[str, object] = { "slug": slug, "payload": payload.model_dump(by_alias=True), } self.queue.append(item) return {"accepted": True, "queue_depth": len(self.queue)} def snapshot(self) -> list[dict[str, object]]: return list(self.queue)