summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/config.py8
-rw-r--r--modules/input_handlers/pipewire_record.py2
-rw-r--r--modules/input_handlers/stdin_input.py2
-rw-r--r--modules/intents/sway.py2
-rw-r--r--modules/responses/libnotify.py15
-rw-r--r--modules/responses/response_handler.py6
-rw-r--r--modules/responses/response_manager.py32
-rw-r--r--modules/responses/responses.py16
8 files changed, 67 insertions, 16 deletions
diff --git a/modules/config.py b/modules/config.py
index b0fc624..c5e8d1d 100644
--- a/modules/config.py
+++ b/modules/config.py
@@ -15,15 +15,21 @@ class Config:
self.intents_dir = ""
self.responses_dir = ""
+ self.resources_dir = ""
self.applications_dir = ""
self.lock = ""
+ self.hestia_images = ""
+
def update(self, **entries) -> None:
self.__dict__.update(entries)
self.intents_dir = Config.__convert_to_absolute_path(self.intents_dir)
self.responses_dir = Config.__convert_to_absolute_path(self.responses_dir)
+ self.resources_dir = Config.__convert_to_absolute_path(self.resources_dir)
+
+ self.hestia_images = os.path.join(self.resources_dir, "hestia_images")
@staticmethod
def __convert_to_absolute_path(path: str) -> str:
@@ -34,7 +40,7 @@ class Config:
def validate(self) -> None:
if self.input_mode not in self.INPUT_MODES:
- sys.exit(f"Invalid input_mode '{self.input_mode}', valid options: {", ".join(self.INPUT_MODES)}")
+ sys.exit(f"Invalid input_mode '{self.input_mode}', valid options: {', '.join(self.INPUT_MODES)}")
def load_config() -> Config:
config = Config()
diff --git a/modules/input_handlers/pipewire_record.py b/modules/input_handlers/pipewire_record.py
index ad119b6..0a767e1 100644
--- a/modules/input_handlers/pipewire_record.py
+++ b/modules/input_handlers/pipewire_record.py
@@ -5,7 +5,7 @@ from time import sleep
import whisper
-from modules.input_handlers.input_handler import InputHandler
+from .input_handler import InputHandler
FIFO_PATH = "/tmp/hestia-listening"
RECORD_PATH = "/tmp/hestia-record.mp3"
diff --git a/modules/input_handlers/stdin_input.py b/modules/input_handlers/stdin_input.py
index a18273f..3d338c1 100644
--- a/modules/input_handlers/stdin_input.py
+++ b/modules/input_handlers/stdin_input.py
@@ -1,6 +1,6 @@
import sys
-from modules.input_handlers.input_handler import InputHandler
+from .input_handler import InputHandler
class StdinInput(InputHandler):
diff --git a/modules/intents/sway.py b/modules/intents/sway.py
index 9955b4c..b5bd9fe 100644
--- a/modules/intents/sway.py
+++ b/modules/intents/sway.py
@@ -3,7 +3,7 @@ from typing import Dict
from ..config import Config
def HesNavigate(data: Dict, config: Config) -> None:
- os.popen(f"swaymsg workspace {data["workspace"]}")
+ os.popen(f"swaymsg workspace {data['workspace']}")
def HesLock(data: Dict, config: Config) -> None:
os.popen(config.lock) \ No newline at end of file
diff --git a/modules/responses/libnotify.py b/modules/responses/libnotify.py
new file mode 100644
index 0000000..0bc774f
--- /dev/null
+++ b/modules/responses/libnotify.py
@@ -0,0 +1,15 @@
+import os
+
+from .response_handler import ResponseHandler
+from ..config import Config
+
+
+class LibNotify(ResponseHandler):
+ def __init__(self, config: Config):
+ self.config = config
+ self.hestia_images = {}
+ for path in os.listdir(self.config.hestia_images):
+ self.hestia_images[os.path.splitext(os.path.basename(path))[0]] = os.path.join(self.config.hestia_images, path)
+
+ def respond(self, text: str) -> None:
+ os.popen(f'notify-send "Hestia " "{text}" -i "{self.hestia_images["hestia"]}" --app-name=hestia') \ No newline at end of file
diff --git a/modules/responses/response_handler.py b/modules/responses/response_handler.py
new file mode 100644
index 0000000..9cc0cf0
--- /dev/null
+++ b/modules/responses/response_handler.py
@@ -0,0 +1,6 @@
+from abc import ABC, abstractmethod
+
+class ResponseHandler(ABC):
+ @abstractmethod
+ def respond(self, response: str):
+ pass \ No newline at end of file
diff --git a/modules/responses/response_manager.py b/modules/responses/response_manager.py
new file mode 100644
index 0000000..34c0a41
--- /dev/null
+++ b/modules/responses/response_manager.py
@@ -0,0 +1,32 @@
+import yaml
+
+from pathlib import Path
+
+from ..config import Config
+from ..responses.responses import Responses
+from ..hassil.util import merge_dict
+from .response_handler import ResponseHandler
+from .libnotify import LibNotify
+
+class ResponseManager:
+ def __init__(self, config: Config):
+ response_dict = {"responses": {}}
+
+ response_yaml_path = Path(config.responses_dir)
+ response_yaml_file_paths = response_yaml_path.glob("*.yaml")
+ for yaml_file_path in response_yaml_file_paths:
+ with open(yaml_file_path, "r", encoding="utf-8") as yaml_file:
+ merge_dict(response_dict, yaml.safe_load(yaml_file))
+
+ self.responses = Responses.from_dict(response_dict)
+ self.respond_handlers: list[ResponseHandler] = [LibNotify(config)]
+
+ def respond(self, response: str, intent_name: str):
+ response_key = intent_name if response == "default" else response
+ if response_key not in self.responses.responses:
+ print(f"No response found for: {response_key}")
+ return
+
+ response_text = self.responses.responses[response_key].sentence_texts[0]
+ for handler in self.respond_handlers:
+ handler.respond(response_text)
diff --git a/modules/responses/responses.py b/modules/responses/responses.py
index 1836deb..f89a1fe 100644
--- a/modules/responses/responses.py
+++ b/modules/responses/responses.py
@@ -2,13 +2,9 @@ from dataclasses import dataclass, field
from typing import List, Dict, Any
@dataclass(frozen=True)
-class ResponseData:
- sentence_texts: List[str]
-
-@dataclass(frozen=True)
class Response:
name: str
- data: List[ResponseData] = field(default_factory=list)
+ sentence_texts: List[str]
@dataclass(frozen=True)
class Responses:
@@ -25,13 +21,9 @@ class Responses:
responses={
response_name: Response(
name=response_name,
- data=[
- ResponseData(
- sentence_texts=data_dict["sentences"],
- )
- for data_dict in response_dict["data"]
- ],
+ sentence_texts=response_dict["sentences"]
)
for response_name, response_dict in input_dict["responses"].items()
},
- ) \ No newline at end of file
+ )
+