From 3f007cc83fb2eb8db69db8e66070fcdfbe44060e Mon Sep 17 00:00:00 2001 From: Dennis Date: Sun, 13 Jan 2019 12:50:15 +0100 Subject: [PATCH] Installation of requirements.txt before loading module --- matrix_bot_api/matrix_bot_api.py | 93 +++++++++++++++-------- plugins/admidio_events/messages/new_event | 11 --- 2 files changed, 61 insertions(+), 43 deletions(-) delete mode 100644 plugins/admidio_events/messages/new_event diff --git a/matrix_bot_api/matrix_bot_api.py b/matrix_bot_api/matrix_bot_api.py index 8268878..a895b0a 100644 --- a/matrix_bot_api/matrix_bot_api.py +++ b/matrix_bot_api/matrix_bot_api.py @@ -20,7 +20,7 @@ DATA_LOCATION = os.path.join(os.path.dirname(__file__), '../data/bot.db') private_message = "Hey {}! Ik heb je even een privébericht gestuurd 🙂" def eprint(*args, **kwargs): - '''Print error messages to stderr''' + """Print error messages to stderr""" print(*args, file=sys.stderr, **kwargs) class MatrixBotAPI: @@ -85,6 +85,10 @@ class MatrixBotAPI: self.add_handler(self.help_handler) def add_plugins(self): + """Acquire list of plugins from configuration, load them, + initialize them, and add them to a list of object + """ + # Store empty list of plugins self.plugin_objects = [] @@ -93,72 +97,91 @@ class MatrixBotAPI: modules = [] #try: - for plugin in self.config['plugins']: + # Loop through the available plugins, install their requirements, + # load them as module, run their setup, append them to a list, + # and add their handler variables + for i, plugin in enumerate(self.config['plugins']): + # Install requirements + self.install_requirements(plugin) + + # Dynamically load the module modules.append( importlib.import_module( "plugins.{0}.{0}".format(plugin), package = None)) + + # Run the module's setup function and save that it got installed + self.setup_plugin(modules[i]) + + # Create new instance of plugin and append to plugin_objects array + self.plugin_objects.append(modules[i].Plugin(self)) + + # Add handler of newly created instance to bot + self.add_handler(self.plugin_objects[i].handler) #except: # eprint("Importing one or more of the plugins did not go well!") # sys.exit() - # Loop through the available modules and add their handler variables - for i, module in enumerate(modules): - # Check if module is already installed - self.setup_plugin(module) - - # Create new instance of plugin and append to plugin_objects array - self.plugin_objects.append(module.Plugin(self)) - - # Add handler of newly created instance to bot - self.add_handler(self.plugin_objects[i].handler) - - def setup_plugin(self, module): - """Check in an SQLite database if the plugin is already installed. - If this is not the case, install all required packages and run the - plugin's setup method. + def check_installation_plugin(self, module_name): + """Function returns 0 if a plugin with that name is not + currently installed """ - module_name = module.__name__.split('.')[-1] - - # Open SQLite database - sqlite_db = sqlite3.connect(DATA_LOCATION) - - sqlite_cursor = sqlite_db.cursor() # Define query to SELECT event from SQLite DB select_sql = f"""SELECT module_name FROM plugins WHERE module_name = "{module_name}" """ + # Open SQLite database and run query sqlite_db = sqlite3.connect(DATA_LOCATION) sqlite_cursor = sqlite_db.cursor() sqlite_cursor.execute(select_sql) - if sqlite_cursor.fetchall(): + number_fetched = sqlite_cursor.fetchall() + + sqlite_db.close() + + return number_fetched + + def install_requirements(self, module_name): + """Install requirements for a given plugin.""" + if self.check_installation_plugin(module_name): # Do nothing, this was already installed print(f"Check: {module_name} already installed.") else: - # This appears to be new, insert it, process requirements.txt - # and run the plugin's setup file. - print(f"Running installation of {module_name}.") - # Install requirements pipmain( ['install', '-r', f'plugins/{module_name}/requirements.txt']) + + def setup_plugin(self, module): + """Run the setup for a given plugin and subsequently save that + this plugin was installed. + """ + + module_name = module.__name__.split('.')[-1] + + if not self.check_installation_plugin(module_name): + # This appears to be new, insert it, process requirements.txt + # and run the plugin's setup file. + print(f"Running installation of {module_name}.") + # Run module's install method - try: - module.setup() - except: - print(f"{module_name} did not specify setup(). Skipping...") + #try: + module.setup() + #except: + # print(f"{module_name} did not specify setup(). Skipping...") # Save in database that we installed this plugin datetime_added = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + # Open SQLite database insert_sql = f"""INSERT INTO plugins(module_name, datetime_added) VALUES('{module_name}', '{datetime_added}')""" + sqlite_db = sqlite3.connect(DATA_LOCATION) + sqlite_cursor = sqlite_db.cursor() sqlite_cursor.execute(insert_sql) sqlite_db.commit() sqlite_db.close() @@ -209,6 +232,12 @@ class MatrixBotAPI: pass def send_message_private_public(self, room, event, message): + """This method takes a room, event, and message and makes sure + that the message is sent in a private room and not in a public + room. If no private room exists, it will create a private room + with the sender of the event. + """ + orig_room = room found_room = False diff --git a/plugins/admidio_events/messages/new_event b/plugins/admidio_events/messages/new_event deleted file mode 100644 index 10918a0..0000000 --- a/plugins/admidio_events/messages/new_event +++ /dev/null @@ -1,11 +0,0 @@ -@room er is zojuist een nieuw evenement aangemaakt! Op {} om {} zal "{}" plaatsvinden. - -

- -Ben je aangemeld op de leden database in je favoriete browser? Klik dan hier: -