diff --git a/jasper/application.py b/jasper/application.py index 2b1dbdf3c..50da83589 100644 --- a/jasper/application.py +++ b/jasper/application.py @@ -118,10 +118,13 @@ def __init__(self, use_local_mic=False): self.plugins = pluginstore.PluginStore(plugin_directories) self.plugins.detect_plugins() + # Initialize Brain + self.brain = brain.Brain(self.config) + # Initialize AudioEngine ae_info = self.plugins.get_plugin(audio_engine_slug, category='audioengine') - self.audio = ae_info.plugin_class(ae_info, self.config) + self.audio = ae_info.plugin_class(self.brain, ae_info, self.config) # Initialize audio input device devices = [device.slug for device in self.audio.get_devices( @@ -167,11 +170,10 @@ def __init__(self, use_local_mic=False): ', '.join(devices)) raise - # Initialize Brain - self.brain = brain.Brain(self.config) + # Initialize speech handler plugins for info in self.plugins.get_plugins_by_category('speechhandler'): try: - plugin = info.plugin_class(info, self.config) + plugin = info.plugin_class(self.brain, info, self.config) except Exception as e: self._logger.warning( "Plugin '%s' skipped! (Reason: %s)", info.name, @@ -193,8 +195,8 @@ def __init__(self, use_local_mic=False): active_stt_plugin_info = self.plugins.get_plugin( active_stt_slug, category='stt') active_stt_plugin = active_stt_plugin_info.plugin_class( - 'default', self.brain.get_plugin_phrases(), active_stt_plugin_info, - self.config) + self.brain, 'default', self.brain.get_plugin_phrases(), + active_stt_plugin_info, self.config) if passive_stt_slug != active_stt_slug: passive_stt_plugin_info = self.plugins.get_plugin( @@ -203,11 +205,13 @@ def __init__(self, use_local_mic=False): passive_stt_plugin_info = active_stt_plugin_info passive_stt_plugin = passive_stt_plugin_info.plugin_class( - 'keyword', self.brain.get_standard_phrases() + [keyword], - passive_stt_plugin_info, self.config) + self.brain, 'keyword', self.brain.get_standard_phrases() + + [keyword], passive_stt_plugin_info, self.config) tts_plugin_info = self.plugins.get_plugin(tts_slug, category='tts') - tts_plugin = tts_plugin_info.plugin_class(tts_plugin_info, self.config) + tts_plugin = tts_plugin_info.plugin_class(self.brain, + tts_plugin_info, + self.config) # Initialize Mic if use_local_mic: diff --git a/jasper/plugin.py b/jasper/plugin.py index 4db7f5bbb..8c3424547 100644 --- a/jasper/plugin.py +++ b/jasper/plugin.py @@ -10,7 +10,8 @@ class GenericPlugin(object): - def __init__(self, info, config): + def __init__(self, brain, info, config): + self._brain = brain self._plugin_config = config self._plugin_info = info @@ -23,6 +24,24 @@ def profile(self): def info(self): return self._plugin_info + @property + def brain(self): + """Returns the plugin's instance of Jasper's brain.""" + return self._brain + + def invoke(self, plugin_name, hook_name, *args, **kwargs): + """Invoke the hook function of a specific plugin.""" + for plugin in self.brain.get_plugins(): + if plugin.__class__.__name__ == plugin_name: + if hasattr(plugin, hook_name): + return getattr(plugin, hook_name)(*args, **kwargs) + + def invoke_all(self, hook_name, *args, **kwargs): + """Invoke the hook function of all available plugins.""" + for plugin in self.brain.get_plugins(): + if hasattr(plugin, hook_name): + getattr(plugin, hook_name)(*args, **kwargs) + class AudioEnginePlugin(GenericPlugin, audioengine.AudioEngine): pass @@ -53,8 +72,9 @@ def get_priority(self): class STTPlugin(GenericPlugin): - def __init__(self, name, phrases, *args, **kwargs): - GenericPlugin.__init__(self, *args, **kwargs) + def __init__(self, brain, name, phrases, *args, **kwargs): + GenericPlugin.__init__(self, brain, *args, **kwargs) + self._brain = brain self._vocabulary_phrases = phrases self._vocabulary_name = name self._vocabulary_compiled = False diff --git a/jasper/testutils.py b/jasper/testutils.py index 2bf022f84..0c98eab8b 100644 --- a/jasper/testutils.py +++ b/jasper/testutils.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import gettext +from . import brain TEST_PROFILE = { 'prefers_email': False, @@ -39,4 +40,5 @@ def get_plugin_instance(plugin_class, *extra_args): } })() args = tuple(extra_args) + (info, TEST_PROFILE) - return plugin_class(*args) + test_brain = brain.Brain(TEST_PROFILE) + return plugin_class(test_brain, *args)