Skip to content
This repository was archived by the owner on Sep 8, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 34 additions & 3 deletions mycroft/skills/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import time
from os.path import join, dirname, splitext, isdir

from functools import wraps

from adapt.intent import Intent

from mycroft.client.enclosure.api import EnclosureAPI
Expand Down Expand Up @@ -106,7 +108,9 @@ def load_skill(skill_descriptor, emitter):
skill.bind(emitter)
skill._dir = dirname(skill_descriptor['info'][1])
skill.load_data_files(dirname(skill_descriptor['info'][1]))
# Set up intent handlers
skill.initialize()
skill._register_decorated()
logger.info("Loaded " + skill_descriptor["name"])
return skill
else:
Expand Down Expand Up @@ -161,6 +165,20 @@ def unload_skills(skills):
s.shutdown()


_intent_list = []


def intent_handler(intent_parser):
""" Decorator for adding a method as an intent handler. """
def real_decorator(func):
@wraps(func)
def handler_method(*args, **kwargs):
return func(*args, **kwargs)
_intent_list.append((intent_parser, func))
return handler_method
return real_decorator


class MycroftSkill(object):
"""
Abstract base class which provides common behaviour and parameters to all
Expand Down Expand Up @@ -238,17 +256,30 @@ def initialize(self):

Usually used to create intents rules and register them.
"""
raise Exception("Initialize not implemented for skill: " + self.name)
logger.debug("No initialize function implemented")

def _register_decorated(self):
"""
Register all intent handlers that has been decorated with an intent.
"""
global _intent_list
for intent_parser, handler in _intent_list:
self.register_intent(intent_parser, handler, need_self=True)
_intent_list = []

def register_intent(self, intent_parser, handler):
def register_intent(self, intent_parser, handler, need_self=False):
name = intent_parser.name
intent_parser.name = self.name + ':' + intent_parser.name
self.emitter.emit(Message("register_intent", intent_parser.__dict__))
self.registered_intents.append((name, intent_parser))

def receive_handler(message):
try:
handler(message)
if need_self:
# When registring from decorator self is required
handler(self, message)
else:
handler(message)
except:
# TODO: Localize
self.speak(
Expand Down