def update_plugin_help(db_conn, plugin_name, plugin_help_text, ignore_file_save=False) -> bool: update_help_query = f""" UPDATE plugins_help SET help_text = ? WHERE plugin_id = (SELECT plugins.plugin_id from plugins WHERE plugins.name = ? ); """ try: db_conn.cursor().execute(update_help_query, (plugin_help_text, plugin_name)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint( f"Updated plugin help text in the database: {plugin_name}", origin=L_DATABASE) log(INFO, f"Updated plugin help text in the database: {plugin_name}", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def import_aliases() -> bool: from JJMumbleBot.lib.utils.dir_utils import get_main_dir from JJMumbleBot.lib.resources.strings import T_TEMP_ALIASES from csv import DictReader, Error try: with open(f"{get_main_dir()}/cfg/downloads/{T_TEMP_ALIASES}.csv", mode='r') as csv_file: csvr = DictReader(csv_file) for i, row in enumerate(csvr): UpdateDB.update_alias(get_memory_db(), alias_name=row['alias'].strip(), commands=row['command'].strip(), ignore_file_save=True) save_memory_db_to_file() log(INFO, f"Updated aliases from the imported aliases file!", origin=L_DATABASE, print_mode=PrintMode.REG_PRINT.value) return True except FileNotFoundError: log(ERROR, f"Could not import aliases because the downloaded file is not found!", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False except Error: log(ERROR, f"Encountered a problem reading the imported aliases file! " f"Please make sure the file is correctly formatted with headers: alias, command", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False except KeyError: log(ERROR, f"Encountered a problem reading the imported aliases file! " f"Please make sure the file is correctly formatted with headers: alias, command", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def update_user_privileges(db_conn, user_name, level, ignore_file_save=False) -> bool: update_privileges_query = f""" UPDATE permissions SET level = ? WHERE user_id = (SELECT users.user_id FROM users WHERE users.name = ? LIMIT 1) AND ? = (SELECT permission_levels.level_id FROM permission_levels WHERE permission_levels.level_id = ?); """ try: db_conn.cursor().execute(update_privileges_query, (level, user_name, level, level)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint( f"Updated user permission in the database: {user_name}-{level}", origin=L_DATABASE) log(INFO, f"Updated user permission in the database: {user_name}-{level}", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def update_alias(db_conn, alias_name, commands, ignore_file_save=False) -> bool: update_alias_query = f""" UPDATE aliases SET alias = ? WHERE name = ?; """ try: db_conn.cursor().execute(update_alias_query, (commands, alias_name)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint(f"Updated alias in the database: {alias_name}", origin=L_DATABASE) log(INFO, f"Updated alias in the database: {alias_name}", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def insert_new_alias(db_conn, alias_name, commands, ignore_file_save=False) -> bool: table_query = f""" INSERT INTO aliases(name, alias) VALUES ( ?, ? ); """ try: db_conn.cursor().execute(table_query, (alias_name, commands)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint(f"Inserted new alias into the database: {alias_name}", origin=L_DATABASE) log(INFO, f"Inserted new alias into the database: {alias_name}", origin=L_DATABASE) return True return False except Error as err: if 'UNIQUE' not in str(err): dprint(err) return False
def update_metadata(db_conn, version, checksum, ignore_file_save=False) -> bool: update_metadata_query = f""" UPDATE metadata SET version = ?, checksum = ? WHERE id = 1; """ try: db_conn.cursor().execute(update_metadata_query, (version, checksum)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: log(INFO, f"Updated metadata in the database: {version}-{checksum}", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True return False except Error as err: log(ERROR, str(err), origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def insert_new_permission(db_conn, username: str, permission_level: int, ignore_file_save=False) -> bool: table_query = f""" INSERT INTO permissions(user_id, level) VALUES ( (SELECT users.user_id FROM users WHERE users.name = ? LIMIT 1), (SELECT permission_levels.level_id FROM permission_levels WHERE permission_levels.level_id = ? LIMIT 1) ); """ try: db_conn.cursor().execute(table_query, (username, permission_level)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint( f"Inserted new permission into the database: {username}-{permission_level}", origin=L_DATABASE) log(INFO, f"Inserted new permission into the database: {username}-{permission_level}", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def insert_new_permission_level(db_conn, level_id: int, level_type: str, ignore_file_save=False) -> bool: table_query = f""" INSERT INTO permission_levels(level_id, level_type) VALUES ( ?, ? ); """ try: db_conn.cursor().execute(table_query, (level_id, level_type)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint( f"Inserted new permission level into the database: {level_id}-{level_type}", origin=L_DATABASE) log(INFO, f"Inserted new permission level into the database: {level_id}-{level_type}", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def insert_new_user(db_conn, username: str, ignore_file_save=False) -> bool: table_query = f""" INSERT INTO users (name) VALUES (?); """ try: db_conn.cursor().execute(table_query, (username, )) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: log(INFO, f"Inserted new user into the database: {username}", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True return False except Error as err: log(ERROR, str(err), origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def insert_metadata(db_conn, version, checksum, ignore_file_save=False) -> bool: table_query = f""" INSERT INTO metadata(version, checksum) VALUES ( ?, ? ); """ try: db_conn.cursor().execute(table_query, (version, checksum)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: log(INFO, f"Inserted new metadata into the database: {version}-{checksum}", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True return False except Error as err: if 'UNIQUE' not in str(err): log(ERROR, str(err), origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def update_command_privileges(db_conn, command_name, permission_level, ignore_file_save=False) -> bool: update_cmd_query = f""" UPDATE commands SET level = ? WHERE name = ?; """ try: db_conn.cursor().execute(update_cmd_query, (permission_level, command_name)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: log(INFO, f"Updated command permission in the database: {command_name}", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True return False except Error as err: log(ERROR, str(err), origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def insert_new_plugins_help(db_conn, plugin_name, help_text, ignore_file_save=False) -> bool: table_query = f""" INSERT INTO plugins_help(plugin_id, help_text) VALUES ( (SELECT plugins.plugin_id FROM plugins WHERE plugins.name = ? LIMIT 1), ? ); """ try: db_conn.cursor().execute(table_query, (plugin_name, help_text)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint( f"Inserted new plugin help data into the database: {plugin_name}", origin=L_DATABASE) log(INFO, f"Inserted new plugin help data into the database: {plugin_name}", origin=L_DATABASE) return True return False except Error as err: if 'UNIQUE' not in str(err): dprint(err) return False
def insert_new_command(db_conn, plugin_name, command_name, permission_level, ignore_file_save=False) -> bool: table_query = f""" INSERT INTO commands(plugin_id, name, level) VALUES ( (SELECT plugins.plugin_id FROM plugins WHERE plugins.name = ? LIMIT 1), ?, ? ); """ try: db_conn.cursor().execute( table_query, (plugin_name, command_name, permission_level)) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint( f"Inserted new command into the database: {plugin_name}-{command_name}-{permission_level}", origin=L_DATABASE) log(INFO, f"Inserted new command into the database: {plugin_name}-{command_name}-{permission_level}", origin=L_DATABASE) return True return False except Error as err: if 'UNIQUE' not in str(err): dprint(err) return False
def initialize_plugins(): import sys import os # Import global aliases into the database. UtilityDB.import_aliases_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/cfg/global_aliases.csv') global_settings.bot_plugins = {} # Load Core Plugins rprint("######### Initializing Core Plugins #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/core') all_imports = [name for name in os.listdir(f'{dir_utils.get_main_dir()}/plugins/core') if os.path.isdir(os.path.join(f'{dir_utils.get_main_dir()}/plugins/core', name)) and name != "__pycache__"] for p_file in all_imports: if not os.path.exists(os.path.join(f'{dir_utils.get_main_dir()}/plugins/core', p_file)): rprint(f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") log(WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") continue # Import the core plugin. global_settings.bot_plugins[p_file] = __import__(f'{p_file}.{p_file}', fromlist=['*']).Plugin() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/privileges.csv') # Import plugin aliases into the database. UtilityDB.import_aliases_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/aliases.csv') # Import plugin help into the database. UtilityDB.import_help_to_db(db_conn=get_memory_db(), html_path=f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/help.html') sys.path.pop(0) rprint("######### Core Plugins Initialized #########") # Load Extension Plugins rprint("######### Initializing Extension Plugins #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/extensions') all_imports = [name for name in os.listdir(f'{dir_utils.get_main_dir()}/plugins/extensions') if os.path.isdir( os.path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', name)) and name != "__pycache__"] for p_file in all_imports: if not os.path.exists(os.path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', p_file)): rprint(f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") log(WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") continue # Import the core plugin. global_settings.bot_plugins[p_file] = __import__(f'{p_file}.{p_file}', fromlist=['*']).Plugin() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/privileges.csv') # Import plugin aliases into the database. UtilityDB.import_aliases_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/aliases.csv') # Import plugin help into the database. UtilityDB.import_help_to_db(db_conn=get_memory_db(), html_path=f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/help.html') save_memory_db_to_file() sys.path.pop(0) rprint("######### Extension Plugins Initialized #########")
def delete_user(db_conn, user_id: int = None, user_name: str = None, ignore_file_save=False) -> bool: if user_id is None and user_name is None: return False delete_permission_query = "" delete_user_query = "" if user_id: delete_permission_query = f""" DELETE FROM permissions WHERE permissions.user_id = ? """ delete_user_query = f""" DELETE FROM users WHERE users.user_id = ? """ elif user_name: delete_permission_query = f""" DELETE FROM permissions WHERE permissions.user_id = (SELECT users.user_id FROM users WHERE users.name = ? LIMIT 1); """ delete_user_query = f""" DELETE FROM users WHERE users.name = ?; """ try: db_conn.cursor().execute( delete_permission_query, (user_id if user_id is not None else user_name, )) db_conn.cursor().execute( delete_user_query, (user_id if user_id is not None else user_name, )) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount > 0: log(INFO, f"Deleted alias in the database: {user_id if user_id is not None else user_name}", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True return False except Error as err: log(ERROR, str(err), origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def delete_alias(db_conn, alias_id: int = None, alias_name: str = None, ignore_file_save=False) -> bool: if alias_id is None and alias_name is None: return False delete_alias_query = "" if alias_id: delete_alias_query = f""" DELETE FROM aliases WHERE aliases.alias_id = ? """ elif alias_name: delete_alias_query = f""" DELETE FROM aliases WHERE aliases.name = ?; """ try: db_conn.cursor().execute( delete_alias_query, (alias_id if alias_id is not None else alias_name, )) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if alias_id is not None: if GetDB.get_alias(db_cursor=db_conn.cursor(), alias_id=alias_id) is None: log(INFO, f"Deleted alias in the database: {alias_id}", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True else: if GetDB.get_alias(db_cursor=db_conn.cursor(), alias_name=alias_name) is None: log(INFO, f"Deleted alias in the database: {alias_name}", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True return False except Error as err: log(ERROR, str(err), origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def delete_all_commands(db_conn, ignore_file_save=False): delete_commands_query = f""" DELETE FROM commands; """ try: db_conn.cursor().execute(delete_commands_query) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint(f"Deleted all commands in the database", origin=L_DATABASE) log(INFO, f"Deleted all commands in the database", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def delete_all_aliases(db_conn, ignore_file_save=False): # Output Format: [(name, alias), (name, alias), ...] delete_aliases_query = f""" DELETE FROM aliases; """ try: db_conn.cursor().execute(delete_aliases_query) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: dprint(f"Deleted all alias in the database", origin=L_DATABASE) log(INFO, f"Deleted all alias in the database", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def delete_all_commands(db_conn, ignore_file_save=False): delete_commands_query = f""" DELETE FROM commands; """ try: db_conn.cursor().execute(delete_commands_query) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount == -1: log(INFO, f"Deleted all commands in the database", origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return True return False except Error as err: log(ERROR, str(err), origin=L_DATABASE, print_mode=PrintMode.VERBOSE_PRINT.value) return False
def delete_alias(db_conn, alias_id: int = None, alias_name: str = None, ignore_file_save=False) -> bool: if alias_id is None and alias_name is None: return False delete_alias_query = "" if alias_id: delete_alias_query = f""" DELETE FROM aliases WHERE aliases.alias_id = ? """ elif alias_name: delete_alias_query = f""" DELETE FROM aliases WHERE aliases.name = ?; """ try: db_conn.cursor().execute( delete_alias_query, (alias_id if alias_id is not None else alias_name, )) save_memory_db(db_conn) if not ignore_file_save: save_memory_db_to_file() if db_conn.cursor().rowcount > 0: dprint( f"Deleted alias in the database: {alias_id if alias_id is not None else alias_name}", origin=L_DATABASE) log(INFO, f"Deleted alias in the database: {alias_id if alias_id is not None else alias_name}", origin=L_DATABASE) return True return False except Error as err: dprint(err) return False
def initialize_plugins_safe(): import sys import os import json from JJMumbleBot.lib.resources.strings import C_PLUGIN_SETTINGS, P_PLUG_SAFE if not global_settings.cfg: from JJMumbleBot.lib.errors import ExitCodes, ConfigError from JJMumbleBot.lib.utils import runtime_utils runtime_utils.exit_bot_error(ExitCodes.CONFIG_ERROR) raise ConfigError('There was an error loading the global config for initializing safe mode plugins.') # Import global aliases into the database. UtilityDB.import_aliases_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/cfg/global_aliases.csv') global_settings.bot_plugins = {} safe_mode_plugins = json.loads(global_settings.cfg.get(C_PLUGIN_SETTINGS, P_PLUG_SAFE)) # Load Core Plugins rprint("######### Initializing Core Plugins - Safe Mode #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/core') all_imports = [name for name in os.listdir(f'{dir_utils.get_main_dir()}/plugins/core') if os.path.isdir( os.path.join(f'{dir_utils.get_main_dir()}/plugins/core', name)) and name != "__pycache__"] for p_file in all_imports: if p_file in safe_mode_plugins: if not os.path.exists(os.path.join(f'{dir_utils.get_main_dir()}/plugins/core', p_file)): rprint(f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") log(WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") continue # Import the core plugin. global_settings.bot_plugins[p_file] = __import__(f'{p_file}.{p_file}', fromlist=['*']).Plugin() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/privileges.csv') # Import plugin aliases into the database. UtilityDB.import_aliases_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/aliases.csv') # Import plugin help into the database. UtilityDB.import_help_to_db(db_conn=get_memory_db(), html_path=f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/help.html') # help_plugin = __import__('help.help') # self.bot_plugins['help'] = help_plugin.help.Plugin(self.bot_plugins) sys.path.pop(0) rprint("######### Core Plugins Initialized - Safe Mode #########") # Load Extension Plugins rprint("######### Initializing Extension Plugins - Safe Mode #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/extensions') all_imports = [name for name in os.listdir(f'{dir_utils.get_main_dir()}/plugins/extensions') if os.path.isdir( os.path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', name)) and name != "__pycache__"] for p_file in all_imports: if p_file in safe_mode_plugins: if not os.path.exists(os.path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', p_file)): rprint(f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") log(WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...") continue # Import the core plugin. global_settings.bot_plugins[p_file] = __import__(f'{p_file}.{p_file}', fromlist=['*']).Plugin() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/privileges.csv') # Import plugin aliases into the database. UtilityDB.import_aliases_to_db(db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/aliases.csv') # Import plugin help into the database. UtilityDB.import_help_to_db(db_conn=get_memory_db(), html_path=f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/help.html') save_memory_db_to_file() sys.path.pop(0) rprint("######### Extension Plugins Initialized - Safe Mode #########")
def initialize_plugins(): import sys from os import path, listdir from json import loads # Clear plugins, plugins_help, and commands tables on launch. DeleteDB.delete_all_commands(db_conn=get_memory_db()) DeleteDB.delete_all_plugins_help(db_conn=get_memory_db()) DeleteDB.delete_all_plugins(db_conn=get_memory_db()) # Import global aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/cfg/global_aliases.csv') global_settings.bot_plugins = {} # Load Core Plugins rprint("######### Initializing Core Plugins #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/core') all_imports = [ name for name in listdir(f'{dir_utils.get_main_dir()}/plugins/core') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/core', name)) and name != "__pycache__" ] for p_file in all_imports: if not path.exists( f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/metadata.ini' ): rprint( f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) log( WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) continue # Import the core plugin class. global_settings.bot_plugins[p_file] = __import__( f'{p_file}.{p_file}', fromlist=['*']).Plugin # Register plugin command callbacks. plugin_metadata = PluginUtilityService.process_metadata( f'plugins/core/{p_file}') plugin_cmds = loads( plugin_metadata.get(C_PLUGIN_INFO, P_PLUGIN_CMDS)) for plugin_command in plugin_cmds: global_settings.cmd_callbacks.register_command( f'{plugin_command}', p_file, f'{plugin_command}_clbk') global_settings.mtd_callbacks.register_callback( f'{plugin_command}_clbk', getattr(global_settings.bot_plugins[p_file], f'cmd_{plugin_command}', None)) dprint( f"Registered plugin command: " f"{plugin_command}:{global_settings.cmd_callbacks.get_command(plugin_command)[1]}:cmd_{plugin_command}" ) # Initialize the core plugin class instance. global_settings.bot_plugins[p_file] = global_settings.bot_plugins[ p_file]() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/privileges.csv' ) # Import plugin aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/aliases.csv' ) # Import plugin help into the database. UtilityDB.import_help_to_db( db_conn=get_memory_db(), html_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/help.html') sys.path.pop(0) rprint("######### Core Plugins Initialized #########") # Load Extension Plugins rprint("######### Initializing Extension Plugins #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/extensions') all_imports = [ name for name in listdir( f'{dir_utils.get_main_dir()}/plugins/extensions') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', name)) and name != "__pycache__" ] for p_file in all_imports: if not path.exists( f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/metadata.ini' ): rprint( f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) log( WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) continue # Import the core plugin class. global_settings.bot_plugins[p_file] = __import__( f'{p_file}.{p_file}', fromlist=['*']).Plugin # Register plugin command callbacks. plugin_metadata = PluginUtilityService.process_metadata( f'plugins/extensions/{p_file}') plugin_cmds = loads( plugin_metadata.get(C_PLUGIN_INFO, P_PLUGIN_CMDS)) for plugin_command in plugin_cmds: global_settings.cmd_callbacks.register_command( f'{plugin_command}', p_file, f'{plugin_command}_clbk') global_settings.mtd_callbacks.register_callback( f'{plugin_command}_clbk', getattr(global_settings.bot_plugins[p_file], f'cmd_{plugin_command}', None)) dprint( f"Registered plugin command: " f"{plugin_command}:{global_settings.cmd_callbacks.get_command(plugin_command)[1]}:cmd_{plugin_command}" ) # Initialize the core plugin class instance. global_settings.bot_plugins[p_file] = global_settings.bot_plugins[ p_file]() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/privileges.csv' ) # Import plugin aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/aliases.csv' ) # Import plugin help into the database. UtilityDB.import_help_to_db( db_conn=get_memory_db(), html_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/help.html' ) save_memory_db_to_file() sys.path.pop(0) rprint("######### Extension Plugins Initialized #########")
def initialize_plugins_safe(): import sys from os import path, listdir from json import loads from JJMumbleBot.lib.resources.strings import C_PLUGIN_SETTINGS, P_PLUG_SAFE from hashlib import md5 if not global_settings.cfg: from JJMumbleBot.lib.errors import ExitCodes, ConfigError from JJMumbleBot.lib.utils import runtime_utils runtime_utils.exit_bot_error(ExitCodes.CONFIG_ERROR) raise ConfigError( 'There was an error loading the global config for initializing safe mode plugins.' ) # Check database metadata for changes. # If the version is different, or plugin checksum is modified, # clear plugins, plugins_help, and commands tables on launch. if global_settings.cfg.getboolean(C_MAIN_SETTINGS, P_DB_INTEGRITY, fallback=True): log(INFO, "######### Checking Database Integrity", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) all_core_plugins = [ name for name in listdir(f'{dir_utils.get_main_dir()}/plugins/core') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/core', name)) and name != "__pycache__" ] all_ext_plugins = [ name for name in listdir( f'{dir_utils.get_main_dir()}/plugins/extensions') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', name)) and name != "__pycache__" ] filenames = [] for core_plugin in all_core_plugins: glob_files = glob.glob( f'{dir_utils.get_main_dir()}/plugins/core/{core_plugin}/**/*', recursive=True) glob_files = [ f for f in glob_files if path.isfile(f) and "__pycache__" not in f ] filenames.extend(glob_files) for ext_plugin in all_ext_plugins: glob_files = glob.glob( f'{dir_utils.get_main_dir()}/plugins/extensions/{ext_plugin}/**/*', recursive=True) glob_files = [ f for f in glob_files if path.isfile(f) and "__pycache__" not in f ] filenames.extend(glob_files) hash_func = md5() # nosec for fn in filenames: if path.isfile(fn): hash_func.update(open(fn, "rb").read()) plugins_checksum = hash_func.hexdigest() integrity_check = UtilityDB.check_database_metadata( db_conn=get_memory_db(), version=META_VERSION, plugins_checksum=plugins_checksum) if integrity_check is False: log(WARNING, "Database integrity mismatch identified! Creating database backup and rebuilding database...", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) db_backup = BotServiceHelper.backup_database() if db_backup: log(INFO, f"Created internal database backup @ {db_backup}", origin=L_DATABASE, print_mode=PrintMode.REG_PRINT.value) DeleteDB.delete_all_commands(db_conn=get_memory_db()) DeleteDB.delete_all_plugins_help(db_conn=get_memory_db()) DeleteDB.delete_all_plugins(db_conn=get_memory_db()) log(INFO, "######### Database Integrity Verified", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) # Import custom aliases into the database. log(INFO, "######### Importing Custom Aliases", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/cfg/custom_aliases.csv', update_if_exists=False) log(INFO, "######### Imported Custom Aliases", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) # Import custom command permissions into the database. log(INFO, "######### Importing Custom Command Permissions", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) UtilityDB.import_privileges_to_db( db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/cfg/custom_permissions.csv', update_if_exists=False) log(INFO, "######### Imported Custom Command Permissions", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) # Import custom user privileges into the database. log(INFO, "######### Importing Custom User Privileges", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) UtilityDB.import_user_privileges_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/cfg/custom_user_privileges.csv', update_if_exists=False) log(INFO, "######### Imported Custom User Privileges", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) global_settings.bot_plugins = {} safe_mode_plugins = loads( global_settings.cfg.get(C_PLUGIN_SETTINGS, P_PLUG_SAFE)) # Load Core Plugins log(INFO, "######### Initializing Core Plugins - Safe Mode", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/core') all_imports = [ name for name in listdir(f'{dir_utils.get_main_dir()}/plugins/core') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/core', name)) and name != "__pycache__" ] for p_file in all_imports: if p_file in safe_mode_plugins: if not path.exists( f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/metadata.ini' ): log(WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) continue # Import the core plugin class. global_settings.bot_plugins[p_file] = __import__( f'{p_file}.{p_file}', fromlist=['*']).Plugin # Register plugin command callbacks. plugin_metadata = PluginUtilityService.process_metadata( f'plugins/core/{p_file}') plugin_cmds = loads( plugin_metadata.get(C_PLUGIN_INFO, P_PLUGIN_CMDS)) for plugin_command in plugin_cmds: global_settings.cmd_callbacks.register_command( f'{plugin_command}', p_file, f'{plugin_command}_clbk') global_settings.mtd_callbacks.register_callback( f'{plugin_command}_clbk', getattr(global_settings.bot_plugins[p_file], f'cmd_{plugin_command}', None)) log(INFO, f"Registered plugin command: {plugin_command}:{global_settings.cmd_callbacks.get_command(plugin_command)[1]}:cmd_{plugin_command}", origin=L_STARTUP, print_mode=PrintMode.VERBOSE_PRINT.value) # Initialize the core plugin class instance. global_settings.bot_plugins[ p_file] = global_settings.bot_plugins[p_file]() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/privileges.csv' ) # Import plugin aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/aliases.csv' ) # Import plugin help into the database. UtilityDB.import_help_to_db( db_conn=get_memory_db(), html_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/help.html' ) # Create directory for user modifiable plugin-specific data and configs. dir_utils.make_directory( f'{dir_utils.get_plugin_data_dir()}/{p_file}') sys.path.pop(0) log(INFO, "######### Core Plugins Initialized - Safe Mode", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) # Load Extension Plugins log(INFO, "######### Initializing Extension Plugins - Safe Mode", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/extensions') all_imports = [ name for name in listdir( f'{dir_utils.get_main_dir()}/plugins/extensions') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', name)) and name != "__pycache__" ] for p_file in all_imports: if p_file in safe_mode_plugins: if not path.exists( f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/metadata.ini' ): log(WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization...", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value) continue # Import the core plugin class. global_settings.bot_plugins[p_file] = __import__( f'{p_file}.{p_file}', fromlist=['*']).Plugin # Register plugin command callbacks. plugin_metadata = PluginUtilityService.process_metadata( f'plugins/extensions/{p_file}') plugin_cmds = loads( plugin_metadata.get(C_PLUGIN_INFO, P_PLUGIN_CMDS)) for plugin_command in plugin_cmds: global_settings.cmd_callbacks.register_command( f'{plugin_command}', p_file, f'{plugin_command}_clbk') global_settings.mtd_callbacks.register_callback( f'{plugin_command}_clbk', getattr(global_settings.bot_plugins[p_file], f'cmd_{plugin_command}', None)) log(INFO, f"Registered plugin command: {plugin_command}:{global_settings.cmd_callbacks.get_command(plugin_command)[1]}:cmd_{plugin_command}", origin=L_STARTUP, print_mode=PrintMode.VERBOSE_PRINT.value) # Initialize the core plugin class instance. global_settings.bot_plugins[ p_file] = global_settings.bot_plugins[p_file]() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/privileges.csv' ) # Import plugin aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/aliases.csv' ) # Import plugin help into the database. UtilityDB.import_help_to_db( db_conn=get_memory_db(), html_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/help.html' ) # Create directory for user modifiable plugin-specific data and configs. dir_utils.make_directory( f'{dir_utils.get_plugin_data_dir()}/{p_file}') save_memory_db_to_file() sys.path.pop(0) log(INFO, "######### Extension Plugins Initialized - Safe Mode", origin=L_STARTUP, print_mode=PrintMode.REG_PRINT.value)
def initialize_plugins_safe(): import sys from os import path, listdir from json import loads from JJMumbleBot.lib.resources.strings import C_PLUGIN_SETTINGS, P_PLUG_SAFE if not global_settings.cfg: from JJMumbleBot.lib.errors import ExitCodes, ConfigError from JJMumbleBot.lib.utils import runtime_utils runtime_utils.exit_bot_error(ExitCodes.CONFIG_ERROR) raise ConfigError( 'There was an error loading the global config for initializing safe mode plugins.' ) # Import global aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path=f'{dir_utils.get_main_dir()}/cfg/global_aliases.csv') global_settings.bot_plugins = {} safe_mode_plugins = loads( global_settings.cfg.get(C_PLUGIN_SETTINGS, P_PLUG_SAFE)) # Load Core Plugins rprint("######### Initializing Core Plugins - Safe Mode #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/core') all_imports = [ name for name in listdir(f'{dir_utils.get_main_dir()}/plugins/core') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/core', name)) and name != "__pycache__" ] for p_file in all_imports: if p_file in safe_mode_plugins: if not path.exists( f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/metadata.ini' ): rprint( f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) log( WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) continue # Import the core plugin class. global_settings.bot_plugins[p_file] = __import__( f'{p_file}.{p_file}', fromlist=['*']).Plugin # Register plugin command callbacks. plugin_metadata = PluginUtilityService.process_metadata( f'plugins/core/{p_file}') plugin_cmds = loads( plugin_metadata.get(C_PLUGIN_INFO, P_PLUGIN_CMDS)) for plugin_command in plugin_cmds: global_settings.cmd_callbacks.register_command( f'{plugin_command}', p_file, f'{plugin_command}_clbk') global_settings.mtd_callbacks.register_callback( f'{plugin_command}_clbk', getattr(global_settings.bot_plugins[p_file], f'cmd_{plugin_command}', None)) dprint( f"Registered plugin command: " f"{plugin_command}:{global_settings.cmd_callbacks.get_command(plugin_command)[1]}:cmd_{plugin_command}" ) # Initialize the core plugin class instance. global_settings.bot_plugins[ p_file] = global_settings.bot_plugins[p_file]() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/privileges.csv' ) # Import plugin aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/aliases.csv' ) # Import plugin help into the database. UtilityDB.import_help_to_db( db_conn=get_memory_db(), html_path= f'{dir_utils.get_main_dir()}/plugins/core/{p_file}/help.html' ) # help_plugin = __import__('help.help') # self.bot_plugins['help'] = help_plugin.help.Plugin(self.bot_plugins) sys.path.pop(0) rprint("######### Core Plugins Initialized - Safe Mode #########") # Load Extension Plugins rprint( "######### Initializing Extension Plugins - Safe Mode #########") sys.path.insert(0, f'{dir_utils.get_main_dir()}/plugins/extensions') all_imports = [ name for name in listdir( f'{dir_utils.get_main_dir()}/plugins/extensions') if path.isdir( path.join(f'{dir_utils.get_main_dir()}/plugins/extensions', name)) and name != "__pycache__" ] for p_file in all_imports: if p_file in safe_mode_plugins: if not path.exists( path.join( f'{dir_utils.get_main_dir()}/plugins/extensions', p_file)): rprint( f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) log( WARNING, f"{p_file} plugin does not contain a metadata.ini file. Skipping initialization..." ) continue # Import the core plugin class. global_settings.bot_plugins[p_file] = __import__( f'{p_file}.{p_file}', fromlist=['*']).Plugin # Register plugin command callbacks. plugin_metadata = PluginUtilityService.process_metadata( f'plugins/core/{p_file}') plugin_cmds = loads( plugin_metadata.get(C_PLUGIN_INFO, P_PLUGIN_CMDS)) for plugin_command in plugin_cmds: global_settings.cmd_callbacks.register_command( f'{plugin_command}', p_file, f'{plugin_command}_clbk') global_settings.mtd_callbacks.register_callback( f'{plugin_command}_clbk', getattr(global_settings.bot_plugins[p_file], f'cmd_{plugin_command}', None)) dprint( f"Registered plugin command: " f"{plugin_command}:{global_settings.cmd_callbacks.get_command(plugin_command)[1]}:cmd_{plugin_command}" ) # Initialize the core plugin class instance. global_settings.bot_plugins[ p_file] = global_settings.bot_plugins[p_file]() # Import core plugin into the database. InsertDB.insert_new_plugin(db_conn=get_memory_db(), plugin_name=p_file, ignore_file_save=True) # Import core plugin user privileges into the database. UtilityDB.import_privileges_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/privileges.csv' ) # Import plugin aliases into the database. UtilityDB.import_aliases_to_db( db_conn=get_memory_db(), csv_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/aliases.csv' ) # Import plugin help into the database. UtilityDB.import_help_to_db( db_conn=get_memory_db(), html_path= f'{dir_utils.get_main_dir()}/plugins/extensions/{p_file}/help.html' ) save_memory_db_to_file() sys.path.pop(0) rprint("######### Extension Plugins Initialized - Safe Mode #########")