Ejemplo n.º 1
0
class ModuleHandler():
    def __init__(self, bot):
        self.event_handler = EventHandler()
        self.bot = bot
        self.load_modules(True)
    
    def load_modules(self, first_time = False):
        if any(result is False for result in self.fire_event('modulehandler:before_load_modules', (self, self.bot, self.event_handler, first_time))):
            return False
        
        logging.info('Loading module resources')
        module_files = glob.glob(os.path.dirname(__file__) + '/modules/resources/*.py')
        module_names = ['modules.resources.' + os.path.basename(f)[:-3] for f in module_files]
        if not self._load_module_list(module_names, first_time):
            return False
        
        logging.info('Loading modules')
        module_files = glob.glob(os.path.dirname(__file__) + '/modules/*.py')
        module_names = ['modules.' + os.path.basename(f)[:-3] for f in module_files]
        imported_modules = self._load_module_list(module_names, first_time)
        if not imported_modules:
            return False
        
        if any(result is False for result in self.fire_event('modulehandler:before_init_modules', (self, self.bot, self.event_handler, first_time))):
            return False
        
        # we've imported with no problems - break old hooks, and try to add new
        self.event_handler.clear_module_hooks()
        self.event_handler.importing_modules = True
        
        for module in imported_modules:
            try:
                module.init()
            except BaseException as e:
                if first_time:
                    raise
                # if we fail out here, this module will NOT have hooked its events - others may have though, so we don't return so all unbroken modules can init
                error = 'module "%s" unable to init: %s: %s' % (str(module), type(e).__name__, e)
                logging.exception(error)
                print(error)
        
        self.event_handler.importing_modules = False
        
        self.fire_event('modulehandler:after_load_modules', (self, self.bot, self.event_handler, first_time))
        
        return True
    
    def _load_module_list(self, list, first_time):
        loaded_modules = []
        for module in list:
            if module.endswith('__init__'):
                continue
        
            if module in sys.modules:
                module = sys.modules[module]
                importfunc = reload_func
            else:
                importfunc = importlib.import_module
            
            try:
                module = importfunc(module)
                module.bot = self.bot
                module.event_handler = self.event_handler
                loaded_modules.append(module)
            except BaseException as e:
                if first_time:
                    raise
                # if we fail out here, old event hooks remain in place
                error = 'module "%s" unable to import: %s: %s' % (str(module), type(e).__name__, e)
                logging.exception(error)
                print(error)
                return []
        
        return loaded_modules
    
    def fire_event(self, key, parameters):
        return self.event_handler.fire(key, parameters)
    
    def hook_event(self, key, function, priority = 500):
        return self.event_handler.hook(key, function, priority)
    
    def get_event_handlers(self, key):
        return self.event_handler.get_handlers(key)