forked from platypush/platypush
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
|
import re
|
||
|
|
||
|
from platypush.message.event import Event
|
||
|
|
||
|
class AssistantEvent(Event):
|
||
|
""" Base class for assistant events """
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super().__init__(*args, **kwargs)
|
||
|
|
||
|
|
||
|
class ConversationStartEvent(AssistantEvent):
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super().__init__(*args, **kwargs)
|
||
|
|
||
|
|
||
|
class ConversationEndEvent(AssistantEvent):
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super().__init__(*args, **kwargs)
|
||
|
|
||
|
|
||
|
class SpeechRecognizedEvent(AssistantEvent):
|
||
|
def __init__(self, phrase, *args, **kwargs):
|
||
|
super().__init__(phrase=phrase, *args, **kwargs)
|
||
|
self.recognized_phrase = phrase.strip().lower()
|
||
|
|
||
|
def matches_condition(self, condition):
|
||
|
if not isinstance(self, condition.type): return [False, {}]
|
||
|
|
||
|
recognized_tokens = re.split('\s+', self.recognized_phrase.strip().lower())
|
||
|
condition_tokens = re.split('\s+', condition.args['phrase'].strip().lower())
|
||
|
parsed_args = {}
|
||
|
|
||
|
while recognized_tokens and condition_tokens:
|
||
|
rec_token = recognized_tokens[0]
|
||
|
cond_token = condition_tokens[0]
|
||
|
|
||
|
if rec_token == cond_token:
|
||
|
recognized_tokens.pop(0)
|
||
|
condition_tokens.pop(0)
|
||
|
elif re.search(cond_token, rec_token):
|
||
|
condition_tokens.pop(0)
|
||
|
else:
|
||
|
m = re.match('^\$([\w\d_])', cond_token)
|
||
|
if m:
|
||
|
parsed_args[cond_token[1:]] = rec_token
|
||
|
recognized_tokens.pop(0)
|
||
|
condition_tokens.pop(0)
|
||
|
else:
|
||
|
recognized_tokens.pop(0)
|
||
|
|
||
|
return [len(condition_tokens) == 0, parsed_args]
|
||
|
|
||
|
|
||
|
# vim:sw=4:ts=4:et:
|
||
|
|