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
Exemple #2
0
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
Exemple #20
0
 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 #########")
Exemple #22
0
    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 #########")
Exemple #23
0
    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)
Exemple #24
0
    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 #########")