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/addons/ultimate-member.php
<?php
defined( 'ABSPATH' ) || exit;

if ( !class_exists( 'Better_Messages_Ultimate_Member' ) ){

    class Better_Messages_Ultimate_Member
    {

        public static function instance()
        {

            static $instance = null;

            if (null === $instance) {
                $instance = new Better_Messages_Ultimate_Member();
            }

            return $instance;
        }

        public function __construct(){
            add_filter( 'um_user_profile_tabs', array( $this, 'um_add_profile_tab' ), 200 );

            add_action( 'um_profile_content_messages_default', array( $this, 'um_content_messages' ), 1 );

            if( Better_Messages()->settings['chatPage'] === '0' ) {
                add_filter('bp_better_messages_page', array($this, 'um_message_page_url'), 10, 2);
            }

            if( Better_Messages()->settings['umProfilePMButton'] === '1' ) {
                add_action('um_profile_navbar', array($this, 'um_profile_message_button'), 5);
            }

            if( Better_Messages()->settings['UMuserListButton'] == '1' ) {
                add_action('um_members_just_after_name_tmpl', array($this, 'um_pm_link'), 10);
                add_action('um_members_list_just_after_actions_tmpl', array( $this, 'um_pm_link' ), 10);
            }

            if(  class_exists('UM_Friends_API') ) {
                add_filter( 'better_messages_friends_active', array($this, 'enabled') );
                add_filter( 'better_messages_get_friends', array($this, 'get_friends'), 10, 2 );
                add_filter( 'better_messages_is_friends', array( $this, 'is_friends' ), 10, 3 );
                if (Better_Messages()->settings['umOnlyFriendsMode'] === '1') {
                    add_filter('better_messages_can_send_message', array($this, 'disable_non_friends_reply'), 10, 3);
                    add_action('better_messages_before_new_thread', array($this, 'disable_start_thread_for_non_friends'), 10, 2);
                    add_filter( 'better_messages_only_friends_mode', array($this, 'enabled') );
                }

                add_filter('better_messages_search_friends', array( $this, 'search_friends'), 10, 3 );
            }

            if( class_exists('UM_Followers_API') ){
                add_filter( 'better_messages_followers_active', array($this, 'enabled') );
                add_filter( 'better_messages_is_followers', array($this, 'is_followers' ), 10, 3);

                if( Better_Messages()->settings['umOnlyFollowersMode'] === '1' ) {
                    add_filter( 'better_messages_only_followers_mode', array($this, 'enabled') );
                    add_filter( 'better_messages_can_send_message',  array($this, 'disable_non_followers_reply'), 10, 3);
                    add_action( 'better_messages_before_new_thread', array($this, 'disable_start_thread_for_non_followers'), 15, 2);
                }
            }

            add_action( 'wp_head', array( $this, 'um_counter_in_profile' ) );

            if( class_exists('UM_Groups') ){
                require_once Better_Messages()->path . 'addons/ultimate-member-groups.php';
                Better_Messages_Ultimate_Member_Groups::instance();
            }

            add_filter( 'bp_better_messages_script_variable', array( $this, 'script_variables' ) );
            add_action( 'um_theme_header_profile_before', array( $this, 'um_theme_header' ), 10 );

            add_action('better_messages_rest_user_item', array( $this, 'um_user_info' ), 20, 3 );
        }

        public function um_user_info( $item, $user_id, $include_personal ){
            if( function_exists('um_user_profile_url') ) {
                $item['url'] = um_user_profile_url($user_id);
            }

            if( function_exists('um_get_user_avatar_url') ) {
                $item['avatar'] = um_get_user_avatar_url($user_id);
            }

            return $item;
        }

        public function um_theme_header(){
            if( ! is_user_logged_in() ) return false;
            ?>

            <div id="bm-um-header" class="header-messenger-box">
                <div class="dropdown msg-drop">

                    <i class="um-msg-tik-ico far fa-envelope dropdown-togglu" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></i>

                    <span class="um-message-live-count" style="display:none">0</span>
                    <ul class="dropdown-menu msg-drop-menu" aria-labelledby="dropdownMenuButton">
                        <div class="bp-messages-wrap bm-threads-list" style="height:400px"></div>
                    </ul>
                </div>
            </div>
            <script type="text/javascript">
                jQuery(document).trigger("bp-better-messages-init-scrollers");
                jQuery(document).on('bp-better-messages-update-unread', function( event ) {
                    var unread = parseInt(event.detail.unread);
                    var private_messages = jQuery('#bm-um-header .um-message-live-count');

                    if( private_messages.length > 0 ){
                        if( unread > 0 ){
                            private_messages.text(unread);
                            private_messages.show();
                        } else {
                            private_messages.text(0).hide();
                        }
                    }
                });
            </script>
            <style type="text/css">
                .um-msg-tik-ico:hover {
                    color: #bbbbbb;
                }.um-msg-tik-ico {
                     color: #cccccc;
                 }</style>
            <?php
        }

        public function search_friends( $result, $search, $user_id  ){
            if( $user_id < 0 ) return $result;

            $friends = UM()->Friends_API()->api()->friends( $user_id );

            if( !! $friends && count( $friends ) > 0 ) {
                $friend_ids = [];
                foreach($friends as $index => $_users) {
                    if ($user_id === (int)$_users['user_id1']) {
                        $friend_id = (int)$_users['user_id2'];
                    } else {
                        $friend_id = (int)$_users['user_id1'];
                    }

                    $friend_ids[] = $friend_id;
                }

                global $wpdb;

                $sql = $wpdb->prepare("
                SELECT ID FROM `{$wpdb->users}`
                WHERE ( `user_nicename` LIKE %s OR `display_name` LIKE %s )
                AND `ID` IN (" . implode(',', array_map( 'intval', $friend_ids ) ) . ")
                LIMIT 0, 10
                ", '%' . $search . '%', '%' . $search . '%', $user_id);

                $matched_friends = $wpdb->get_col($sql);

                if( count( $matched_friends ) > 0 ){
                    foreach( $matched_friends as $friend ){
                        $result[] = intval( $friend );
                    }
                }
            }

            return $result;
        }


        public function is_friends( $bool, $user_id_1, $user_id_2 ){
            return UM()->Friends_API()->api()->is_friend( $user_id_1, $user_id_2 );
        }

        public function get_friends( $friends, $user_id ){
            $user_id = (int) Better_Messages()->functions->get_current_user_id();
            $friends = UM()->Friends_API()->api()->friends( $user_id );

            $users = [];

            if( !! $friends && count( $friends ) > 0 ) {
                foreach($friends as $index => $_users){
                    if( $user_id === (int) $_users['user_id1'] ) {
                        $friend_id = (int) $_users['user_id2'];
                    } else {
                        $friend_id = (int) $_users['user_id1'];
                    }

                    $user = get_userdata($friend_id);
                    if( ! $user ) continue;

                    $users[] = Better_Messages()->functions->rest_user_item( $user->ID );
                }
            }

            return $users;
        }

        public function enabled(){
            return true;
        }

        public function script_variables( $script_variables ){
            if( Better_Messages()->settings['UMminiGroupsEnable'] === '1' ) {
                $script_variables['miniGroups'] = '1';
            }
            if( Better_Messages()->settings['UMcombinedGroupsEnable'] === '1' ) {
                $script_variables['combinedGroups'] = '1';
            }
            if( Better_Messages()->settings['UMmobileGroupsEnable'] === '1' ) {
                $script_variables['mobileGroups'] = '1';
            }

            if( Better_Messages()->settings['UMminiFriendsEnable'] === '1' ) {
                $script_variables['miniFriends'] = '1';
            }
            if( Better_Messages()->settings['UMcombinedFriendsEnable'] === '1' ) {
                $script_variables['combinedFriends'] = '1';
            }
            if( Better_Messages()->settings['UMmobileFriendsEnable'] === '1' ) {
                $script_variables['mobileFriends'] = '1';
            }

            return $script_variables;
        }

        public function um_counter_in_profile(){
            if( ! is_user_logged_in() ) return false;
            ob_start();

            //<span class="um-tab-notifier">1</span>
            ?>
            <script type="text/javascript">
                jQuery(document).on('bp-better-messages-update-unread', function( event ) {
                    var unread = parseInt(event.detail.unread);
                    var private_messages = jQuery('.um-profile-nav-item.um-profile-nav-messages > a');

                    private_messages.each(function(){
                        var tab = jQuery(this);

                        if( unread > 0 ){
                            var count = tab.find('span.um-tab-notifier');

                            if( count.length === 0 ){
                                tab.append('<span class="um-tab-notifier">' + unread + '</span>');
                            } else {
                                count.text(unread);
                            }
                        } else {
                            tab.find('span.um-tab-notifier').remove();
                        }
                    });
                });
            </script>
            <?php
            $script = ob_get_clean();

            echo Better_Messages()->functions->minify_js( $script );
        }




        public function is_followers($bool, $user_id_1, $user_id_2){
            $followed = UM()->Followers_API()->api()->followed( $user_id_1, $user_id_2 );

            if( ! $followed ) {
                $followed = UM()->Followers_API()->api()->followed( $user_id_1, $user_id_2 );
            }

            return $followed;
        }

        public function disable_start_thread_for_non_followers(&$args, &$errors){
            if( ! class_exists('UM_Followers_API') ) {
                return null;
            }

            if( current_user_can('manage_options' ) ) {
                return null;
            }

            if( count( $errors ) > 0 ) {
                return null;
            }

            $recipients = $args['recipients'];

            if( ! is_array( $recipients ) ) $recipients = [ $recipients ];

            $notFollowed = array();

            foreach($recipients as $recipient){
                $user = get_userdata($recipient);

                $allowed = Better_Messages()->functions->is_followers( Better_Messages()->functions->get_current_user_id(), $user->ID );

                if( ! $allowed ) {
                    $notFollowed[] = Better_Messages()->functions->get_name($user->ID);
                }
            }

            if(count($notFollowed) > 0){
                $message = sprintf(_x('%s need to be followed to start new conversation', 'Ultimate member - follower restriction', 'bp-better-messages'), implode(', ', $notFollowed));
                $errors[] = $message;
            }

        }

        public function disable_non_followers_reply( $allowed, $user_id, $thread_id ){
            if( ! class_exists('UM_Followers_API') ) {
                return $allowed;
            }

            $participants = Better_Messages()->functions->get_participants($thread_id);
            if( count($participants['recipients']) !== 1) return $allowed;

            reset($participants['recipients']);

            $user_id_2 = key($participants['recipients']);
            /**
             * Allow users reply to admins even if not friends
             */
            if( current_user_can('manage_options') || user_can( $user_id_2, 'manage_options' ) ) {
                return $allowed;
            }

            $allowed = Better_Messages()->functions->is_followers( $user_id, $user_id_2 );

            if( ! $allowed ){
                global $bp_better_messages_restrict_send_message;
                $bp_better_messages_restrict_send_message['follow_needed'] = _x('You must follower this user to send messages', 'Ultimate member - follower restriction', 'bp-better-messages');
            }

            return $allowed;
        }

        public function disable_start_thread_for_non_friends(&$args, &$errors){
            if( ! class_exists('UM_Friends_API') ) {
                return null;
            }

            if( current_user_can('manage_options' ) ) {
                return null;
            }

            $recipients = $args['recipients'];

            if( ! is_array( $recipients ) ) $recipients = [ $recipients ];

            $notFriends = array();

            foreach($recipients as $recipient){
                if( $recipient < 0 ) continue;

                $user = get_userdata($recipient);

                if( ! UM()->Friends_API()->api()->is_friend( Better_Messages()->functions->get_current_user_id(), $user->ID ) ) {
                    $notFriends[] = Better_Messages()->functions->get_name($user->ID);
                }
            }

            if(count($notFriends) > 0){
                $message = sprintf(__('%s not on your friends list', 'bp-better-messages'), implode(', ', $notFriends));
                $errors[] = $message;
            }

        }

        public function disable_non_friends_reply( $allowed, $user_id, $thread_id ){
            if( ! class_exists('UM_Friends_API') ) {
                return $allowed;
            }

            $type = Better_Messages()->functions->get_thread_type( $thread_id );
            if( $type !== 'thread' ) return $allowed;

            $participants = Better_Messages()->functions->get_participants($thread_id);
            if( count($participants['recipients']) !== 1) return $allowed;
            reset($participants['recipients']);

            $friend_id = key($participants['recipients']);
            /**
             * Allow users reply to admins even if not friends
             */
            if( current_user_can('manage_options') || user_can( $friend_id, 'manage_options' ) || $friend_id < 0 ) {
                return $allowed;
            }

            $allowed = UM()->Friends_API()->api()->is_friend( $user_id, $friend_id );

            if( ! $allowed ){
                global $bp_better_messages_restrict_send_message;
                $bp_better_messages_restrict_send_message['friendship_needed'] = __('You must become friends to send messages', 'bp-better-messages');
            }

            return $allowed;
        }

        public function um_message_page_url( $url, $user_id ){
            $um_profile_url = um_user_profile_url( $user_id );
            return add_query_arg( ['profiletab' => 'messages'], $um_profile_url );
        }

        public function um_add_profile_tab( $tabs ) {
            $user_id  = (int) um_profile_id();
            $can_view = is_user_logged_in() && Better_Messages()->functions->get_current_user_id() === $user_id;

            if( $can_view ) {
                $tabs['messages'] = array(
                    'name' => __('Messages', 'bp-better-messages'),
                    'icon' => 'um-faicon-envelope-o',
                    'default_privacy' => 3,
                );
            }

            return $tabs;
        }

        public function um_content_messages( $args ) {
            echo Better_Messages()->functions->get_page();
        }


        public function um_pm_link( $args ){
            if ( ! is_user_logged_in() ) return;

            $base_url = Better_Messages()->functions->get_link(Better_Messages()->functions->get_current_user_id());

            $args = [
                'to' => '{{{user.id}}}'
            ];

            if( Better_Messages()->settings['fastStart'] == '1'){
                $args['bm-fast-start'] = '1';
            }

            if( isset( $args['bm-fast-start'] ) ){
                $url = add_query_arg( $args, $base_url );
            } else {
                $url = Better_Messages()->functions->add_hash_arg('new-conversation', $args, $base_url);
            }

            $class      = 'um-members-bpbm-btn';
            $link_class = 'um-button um-alt';
            $link_attr  = '';

            if( Better_Messages()->settings['umForceMiniChat'] === '1' ){
                $link_class .= ' bpbm-pm-button open-mini-chat ';
                $link_attr .= ' data-user-id="{{{user.id}}}"';
            }

            if( doing_action('um_members_list_just_after_actions_tmpl') ){
                $class .= ' um-members-list-footer-button-wrapper bpbm-pm-button';
            }

            echo '<div class="' . $class . '">';
            echo '<a href="' . $url . '" class="' . $link_class . '" target="_self" ' . $link_attr . '><span class="bm-button-text">' . __('Private Message', 'bp-better-messages') . '</span></a>';
            echo '</div>';
        }

        public function um_profile_message_button( $args ){
            if( ! function_exists('um_profile_id') ) return false;
            $user_id = um_profile_id();

            if ( is_user_logged_in() ) {
                if ( Better_Messages()->functions->get_current_user_id() == $user_id ) {
                    return;
                }
            }
            ?>
            <div class="um-messaging-btn">
                <?php
                if( Better_Messages()->settings['umForceMiniChat'] === '1' ){
                    echo do_shortcode( '[better_messages_mini_chat_button text="' . __('Private Message', 'bp-better-messages') . '" target="_self" fast_start="1" user_id="' . $user_id . '"]' );
                } else {
                    echo do_shortcode( '[better_messages_pm_button text="' . __('Private Message', 'bp-better-messages') . '" target="_self" fast_start="1" user_id="' . $user_id . '"]' );
                } ?>
            </div>
            <?php
        }

    }
}