File "wpaicg_comment.php"

Full Path: /home/digimqhe/flashdigi.uk/comment-content/plugins/gpt3-ai-content-generator/classes/wpaicg_comment.php
File size: 11.53 KB
MIME-type: text/x-php
Charset: utf-8

<?php
namespace WPAICG;
if ( ! defined( 'ABSPATH' ) ) exit;
if(!class_exists('\\WPAICG\\WPAICG_Comment')) {
    class WPAICG_Comment
    {
        private static $instance = null;

        public static function get_instance()
        {
            if (is_null(self::$instance)) {
                self::$instance = new self();
            }
            return self::$instance;
        }

        public function __construct()
        {
            add_filter('comment_row_actions',[$this,'row_action'],10,2);
            add_action('admin_footer',[$this,'scripts']);
            add_action('wp_ajax_wpaicg_comment_replier', [$this,'wpaicg_comment_replier']);
        }

        public function row_action($actions,$post)
        {
            if(current_user_can('wpaicg_comment_reply')) {
                $actions['wpaicg_comment_replier_box'] = sprintf('<a class="wpaicg_comment_replier" href="javascript:void(0)" data-id="%s">%s</a>',
                esc_attr($post->comment_ID),
                esc_html__('Generate Reply','gpt3-ai-content-generator'));
            }
            return $actions;
        }

        public function scripts()
        {
            if(current_user_can('wpaicg_comment_reply')) {
                ?>
                <script>
                    jQuery(document).ready(function ($){
                        if($('#reviews-filter').length){
                            $('table.product-reviews tr.comment').each(function (idx, item){
                                let id = $(item).find('.check-column input[type=checkbox]').val();
                                $(item).find('.has-row-actions .row-actions').append(' | <span class="wpaicg_comment_replier_box"><a class="wpaicg_comment_replier" href="javascript:void(0)" data-id="'+id+'"><?php echo esc_html__('Generate Reply','gpt3-ai-content-generator')?></a></span>')
                            })
                        }
                        var wpaicgGeneratorCommentWorking = false;
                        $(document).on('click','.wpaicg_comment_replier', function (e){
                            var btn = $(e.currentTarget);
                            if(wpaicgGeneratorCommentWorking){
                                alert('<?php echo esc_html__('Please wait previous ajax request finished.','gpt3-ai-content-generator')?>');
                            }
                            else
                            {
                                var id = btn.attr('data-id');
                                if (id === '') {
                                    alert('<?php echo esc_html__('Can not find ID of comment or review.', 'gpt3-ai-content-generator')?>');
                                } else {
                                    wpaicgGeneratorCommentWorking = $.ajax({
                                        url: '<?php echo esc_url_raw( admin_url('admin-ajax.php') ); ?>',
                                        data: {action: 'wpaicg_comment_replier',id: id,_wpnonce: '<?php echo esc_js( wp_create_nonce('wpaicg_comment_replier') ); ?>'},
                                        type: 'POST',
                                        dataType: 'JSON',
                                        beforeSend: function (){
                                            btn.html('<?php echo esc_html__('Generating Reply.. Please wait','gpt3-ai-content-generator')?>')
                                        },
                                        success: function (res){
                                            btn.html('<?php echo esc_html__('Generate Reply','gpt3-ai-content-generator')?>');
                                            wpaicgGeneratorCommentWorking = false;
                                            if(res.status === 'success'){
                                                btn.closest('.row-actions').find('.reply button').click();
                                                $('#replycontainer .wp-editor-area').val(res.data);
                                            }
                                            else{
                                                alert(res.msg);
                                            }
                                        },
                                        error: function (){
                                            wpaicgGeneratorCommentWorking = false;
                                        }
                                    })
                                }
                            }
                        })
                    })
                </script>
                <?php
            }
        }

        public function wpaicg_comment_replier()
        {
            global $wpdb;
            $wpaicg_result = array('status' => 'error','msg' => esc_html__('Missing parameters in request','gpt3-ai-content-generator'));
            if(!current_user_can('wpaicg_comment_reply')){
                $wpaicg_result['msg'] = esc_html__('You do not have permission for this action.','gpt3-ai-content-generator');
                wp_send_json($wpaicg_result);
            }
            if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'wpaicg_comment_replier' ) ) {
                $wpaicg_result['status'] = 'error';
                $wpaicg_result['msg'] = esc_html__('Nonce verification failed','gpt3-ai-content-generator');
                wp_send_json($wpaicg_result);
                exit;
            }

            // Get the AI engine.
            try {
                $ai_engine = WPAICG_Util::get_instance()->initialize_ai_engine();
            } catch (\Exception $e) {
                $wpaicg_result['msg'] = $e->getMessage();
                wp_send_json($wpaicg_result);
            }

            $wpaicg_generator = WPAICG_Generator::get_instance();
            $wpaicg_generator->openai($ai_engine);
            if(isset($_REQUEST['id']) && !empty($_REQUEST['id'])){
                $commentID = sanitize_text_field($_REQUEST['id']);
                $comment = get_comment($commentID);
                if($comment){
                    $post = get_post($comment->comment_post_ID);
                    if($post) {
                        $default_prompt = "Please generate a relevant and thoughtful response to [username]'s comment on the post titled '[post_title]' with the excerpt '[post_excerpt]'. The user's latest comment is: '[last_comment]'. If applicable, consider the context of the previous conversation: '[parent_comments]'. Keep the response focused on the topic and avoid creating any new information.";
                        $wpaicg_comment_prompt = get_option('wpaicg_comment_prompt',$default_prompt);
                        $prompt = str_replace('[post_title]', $post->post_title, $wpaicg_comment_prompt);
                        $prompt = str_replace('[post_excerpt]', $post->post_excerpt, $prompt);
                        $prompt = str_replace('[username]', $comment->comment_author, $prompt);
                        $prompt = str_replace('[last_comment]', $comment->comment_content, $prompt);
                        $totalWords = $wpaicg_generator->wpaicg_count_words($prompt);
                        $prompts_comments = array();
                        $prompts_final_comments = array();
                        $parent_comments = array();
                        if ($comment->comment_parent > 0) {
                            $parentComments = $this->wpaicg_comments($comment->comment_parent, array());
                            if ($parentComments && is_array($parentComments) && count($parentComments)) {
                                foreach ($parentComments as $item) {
                                    $prompts_comments[] = $item->comment_author.': '.$item->comment_content;
                                }
                            }
                        }
                        foreach($prompts_comments as $prompts_comment){
                            $comment_word_count = $wpaicg_generator->wpaicg_count_words($prompts_comment);
                            $totalWords += $comment_word_count;
                            if($totalWords > 1500){
                                break;
                            }
                            else{
                                $prompts_final_comments[] = $prompts_comment;
                            }
                        }
                        if(count($prompts_final_comments)){
                            foreach(array_reverse($prompts_final_comments) as $prompts_final_comment){
                                $parent_comments[] = $prompts_final_comment;
                            }
                        }
                        if(count($parent_comments)){
                            $parent_comments = implode("\n",$parent_comments);
                            $prompt = str_replace('[parent_comments]',$parent_comments,$prompt);
                        }

                        $ai_provider_info = \WPAICG\WPAICG_Util::get_instance()->get_default_ai_provider();
                        $wpaicg_provider = $ai_provider_info['provider'];
                        $wpaicg_ai_model = $ai_provider_info['model'];

                        if ($wpaicg_provider === 'Google') {
                            // Prepare options for Google request
                            $title = $prompt;
                            $model = $wpaicg_ai_model;
                            $temperature = 0.7;
                            $top_p = 1;
                            $max_tokens = 1000;
                            $result = $ai_engine->send_google_request($title, $model, $temperature, $top_p, $max_tokens);

                            if (!empty($result['status']) && $result['status'] === 'error') {
                                wp_send_json(['msg' => $result['msg'], 'status' => 'error']);
                            } else {
                                $wpaicg_result = $result;
                            }
                            
                        } else {
                            // OpenAI or Azure request
                            $result = $wpaicg_generator->wpaicg_request(array(
                                'model' => $wpaicg_ai_model,
                                'prompt' => $prompt,
                                'temperature' => 0.7,
                                'max_tokens' => 1000,
                                'frequency_penalty' => 0.01,
                                'presence_penalty' => 0.01,
                            ));
                        }

                        if($result['status'] == 'error'){
                            $wpaicg_result['msg'] = $result['msg'];
                        }
                        else{
                            $wpaicg_result['data'] = $result['data'];
                            $wpaicg_result['prompt'] = $prompt;
                            $wpaicg_result['status'] = 'success';
                        }
                    }
                    else{
                        $wpaicg_result['msg'] = esc_html__('Data not found or deleted','gpt3-ai-content-generator');
                    }
                }
                else $wpaicg_result['msg'] = esc_html__('Comment not found','gpt3-ai-content-generator');
            }
            wp_send_json($wpaicg_result);
        }

        public function wpaicg_comments($id, $comments)
        {
            $comment = get_comment($id);
            if($comment){
                $comments[] = $comment;
                if($comment->comment_parent > 0){
                    $comments = $this->wpaicg_comments($comment->comment_parent,$comments);
                }
            }
            return $comments;
        }
    }

    WPAICG_Comment::get_instance();
}