"""Модуль 5: hotkeys — клавиши управления (событийные бэкенды). Использование: from modules.hotkeys import KeyEvents, get_backend events = KeyEvents(on_talk_down=..., on_talk_up=..., on_stop=..., on_repeat=..., on_quit=...) backend = get_backend("console", events) # или "keys" (Windows / root-Linux) backend.start() """ from __future__ import annotations import os from .base import KeyEvents from .console import ConsoleBackend from .keyboard_hook import KeyboardHookBackend __all__ = ["KeyEvents", "ConsoleBackend", "KeyboardHookBackend", "get_backend"] _BACKENDS = { ConsoleBackend.name: ConsoleBackend, KeyboardHookBackend.name: KeyboardHookBackend, } def get_backend(name: str, events: KeyEvents, **kwargs): """Фабрика бэкендов клавиш.""" if name == KeyboardHookBackend.name: # Клавиши можно переопределить через переменные окружения/.env: # HOTKEY_DIALOG (пробел-тумблер), HOTKEY_TALK, HOTKEY_STOP, HOTKEY_REPEAT kwargs.setdefault("dialog", os.environ.get("HOTKEY_DIALOG", "space")) kwargs.setdefault("talk", os.environ.get("HOTKEY_TALK", "num 0")) kwargs.setdefault("stop_key", os.environ.get("HOTKEY_STOP", "esc")) kwargs.setdefault("repeat", os.environ.get("HOTKEY_REPEAT", "enter")) try: backend_cls = _BACKENDS[name] except KeyError: raise ValueError( f"Неизвестный бэкенд клавиш: {name!r}. Доступны: {sorted(_BACKENDS)}" ) from None return backend_cls(events, **kwargs)