From f5806b86c56521981f62dfab1046906667e6bac9 Mon Sep 17 00:00:00 2001 From: Jarbas Date: Thu, 28 Sep 2017 16:53:57 +0100 Subject: [PATCH] fallback start, end, failure messages (#1108) ==== Tech Notes ==== Add mycroft.skill.handler.start and mycroft.skill.handler.complete to fallback handler. handler in data field will be called "fallback" upon completion the used handler will be reported in the "fallback_handler" data entry. * fix * pep8 * fallback handler name --- mycroft/skills/core.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/mycroft/skills/core.py b/mycroft/skills/core.py index f10496b1ab..70788994c4 100644 --- a/mycroft/skills/core.py +++ b/mycroft/skills/core.py @@ -37,7 +37,6 @@ from mycroft.util.log import LOG __author__ = 'seanfitz' - MainModule = '__init__' @@ -142,7 +141,8 @@ def load_skill(skill_descriptor, emitter, skill_id, BLACKLISTED_SKILLS=None): skill_descriptor["name"])) except: LOG.error( - "Failed to load skill: " + skill_descriptor["name"], exc_info=True) + "Failed to load skill: " + skill_descriptor["name"], + exc_info=True) return None @@ -162,8 +162,7 @@ def get_handler_name(handler): Returns: handler name as string """ name = '' - if '__self__' in dir(handler) and \ - 'name' in dir(handler.__self__): + if '__self__' in dir(handler) and 'name' in dir(handler.__self__): name += handler.__self__.name + '.' name += handler.__name__ return name @@ -190,12 +189,15 @@ def intent_handler(intent_parser): def intent_file_handler(intent_file): """ Decorator for adding a method as an intent file handler. """ + def real_decorator(func): @wraps(func) def handler_method(*args, **kwargs): return func(*args, **kwargs) + _intent_file_list.append((intent_file, func)) return handler_method + return real_decorator @@ -332,6 +334,7 @@ class MycroftSkill(object): intent handler the function will need the self variable passed as well. """ + def wrapper(message): try: # Indicate that the skill handler is starting @@ -369,6 +372,7 @@ class MycroftSkill(object): # Indicate that the skill handler has completed self.emitter.emit(Message('mycroft.skill.handler.complete', data={'handler': name})) + if handler: self.emitter.on(name, wrapper) self.events.append((name, wrapper)) @@ -672,15 +676,29 @@ class FallbackSkill(MycroftSkill): """Goes through all fallback handlers until one returns True""" def handler(message): + # indicate fallback handling start + ws.emit(Message("mycroft.skill.handler.start", + data={'handler': "fallback"})) for _, handler in sorted(cls.fallback_handlers.items(), key=operator.itemgetter(0)): try: if handler(message): + # indicate completion + ws.emit(Message( + 'mycroft.skill.handler.complete', + data={'handler': "fallback", + "fallback_handler": get_handler_name( + handler)})) return except Exception as e: LOG.info('Exception in fallback: ' + str(e)) ws.emit(Message('complete_intent_failure')) LOG.warning('No fallback could handle intent.') + # indicate completion with exception + ws.emit(Message('mycroft.skill.handler.complete', + data={'handler': "fallback", + 'exception': + "No fallback could handle intent."})) return handler