Exemple #1
0
class Bot:
    """
	Creates a new bot instance
	"""

    # Bot name
    name = "Mr. Nobody"

    version = "2.0"

    # List of Skills
    skills = defaultdict(list)

    io_manager = None

    threads = []

    def __init__(self, name):
        self.name = name

        self.regex_name = '^(' + re.escape(name) + "|" + re.escape(
            unidecode(name)) + "),? ?"

        logger.info("%s is initializing. Running version %s" %
                    (name, self.version))

        # Create input manager
        self.io_manager = IOManager(self)

        # 1st. Setup Inputs
        self.io_manager.setup()

        # 2nd. Setup Skills
        self.setup_skills()

        # 3rd. Setup default skill
        self.default_skill = Default(self)

    def start(self):

        # Start input manager worker
        self.io_manager.start()

    def shutdown(self):
        logger.info("Shutting down %s threads " % len(self.threads))

        # Shutdown all the bot instantiated threads
        for t in self.threads:
            t.kill_received = True
            t.join()
            #self.threads.remove(t)
            self.threads = [
                thread for thread in self.threads if thread is not t
            ]
            logger.info("Killed %s " % t)

        # Shutdown the input manager
        self.io_manager.shutdown()

    def run(self):

        self.start()

        # Check if threads are running
        while True:
            try:
                time.sleep(60)
            except KeyboardInterrupt:
                logger.info("Ctrl-c received! Shutting down...")
                self.shutdown()
                return

    def setup_skills(self):
        from ambrosio import config

        # Fetch skills from config
        skills = config['skills']

        logger.info("Initializing Skills")

        for skill in skills:

            level = skill['level'] if 'level' in skill else 0
            name = skill['skill']
            is_custom = skill['custom'] if 'custom' in skill else False

            try:
                if is_custom:
                    module = importlib.import_module('config.skills.' +
                                                     name.lower())
                else:
                    module = importlib.import_module('skills.' + name.lower())

                module_obj = getattr(module, name)

                self.register_skill(module_obj(self), level)
            except ImportError as e:
                logger.error(
                    "Impossible to load skill %s: Module not found (%s)" %
                    (name, e.args[0]))
            except Exception:
                logger.error("Error loading skill. " +
                             str(traceback.format_exc()))

    def register_skill(self, skill, level=0):
        logger.debug("Registering Skill %s in level %s" % (skill.name, level))
        self.skills[level].append(skill)
        return True