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
40 lines
1.3 KiB
Python
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)
|