HEX
Server: Apache/2.4.65 (Debian)
System: Linux localhost 6.9.12 #1 SMP Tue May 5 14:23:20 UTC 2026 x86_64
User: www-data (33)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/bp-better-messages/bp-better-messages.php
<?php

/*
    @wordpress-plugin
    Plugin Name: Better Messages
    Plugin URI: https://www.wordplus.org
    Description: Realtime private messaging system for WordPress
    Version: 2.10.4
    Author: WordPlus
    Author URI: https://www.wordplus.org
    Requires PHP: 7.4
    Requires at least: 5.9.0
    License: GPLv3
    Text Domain: bp-better-messages
    Domain Path: /languages    */
defined( 'ABSPATH' ) || exit;
if ( !class_exists( 'Better_Messages' ) && !function_exists( 'bpbm_fs' ) ) {
    class Better_Messages {
        public $version = '2.10.4';

        public $db_version = '1.0.4';

        public $realtime;

        public $path;

        public $url;

        public $settings;

        /** @var Better_Messages_Options $options */
        public $options;

        /** @var Better_Messages_Functions $functions */
        public $functions;

        /** @var Better_Messages_Shortcodes $shortcodes */
        public $shortcodes;

        /** @var Better_Messages_Rest_Api $api */
        public $api;

        /** @var Better_Messages_Stickers $stickers */
        public $stickers;

        /** @var Better_Messages_Mentions $mentions */
        public $mentions;

        /** @var Better_Messages_Giphy $giphy */
        public $giphy;

        /** @var Better_Messages_Urls $urls */
        public $urls;

        /** @var Better_Messages_Files $files */
        public $files;

        /** @var Better_Messages_Mini_List $mini_list */
        public $mini_list;

        /** @var Better_Messages_Emojis $emoji */
        public $emoji;

        /** @var Better_Messages_Chats $chats */
        public $chats;

        /** @var Better_Messages_Notifications $notifications */
        public $notifications;

        /** @var Better_Messages_Component $tab */
        public $tab;

        /** @var Better_Messages_Hooks $hooks */
        public $hooks;

        /** @var Better_Messages_Group $groups */
        public $groups;

        /** @var Better_Messages_Customize $customize */
        public $customize;

        /** @var Better_Messages_User_Config $user_config */
        public $user_config;

        /** @var Better_Messages_Moderation $moderation */
        public $moderation;

        /** @var Better_Messages_Users $users */
        public $users;

        /** @var Better_Messages_Guests $guests */
        public $guests;

        /** @var Better_Messages_Cleaner $cleaner */
        public $cleaner;

        /** @var Better_Messages_Capabilities $capabilities */
        public $capabilities;

        /** @var Better_Messages_WebSocket $functions */
        public $websocket = false;

        /** @var Better_Messages_Calls $calls */
        public $calls = false;

        /** @var Better_Messages_Calls_Group $group_calls */
        public $group_calls = false;

        /** @var Better_Messages_AI $group_calls */
        public $ai = false;

        /** @var Better_Messages_Blocks $blocks */
        public $blocks = false;

        /** @var Better_Messages_Mobile_App $mobile_app */
        public $mobile_app = false;

        public $script_variables;

        public static function instance() {
            // Store the instance locally to avoid private static replication
            static $instance = null;
            // Only run these methods if they haven't been run previously
            if ( null === $instance ) {
                $instance = new Better_Messages();
                $instance->setup_vars();
                $instance->setup_actions();
                $instance->setup_classes();
            }
            // Always return the instance
            return $instance;
            // The last metroid is in captivity. The galaxy is at peace.
        }

        public function setup_vars() {
            global $wpdb;
            $wpdb->__set( 'bm_threadmeta', bm_get_table( 'threadsmeta' ) );
            $wpdb->__set( 'bm_messagemeta', bm_get_table( 'meta' ) );
            $this->realtime = false;
            $this->path = plugin_dir_path( __FILE__ );
            $this->url = plugin_dir_url( __FILE__ );
        }

        public function setup_actions() {
            $this->require_files();
            add_action( 'wp_enqueue_scripts', array($this, 'load_scripts') );
            add_action( 'admin_enqueue_scripts', array($this, 'load_admin_scripts') );
            add_action( 'init', array($this, 'load_text_domain') );
        }

        /**
         * Require necessary files
         */
        public function require_files() {
            require_once 'inc/classes/message.php';
            require_once 'inc/classes/thread.php';
            require_once 'inc/functions-global.php';
            require_once 'inc/functions.php';
            /**
             * Require component only if BuddyPress is active
             */
            if ( class_exists( 'BP_Component' ) ) {
                require_once 'inc/component.php';
            }
            require_once 'inc/hooks.php';
            require_once 'inc/users.php';
            require_once 'inc/options.php';
            require_once 'inc/notifications.php';
            require_once 'inc/chats.php';
            require_once 'inc/mini-list.php';
            require_once 'inc/user-config.php';
            require_once 'inc/shortcodes.php';
            require_once 'inc/rest-api.php';
            require_once 'inc/capabilities.php';
            require_once 'inc/cleaner.php';
            require_once 'inc/moderation.php';
            require_once 'inc/guests.php';
            require_once 'addons/urls.php';
            require_once 'addons/files.php';
            require_once 'addons/emojis.php';
            require_once 'addons/mentions.php';
            require_once 'addons/stickers.php';
            require_once 'addons/giphy.php';
            require_once 'addons/reactions.php';
            require_once 'inc/customize.php';
            require_once 'addons/ai/ai.php';
            require_once 'inc/blocks/blocks.php';
            require_once Better_Messages()->path . 'vendor/AES256.php';
            require_once Better_Messages()->path . 'vendor/randomizer/randomizer-start.php';
            require_once Better_Messages()->path . 'vendor/random-name-generator/random-name-generator.php';
            bpbm_fs()->add_filter( 'plugin_icon', function () {
                return $this->path . 'assets/images/icon.png';
            } );
        }

        public function setup_classes() {
            $this->functions = Better_Messages_Functions();
            $this->options = Better_Messages_Options();
            $this->load_options();
            $this->hooks = Better_Messages_Hooks();
            $this->users = Better_Messages_Users();
            $this->guests = Better_Messages_Guests();
            $this->notifications = Better_Messages_Notifications();
            $this->chats = Better_Messages_Chats();
            $this->mini_list = Better_Messages_Mini_List();
            $this->files = Better_Messages_Files();
            if ( $this->settings['searchAllUsers'] === '1' && !defined( 'BP_MESSAGES_AUTOCOMPLETE_ALL' ) ) {
                define( 'BP_MESSAGES_AUTOCOMPLETE_ALL', true );
            }
            $this->capabilities = Better_Messages_Capabilities();
            $this->urls = Better_Messages_Urls();
            $this->emoji = Better_Messages_Emojis();
            $this->mentions = Better_Messages_Mentions();
            $this->stickers = Better_Messages_Stickers();
            $this->giphy = Better_Messages_Giphy();
            $this->user_config = Better_Messages_User_Config();
            $this->shortcodes = Better_Messages_Shortcodes();
            $this->api = Better_Messages_Rest_Api();
            $this->cleaner = Better_Messages_Cleaner();
            $this->moderation = Better_Messages_Moderation();
            $this->ai = Better_Messages_AI();
            $this->blocks = Better_Messages_Blocks();
            if ( bm_bp_is_active( 'groups' ) ) {
                require_once 'inc/component-group.php';
                $this->groups = Better_Messages_Group();
            }
            if ( file_exists( $this->path . 'addons/calls.php' ) && Better_Messages()->functions->can_use_premium_code_premium_only() ) {
                require_once $this->path . 'addons/calls.php';
            }
            if ( file_exists( $this->path . 'addons/calls-group.php' ) && Better_Messages()->functions->can_use_premium_code_premium_only() ) {
                require_once $this->path . 'addons/calls-group.php';
            }
            if ( function_exists( 'Better_Messages_Calls' ) ) {
                if ( $this->settings['videoCalls'] === '1' || $this->settings['audioCalls'] === '1' || $this->settings['groupCallsGroups'] === '1' || $this->settings['groupCallsThreads'] === '1' || $this->settings['groupCallsChats'] === '1' ) {
                    $this->calls = Better_Messages_Calls();
                }
            }
            if ( function_exists( 'Better_Messages_Calls_Group' ) ) {
                if ( $this->settings['groupAudioCallsChats'] === '1' || $this->settings['groupAudioCallsThreads'] === '1' || $this->settings['groupAudioCallsChats'] === '1' || $this->settings['groupCallsGroups'] === '1' || $this->settings['groupCallsThreads'] === '1' || $this->settings['groupCallsChats'] === '1' ) {
                    $this->group_calls = Better_Messages_Calls_Group();
                }
            }
            $this->customize = Better_Messages_Customize();
        }

        public function load_options() {
            $this->settings = $this->options->settings;
            $this->settings = apply_filters( 'bp_better_messages_overwrite_settings', $this->settings );
        }

        public function load_text_domain() {
            load_plugin_textdomain( 'bp-better-messages', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
        }

        public function load_admin_scripts() {
            $this->enqueue_admin_js();
            $this->enqueue_admin_css();
            return true;
        }

        public function load_scripts() {
            if ( !is_user_logged_in() && !Better_Messages()->guests->guest_access_enabled() ) {
                return false;
            }
            $this->enqueue_js();
            $this->enqueue_css();
            return true;
        }

        public function ensure_version_included( $src, $handle ) {
            $handles_to_ensure = [
                'better-messages',
                'better-messages-media',
                'better-messages-files-webcam',
                'better-messages-files-image-editor',
                'better-messages-files-react',
                'better-messages-files-core',
                'better-messages-app'
            ];
            if ( !in_array( $handle, $handles_to_ensure ) ) {
                return $src;
            }
            $parsed_vars = parse_url( $src, PHP_URL_QUERY );
            $version_included = false;
            if ( $parsed_vars ) {
                parse_str( $parsed_vars, $url_vars );
                if ( isset( $url_vars['ver'] ) ) {
                    $version_included = true;
                }
            }
            if ( !$version_included ) {
                $src = add_query_arg( 'ver', $this->version, $src );
            }
            return $src;
        }

        public function enqueue_admin_css() {
            $current_screen = get_current_screen();
            $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min' );
            $version = $this->version;
            if ( empty( $suffix ) ) {
                $version .= filemtime( $this->path . 'assets/admin/admin' . $suffix . '.css' );
            }
            $include_css = false;
            switch ( $current_screen->id ) {
                case 'toplevel_page_bp-better-messages':
                case 'edit-bpbm-chat':
                case 'bm-ai-chat-bot':
                case 'bpbm-chat':
                    $include_css = true;
                    break;
                default:
                    if ( str_ends_with( $current_screen->id, 'better-messages-viewer' ) ) {
                        $include_css = true;
                    } else {
                        if ( str_ends_with( $current_screen->id, 'better-messages-mobile-app' ) ) {
                            $include_css = true;
                        } else {
                            if ( str_ends_with( $current_screen->id, 'better-messages-settings' ) ) {
                                $include_css = true;
                            }
                        }
                    }
            }
            if ( $include_css ) {
                wp_enqueue_style(
                    'better-messages-admin',
                    plugins_url( 'assets/admin/admin' . $suffix . '.css', __FILE__ ),
                    false,
                    $version
                );
            }
        }

        public function enqueue_admin_js() {
            $current_screen = get_current_screen();
            $include_js = false;
            switch ( $current_screen->id ) {
                case 'toplevel_page_bp-better-messages':
                case 'edit-bpbm-chat':
                case 'bm-ai-chat-bot':
                case 'bpbm-chat':
                    $include_js = true;
                    break;
                default:
                    if ( str_ends_with( $current_screen->id, 'better-messages-viewer' ) ) {
                        $include_js = true;
                    } else {
                        if ( str_ends_with( $current_screen->id, 'better-messages-mobile-app' ) ) {
                            $include_js = true;
                        } else {
                            if ( str_ends_with( $current_screen->id, 'better-messages-settings' ) ) {
                                $include_js = true;
                            }
                        }
                    }
            }
            if ( !$include_js ) {
                return;
            }
            $file_name = 'admin.min.js';
            $is_dev = defined( 'BM_DEV' );
            $version = $this->version;
            if ( $is_dev && file_exists( $this->path . 'assets/admin/admin.js' ) ) {
                $file_name = 'admin.js';
                $version .= filemtime( $this->path . 'assets/admin/admin.js' );
            }
            $dependencies = array('jquery', 'wp-i18n');
            wp_register_script(
                'better-messages-admin',
                plugins_url( 'assets/admin/' . $file_name, __FILE__ ),
                $dependencies,
                $version
            );
            $script_variables = [
                'restUrl' => $this->functions->get_rest_api_url(),
                'nonce'   => wp_create_nonce( 'wp_rest' ),
            ];
            wp_set_script_translations( 'better-messages-admin', 'bp-better-messages', plugin_dir_path( __FILE__ ) . 'languages/' );
            wp_localize_script( 'better-messages-admin', 'Better_Messages_Admin', $script_variables );
            wp_enqueue_script( 'better-messages-admin' );
        }

        public $css_loaded = false;

        public function enqueue_css( $force = false ) {
            if ( !$force && $this->css_loaded ) {
                return;
            }
            if ( !has_action( 'style_loader_src', array($this, 'ensure_version_included') ) ) {
                add_action(
                    'style_loader_src',
                    array($this, 'ensure_version_included'),
                    999,
                    2
                );
            }
            $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min' );
            $version = $this->version;
            if ( empty( $suffix ) ) {
                $version .= filemtime( $this->path . 'assets/css/bp-messages' . $suffix . '.css' );
            }
            $dependencies = apply_filters( 'better_messages_style_dependencies', array() );
            wp_register_style(
                'better-messages',
                plugins_url( 'assets/css/bp-messages' . $suffix . '.css', __FILE__ ),
                $dependencies,
                $version
            );
            wp_add_inline_style( 'better-messages', Better_Messages()->hooks->css_customizations() );
            wp_add_inline_style( 'better-messages', Better_Messages()->customize->header_output() );
            wp_enqueue_style( 'better-messages' );
            $this->css_loaded = true;
        }

        public $js_loaded = false;

        public function enqueue_js() {
            if ( $this->js_loaded ) {
                return;
            }
            if ( !has_action( 'script_loader_src', array($this, 'ensure_version_included') ) ) {
                add_action(
                    'script_loader_src',
                    array($this, 'ensure_version_included'),
                    999,
                    2
                );
            }
            do_action( 'better_messages_register_script_dependencies' );
            $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min' );
            $dependencies = apply_filters( 'better_messages_script_dependencies', array('wp-i18n') );
            $is_dev = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG;
            $file_name = 'bp-messages-free.min.js';
            if ( $is_dev && file_exists( $this->path . 'assets/js/bp-messages.js' ) ) {
                $file_name = 'bp-messages.js';
            }
            $version = $this->version;
            if ( empty( $suffix ) ) {
                $version .= filemtime( $this->path . 'assets/js/' . $file_name );
            }
            wp_register_script(
                'better-messages',
                plugins_url( 'assets/js/' . $file_name, __FILE__ ),
                $dependencies,
                $version,
                false
            );
            $script_variables = $this->get_script_variables();
            wp_set_script_translations( 'better-messages', 'bp-better-messages', plugin_dir_path( __FILE__ ) . 'languages/' );
            wp_localize_script( 'better-messages', 'Better_Messages', apply_filters( 'bp_better_messages_script_variables', $script_variables ) );
            wp_enqueue_script( 'better-messages' );
            $this->js_loaded = true;
        }

        public function get_script_variables() {
            $enableSound = '1';
            if ( Better_Messages()->settings['allowSoundDisable'] === '1' ) {
                $disabled = Better_Messages()->functions->get_user_meta( get_current_user_id(), 'bpbm_disable_sound_notification', true ) === 'yes';
                if ( $disabled ) {
                    $enableSound = '0';
                }
            }
            if ( is_user_logged_in() ) {
                $unread_count = Better_Messages()->functions->get_total_threads_for_user( get_current_user_id(), 'unread' );
            } else {
                $unread_count = 0;
            }
            $ukey = Better_Messages()->functions->get_user_secret_key( get_current_user_id() );
            $locale = sanitize_file_name( strtolower( get_locale() ) );
            $locale = str_replace( '_', '-', $locale );
            $locale = apply_filters( 'bp_better_messages_time_locale', $locale );
            $friends = Better_Messages()->functions->is_friends_active();
            $groups = Better_Messages()->functions->is_groups_active();
            $localEncryption = $this->settings['encryptionLocal'] === '1';
            $hash = serialize( $this->settings ) . serialize( $this->functions->get_user_roles( get_current_user_id() ) ) . $this->db_version;
            if ( $localEncryption ) {
                $hash .= $ukey;
            }
            $script_variables = array(
                'hash'               => md5( $hash ),
                'user_id'            => get_current_user_id(),
                'version'            => $this->version,
                'ajaxUrl'            => admin_url( 'admin-ajax.php' ),
                'restUrl'            => esc_url_raw( get_rest_url( null, '/better-messages/v1/' ) ),
                'nonce'              => wp_create_nonce( 'wp_rest' ),
                'siteRefresh'        => ( isset( $this->settings['site_interval'] ) ? intval( $this->settings['site_interval'] ) * 1000 : 10000 ),
                'threadRefresh'      => ( isset( $this->settings['thread_interval'] ) ? intval( $this->settings['thread_interval'] ) * 1000 : 3000 ),
                'url'                => $this->functions->get_link(),
                'threadUrl'          => $this->functions->get_link( get_current_user_id() ) . '#/conversation/',
                'baseUrl'            => $this->functions->get_link( get_current_user_id() ),
                'assets'             => plugin_dir_url( __FILE__ ) . 'assets/',
                'sounds'             => apply_filters( 'bp_better_messages_sounds_assets', plugin_dir_url( __FILE__ ) . 'assets/sounds/' ),
                'soundLevels'        => array(
                    'notification' => $this->settings['notificationSound'] / 100,
                    'sent'         => $this->settings['sentSound'] / 100,
                    'calling'      => $this->settings['callSound'] / 100,
                    'dialing'      => $this->settings['dialingSound'] / 100,
                ),
                'color'              => get_theme_mod( 'main-bm-color', '#21759b' ),
                'darkColor'          => get_theme_mod( 'main-bm-color-dark', '#fff' ),
                'locale'             => $locale,
                'stickers'           => ( !empty( $this->settings['stipopApiKey'] ) ? '1' : '0' ),
                'gifs'               => ( !empty( $this->settings['giphyApiKey'] ) ? '1' : '0' ),
                'realtime'           => ( $this->realtime ? '1' : '0' ),
                'minHeight'          => (int) $this->settings['messagesMinHeight'],
                'maxHeight'          => (int) apply_filters( 'bp_better_messages_max_height', $this->settings['messagesHeight'] ),
                'headerHeight'       => (int) $this->settings['fixedHeaderHeight'],
                'sideWidth'          => (int) $this->settings['sideThreadsWidth'],
                'favorite'           => ( $this->settings['disableFavoriteMessages'] == '1' ? '0' : '1' ),
                'fullScreen'         => ( $this->settings['desktopFullScreen'] == '1' ? '1' : '0' ),
                'myProfile'          => ( $this->settings['myProfileButton'] == '1' ? '1' : '0' ),
                'replies'            => ( $this->settings['enableReplies'] == '1' ? '1' : '0' ),
                'selfReplies'        => ( $this->settings['enableSelfReplies'] == '1' ? '1' : '0' ),
                'privateReplies'     => ( $this->settings['privateReplies'] == '1' ? '1' : '0' ),
                'template'           => $this->settings['template'],
                'layout'             => $this->settings['modernLayout'],
                'singleThread'       => ( $this->settings['singleThreadMode'] == '1' ? '1' : '0' ),
                'forceThread'        => ( $this->settings['newThreadMode'] == '1' ? '1' : '0' ),
                'groupThreads'       => ( $this->settings['disableGroupThreads'] == '1' ? '0' : '1' ),
                'subjects'           => ( $this->settings['disableSubject'] == '1' ? '0' : '1' ),
                'suggestions'        => ( $this->settings['enableUsersSuggestions'] == '1' ? '1' : '0' ),
                'friends'            => ( $friends ? '1' : '0' ),
                'groups'             => ( $groups ? '1' : '0' ),
                'newThread'          => ( $this->settings['disableNewThread'] == '1' && !current_user_can( 'manage_options' ) ? '0' : '1' ),
                'mobileFullScreen'   => ( $this->settings['mobileFullScreen'] == '1' ? '1' : '0' ),
                'mobileSwipeBack'    => ( $this->settings['mobileSwipeBack'] == '1' ? '1' : '0' ),
                'autoFullScreen'     => ( $this->settings['autoFullScreen'] == '1' ? '1' : '0' ),
                'tapToOpen'          => ( $this->settings['tapToOpenMsg'] == '1' ? '1' : '0' ),
                'emojiHash'          => get_option( 'bm-emoji-hash', '' ),
                'emojiSet'           => $this->settings['emojiSet'],
                'sprite'             => Better_Messages_Emojis()->getSpriteUrl(),
                'search'             => ( $this->settings['disableSearch'] == '1' ? '0' : '1' ),
                'datePosition'       => ( get_theme_mod( 'bm-date-position', 'message' ) === 'stack' ? 'stack' : 'message' ),
                'timeFormat'         => ( get_theme_mod( 'bm-time-format', '24' ) === '12' ? '12' : '24' ),
                'avatars'            => ( in_array( get_theme_mod( 'bm-avatars-list', 'show' ), ['hide_private', 'hide_groups', 'hide'] ) ? get_theme_mod( 'bm-avatars-list', 'show' ) : 'show' ),
                'subName'            => ( in_array( get_theme_mod( 'bm-private-sub-name', 'show' ), ['online', 'subject', 'hide'] ) ? get_theme_mod( 'bm-private-sub-name', 'show' ) : 'online' ),
                'touchEnter'         => ( $this->settings['disableEnterForTouch'] == '1' ? '0' : '1' ),
                'loginUrl'           => apply_filters( 'better_messages_login_url', wp_login_url( add_query_arg( [] ) ) ),
                'total_unread'       => (int) $unread_count,
                'disableEnter'       => ( $this->settings['disableEnterForDesktop'] == '1' ? '1' : '0' ),
                'miniClose'          => ( $this->settings['enableMiniCloseButton'] ? '1' : '0' ),
                'miniChats'          => ( $this->realtime && $this->settings['miniChatsEnable'] ? '1' : '0' ),
                'miniMessages'       => ( $this->realtime && $this->settings['miniThreadsEnable'] ? '1' : '0' ),
                'combinedChats'      => ( $this->realtime && $this->settings['combinedChatsEnable'] == '1' ? '1' : '0' ),
                'miniAudio'          => ( $this->realtime && $this->settings['miniChatAudioCall'] ? '1' : '0' ),
                'miniVideo'          => ( $this->realtime && $this->settings['miniChatVideoCall'] ? '1' : '0' ),
                'messagesStatus'     => ( $this->realtime && $this->settings['messagesStatus'] ? '1' : '0' ),
                'listStatus'         => ( $this->realtime && $this->settings['messagesStatusList'] ? '1' : '0' ),
                'statusDetails'      => ( $this->realtime && $this->settings['messagesStatusDetailed'] ? '1' : '0' ),
                'combinedView'       => ( $this->settings['combinedView'] == '1' ? '1' : '0' ),
                'onSiteNotification' => ( $this->settings['disableOnSiteNotification'] == '1' ? '0' : '1' ),
                'onsitePosition'     => ( $this->settings['onsitePosition'] === 'right' ? 'right' : 'left' ),
                'titleNotifications' => ( $this->settings['titleNotifications'] == '1' ? '1' : '0' ),
                'hPBE'               => ( $this->settings['hidePossibleBreakingElements'] == '1' ? '1' : '0' ),
                'userSettings'       => ( $this->settings['disableUserSettings'] == '1' ? '0' : '1' ),
                'miniSync'           => ( $this->settings['miniChatDisableSync'] != '1' ? '1' : '0' ),
                'pinning'            => ( $this->settings['pinnedThreads'] == '1' ? '1' : '0' ),
                'mobileOnsite'       => ( in_array( $this->settings['mobileOnsiteLocation'], ['top', 'bottom'] ) ? $this->settings['mobileOnsiteLocation'] : 'auto' ),
                'enableSound'        => $enableSound,
                'guests'             => ( Better_Messages()->guests->guest_access_enabled() ? '1' : '0' ),
                'reports'            => ( $this->settings['allowReports'] == '1' ? '1' : '0' ),
            );
            $sounds_keys = [
                'notificationSound',
                'sentSound',
                'callSound',
                'dialingSound'
            ];
            foreach ( $sounds_keys as $key ) {
                $setting_key = $key . 'Url';
                if ( !empty( $this->settings[$setting_key] ) ) {
                    $script_variables[$setting_key] = $this->settings[$setting_key];
                }
            }
            $suggested_conversations = apply_filters( 'better_messages_suggested_conversations', $this->settings['suggestedConversations'], get_current_user_id() );
            if ( !empty( $suggested_conversations ) ) {
                $script_variables['suggestedConversations'] = $suggested_conversations;
            }
            if ( !is_user_logged_in() && get_option( 'users_can_register' ) ) {
                $script_variables['registerUrl'] = apply_filters( 'better_messages_registration_url', wp_registration_url() );
            }
            if ( current_user_can( 'manage_options' ) ) {
                $script_variables['isAdmin'] = '1';
            }
            if ( Better_Messages_Rest_Api_Bulk_Message()->has_access() ) {
                $script_variables['canBulk'] = '1';
            }
            if ( $this->settings['enableReactions'] == '1' ) {
                $script_variables['reactions'] = Better_Messages_Reactions::instance()->get_reactions();
                $script_variables['reactionsList'] = ( $this->settings['enableReactionsPopup'] == '1' ? '1' : '0' );
            }
            if ( $friends ) {
                $script_variables['combinedFriends'] = ( $this->settings['combinedFriendsEnable'] == '1' ? '1' : '0' );
                $script_variables['miniFriends'] = ( $this->settings['miniFriendsEnable'] == '1' ? '1' : '0' );
                $script_variables['mobileFriends'] = ( $this->settings['mobileFriendsEnable'] == '1' ? '1' : '0' );
            }
            if ( $groups ) {
                $script_variables['combinedGroups'] = ( $this->settings['combinedGroupsEnable'] == '1' ? '1' : '0' );
                $script_variables['miniGroups'] = ( $this->settings['enableMiniGroups'] == '1' ? '1' : '0' );
                $script_variables['mobileGroups'] = ( $this->settings['mobileGroupsEnable'] == '1' ? '1' : '0' );
            }
            if ( $this->realtime && $this->settings['userStatuses'] ) {
                $script_variables['userStatuses'] = $this->websocket->get_all_statuses();
            }
            if ( $this->settings['unreadCounter'] === 'conversations' ) {
                $script_variables['unreadCounter'] = 'conversations';
            }
            if ( is_user_logged_in() ) {
                $user_data = $this->functions->rest_user_item( get_current_user_id(), false );
                $script_variables['me'] = [
                    'name'   => base64_encode( $user_data['name'] ),
                    'url'    => base64_encode( $user_data['url'] ),
                    'avatar' => base64_encode( $user_data['avatar'] ),
                ];
            }
            $script_variables['ukey'] = $ukey;
            $this->script_variables = apply_filters( 'bp_better_messages_script_variable', $script_variables );
            return $this->script_variables;
        }

    }

    if ( !class_exists( 'BP_Better_Messages' ) ) {
        class BP_Better_Messages extends Better_Messages {
        }

    }
    if ( !function_exists( 'BP_Better_Messages' ) ) {
        /**
         * Fallback to old naming
         * @return Better_Messages|null
         */
        function BP_Better_Messages() {
            return Better_Messages();
        }

    }
    function Better_Messages() {
        return Better_Messages::instance();
    }

    function bm_bp_is_active(  $component = '', $feature = ''  ) {
        if ( function_exists( 'bp_is_active' ) ) {
            return bp_is_active( $component, $feature );
        } else {
            return false;
        }
    }

    function bm_get_table(  $table  ) {
        global $wpdb;
        $bp_prefix = apply_filters( 'bp_core_get_table_prefix', $wpdb->base_prefix );
        if ( function_exists( 'buddypress' ) && bm_bp_is_active( 'messages' ) ) {
            switch ( $table ) {
                case 'threads':
                    return $bp_prefix . 'bm_threads';
                case 'messages':
                    return $bp_prefix . 'bm_message_messages';
                    break;
                case 'meta':
                    return $bp_prefix . 'bm_message_meta';
                    break;
                case 'recipients':
                    return $bp_prefix . 'bm_message_recipients';
                    break;
                case 'notifications':
                    if ( isset( buddypress()->notifications ) ) {
                        return buddypress()->notifications->table_name;
                    } else {
                        return false;
                    }
                    break;
                case 'threadsmeta':
                    return $bp_prefix . 'bm_thread_meta';
                    break;
                case 'mentions':
                    return $bp_prefix . 'bm_mentions';
                    break;
                case 'moderation':
                    return $bp_prefix . 'bm_moderation';
                    break;
                case 'guests':
                    return $bp_prefix . 'bm_guests';
                case 'users':
                    return $bp_prefix . 'bm_user_index';
                case 'roles':
                    return $bp_prefix . 'bm_user_roles_index';
                    break;
            }
        } else {
            switch ( $table ) {
                case 'threads':
                    return $bp_prefix . 'bm_threads';
                case 'messages':
                    return $bp_prefix . 'bm_message_messages';
                    break;
                case 'meta':
                    return $bp_prefix . 'bm_message_meta';
                    break;
                case 'recipients':
                    return $bp_prefix . 'bm_message_recipients';
                    break;
                case 'threadsmeta':
                    return $bp_prefix . 'bm_thread_meta';
                    break;
                case 'mentions':
                    return $bp_prefix . 'bm_mentions';
                    break;
                case 'moderation':
                    return $bp_prefix . 'bm_moderation';
                    break;
                case 'notifications':
                    return false;
                    break;
                case 'guests':
                    return $bp_prefix . 'bm_guests';
                case 'users':
                    return $bp_prefix . 'bm_user_index';
                    break;
                case 'roles':
                    return $bp_prefix . 'bm_user_roles_index';
                    break;
            }
        }
        return false;
    }

    function Better_Messages_Incompatible_PHP() {
        echo '<div class="notice notice-error">';
        echo '<p><b>Better Messages</b> require at least <b>PHP 7.1</b>, currently running PHP <b>' . PHP_VERSION . '</b>.</p>';
        echo '<p>Please upgrade your website PHP version to use Better Messages.</p>';
        echo '<p class="button-container"><a class="button button-primary" href="https://wordpress.org/support/update-php/" target="_blank" rel="noopener" style="vertical-align: middle;">Learn more about updating PHP <span class="screen-reader-text">(opens in a new tab)</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>	</p>';
        echo '</div>';
    }

    function Better_Messages_Init() {
        if ( version_compare( PHP_VERSION, '7.1' ) < 0 ) {
            add_action( 'admin_notices', 'Better_Messages_Incompatible_PHP' );
            return;
        }
        if ( class_exists( 'BuddyPress' ) && bm_bp_is_active( 'messages' ) ) {
            Better_Messages();
        } else {
            $is_activating_buddypress = isset( $_GET['plugin'] ) && isset( $_GET['action'] ) && strpos( $_GET['plugin'], 'bp-loader.php' ) !== false && $_GET['action'] == 'activate';
            $is_activating_buddypress_2 = isset( $_GET['plugin'] ) && isset( $_GET['action'] ) && strpos( $_GET['plugin'], 'bp-loader.php' ) !== false && $_GET['action'] == 'activate-plugin';
            $is_activating_buddypress_3 = isset( $_GET['plugins'] ) && isset( $_GET['action'] ) && strpos( $_GET['plugins'], 'bp-loader.php' ) !== false && $_GET['action'] == 'update-selected';
            if ( $is_activating_buddypress || $is_activating_buddypress_2 || $is_activating_buddypress_3 ) {
                Better_Messages();
            } else {
                require_once 'vendor/buddypress/functions.php';
                Better_Messages();
            }
        }
    }

    // Uncanny Automator
    require_once trailingslashit( dirname( __FILE__ ) ) . 'addons/uncanny/uncanny-automator-better-messages.php';
    // AutomatorWP
    require_once trailingslashit( dirname( __FILE__ ) ) . 'addons/automatorwp/automatorwp.php';
    add_action( 'plugins_loaded', 'Better_Messages_Init', 20 );
    require_once trailingslashit( dirname( __FILE__ ) ) . 'inc/install.php';
    register_activation_hook( __FILE__, 'better_messages_activation' );
    register_deactivation_hook( __FILE__, 'better_messages_deactivation' );
    if ( !function_exists( 'bpbm_fs' ) ) {
        // Create a helper function for easy SDK access.
        function bpbm_fs() {
            global $bbm_fs;
            if ( !isset( $bbm_fs ) ) {
                if ( !defined( 'WP_FS__PRODUCT_1557_MULTISITE' ) ) {
                    define( 'WP_FS__PRODUCT_1557_MULTISITE', true );
                }
                // Include Freemius SDK.
                require_once dirname( __FILE__ ) . '/vendor/freemius/start.php';
                $bbm_fs = fs_dynamic_init( array(
                    'id'             => '1557',
                    'slug'           => 'bp-better-messages',
                    'premium_slug'   => 'bp-better-messages-websocket',
                    'type'           => 'plugin',
                    'public_key'     => 'pk_8af54172153e9907893f32a4706e2',
                    'is_premium'     => false,
                    'premium_suffix' => '- WebSocket Version',
                    'has_addons'     => true,
                    'has_paid_plans' => true,
                    'trial'          => array(
                        'days'               => 3,
                        'is_require_payment' => true,
                    ),
                    'menu'           => array(
                        'slug'    => 'bp-better-messages',
                        'support' => false,
                    ),
                    'is_live'        => true,
                ) );
            }
            return $bbm_fs;
        }

        // Init Freemius.
        bpbm_fs();
        // Signal that SDK was initiated.
        do_action( 'bbm_fs_loaded' );
        bpbm_fs()->add_filter( 'templates/checkout.php', function ( $template ) {
            if ( false !== strpos( $template, '&billing_cycle=annual' ) ) {
                $template = str_replace( '&billing_cycle=annual', '&billing_cycle=annual&show_monthly_switch=true', $template );
            }
            return $template;
        } );
    }
}