OrderAnalyser.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import re
  2. class OrderAnalyser:
  3. def __init__(self, order, main_controller=None):
  4. """
  5. Class used to load
  6. :param order: spelt order
  7. :param main_controller
  8. """
  9. self.main_controller = main_controller
  10. self.order = order
  11. self.brain = main_controller.conf.brainLoader.get_config()
  12. print "Receiver order: %s" % self.order
  13. def start(self):
  14. print self.brain
  15. for el in self.brain:
  16. # print el
  17. # print el["when"]
  18. whens = el["when"]
  19. for when in whens:
  20. brain_order = when["order"]
  21. print "order to test: %s" % brain_order
  22. if self._spelt_order_match_brain_order(brain_order):
  23. print "Order found! Run neurons: %s" % el["neurons"]
  24. neurons = el["neurons"]
  25. for neuron in neurons:
  26. if isinstance(neuron, dict):
  27. for plugin, parameter in neuron.items():
  28. # capitalizes the first letter (because classes have first letter upper case)
  29. plugin = plugin.capitalize()
  30. self._run_plugin(plugin, parameter)
  31. else:
  32. plugin = neuron
  33. # capitalizes the first letter (because classes have first letter upper case)
  34. plugin = plugin.capitalize()
  35. self._run_plugin(plugin)
  36. # once we ran all plugin, we can start back jarvis trigger
  37. if self.main_controller is not None:
  38. self.main_controller.unpause_jarvis_trigger()
  39. def _spelt_order_match_brain_order(self, order_to_test):
  40. """
  41. test if the current order match the order spelt by the user
  42. :param order_to_test:
  43. :return:
  44. """
  45. my_regex = r"\b(?=\w)" + re.escape(order_to_test) + r"\b(?!\w)"
  46. if re.search(my_regex, self.order, re.IGNORECASE):
  47. return True
  48. def _run_plugin(self, plugin, parameter=None):
  49. """
  50. Dynamic loading of a module
  51. :param plugin: Module name to load
  52. :param parameter: Parameter of the module
  53. :return:
  54. """
  55. print "Run plugin %s with parameter %s" % (plugin, parameter)
  56. mod = __import__('neurons', fromlist=[plugin])
  57. klass = getattr(mod, plugin)
  58. # run the plugin
  59. if not parameter:
  60. klass()
  61. else:
  62. klass(parameter)