Files
thomas 1f110866f5
CI / backend (pull_request) Canceled after 0s
CI / shell (pull_request) Canceled after 0s
CI / frontend (pull_request) Canceled after 0s
CI / arm64-smoke (pull_request) Canceled after 0s
CI / backend (push) Canceled after 0s
CI / shell (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / arm64-smoke (push) Canceled after 0s
Update docs and screenshots
2026-07-25 10:26:29 +02:00

40 lines
1.3 KiB
Python

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)