HEX
Server: LiteSpeed
System: Linux premium69.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
User: swifizcd (1555)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: //home/swifizcd/julnohub.com.ng/wp-content/plugins/cleantalk-spam-protect/inc/cleantalk-admin.php
<?php

use Cleantalk\ApbctWP\AdjustToEnvironmentModule\AdjustToEnvironmentHandler;
use Cleantalk\ApbctWP\AJAXService;
use Cleantalk\ApbctWP\ApbctEnqueue;
use Cleantalk\ApbctWP\CleantalkSettingsTemplates;
use Cleantalk\ApbctWP\ContactsEncoder\ContactsEncoder;
use Cleantalk\ApbctWP\Escape;
use Cleantalk\ApbctWP\Variables\Get;
use Cleantalk\ApbctWP\Variables\Post;
use Cleantalk\ApbctWP\Variables\Server;
use Cleantalk\ApbctWP\LinkConstructor;
use Cleantalk\Common\TT;
use Cleantalk\ApbctWP\SupportUser;

// Prevent direct call
if ( ! defined('ABSPATH') ) {
    die('Not allowed!');
}

require_once('cleantalk-settings.php');

// Add buttons to comments list table
add_action('manage_comments_nav', 'apbct_add_buttons_to_comments_and_users', 10, 1);
add_action('manage_users_extra_tablenav', 'apbct_add_buttons_to_comments_and_users', 10, 1);

// Check renew banner
add_action('wp_ajax_apbct_settings__check_renew_banner', 'apbct_settings__check_renew_banner');

// Crunch for Anti-Bot
add_action('admin_head', 'apbct_admin_set_cookie_for_anti_bot');

// Catch comment status change
add_action('comment_approved_to_unapproved', 'apbct_comment__remove_meta_approved', 10, 1);
add_action('comment_spam_to_unapproved', 'apbct_comment__remove_meta_approved', 10, 1);
add_action('comment_trash_to_unapproved', 'apbct_comment__remove_meta_approved', 10, 1);

/**
 * Crunch for Anti-Bot
 * Hooked by 'admin_head'
 */
function apbct_admin_set_cookie_for_anti_bot()
{
    global $apbct;

    if ( $apbct->data['key_is_ok'] ) {
        echo
            '<script ' . (class_exists('Cookiebot_WP') ? 'data-cookieconsent="ignore"' : '') . '>
                var ctSecure = location.protocol === "https:" ? "; secure" : "";
                document.cookie = "wordpress_apbct_antibot=' . hash('sha256', $apbct->api_key . $apbct->data['salt']) . '; path=/; expires=0; samesite=lax" + ctSecure;
            </script>';
    }
}


/**
 * Add buttons to comments list table
 * Hooked by 'manage_comments_nav' and 'manage_users_extra_tablenav'
 *
 * @param $_unused_argument
 */
function apbct_add_buttons_to_comments_and_users($_unused_argument)
{
    global $apbct;

    if ( is_null($current_screen = get_current_screen()) ) {
        return;
    }

    if ( 'users' === $current_screen->base ) {
        $button_url__check  = $current_screen->base . '.php?page=ct_check_users';
        $button_description = 'users';
    } elseif ( 'edit-comments' === $current_screen->base ) {
        $button_url__check  = $current_screen->base . '.php?page=ct_check_spam';
        $button_description = 'comments';
    } else {
        return;
    }

    echo '
    <a href="' . Escape::escAttr($button_url__check) . '" class="button" style="margin:1px 0 0 0; display: inline-block;">
        <img src="' . Escape::escUrl($apbct->logo__small__colored) . '" alt="CleanTalk Anti-Spam logo"  height="" style="width: 17px; vertical-align: text-bottom;" />
        ' . sprintf(__('Find spam %s', 'cleantalk-spam-protect'), $button_description) . '
    </a>
    ';
}

/**
 * Adding widget
 * Hooked by 'wp_dashboard_setup'
 *
 * @psalm-suppress UndefinedFunction
 */
function ct_dashboard_statistics_widget()
{
    global $apbct;

    $actual_plugin_name = $apbct->plugin_name;
    if (isset($apbct->data['wl_brandname']) && $apbct->data['wl_brandname'] !== APBCT_NAME) {
        $actual_plugin_name = $apbct->data['wl_brandname'];
    }
    /**
     * Hook. List of allowed user roles for the Dashboard widget.
     * add_filter('apbct_hook_dashboard_widget_allowed_roles_list', function($roles_list) {
     *  $roles_list[] = 'editor';
     *  return $roles_list;
     * });
     */
    $roles_list = apply_filters('apbct_hook_dashboard_widget_allowed_roles_list', array('administrator'));

    if (is_array($roles_list) && apbct_is_user_role_in($roles_list) ) {
        wp_add_dashboard_widget(
            'ct_dashboard_statistics_widget',
            $actual_plugin_name,
            'ct_dashboard_statistics_widget_output'
        );
    }
}

/**
 * Outputs statistics widget content
 *
 * @param $_post
 * @param $_callback_args
 */
function ct_dashboard_statistics_widget_output($_post, $_callback_args)
{
    global $apbct, $current_user;

    $actual_plugin_name = $apbct->plugin_name;
    if (isset($apbct->data['wl_brandname']) && $apbct->data['wl_brandname'] !== APBCT_NAME) {
        $actual_plugin_name = $apbct->data['wl_brandname'];
    }

    echo "<div id='ct_widget_wrapper'>";
    ?>
    <div class='ct_widget_top_links'>
        <img src="<?php echo Escape::escUrl(APBCT_IMG_ASSETS_PATH . '/preloader.gif'); ?>" class='ct_preloader'>
        <?php
        echo sprintf(
            __("%sRefresh%s", 'cleantalk-spam-protect'),
            "<a href='#ct_widget' class='ct_widget_refresh_link'>",
            "</a>"
        ); ?>
        <?php
        echo sprintf(
            __("%sConfigure%s", 'cleantalk-spam-protect'),
            "<a href='{$apbct->settings_link}' class='ct_widget_settings_link'>",
            "</a>"
        ); ?>
    </div>
    <form id='ct_refresh_form' method='POST' action='#ct_widget'>
        <input type='hidden' name='ct_brief_refresh' value='1'>
    </form>
    <h4 class='ct_widget_block_header' style='margin-left: 12px;'><?php
        _e('7 days Anti-Spam and SpamFireWall stats', 'cleantalk-spam-protect'); ?></h4>
    <div class='ct_widget_block ct_widget_chart_wrapper'>
        <canvas id='ct_widget_chart' ></canvas>
    </div>
    <h4 class='ct_widget_block_header'><?php
        _e('Top 5 spam IPs blocked', 'cleantalk-spam-protect'); ?></h4>
    <hr class='ct_widget_hr'>
    <?php
    if (
            ! apbct_api_key__is_correct() ||
            (isset($apbct->data['brief_data']['error_no']) && $apbct->data['brief_data']['error_no'] == 6)
    ) {
        ?>
        <div class='ct_widget_block'>
            <form action='<?php
            echo $apbct->settings_link; ?>' method='POST'>
                <h2 class='ct_widget_activate_header'><?php
                    _e('Get Access key to activate Anti-Spam protection!', 'cleantalk-spam-protect'); ?></h2>
                <input class='ct_widget_button ct_widget_activate_button' type='submit' name='get_apikey_auto'
                       value='ACTIVATE'/>
            </form>
        </div>
        <?php
    } elseif ( ! empty($apbct->data['brief_data']['error']) ) {
        echo '<div class="ct_widget_block">'
             . '<h2 class="ct_widget_activate_header">'
             . sprintf(
                 __('Something went wrong! Error: "%s".', 'cleantalk-spam-protect'),
                 "<u>{$apbct->brief_data['error']}</u>"
             )
             . '</h2>';
        if (apbct_is_user_role_in(array('administrator')) && $apbct->user_token && ! $apbct->white_label ) {
            $link = LinkConstructor::buildCleanTalkLink(
                'anti_crawler_inactive',
                'my',
                array(
                    'user_token' => $apbct->user_token,
                    'cp_mode' => 'antispam'
                )
            );
            echo '<h2 class="ct_widget_activate_header">'
                 . __('Please, visit your Dashboard.', 'cleantalk-spam-protect')
                 . '</h2>'
                 . '<a target="_blank" href="' . $link . '">'
                 . '<input class="ct_widget_button ct_widget_activate_button ct_widget_resolve_button" type="button" value="VISIT CONTROL PANEL">'
                 . '</a>';
        }
        echo '</div>';
    }

    if ( apbct_api_key__is_correct() && empty($apbct->data['brief_data']['error']) ) {
        ?>
        <div class='ct_widget_block'>
            <table cellspacing="0">
                <tr>
                    <th><?php
                        _e('IP', 'cleantalk-spam-protect'); ?></th>
                    <th><?php
                        _e('Country', 'cleantalk-spam-protect'); ?></th>
                    <th><?php
                        _e('Block Count', 'cleantalk-spam-protect'); ?></th>
                </tr>
                <?php
                foreach ( $apbct->brief_data['top5_spam_ip'] as $val ) { ?>
                    <tr>
                        <td><?php
                            echo Escape::escHtml($val[0]); ?></td>

                        <td class="ct_widget_block__country_cell">
                            <?php
                            echo $val[1]
                                ? "<img src='" . Escape::escHtml(APBCT_URL_PATH) . "/inc/images/flags/countries_collection.svg#" . strtolower(isset($val[1]['country_code']) ? Escape::escHtml($val[1]['country_code']) : 'xx') . "'>"
                                : ''; ?>
                            <?php
                            echo isset($val[1]['country_name']) ? Escape::escHtml($val[1]['country_name']) : 'Unknown'; ?>
                        </td>

                        <td style='text-align: center;'><?php
                            echo Escape::escHtml($val[2]); ?></td>
                    </tr>
                    <?php
                } ?>
            </table>
            <?php
            if (apbct_is_user_role_in(array('administrator')) && $apbct->user_token && ! $apbct->data["wl_mode_enabled"] ) {
                $link = LinkConstructor::buildCleanTalkLink(
                    'dashboard_widget_all_data_link',
                    'my/show_requests',
                    array(
                        'user_token' => Escape::escHtml($apbct->user_token)
                    )
                );
                ?>
                <a target='_blank' href='<?php echo $link; ?>'>
                    <input class='ct_widget_button' id='ct_widget_button_view_all' type='button' value='View all'>
                </a>
                <?php
            } ?>
        </div>

        <?php
    }
    // Notice at the bottom
    if ( $apbct->spam_count && $apbct->spam_count > 0 ) {
        $cp_total_stats = '';
        //Link to CP is only for admins due the token provided
        if ( apbct_is_user_role_in(array('administrator')) ) {
            $link = LinkConstructor::buildCleanTalkLink(
                'dashboard_widget_go_to_cp',
                'my',
                array(
                    'user_token' => $apbct->user_token,
                    'cp_mode'    => 'antispam'
                )
            );
            $cp_total_stats =
                ($apbct->data["wl_mode_enabled"] ? '' : '<img src="' . Escape::escUrl($apbct->logo__small__colored) . '" class="ct_widget_small_logo"/>')
                . '<span title="'
                . sprintf(
                    __(
                        'This is the count from the %s\'s cloud and could be different to admin bar counters',
                        'cleantalk-spam-protect'
                    ) . '">',
                    $actual_plugin_name
                )
                . sprintf(
                /* translators: %s: Number of spam messages */
                    __(
                        '%s%s%s has blocked %s spam for past year. The statistics are automatically updated every 24 hours.',
                        'cleantalk-spam-protect'
                    ),
                    ! $apbct->data["wl_mode_enabled"] ? '<a href="' . $link . '" target="_blank">' : '',
                    $actual_plugin_name,
                    ! $apbct->data["wl_mode_enabled"] ? '</a>' : '',
                    number_format($apbct->data['spam_count'], 0, ',', ' ')
                )
                . '</span>';
        }
        echo '<div class="ct_widget_wprapper_total_blocked">'
             . $cp_total_stats
             . (! $apbct->white_label && ! $apbct->data["wl_mode_enabled"]
                ? '<br><br>'
                  . '<b style="font-size: 16px;">'
                  . sprintf(
                      __('Do you like CleanTalk? %sPost your feedback here%s.', 'cleantalk-spam-protect'),
                      '<u><a href="https://wordpress.org/support/plugin/cleantalk-spam-protect/reviews/#new-post" target="_blank">',
                      '</a></u>'
                  )
                  . '</b>'
                : ''
             )
             . '</div>';
    }
    echo '</div>';
}

/**
 * Admin action 'admin_init' - Add the admin settings and such
 *
 * @psalm-suppress UndefinedFunction
 */
function apbct_admin__init()
{
    global $apbct, $spbc;

    // TODO: need to find another way to be compatible with WP Rocket and WPEngine
    if (defined('WP_ROCKET_VERSION') &&
        Server::get('IS_WPE') &&
        strpos(TT::toString(Server::get('REQUEST_URI')), 'wp-admin/admin-ajax.php') === false
    ) {
        ob_start(function ($buffer) {
            $pattern_admin_js = '/<script\s+type="rocketlazyloadscript"[^>]*cleantalk-admin\.min\.js[^>]*>/i';
            $pattern_checkusers_js = '/<script\s+type="rocketlazyloadscript"[^>]*cleantalk-users-checkspam\.min\.js[^>]*>/i';
            $pattern_checkspam_js = '/<script\s+type="rocketlazyloadscript"[^>]*cleantalk-comments-checkspam\.min\.js[^>]*>/i';

            $buffer = preg_replace($pattern_admin_js, '<script src="' . APBCT_JS_ASSETS_PATH . '/cleantalk-admin.min.js' .
                '?ver=' . APBCT_VERSION . '" id="ct_admin_common-js"></script>', $buffer);
            $buffer = preg_replace($pattern_checkusers_js, '<script src="' . APBCT_JS_ASSETS_PATH . '/cleantalk-users-checkspam.min.js' .
                '?ver=' . APBCT_VERSION . '" id="ct_check_users-js"></script>', $buffer);
            $buffer = preg_replace($pattern_checkspam_js, '<script src="' . APBCT_JS_ASSETS_PATH . '/cleantalk-comments-checkspam.min.js' .
                '?ver=' . APBCT_VERSION . '" id="ct_check_spam-js"></script>', $buffer);

            return $buffer;
        });
    }

    // Admin bar
    $apbct->admin_bar_enabled = $apbct->settings['admin_bar__show'] &&
                                current_user_can('activate_plugins');

    if ( $apbct->admin_bar_enabled ) {
        if (
            ! has_action('admin_bar_menu', 'apbct_admin__admin_bar__add_structure') &&
            ! has_action('admin_bar_menu', 'spbc_admin__admin_bar__add_structure')
        ) {
            add_action('admin_bar_menu', 'apbct_admin__admin_bar__add_structure', 999);
        }

        add_filter('cleantalk_admin_bar__parent_node__before', 'apbct_admin__admin_bar__prepare_counters');
        add_filter('cleantalk_admin_bar__add_icon_to_parent_node', 'apbct_admin__admin_bar__prepare_counters');
        add_filter('cleantalk_admin_bar__parent_node__after', 'apbct_admin__admin_bar__add_counter', 10, 1);

        add_action('admin_bar_menu', 'apbct_admin__admin_bar__add_child_nodes', 1000);
        if ( ! $spbc ) {
            add_filter('admin_bar_menu', 'apbct_spbc_admin__admin_bar__add_child_nodes', 1001);
        }
    }

    // Getting dashboard widget statistics
    if ( Post::getInt('ct_brief_refresh') === 1 ) {
        cleantalk_get_brief_data($apbct->api_key);
    }

    // Getting Access key like a hoster. Only once!
    if (
            ! is_main_site() &&
            $apbct->white_label &&
            (empty($apbct->api_key) || $apbct->settings['apikey'] == $apbct->network_settings['apikey'])
    ) {
        $res = apbct_settings__get_key_auto(true);
        if ( isset($res['auth_key'], $res['user_token']) ) {
            $settings       = apbct_settings__validate(array(
                'apikey' => $res['auth_key'],
            ));
            $apbct->api_key = isset($settings['apikey']) ? $settings['apikey'] : null;
            $apbct->save('settings');
        }
    }

    // Settings
    add_action(
        'wp_ajax_apbct_settings__get__long_description',
        'apbct_settings__get__long_description'
    ); // Long description

    add_action('wp_ajax_apbct_sync', 'apbct_settings__sync');

    add_action('wp_ajax_apbct_get_key_auto', 'apbct_settings__get_key_auto');

    add_action('wp_ajax_apbct_update_account_email', 'apbct_settings__update_account_email');

    // Settings Templates
    if (
        ! $apbct->data['wl_mode_enabled'] &&
        ! is_multisite() ||
        is_main_site() ||
        ( ! is_main_site() && $apbct->network_settings['multisite__allow_custom_settings'])
    ) {
        new CleantalkSettingsTemplates($apbct->api_key);
    }

    // Check compatibility
    do_action('apbct__check_compatibility');
}

/**
 * Manage links in plugins list
 *
 * @param $links
 * @param $_file
 *
 * @return array
 */
function apbct_admin__plugin_action_links($links, $_file)
{
    global $apbct;

    $settings_link = '<a href="' . $apbct->settings_link . '">' . __('Settings') . '</a>';

    array_unshift($links, $settings_link); // before other links

    return $links;
}

/**
 * Change th plugin description on all plugins page.
 * @param $all_plugins
 * @return array
 */
function apbct_admin__change_plugin_description($all_plugins)
{
    global $apbct;
    if (
        $apbct->data["wl_mode_enabled"] &&
        isset($all_plugins['cleantalk-spam-protect/cleantalk.php']) &&
        $apbct->data["wl_antispam_description"]
    ) {
        $all_plugins['cleantalk-spam-protect/cleantalk.php']['Description'] = $apbct->data["wl_antispam_description"];
    }
    return $all_plugins;
}

/**
 * Manage links and plugins page
 *
 * @param $links
 * @param $file
 * @param $plugin_data
 *
 * @return array
 */
function apbct_admin__register_plugin_links($links, $file, $plugin_data)
{
    global $apbct;
    $plugin_name = $plugin_data['Name'] ?: APBCT_NAME;

    //Return if it's not our plugin
    if ( $file != $apbct->base_name ) {
        return $links;
    }

    $actual_plugin_name = $apbct->plugin_name;
    if (isset($apbct->data['wl_brandname']) && $apbct->data['wl_brandname'] !== APBCT_NAME) {
        $actual_plugin_name = $apbct->data['wl_brandname'] . "&nbsp; Anti-Spam";
    }

    if ( $apbct->white_label || $apbct->data["wl_mode_enabled"] ) {
        $links   = array_slice($links, 0, 1);
        if (isset($links[0])) {
            $links[0] .= "<script " . (class_exists('Cookiebot_WP') ? 'data-cookieconsent="ignore"' : '') . ">
            function changedPluginName(){
                jQuery('.plugin-title strong').each(function(i, item){
                if(jQuery(item).html() == '{$plugin_name}')
                    jQuery(item).html('{$actual_plugin_name}');
                });
            }
            changedPluginName();
            jQuery( document ).ajaxComplete(function() {
                changedPluginName();
            });
            </script>";
        }
    }

    if ( substr(get_locale(), 0, 2) != 'en' ) {
        $links[] = '<a class="ct_meta_links ct_translate_links" href="'
                   . sprintf(
                       'https://translate.wordpress.org/locale/%s/default/wp-plugins/cleantalk-spam-protect',
                       substr(get_locale(), 0, 2)
                   )
                   . '" target="_blank">'
                   . __('Translate', 'cleantalk-spam-protect')
                   . '</a>';
    }

    $links[] = '<a class="ct_meta_links" href="' . $apbct->settings_link . '" target="_blank">'
               . __('Start here', 'cleantalk-spam-protect') . '</a>';
    $links[] = '<a class="ct_meta_links ct_faq_links" href="' . $apbct->data['wl_support_faq'] . '" target="_blank">'
               . __('FAQ', 'cleantalk-spam-protect') . '</a>';
    $links[] = '<a class="ct_meta_links ct_support_links" href="' . $apbct->data['wl_support_url'] . '" target="_blank">'
               . __('Support', 'cleantalk-spam-protect') . '</a>';
    $trial   = apbct_admin__badge__get_premium('plugins_listing');
    if ( ! empty($trial) && !$apbct->data["wl_mode_enabled"]) {
        $links[] = $trial;
    }

    return $links;
}

/**
 * Admin action 'admin_enqueue_scripts' - Enqueue admin script of reloading admin page after needed AJAX events
 *
 * @param string $hook URL of hooked page
 */
function apbct_admin__enqueue_scripts($hook)
{
    global $apbct;

    // Scripts to all admin pages
    ApbctEnqueue::getInstance()->js('common-cleantalk-modal.js', array('jquery'));
    ApbctEnqueue::getInstance()->js('cleantalk-admin.js', array('common-cleantalk-modal-js', 'jquery'));
    ApbctEnqueue::getInstance()->css('cleantalk-admin.css');
    ApbctEnqueue::getInstance()->css('cleantalk-icons.css');
    ApbctEnqueue::getInstance()->css('cleantalk-email-decoder.css');

    $data = array(
        '_ajax_nonce'        => $apbct->ajax_service->getAdminNonce(),
        '_ajax_url'          => admin_url('admin-ajax.php', 'relative'),
        'plugin_name'        => $apbct->plugin_name,
        'logo'               => '<img src="' . Escape::escUrl($apbct->logo) . '" alt=""  height="" style="width: 17px; vertical-align: text-bottom;" />',
        'logo_small'         => '<img src="' . Escape::escUrl($apbct->logo__small) . '" alt=""  height="" style="width: 17px; vertical-align: text-bottom;" />',
        'logo_small_colored' => '<img src="' . Escape::escUrl($apbct->logo__small__colored) . '" alt=""  height="" style="width: 17px; vertical-align: text-bottom;" />',
        'new_window_gif'     => APBCT_URL_PATH . "/inc/images/new_window.gif",
        'notice_when_deleting_user_text' => esc_html__('Warning! Users are deleted without the possibility of restoring them, you can only restore them from a site backup.', 'cleantalk-spam-protect'),
        'apbctNoticeDismissSuccess'       => esc_html__('Thank you for the review! We strive to make our Anti-Spam plugin better every day.', 'cleantalk-spam-protect'),
        'apbctNoticeForceProtectionOn'       => esc_html__('This option affects the reflection of the page by checking the user and adds a cookie "apbct_force_protection_check", which serves as an indicator of successful or unsuccessful verification. If the check is successful, it will no longer run.', 'cleantalk-spam-protect'),
    );
    $data = array_merge($data, ContactsEncoder::getLocalizationText());
    wp_localize_script('cleantalk-admin-js', 'ctAdminCommon', $data);

    /**
     * Hook. List of allowed user roles for the Dashboard widget.
     * add_filter('apbct_hook_dashboard_widget_allowed_roles_list', function($roles_list) {
     *  $roles_list[] = 'editor';
     *  return $roles_list;
     * });
     */
    $roles_list = apply_filters('apbct_hook_dashboard_widget_allowed_roles_list', array('administrator'));
    // DASHBOARD page JavaScript and CSS
    if (
        $hook == 'index.php' &&
        is_array($roles_list) && apbct_is_user_role_in($roles_list) &&
        $apbct->settings['wp__dashboard_widget__show'] &&
        ! $apbct->moderate_ip
    ) {
        // Enqueue widget scripts if the dashboard widget enabled and not IP license
        // Preparing widget data
        // Parsing brief data 'spam_stat' {"yyyy-mm-dd": spam_count, "yyyy-mm-dd": spam_count} to [["yyyy-mm-dd", "spam_count"], ["yyyy-mm-dd", "spam_count"]]
        $to_chart = array();

        // Crunch. Response contains error.
        if ( ! empty($apbct->data['brief_data']['error']) ) {
            $apbct->data['brief_data'] = array_merge($apbct->data['brief_data'], $apbct->default_data['brief_data']);
        }

        if ( isset($apbct->data['brief_data']['spam_stat']) && is_array($apbct->data['brief_data']['spam_stat']) ) {
            foreach ( $apbct->data['brief_data']['spam_stat'] as $key => $value ) {
                $to_chart[] = array($key, $value);
            }
            unset($key, $value);
        }
        sort($to_chart);

        //hardcode fix to prevent more than 8 elements
        if ( count($to_chart) > 8 ) {
            array_shift($to_chart);
        }

        ApbctEnqueue::getInstance()->css('cleantalk-dashboard-widget.css');
        $widget_chart_handler = ApbctEnqueue::getInstance()->js('cleantalk-dashboard-widget--chartjs.js', array('jquery'));
        $widget_handler = ApbctEnqueue::getInstance()->js('cleantalk-dashboard-widget.js', array($widget_chart_handler));
        wp_localize_script($widget_handler, 'apbctDashboardWidget', array(
            'data' => $to_chart,
        ));
    }

    // SETTINGS's page JavaScript and CSS
    if ( $hook == 'settings_page_cleantalk' ) {
        wp_enqueue_media();

        ApbctEnqueue::getInstance()->js('cleantalk-admin-settings-page.js');
        ApbctEnqueue::getInstance()->css('cleantalk-admin-settings-page.css');

        wp_localize_script('cleantalk-admin-settings-page-js', 'ctSettingsPage', array(
            'ct_subtitle' => $apbct->ip_license ? __('Hosting Anti-Spam', 'cleantalk-spam-protect') : '',
            'ip_license'  => $apbct->ip_license ? true : false,
            'key_changed' => ! empty($apbct->data['key_changed']),
            'key_is_ok'   => ! empty($apbct->key_is_ok) && !empty($apbct->settings['apikey']),
            'support_user_creation_msg_array' => SupportUser::getMessages(),
        ));

        ApbctEnqueue::getInstance()->js('common-cleantalk-modal.min.js');
    }

    // COMMENTS page JavaScript
    if ( $hook == 'edit-comments.php' ) {
        ApbctEnqueue::getInstance()->css('cleantalk-trp.css');
        ApbctEnqueue::getInstance()->js('/public-3-trp.js');
        wp_localize_script(
            'public-3-trp-js',
            'ctTrpAdminLocalize',
            \Cleantalk\ApbctWP\CleantalkRealPerson::getLocalizingData()
        );
        ApbctEnqueue::getInstance()->js('cleantalk-comments-editscreen.js');
        $link = LinkConstructor::buildCleanTalkLink(
            'public_comments_page_go_to_cp',
            'my',
            array(
                'user_token' => $apbct->user_token,
                'cp_mode' => 'antispam'
            )
        );
        wp_localize_script('cleantalk-comments-editscreen-js', 'ctCommentsScreen', array(
            'ct_ajax_nonce'               => $apbct->ajax_service->getAdminNonce(),
            'spambutton_text'             => __("Find spam comments", 'cleantalk-spam-protect'),
            'ct_feedback_msg_whitelisted' => __("The sender has been whitelisted.", 'cleantalk-spam-protect'),
            'ct_feedback_msg_blacklisted' => __("The sender has been blacklisted.", 'cleantalk-spam-protect'),
            'ct_feedback_msg'             => sprintf(
                __("Feedback has been sent to %sCleanTalk Dashboard%s.", 'cleantalk-spam-protect'),
                $apbct->user_token ? "<a target='_blank' href='$link'>" : '',
                $apbct->user_token ? "</a>" : ''
            ) . ' ' . esc_html__('The service accepts feedback only for requests made no more than 7 or 45 days 
            (if the Extra package is activated) ago.', 'cleantalk-spam-protect'),
            'ct_show_check_links'         => (bool)$apbct->settings['comments__show_check_links'],
            'ct_img_src_new_tab'          => plugin_dir_url(__FILE__) . "images/new_window.gif",
        ));
    }

    // USERS page JavaScript
    if ( $hook == 'users.php' ) {
        ApbctEnqueue::getInstance()->css('cleantalk-icons.css');
        ApbctEnqueue::getInstance()->js('cleantalk-users-editscreen.js');
        wp_localize_script('cleantalk-users-editscreen-js', 'ctUsersScreen', array(
            'spambutton_text'     => __("Find spam-users", 'cleantalk-spam-protect'),
            'ct_show_check_links' => (bool)$apbct->settings['comments__show_check_links'],
            'ct_img_src_new_tab'  => plugin_dir_url(__FILE__) . "images/new_window.gif"
        ));
    }
}

/**
 * Premium badge layout.
 *
 * @param string $placement - where should the layout placed, prefix and utm marks depends on this
 *
 * @return string Escaped string
 */
function apbct_admin__badge__get_premium($placement = null)
{
    global $apbct;

    $out = '';
    $utm_preset = '';
    $prefix = '';

    $placements_available = array(
            'checkers' => array(
                'prefix' => __('Make it right!', 'cleantalk-spam-protect') . ' ',
                'utm_set' => 'renew_checkers'),
            'top_info' => array(
                'prefix' => __('Make it right!', 'cleantalk-spam-protect') . ' ',
                'utm_set' => 'renew_top_info'),
            'cleantalk-bbpress-spam-scanner' => array(
                'prefix' => __('Make it right!', 'cleantalk-spam-protect') . ' ',
                'utm_set' => 'cleantalk-bbpress-spam-scanner'),
            'plugins_listing' => array(
                'prefix' => '',
                'utm_set' => 'renew_plugins_listing'),
    );

    if ( $apbct->license_trial == 1 && $apbct->user_token ) {
        if (!empty($placement) && isset($placements_available[$placement])) {
            $utm_preset = $placements_available[$placement]['utm_set'];
            $prefix = $placements_available[$placement]['prefix'];
        }
        $link_text = __('Get premium', 'cleantalk-spam-protect');
        $renew_link = LinkConstructor::buildRenewalLinkATag($apbct->user_token, $link_text, 1, $utm_preset);
        $out = $prefix . '<b style="display: inline-block; margin-top: 10px;">' . $renew_link . '</b>';
    }

    return Escape::escKsesPreset($out, 'apbct_get_premium_link');
}

/**
 * Adds structure to the admin bar.
 *
 * This function adds a common parent node to the admin bar for both APBCT and SPBCT products.
 * It also adds individual nodes for APBCT and SPBCT under the common parent node.
 *
 * @param WP_Admin_Bar $wp_admin_bar The admin bar object.
 * @global object $spbc The SPBCT object.
 * @global object $apbct The APBCT object.
 */
function apbct_admin__admin_bar__add_structure($wp_admin_bar)
{
    global $spbc, $apbct;

    //init preparing total counters for both products APBCT/SPBCT
    do_action('cleantalk_admin_bar__prepare_counters');

    // Adding common parent node
    /**
     * Adding common parent node for both products APBCT/SPBCT
     */
    $wp_admin_bar->add_node(array(
        'id' => 'cleantalk_admin_bar__parent_node',
        'title' =>
            apply_filters('cleantalk_admin_bar__add_icon_to_parent_node', '') . // @deprecated
            apply_filters('cleantalk_admin_bar__parent_node__before', '') .
            '<span class="cleantalk_admin_bar__title">' . $apbct->data["wl_brandname_short"] . '</span>' .
            apply_filters('cleantalk_admin_bar__parent_node__after', ''),
        'meta' => array('class' => 'cleantalk-admin_bar--list_wrapper'),
    ));

    /**
     * Adding APBCT bar node
     */

    $apbct_title_node = apbct__admin_bar__get_title_for_apbct($apbct);

    if ( $apbct_title_node ) {
        $wp_admin_bar->add_node($apbct_title_node);
    }

    /**
     * Adding SPBCT bar node
     */

    $spbc_title_node = apbct__admin_bar__get_title_for_spbc($spbc, $apbct->user_token, $apbct->white_label);

    if ( $spbc_title_node ) {
        $wp_admin_bar->add_node($spbc_title_node);
    }

    /**
     * Link to project manager
     */
    $project_manager_title_node = apbct__admin_bar__get_title_for_project_manager();
    if ( $project_manager_title_node ) {
        $wp_admin_bar->add_node($project_manager_title_node);
        $gf2db_title_node = apbct__admin_bar__add_gf2db_title();
        if ($gf2db_title_node) {
            $wp_admin_bar->add_node($gf2db_title_node);
        } else {
            $gf2db_invite_to_install_title = apbct__admin_bar__get_title_for_gf2db_invite_to_install();
            if ($gf2db_invite_to_install_title) {
                $wp_admin_bar->add_node($gf2db_invite_to_install_title);
            }
        }
    }

    /**
     * Adding FAQ node
     */
    $faq_title_node = apbct__admin_bar__get_title_for_faq();

    if ( $faq_title_node ) {
        $wp_admin_bar->add_node($faq_title_node);
    }
}

/**
 * Gets the title for the project manager admin bar node.
 *
 * This function constructs the title for the project manager admin bar node based on various conditions.
 * The title includes a link to the project manager.
 *
 * @return array|false The node data for the project manager admin bar node, or false if the project manager admin bar is not enabled.
 */
function apbct__admin_bar__get_title_for_project_manager()
{
    if (!is_plugin_active('gravityforms/gravityforms.php')) {
        return false;
    }

    $title = '<span><a>' . __('Project management', 'cleantalk-spam-protect') . '</a></span>';

    return array(
        'parent' => 'cleantalk_admin_bar__parent_node',
        'id' => 'project_manager__parent_node',
        'title' => $title,
    );
}

/**
 * Adds the title for the Gravity Forms to doBoard / Settings admin bar node.
 *
 * This function constructs the title for the Gravity Forms to doBoard / Settings admin bar node based on various conditions.
 * The title includes a link to the Gravity Forms to doBoard / Settings.
 *
 */
function apbct__admin_bar__add_gf2db_title()
{
    if (!is_plugin_active('cleantalk-doboard-add-on-for-gravity-forms/cleantalk-doboard-add-on-for-gravity-forms.php')) {
        return false;
    }

    $title = sprintf(
        '<a href="%s" target="_blank">%s</a>',
        admin_url('admin.php?page=gf_settings&subview=cleantalk-doboard-add-on-for-gravity-forms'),
        esc_html__('Gravity Forms to doBoard / Settings', 'cleantalk-spam-protect')
    );

    return array(
        'parent' => 'project_manager__parent_node',
        'id' => 'gf2db_title',
        'title' => $title,
    );
}

/**
 * Gets the title for the "Gravity Forms to doBoard" Add-On invite to install admin bar node.
 *
 * This function constructs the title for the "Gravity Forms to doBoard" Add-On invite to install admin bar node based on various conditions.
 * The title includes a link to the "Gravity Forms to doBoard" Add-On invite to install.
 *
 * @return array|false The node data for the "Gravity Forms to doBoard" Add-On invite to install admin bar node, or false if the "Gravity Forms to doBoard" Add-On invite to install admin bar node is not enabled.
 */
function apbct__admin_bar__get_title_for_gf2db_invite_to_install()
{
    if (is_plugin_active('cleantalk-doboard-add-on-for-gravity-forms/cleantalk-doboard-add-on-for-gravity-forms.php')) {
        return false;
    }

    $title = sprintf(
        '<a href="%s" target="_blank" title="%s">%s</a>',
        admin_url('plugin-install.php?s=GF2DB&tab=search&type=term'),
        esc_html__(
            'Organize and track all messages from your site. Gravity Forms, upgraded with project management.',
            'cleantalk-spam-protect'
        ),
        esc_html__('Install "Gravity Forms to doBoard" Add-On', 'cleantalk-spam-protect')
    );

    return array(
        'parent' => 'project_manager__parent_node',
        'id' => 'gf2db_invite_to_install_title',
        'title' => $title,
    );
}

/**
 * Gets the title for the APBCT admin bar node.
 *
 * This function constructs the title for the APBCT admin bar node based on various conditions.
 * The title includes a renewal link if the notice is set to show and either the trial notice or the renew notice is set.
 * An attention mark is added to the title if the notice is set to show.
 *
 * @param object $apbct The APBCT object.
 * @return array The node data for the APBCT admin bar node.
 */
function apbct__admin_bar__get_title_for_apbct($apbct)
{

    $node_data = array(
        'parent' => 'cleantalk_admin_bar__parent_node',
        'id' => 'apbct__parent_node',
        'title' => '',
    );

    $title = '<span><a>' . __('Anti-Spam', 'cleantalk-spam-protect') . '</a></span>';

    if (
        $apbct->notice_show && // needs to show notice
        (
            $apbct->notice_trial || // NPT trial flag
            $apbct->notice_renew // needs to renew
        ) &&
        (
            is_main_site() ||
            $apbct->network_settings['multisite__work_mode'] == 2
        ) // is single site or WPMS network mode 2
    ) {
        $link_text = __('Renew Anti-Spam', 'cleantalk-spam-protect');
        $renew_link = LinkConstructor::buildRenewalLinkATag($apbct->user_token, $link_text, 1, 'renew_admin_bar_apbct');
        $title = '<span>' . $renew_link . '</span>';
    }

    //show the attention mark in any case if the notice show gained
    $attention_mark = $apbct->notice_show ? '<i class="apbct-icon-attention-alt"></i>' : '';

    //construct the final title
    $node_data['title'] = '<div class="cleantalk-admin_bar__parent">' . $title . $attention_mark . '</div>';

    return $node_data;
}

/**
 * Gets the title for the SPBCT admin bar node.
 *
 * This function constructs the title for the SPBCT admin bar node based on various conditions.
 * The title includes a renewal link if the SPBCT object exists, a user token is provided, and the SPBCT trial is set.
 * An attention mark is added to the title if the SPBCT notice is set to show.
 *
 * @param object|null $spbc The SPBCT object. If not provided, defaults to null.
 * @param string $user_token The user token.
 * @param bool $is_apbct_wl_mode Indicates if the APBCT white label mode is enabled.
 * @return array|false The node data for the SPBCT admin bar node, or false if the SPBCT admin bar is not enabled or the APBCT white label mode is enabled.
 */
function apbct__admin_bar__get_title_for_spbc($spbc, $user_token, $is_apbct_wl_mode)
{
    $node_data = array(
        'parent' => 'cleantalk_admin_bar__parent_node',
        'id' => 'spbc__parent_node',
        'title' => '',
    );

    if (
        !$spbc ||
        !$user_token ||
        $spbc->trial !== 1
    ) {
        $node_data['title'] = '<a>' . __('Security', 'security-malware-firewall') . '</a>';
        return $node_data;
    }

    if ( !$spbc->admin_bar_enabled || $is_apbct_wl_mode ) {
        return false;
    }

    $link_text = __('Renew Security', 'cleantalk-spam-protect');
    $renew_link = LinkConstructor::buildRenewalLinkATag($user_token, $link_text, 4, 'renew_admin_bar_spbct');
    $spbc_title = '<span>' . $renew_link . '</span>';

    //show the attention mark in any case if the notice show gained
    $attention_mark = $spbc->notice_show ? '<i class="apbct-icon-attention-alt"></i>' : '';

    //construct the final title
    $node_data['title'] = '<div class="cleantalk-admin_bar__parent">' . $spbc_title . $attention_mark . '</div>';

    return $node_data;
}

function apbct__admin_bar__get_title_for_faq()
{
    $faq_link_url = LinkConstructor::buildCleanTalkLink('faq_admin_bar_apbct', 'help/introduction');
    $faq_link_layout = sprintf(
        '<a href="%s" target="_blank">%s</a>',
        $faq_link_url,
        esc_html__('Manuals and FAQ', 'cleantalk-spam-protect')
    );
    $title = '<div class="cleantalk-admin_bar__parent"><span>' . $faq_link_layout . '</span></div>';
    return array(
        'parent' => 'cleantalk_admin_bar__parent_node',
        'id' => 'faq__parent_node',
        'title' => $title,
    );
}

/**
 * Prepares properties for counters in $apbct
 * Handles counter reset
 *
 * @return void
 */
function apbct_admin__admin_bar__prepare_counters()
{
    global $apbct;

    //Reset or create user counter
    if ( ! empty(Get::get('ct_reset_user_counter')) ) {
        AJAXService::checkNonceRestrictingNonAdmins('security');
        $apbct->data['user_counter']['accepted'] = 0;
        $apbct->data['user_counter']['blocked']  = 0;
        $apbct->data['user_counter']['since']    = date('d M');
        $apbct->saveData();
    }
    //Reset or create all counters
    if ( ! empty(Get::get('ct_reset_all_counters')) ) {
        AJAXService::checkNonceRestrictingNonAdmins('security');
        $apbct->data['admin_bar__sfw_counter']      = array('all' => 0, 'blocked' => 0);
        $apbct->data['admin_bar__all_time_counter'] = array('accepted' => 0, 'blocked' => 0);
        $apbct->data['user_counter']                = array(
            'all'      => 0,
            'accepted' => 0,
            'blocked'  => 0,
            'since'    => date('d M')
        );
        $apbct->data['array_accepted']              = array();
        $apbct->data['array_blocked']               = array();
        $apbct->data['current_hour']                = '';
        $apbct->saveData();
    }

    $apbct->counter__sum = 0;

    $apbct->counter__user = array(
        'accepted' => $apbct->data['user_counter']['accepted'],
        'blocked'  => $apbct->data['user_counter']['blocked'],
        'all'      => $apbct->data['user_counter']['accepted'] + $apbct->data['user_counter']['blocked'],
        'since'    => $apbct->data['user_counter']['since']
    );
    $apbct->counter__sum  += $apbct->counter__user['all'];

    if ( $apbct->settings['admin_bar__all_time_counter'] ) {
        $apbct->counter__all_time = array(
            'accepted' => $apbct->data['admin_bar__all_time_counter']['accepted'],
            'blocked'  => $apbct->data['admin_bar__all_time_counter']['blocked'],
            'all'      => $apbct->data['admin_bar__all_time_counter']['accepted'] + $apbct->data['admin_bar__all_time_counter']['blocked']
        );
        $apbct->counter__sum      += $apbct->counter__all_time['all'];
    }

    if ( $apbct->settings['admin_bar__daily_counter'] ) {
        $apbct->counter__daily = array(
            'accepted' => array_sum($apbct->data['array_accepted']),
            'blocked'  => array_sum($apbct->data['array_blocked']),
            'all'      => array_sum($apbct->data['array_accepted']) + array_sum($apbct->data['array_blocked'])
        );
        $apbct->counter__sum   += $apbct->counter__daily['all'];
    }

    if ( $apbct->settings['admin_bar__sfw_counter'] && $apbct->settings['sfw__enabled'] ) {
        $apbct->counter__sfw = array(
            'all'     => $apbct->data['admin_bar__sfw_counter']['all'],
            'blocked' => $apbct->data['admin_bar__sfw_counter']['blocked']
        );
        $apbct->counter__sum += $apbct->counter__sfw['all'];
    }
}

function apbct_admin__admin_bar__add_parent_icon($icon)
{
    return $icon
           . '<img class="cleantalk_admin_bar__apbct_icon" src="' . Escape::escUrl(APBCT_URL_PATH . '/inc/images/logo.png') . '" alt="">&nbsp;';
}

function apbct_admin__admin_bar__add_counter($after)
{
    global $apbct;

    $counter__sum__layout = ($after ? ' / ' : '<div class="cleantalk_admin_bar__sum_counter">') .
                            '<span title="' . __(
                                'All Anti-Spam events',
                                'cleantalk-spam-protect'
                            ) . '">' . $apbct->counter__sum . '</span>' .
                            '</div>';

    return ($after ? substr($after, 0, -6) : $after)
           . $counter__sum__layout;
}

function apbct_admin__admin_bar__add_child_nodes($wp_admin_bar)
{
    global $apbct;

    $attention_mark = $apbct->notice_show ? '<i class="apbct-icon-attention-alt"></i>' : '';

    $wp_admin_bar->add_node(array(
        'parent' => 'apbct__parent_node',
        'id'     => 'apbct_admin_bar__counter_header',
        'title'  => __('Counters:', 'cleantalk-spam-protect'),
    ));

    // User's counter
    $wp_admin_bar->add_node(array(
        'parent' => 'apbct__parent_node',
        'id'     => 'apbct_admin_bar__counter__user',
        'title'  => '<a>'
                    . __('Since', 'cleantalk-spam-protect') . '&nbsp;' . $apbct->counter__user['since'] . ': '
                    . '<span style="color: green;">' . $apbct->counter__user['accepted'] . '</span> / '
                    . '<span style="color: red;">' . $apbct->counter__user['blocked'] . '</span>'
                    . '<i class="apbct-icon-help-circled" title="'
                    . __(
                        'Shows amount of alllowed and blocked requests since the date.',
                        'cleantalk-spam-protect'
                    ) . '"></i>'
                    . '</a>',
    ));

    // All-time counter
    if ( $apbct->settings['admin_bar__all_time_counter'] ) {
        $wp_admin_bar->add_node(array(
            'parent' => 'apbct__parent_node',
            'id'     => 'apbct_admin_bar__counter__all_time',
            'title'  => '<a>'
                        . '<span>'
                        . __('Since activation', 'cleantalk-spam-protect') . ': '
                        . '<span style="color: white;">' . $apbct->counter__all_time['all'] . '</span> / '
                        . '<span style="color: green;">' . $apbct->counter__all_time['accepted'] . '</span> / '
                        . '<span style="color: red;">' . $apbct->counter__all_time['blocked'] . '</span>'
                        . '</span>'
                        . '<i class="apbct-icon-help-circled" title="' . __(
                            'All / Allowed / Blocked submissions. The number of submissions is being counted since CleanTalk plugin installation.',
                            'cleantalk-spam-protect'
                        ) . '"></i>'
                        . '</a>',
        ));
    }

    // Daily counter
    if ( $apbct->settings['admin_bar__daily_counter'] ) {
        $wp_admin_bar->add_node(array(
            'parent' => 'apbct__parent_node',
            'id'     => 'apbct_admin_bar__counter__daily',
            'title'  => '<a>'
                        . '<span>'
                        . __('Day', 'cleantalk-spam-protect') . ': '
                        . '<span style="color: green;">' . $apbct->counter__daily['accepted'] . '</span> / '
                        . '<span style="color: red;">' . $apbct->counter__daily['blocked'] . '</span>'
                        . '</span>'
                        . '<i class="apbct-icon-help-circled" title="' . __(
                            'Allowed / Blocked submissions. The number of submissions for past 24 hours. ',
                            'cleantalk-spam-protect'
                        ) . '"></i>'
                        . '</a>',
        ));
    }

    // SFW counter
    if ( $apbct->settings['admin_bar__sfw_counter'] && $apbct->settings['sfw__enabled'] ) {
        $wp_admin_bar->add_node(array(
            'parent' => 'apbct__parent_node',
            'id'     => 'apbct_admin_bar__counter__sfw',
            'title'  => '<a>'
                        . '<span>'
                        . __('SpamFireWall', 'cleantalk-spam-protect') . ': '
                        . '<span style="color: white;">' . $apbct->counter__sfw['all'] . '</span> / '
                        . '<span style="color: red;">' . $apbct->counter__sfw['blocked'] . '</span>'
                        . '</span>'
                        . '<i class="apbct-icon-help-circled" title="' . __(
                            'All / Blocked events. Access attempts triggered by SpamFireWall counted since the last plugin activation.',
                            'cleantalk-spam-protect'
                        ) . '"></i>'
                        . '</a>',
        ));
    }

    // User counter reset.
    $wp_admin_bar->add_node(array(
        'parent' => 'apbct__parent_node',
        'id'     => 'ct_reset_counter',
        'title'  =>
            '<hr style="margin-top: 7px; border: 1px solid #888;">'
            . '<a href="?' . http_build_query(array_merge($_GET, array('ct_reset_user_counter' => 1, 'security' => $apbct->ajax_service->getAdminNonce())))
            . '" title="Reset your personal counter of submissions.">'
            . __('Reset first counter', 'cleantalk-spam-protect') . '</a>',
    ));

    // Reset ALL counter
    $wp_admin_bar->add_node(array(
        'parent' => 'apbct__parent_node',
        'id'     => 'ct_reset_counters_all',
        'title'  =>
            '<a href="?' . http_build_query(array_merge($_GET, array('ct_reset_all_counters' => 1, 'security' => $apbct->ajax_service->getAdminNonce())))
            . '" title="' . __('Reset all counters', 'cleantalk-spam-protect') . '">'
            . __('Reset all counters', 'cleantalk-spam-protect') . '</a>',
    ));

    // Counter separator
    if ( $apbct->counter__sum ) {
        $wp_admin_bar->add_node(array(
            'parent' => 'apbct__parent_node',
            'id'     => 'apbct_admin_bar__separator',
            'title'  => '<hr style="margin-top: 7px;" />',
            'meta'   => array('class' => 'cleantalk_admin_bar__separator')
        ));
    }

    $wp_admin_bar->add_node(array(
        'parent' => 'apbct__parent_node',
        'id'     => 'ct_settings_link',
        'title'  => '<a href="' . $apbct->settings_link . '">'
                    . __('Settings', 'cleantalk-spam-protect') . '</a>' . $attention_mark,
    ));

    // Add a child item to our parent item. Bulk checks.
    if ( ! is_network_admin() ) {
        $wp_admin_bar->add_node(
            array(
                'parent' => 'apbct__parent_node',
                'id'     => 'ct_settings_bulk_comments',
                'title'  => '<hr style="margin-top: 7px;" /><a href="edit-comments.php?page=ct_check_spam" title="'
                            . __('Bulk spam comments removal tool.', 'cleantalk-spam-protect') . '">'
                            . __('Check comments for spam', 'cleantalk-spam-protect') . '</a>',
            )
        );
    }

    // Add a child item to our parent item. Bulk checks.
    if ( ! is_network_admin() ) {
        $wp_admin_bar->add_node(
            array(
                'parent' => 'apbct__parent_node',
                'id'     => 'ct_settings_bulk_users',
                'title'  => '<a href="users.php?page=ct_check_users" title="Bulk spam users removal tool.">'
                            . __('Check users for spam', 'cleantalk-spam-protect') . '</a>',
            )
        );
    }

    // Add a child item to our parent item. Bulk checks.
    if ( ! is_network_admin() && apbct_is_plugin_active('woocommerce/woocommerce.php') ) {
        $wp_admin_bar->add_node(
            array(
                'parent' => 'apbct__parent_node',
                'id'     => 'ct_settings_bulk_orders',
                'title'  => '<a href="admin.php?page=apbct_wc_spam_orders" title="Bulk spam orders removal tool.">'
                            . __('WooCommerce spam orders', 'cleantalk-spam-protect') . '</a>',
            )
        );
    }

    // Support link
    $link_to_support = 'https://wordpress.org/support/plugin/cleantalk-spam-protect';
    if (!empty($apbct->data['wl_support_url'])) {
        $link_to_support = esc_url($apbct->data['wl_support_url']);
    }

    if ( ! $apbct->white_label || !empty($apbct->data['wl_support_url']) ) {
        $wp_admin_bar->add_node(
            array(
                'parent' => 'apbct__parent_node',
                'id'     => 'ct_admin_bar_support_link',
                'title'  => '<hr style="margin-top: 7px;" /><a target="_blank" href="' . $link_to_support . '">'
                            . __('Support', 'cleantalk-spam-protect') . '</a>',
            )
        );
    }
}

function apbct_spbc_admin__admin_bar__add_child_nodes($wp_admin_bar)
{
    // Installation link
    $wp_admin_bar->add_node(
        array(
            'parent' => 'spbc__parent_node',
            'id'     => 'apbct_admin_bar__install',
            'title'  => '<a target="_blank" href="plugin-install.php?s=Security%20and%20Malware%20scan%20by%20CleanTalk%20&tab=search">'
                        . __('Install Security by CleanTalk', 'cleantalk-spam-protect') . '</a>',
        )
    );

    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'install_separator',
        'title'  => '<hr style="margin-top: 7px;" />',
        'meta'   => array('class' => 'cleantalk_admin_bar__separator')
    ));

    // Counter header
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'spbc_admin_bar__counter_header',
        'title'  => '<a>' . __('Counters:', 'security-malware-firewall') . '</a>',
        'meta'   => array('class' => 'cleantalk_admin_bar__blocked'),
    ));

    // Failed / success login attempts counter
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'spbc_admin_bar__counter__logins',
        'title'  => '<a>'
                    . '<span>' . __('Logins:', 'cleantalk-spam-protect') . '</span>&nbsp;'
                    . '<span style="color: white;">'
                    . '<b style="color: green;">' . 0 . '</b> / '
                    . '<b style="color: red;">' . 0 . '</b>'
                    . '</span>'
                    . '<i class="apbct-icon-help-circled" title="' . __(
                        'Blocked login attempts in the local database for past 24 hours.',
                        'cleantalk-spam-protect'
                    ) . '"></i>'
                    . '</a>',
        'meta'   => array('class' => 'cleantalk_admin_bar__blocked'),
    ));

    // Firewall blocked / allowed counter
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'spbc_admin_bar__counter__firewall',
        'title'  => '<a>'
                    . '<b>' . __('Security Firewall: ', 'cleantalk-spam-protect') . '</b>&nbsp;'
                    . '<b style="color: white;">'
                    . '<b style="color: green;">' . 0 . '</b> / '
                    . '<b style="color: red;">' . 0 . '</b>'
                    . '</b>'
                    . '<i class="apbct-icon-help-circled" title="' . __(
                        'Passed / Blocked requests by Security Firewall for past 24 hours.',
                        'cleantalk-spam-protect'
                    ) . '"></i>'
                    . '</a>',
        'meta'   => array('class' => 'cleantalk_admin_bar__blocked'),
    ));

    // Users online counter
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'spbc_admin_bar__counter__online',
        'title'  => '<a>'
                    . '<span>' . __('Users online:', 'cleantalk-spam-protect') . '</span>'
                    . '&nbsp;<b class="spbc-admin_bar--user_counter">' . 0 . '</b>'
                    . '<i class="apbct-icon-help-circled" title="' . __(
                        'Shows amount of currently logged in administrators. Updates each 10 seconds.',
                        'cleantalk-spam-protect'
                    ) . '"></i>'
                    . '</a>',
        'meta'   => array('class' => 'cleantalk_admin_bar__blocked'),
    ));

    // Counter separator
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'spbc_admin_bar__separator',
        'title'  => '<hr style="margin-top: 7px;" />',
        'meta'   => array('class' => 'cleantalk_admin_bar__separator')
    ));

    // Settings
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'spbc_admin_bar__settings_link',
        'title'  => '<a>' . __('Settings', 'cleantalk-spam-protect') . '</a>',
        'meta'   => array('class' => 'cleantalk_admin_bar__blocked'),
    ));

    // Scanner
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'id'     => 'spbc_admin_bar__scanner_link',
        'title'  => '<a style="display:inline">' . __('Scanner', 'cleantalk-spam-protect') . '</a>'
                    . '/'
                    . '<a style="display:inline">' . __('Start scan', 'cleantalk-spam-protect') . '</a>',
        'meta'   => array('class' => 'cleantalk_admin_bar__blocked'),
    ));

    // Support link
    $wp_admin_bar->add_node(array(
        'parent' => 'spbc__parent_node',
        'title'  => '<hr style="margin-top: 7px;" /><a>' . __('Support', 'cleantalk-spam-protect') . '</a>',
        'id'     => 'spbc_admin_bar__support_link',
        'meta'   => array('class' => 'cleantalk_admin_bar__blocked'),
    ));
}


/**
 * Unmark bad words
 *
 * @param string $message
 *
 * @return string Cleat comment
 */
function apbct_comment__unmark_red($message)
{
    $message = preg_replace("/\<font rel\=\"cleantalk\" color\=\"\#FF1000\"\>(\S+)\<\/font>/iu", '$1', $message);

    return $message;
}

/**
 * Ajax action feedback form comments page.
 *
 * @param null|int $comment_id
 * @param null|string $comment_status
 * @param bool $change_status
 * @param null|bool $direct_call
 */
function apbct_comment__send_feedback(
    $comment_id = null,
    $comment_status = null,
    $change_status = false,
    $direct_call = null
) {
    // For AJAX call
    if ( ! $direct_call ) {
        AJAXService::checkNonceRestrictingNonAdmins('security');
    }

    $comment_id     = Post::get('comment_id') ? Post::getInt('comment_id') : $comment_id;
    $comment_status = Post::get('comment_status') ? Post::getString('comment_status') : $comment_status;
    $change_status  = Post::get('change_status') ? Post::getBool('change_status') : $change_status;

    // If enter params is empty exit
    if ( ! $comment_id || ! $comment_status ) {
        die();
    }

    // $comment = get_comment($comment_id, 'ARRAY_A');
    $hash = get_comment_meta($comment_id, 'ct_hash', true);

    // If we can send the feedback
    if ( $hash ) {
        // Approving
        if ( $comment_status == '1' || $comment_status == 'approve' ) {
            $result = ct_send_feedback($hash . ":1");
            // $comment['comment_content'] = apbct_comment__unmark_red($comment['comment_content']);
            // wp_update_comment($comment);
            $result === true ? 1 : 0;
        }

        // Disapproving
        if ( $comment_status == 'spam' ) {
            $result = ct_send_feedback($hash . ":0");
            $result === true ? 1 : 0;
        }
    } else {
        $result = 'no_hash';
    }

    // Changing comment status(folder) if flag is set. spam || approve
    if ( $change_status !== false ) {
        wp_set_comment_status($comment_id, $comment_status);
    }

    if ( ! $direct_call ) {
        ! empty($result) ? die($result) : die(0);
    }
}

/**
 * Catch comment status change
 *
 * @param WP_Comment $comment Comment object
 *
 * @return void
 */
function apbct_comment__remove_meta_approved($comment)
{
    delete_comment_meta((int)$comment->comment_ID, 'ct_marked_as_approved');
}


/**
 * Ajax action feedback form user page.
 *
 * @param null $user_id
 * @param null $status
 * @param null $direct_call
 */
function apbct_user__send_feedback($user_id = null, $status = null, $direct_call = null)
{
    AJAXService::checkNonceRestrictingNonAdmins('security');

    if ( ! $direct_call ) {
        $user_id = Post::getInt('user_id');
        $status  = Post::getString('status', null, 'word');
    }

    $hash = isset($user_id) ? get_user_meta($user_id, 'ct_hash', true) : null;

    if ( $hash ) {
        if ( $status === 'approve' || $status === '1' ) {
            $result = ct_send_feedback($hash . ":1");
            $result = $result === true ? 1 : 0;
        }
        if ( $status === 'spam' || $status === 'disapprove' || $status === '0' ) {
            $result = ct_send_feedback($hash . ":0");
            $result = $result === true ? 1 : 0;
        }
    } else {
        $result = 'no_hash';
    }

    if ( ! $direct_call ) {
        ! empty($result) ? die($result) : die(0);
    }
}

/**
 * Send feedback when user deleted
 *
 * @param $user_id
 * @param null $_reassign
 *
 * @return null
 */
function apbct_user__delete__hook($user_id, $_reassign = null)
{
    $hash = get_user_meta($user_id, 'ct_hash', true);
    if ( $hash !== '' ) {
        ct_feedback($hash, 0);
    }
}

/**
 * Check compatibility action
 */
add_action('apbct__check_compatibility', 'apbct__check_compatibility_handler');
function apbct__check_compatibility_handler()
{
    new \Cleantalk\Common\Compatibility();
}

/**
 * Function for `wpmu_blogs_columns` filter-hook.
 *
 * @param string[] $sites_columns An array of displayed site columns.
 *
 * @return string[]
 */
function apbct__wpmu_blogs_columns_filter($sites_columns)
{
    $sites_columns['cleantalk_status'] = esc_html__('CleanTalk Status', 'cleantalk-spam-protect');

    return $sites_columns;
}

add_filter('wpmu_blogs_columns', 'apbct__wpmu_blogs_columns_filter');

/**
 * Function for `manage_posts_custom_column` action-hook.
 *
 * @param string $_column_name The name of the column to display.
 * @param int    $site_id     The current post ID.
 *
 * @return void
 */
function apbct__manage_sites_custom_column_action($column_name, $site_id)
{
    if ( $column_name !== 'cleantalk_status' ) {
        return;
    }

    $cleantalk_data = get_blog_option($site_id, 'cleantalk_data');
    $key_is_ok_text = esc_html__('The Access key is set and correct', 'cleantalk-spam-protect');
    $key_is_bad_text = esc_html__('The Access key is not set or is incorrect', 'cleantalk-spam-protect');
    $key_status_caption = '<span style="color: red"">' . $key_is_bad_text . '</span>';

    if (!$cleantalk_data) {
        return;
    }

    $key_is_ok = isset($cleantalk_data['key_is_ok']) ? $cleantalk_data['key_is_ok'] : false;

    if ($key_is_ok) {
        $key_status_caption = '<span style="color: green"">' . $key_is_ok_text . '</span>';
    }

    echo $key_status_caption;
}

add_action('manage_sites_custom_column', 'apbct__manage_sites_custom_column_action', 10, 2);

add_action('wp_ajax_apbct_action_adjust_change', 'apbct_action_adjust_change');
function apbct_action_adjust_change()
{
    AJAXService::checkAdminNonce();

    if (!current_user_can('activate_plugins')) {
        wp_send_json_error('Permission denied');
    }

    if (in_array(Post::get('adjust'), array_keys(AdjustToEnvironmentHandler::SET_OF_ADJUST))) {
        try {
            $adjust = Post::getString('adjust');
            $adjust_class = AdjustToEnvironmentHandler::SET_OF_ADJUST[$adjust];
            $adjust_handler = new AdjustToEnvironmentHandler();
            $adjust_handler->handleOne($adjust_class);
        } catch (Exception $exception) {
            error_log('CleanTalk adjusting action error: ' . $exception->getMessage());
        }
    }

    wp_send_json_success();
}

add_action('wp_ajax_apbct_action_adjust_reverse', 'apbct_action_adjust_reverse');
function apbct_action_adjust_reverse()
{
    AJAXService::checkAdminNonce();

    if (!current_user_can('activate_plugins')) {
        wp_send_json_error('Permission denied');
    }

    if (in_array(Post::getString('adjust'), array_keys(AdjustToEnvironmentHandler::SET_OF_ADJUST))) {
        $adjust = Post::getString('adjust');
        try {
            $adjust_class = AdjustToEnvironmentHandler::SET_OF_ADJUST[$adjust];
            $adjust_handler = new AdjustToEnvironmentHandler();
            $adjust_handler->reverseAdjust($adjust_class);
        } catch (Exception $exception) {
            error_log('CleanTalk adjusting reverse error: ' . $exception->getMessage());
        }
    }

    wp_send_json_success();
}

function apbct_action__create_support_user()
{
    if (!current_user_can('activate_plugins')) {
        wp_send_json_error('Permission denied');
    }

    $support_user = new SupportUser();
    $result = $support_user->ajaxProcess();
    wp_send_json($result);
}