obscreen/src/Application.py
2024-07-15 23:43:18 +02:00

62 lines
2.2 KiB
Python

import sys
import logging
import signal
import threading
from src.service.ModelStore import ModelStore
from src.service.PluginStore import PluginStore
from src.service.TemplateRenderer import TemplateRenderer
from src.service.WebServer import WebServer
from src.model.enum.HookType import HookType
class Application:
def __init__(self, project_dir: str):
self._project_dir = project_dir
self._stop_event = threading.Event()
self._model_store = ModelStore(self.get_plugins)
self._template_renderer = TemplateRenderer(kernel=self, model_store=self._model_store, render_hook=self.render_hook)
self._web_server = WebServer(kernel=self, model_store=self._model_store, template_renderer=self._template_renderer)
logging.info("[{}] Starting application v{}...".format(self.get_name(), self.get_version()))
self._plugin_store = PluginStore(kernel=self, model_store=self._model_store, template_renderer=self._template_renderer, web_server=self._web_server)
signal.signal(signal.SIGINT, self.signal_handler)
def start(self) -> None:
variable = self._model_store.variable().get_one_by_name('start_counter')
if variable:
self._model_store.variable().update_by_name(variable.name, variable.as_int() + 1)
self._web_server.run()
def signal_handler(self, signal, frame) -> None:
logging.info("[{}] Shutting down...".format(self.get_name()))
self._model_store.database().close()
self._stop_event.set()
sys.exit(0)
def get_project_dir(self) -> str:
return self._project_dir
def render_hook(self, hook: HookType) -> str:
return self._template_renderer.render_hooks(self._plugin_store.map_hooks()[hook])
def get_plugins(self):
return self._plugin_store.map_plugins()
@staticmethod
def get_name() -> str:
return 'obscreen-studio'
@staticmethod
def get_version() -> str:
with open("version.txt", 'r') as file:
return file.read().strip()
def reload_lang(self, lang: str) -> None:
self._model_store.lang().set_lang(lang)
self._model_store.variable().reload()
self._plugin_store.reload_lang()