403Webshell
Server IP : 121.121.20.254  /  Your IP : 216.73.216.202
Web Server : Microsoft-IIS/10.0
System : Windows NT WEB-SERVER 10.0 build 20348 (Windows Server 2022) AMD64
User : IUSR ( 0)
PHP Version : 8.3.28
Disable Function : NONE
MySQL : ON  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  C:/inetpub/wwwroot/AIWEBSTATION/wp-content/plugins/whatsapp-chatbot-addon/includes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : C:/inetpub/wwwroot/AIWEBSTATION/wp-content/plugins/whatsapp-chatbot-addon/includes/functions.php
<?php 

use Twilio\Rest\Client;

/**
 * Get current language
 *
 * @return string
 */
function qcld_wa_currentLanguage() {
    $lancode = get_wpbot_locale();
    return $lancode;
}

/**
 * Get Option
 *
 * @param string $key
 * 
 * @return array|string $option
 */
function qcld_wa_get_option($key) {
    $options = get_option( $key );
    
    if( $options ){
        $options = maybe_unserialize( $options );
        if( is_array( $options ) ){
            if ( isset( $options[qcld_wa_currentLanguage()] ) ) {

                return $options[qcld_wa_currentLanguage()];

            } else {
                return $options;
            }
        } else {
            return $options;
        }

    } else {
        return $options;
    }
}

/**
 * Remove all transient that are being set during conversation
 *
 * @return void
 */
function qcld_wa_clear_all_transient( $waid ) {

    qcld_wa_delete_transient( $waid . '_start_menu' );

    qcld_wa_delete_transient( $waid . '_wa_feedback' );
    qcld_wa_delete_transient( $waid . '_wa_feedback_email' );
    qcld_wa_delete_transient( $waid . '_wa_feedback_msg' );
    qcld_wa_delete_transient( $waid . '_wa_phone' );
    qcld_wa_delete_transient( $waid . '_wa_sitesearch' );
    qcld_wa_delete_transient( $waid . '_wa_subscription' );
    qcld_wa_delete_transient( $waid . '_wa_conversational_field_entry' );
    qcld_wa_delete_transient( $waid . '_wa_conversational_field_id' );
    qcld_wa_delete_transient( $waid . '_wa_conversational_form_id' );
    qcld_wa_delete_transient( $waid . '_wa_conversational_form' );
    qcld_wa_delete_transient( $waid . '_faq_menu' );
    qcld_wa_delete_transient( $waid . '_wa_faq' );
    qcld_wa_delete_transient( $waid . '_wa_str_buttons' );
    qcld_wa_delete_transient( $waid . '_wa_cf_buttons' );
    qcld_wa_delete_transient( $waid . '_wa_df_buttons' );
    qcld_wa_delete_transient( $waid . '_wa_product_search' );
    qcld_wa_delete_transient( $waid . '_wa_order_status' );
    qcld_wa_delete_transient( $waid . '_wa_order_status_email' );
    qcld_wa_delete_transient( $waid . '_wa_product_showing' );
    qcld_wa_delete_transient( $waid . '_wa_product_buttons' );
    qcld_wa_delete_transient( $waid . '_wa_order_email' );
    qcld_wa_delete_transient( $waid . '_wa_order_product' );
    qcld_wa_delete_transient( $waid . '_wa_languages' );
    

}

/**
 * Check if number
 * 
 * @since 1.0.0
 * 
 * @param string $string
 *
 * @return bool
 */
function qcld_wa_is_number( $string ) {
    return is_numeric( $string );
}

/**
 * Delete transient
 * 
 * @since 1.0.0
 *
 * @param string $key
 * @return void
 */
function qcld_wa_delete_transient( $key ) {
    delete_transient( $key );
}

/**
 * Get all menu items
 * 
 * @since 1.0.0
 *
 * @return array
 */
function qcld_wa_getmenuitems() {
    
    $cache = array();
    $cache_key = '_menu_cache_key';

    if ( isset( $cache[ $cache_key ] ) && ! empty( $cache[ $cache_key ] ) ) {
        return $cache[ $cache_key ];
    }
    
    $phonetxt = ( qcld_wa_get_option( 'qlcd_wp_chatbot_support_phone' ) != '' ? qcld_wa_get_option( 'qlcd_wp_chatbot_support_phone' ) : 'Leave your number. We will call you back!' );

    $custom_intents_array = array_filter( maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_custon_intent_label' ) ) );
    
    $all_faqs = array(
    
        ( qcld_wa_get_option( 'qlcd_wp_email_subscription' ) != '' ? qcld_wa_get_option( 'qlcd_wp_email_subscription' ) : 'Email Subscription' ),
        ( qcld_wa_get_option( 'qlcd_wp_chatbot_sys_key_support' ) != '' ? strtoupper( qcld_wa_get_option( 'qlcd_wp_chatbot_sys_key_support' ) ) : 'FAQ' ),
        ( qcld_wa_get_option( 'qlcd_wp_send_us_email' ) != '' ? qcld_wa_get_option( 'qlcd_wp_send_us_email' ) : 'Send Us Email' ),
        ( qcld_wa_get_option( 'qlcd_wp_leave_feedback' ) != '' ? qcld_wa_get_option( 'qlcd_wp_leave_feedback' ) : 'Leave a Feedback' ),
        ( qcld_wa_get_option( 'qlcd_wp_site_search' )!='' ? qcld_wa_get_option( 'qlcd_wp_site_search' ) : 'Site Search' ),
        $phonetxt
    );
    
    $all_faqs = array_merge($all_faqs, $custom_intents_array);
   
    if ( qcld_wa_get_option( 'qc_wpbot_wa_menu_order' ) && qcld_wa_get_option( 'qc_wpbot_wa_menu_order' ) != '' && qcld_wa_get_option( 'wa_disable_start_menu' ) != '1' ) {
        $startmenu = stripslashes( qcld_wa_get_option( 'qc_wpbot_wa_menu_order' ) );
        preg_match_all( "/\<\w[^<>]*?\>([^<>]+?\<\/\w+?\>)?|\<\/\w+?\>/i", $startmenu, $matches );
        $newArray = array_map( function( $v ){
            return trim( strip_tags( $v ) );
        }, $matches[0] );
        $newArray = array_filter( $newArray );
        if ( ! empty( $newArray ) ){
            $all_faqs = $newArray;
        }
    } else {
        if ( qcld_wa_get_option( 'qc_wpbot_menu_order' ) && qcld_wa_get_option( 'qc_wpbot_menu_order' ) != '' ) {
            $startmenu = stripslashes( qcld_wa_get_option( 'qc_wpbot_menu_order' ) );
            preg_match_all( "/\<\w[^<>]*?\>([^<>]+?\<\/\w+?\>)?|\<\/\w+?\>/i", $startmenu, $matches );
            $newArray = array_map( function( $v ) {
                return trim( strip_tags( $v ) );
            }, $matches[0] );
            $newArray = array_filter( $newArray );
            if ( ! empty( $newArray ) ) {
                $all_faqs = $newArray;
            }
        }
    }

    if( function_exists( 'qcld_wpbotml' ) && qcld_wa_get_option( 'wa_language_command' ) && qcld_wa_get_option( 'wa_language_command' ) != '' ){
        $all_faqs[] = qcld_wa_get_option( 'wa_language_command' );
    }

    $cache[ $cache_key ] = apply_filters( 'qcld_wa_start_menu', array_unique( $all_faqs ) ) ;
    return $cache[ $cache_key ];
}

/**
 * Set Transient
 *
 * @param string $key
 * @param mixed $value
 * @return void
 */
function qcld_wa_set_transient( $key, $value ) {
    set_transient( $key, $value, 12 * HOUR_IN_SECONDS );
}

/**
 * Get transient
 *
 * @param string $transient
 * @return void
 */
function qcld_wa_get_transient( $key ) {
    return get_transient( $key );
}

/**
 * Send Messages
 *
 * @param string $content
 * @param string $to
 * @return string $message_sid
 */
function qcld_wa_send_message( $content, $to ) {

    // Your Account Sid and Auth Token from twilio.com/console
    $sid    = get_option( 'wa_account_sid' );
    $token  = get_option( 'wa_auth_token' );

    $from = 'whatsapp:' . get_option( 'wa_whatsapp_number' );

    $twilio = new Client($sid, $token);

    $message = $twilio->messages
       ->create( $to ,
           [
               "body" => $content,
               "from" => $from
           ]
       );
    
    return ($message->sid);
}

/**
 * Convert command to number
 *
 * @param array $items
 * 
 * @return string
 */
function qcld_wa_convert_command_to_number( $items ) {
    $text = '';
    if ( ! empty( $items ) ) {
        foreach ( $items as $key=>$item ) {
            $text .= ($key + 1). '. ' . $item . "\n";
        }
    }
    return $text;
}

/**
 * Show start menu
 * 
 * @since 1.0.0
 *
 * @param Qcld_WA_Request $request
 * @return void
 */
function qcld_wa_showstartmenu( Qcld_WA_Request $request ) {

    qcld_wa_clear_all_transient( $request->getWaId() );

    $msgtextoutput = 'I am here to find what you need. What are you looking for?';
    $default_msgs = qcld_wa_get_option( 'qlcd_wp_chatbot_wildcard_msg' );
    if( $default_msgs != '' ){
        $default_msgs = array_filter( maybe_unserialize( $default_msgs ) );
        if ( ! empty( $default_msgs ) ) {
            $msgtextoutput = $default_msgs[array_rand( $default_msgs )];
        }
    }

    $menu_items = qcld_wa_getmenuitems();
    
    if ( !empty( $menu_items ) ) {
        $msgtextoutput .= "\n";
        $msgtextoutput .= qcld_wa_convert_command_to_number( $menu_items );
    }

    $msgtextoutput = apply_filters( 'qcld_wa_modify_content', $msgtextoutput, $request );

    $response = qcld_wa_send_message( $msgtextoutput, $request->getFrom() );
    if ( $response ) {
        qcld_wa_set_transient( $request->getWaId() . '_start_menu', 1 );
    }
    exit;
}

/**
 * Email Subscription intent
 * 
 * @since 1.0.0
 * 
 * @param Qcld_WA_Request $request
 *
 * @param integer $step
 * 
 * @return null
 */
function qcld_wa_emailsubscription( Qcld_WA_Request $request, $step = 1 ) {
    global $wpdb;

    if ( $step == 1 ) {

        qcld_wa_set_transient( $request->getWaId() . '_wa_subscription', 1 );
        $texts = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_chatbot_asking_email' ) );
        $text = $texts[array_rand( $texts )];

    } elseif ( $step == 2 ) {

        qcld_wa_delete_transient( $request->getWaId() . '_wa_subscription' );
        $table              = $wpdb->prefix.'wpbot_subscription';
        $name               = $request->getProfileName();
        $email              = $request->getBody();
        $url                = '';
        $user_agent         = '';
        $response           = array();
        $response['status'] = 'fail';
        $query = $wpdb->prepare( 
            "select * from $table where 1 and email = %s", 
            $email
        );
        
        $email_exists = $wpdb->get_row( $query );
        if ( empty( $email_exists ) ) {
        
            $wpdb->query( $wpdb->prepare( " INSERT INTO $table ( date, name, email, url, user_agent ) VALUES ( %s, %s, %s, %s, %s ) ", array( date('Y-m-d H:i:s'), $name, $email, $url, $user_agent ) ) );
            $response['status'] = 'success';
            $texts              = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_email_subscription_success' ) );
            $text               = $texts[array_rand( $texts )];
        
        }else{
            $texts              = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_email_already_subscribe' ) );
            $text               = $texts[array_rand( $texts )];
        }
    }

    $text = apply_filters( 'qcld_wa_modify_content', $text, $request );

    $response = qcld_wa_send_message( $text, $request->getFrom() );
    exit;

}


/**
 * Send Us Email, Leave A Feedback intent
 * 
 * @since 1.0.0
 *
 * @param Qcld_WA_Request $request
 * 
 * @param integer $step
 * 
 * @return null
 */
function qcld_wa_sendusemail( Qcld_WA_Request $request, $step = 1 ) {

    if ( $step == 1 ) {

        qcld_wa_set_transient( $request->getWaId() . '_wa_feedback', 1 );
        $texts = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_chatbot_asking_email' ) );
        $text = $texts[array_rand( $texts )];

    } elseif ( $step == 2 ) {

        qcld_wa_set_transient( $request->getWaId() . '_wa_feedback', 2);
        $texts = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_chatbot_asking_msg' ) );
        $text = $texts[array_rand( $texts )];

    } elseif ( $step == 3 ) {

        qcld_wa_delete_transient( $request->getWaId() . '_wa_feedback' );
        $name                   = $request->getProfileName();
        $email                  = qcld_wa_get_transient( $request->getWaId() . '_wa_feedback_email' );
        $message                = qcld_wa_get_transient( $request->getWaId() . '_wa_feedback_msg' );
        $subject                = 'Feedback from WPBot by Client';

        //Extract Domain
        $url                    = get_site_url();
        $url                    = parse_url( $url );
        $domain                 = $url['host'];
        $admin_email            = qcld_wa_get_option( 'admin_email' );
        $toEmail                = qcld_wa_get_option( 'qlcd_wp_chatbot_admin_email' ) != '' ? qcld_wa_get_option( 'qlcd_wp_chatbot_admin_email' ) : $admin_email;
        $fromEmail              = "wordpress@" . $domain;
        //Starting messaging and status.
        $response['status']     = 'fail';
        $response['message']    = esc_html( str_replace( '\\', '', qcld_wa_get_option( 'qlcd_wp_chatbot_email_fail' ) ) );
    
        //build email body
        $bodyContent            = "";
        $bodyContent           .= '<p><strong>' . esc_html__( 'Feedback Details', 'wpchatbot' ) . ':</strong></p><hr>';
        $bodyContent           .= '<p>' . esc_html__( 'Name', 'wpfb' ) . ' : ' . esc_html( $name ) . '</p>';
        $bodyContent           .= '<p>' . esc_html__( 'Email', 'wpfb' ) . ' : ' . esc_html( $email ) . '</p>';
        $bodyContent           .= '<p>' . esc_html__( 'Message', 'wpfb' ) . ' : ' . esc_html( $message ) . '</p>';
        
            
        $bodyContent           .= '<p>' . esc_html__( 'Mail Generated on', 'wpchatbot' ) . ': ' . date( 'F j, Y, g:i a' ) . '</p>';
        $to                     = $toEmail;
        $body                   = $bodyContent;
    
        $headers                = array();
        $headers[]              = 'Content-Type: text/html; charset=UTF-8';
        $headers[]              = 'From: ' . esc_html( $name ) . ' <' . esc_html( $fromEmail ) . '>';
    
        wp_mail( $to, $subject, $body, $headers );
        qcld_wa_delete_transient( $request->getWaId() . '_wa_feedback_email' );
        qcld_wa_delete_transient( $request->getWaId() . '_wa_feedback_msg' );
        $text = ( qcld_wa_get_option( 'qlcd_wp_chatbot_email_sent' ) != '' ? qcld_wa_get_option( 'qlcd_wp_chatbot_email_sent' ) : 'Your email was sent successfully. Thanks!' );

    }

    $text = apply_filters( 'qcld_wa_modify_content', $text, $request );

    $response = qcld_wa_send_message( $text, $request->getFrom() );
    exit;
   
}

/**
 * Leave your number. We will call you back! - Intent
 * Multi step function
 * 
 * @since 1.0.0
 * 
 * @param Qcld_WA_Request $request
 * 
 * @param int $step [1, 2]
 * 
 * @return array
 */
function qcld_wa_callmeback( Qcld_WA_Request $request, $step = 1 ) {

    if ( $step == 1 ) {
        qcld_wa_set_transient( $request->getWaId() . '_wa_phone', 1 );
        $texts = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_chatbot_asking_phone' ) );
        $text = $texts[array_rand($texts)];
        
    } elseif ( $step == 2 ) {
        qcld_wa_delete_transient( $request->getWaId() . '_wa_phone' );
        $text = ( qcld_wa_get_option('qlcd_wp_chatbot_phone_sent' ) != '' ? qcld_wa_get_option('qlcd_wp_chatbot_phone_sent') : 'Thanks for your phone number. We will call you ASAP!' );
       
    }
    $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
    $response = qcld_wa_send_message( $text, $request->getFrom() );
    exit;

}

/**
 * Handle faq responses
 * 
 * @param Qcld_WA_Request $request
 *
 * @param [type] $key
 * @param array $all_faqs
 * @return void
 */
function qcld_wa_faq( Qcld_WA_Request $request, $key, $answer = "" ) {

    $all_faqs = maybe_unserialize( qcld_wa_get_option( 'support_query' ));

    if ( $key == 'show_question' ){
        $faqjson = '';
        
        $welcomefaqs = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_chatbot_support_welcome' ) );
        $welcomefaq = $welcomefaqs[array_rand( $welcomefaqs )];

        $text = apply_filters( 'qcld_wa_modify_content', $welcomefaq, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );

        if ( $response ) {
            $faqtext = qcld_wa_convert_command_to_number( $all_faqs );

            $faqtext = apply_filters( 'qcld_wa_modify_content', $faqtext, $request );
            $response = qcld_wa_send_message( $faqtext, $request->getFrom() );
            if ( $response ) {
                qcld_wa_set_transient( $request->getWaId() . '_faq_menu', 1 );
                qcld_wa_set_transient( $request->getWaId() . '_wa_faq', 1 );
            }

        }
        exit;
        
    } else {
        
        $faqkey = array_search ( $answer , $all_faqs);
        $faqans = maybe_unserialize( qcld_wa_get_option( 'support_ans' ) );

        $faqans = apply_filters( 'qcld_wa_modify_content', $faqans[$faqkey], $request );
        $response = qcld_wa_send_message( $faqans, $request->getFrom() );
        if ( $response ) {
            qcld_wa_delete_transient( $request->getWaId() . '_faq_menu' );
            qcld_wa_delete_transient( $request->getWaId() . '_wa_faq' );
        }
        exit;

    }
}

/**
 * Site Search function
 * 
 * @since 1.0.0
 *
 * @param Qcld_WA_Request $request
 * @param integer $step
 * @return void
 */
function qcld_wa_sitesearch( Qcld_WA_Request $request, $step = 1 ) {

    if ( $step == 1 ) {

        qcld_wa_set_transient( $request->getWaId() . '_wa_sitesearch', 1 );
        $texts  = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_chatbot_search_keyword' ) );
        $text   = $texts[array_rand( $texts )];

    } elseif ( $step == 2 ) {

        qcld_wa_delete_transient( $request->getWaId() . '_wa_sitesearch' );
        $sitesearchresult = qcld_wpbo_search_site_fb( $request->getBody() );

        if ( $sitesearchresult['status'] == 'success' ) {

            $results = $sitesearchresult['results'];
            $text = qcld_wa_site_search_result( $results );

            $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            if ( $response ) {
                qcld_wa_delete_transient( $request->getWaId() . '_faq_menu' );
                qcld_wa_delete_transient( $request->getWaId() . '_wa_faq' );
            }

        } else {

            $text = qcld_wa_get_option( 'qlcd_wp_chatbot_dialogflow_defualt_reply' );

            $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            exit;

        }

    }

    $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
    $response = qcld_wa_send_message( $text, $request->getFrom() );
    exit;

}

/**
 * format site search result for whatsapp
 * 
 * @since 1.0.0
 *
 * @param array $results
 * 
 * @return string
 */
function qcld_wa_site_search_result( $results ) {
    $text = '';
    foreach ( $results as $result ) {
        $text .= $result['title'].' - ' . $result['link']."\n";
    }
    return $text;
}


/**
 * str to lower recursively
 * 
 * @since 1.0.0
 *
 * @param string $value
 * @return string
 */
function qc_wa_nestedLowercase($value) {
    if (is_array($value)) {
        return array_map('qc_wa_nestedLowercase', $value);
    }
    return strtolower($value);
}


/**
 * find conversational form ID
 *
 * @param [type] $ccommands
 * @param [type] $cforms
 * @param [type] $cformid
 * @param [type] $message
 * @return void
 */
function qc_wa_findformid( $ccommands, $cforms, $cformid, $message ) {
	
	$gformid = 'None';
	
	if(!empty($ccommands)){
		
		foreach($ccommands as $key=>$val){
			
			if (in_array($message, $val)){
				return $cformid[$key];
			}
			
		}
		
	}
	if(!empty($cforms)){
		
		foreach($cforms as $key=>$val){
			if($val==$message){
				return $cformid[$key];
			}
		}
		
	}
	return $gformid;
}

/**
 * Get form first field by id
 *
 * @param int $formid
 * @param int $chatid
 * @return void
 */
function qcwpbot_wa_get_form($formid, $sender){
    global $wpdb;

    $formid = sanitize_text_field($formid);
    $session = sanitize_text_field($sender);

    $result = $wpdb->get_row("SELECT * FROM ". $wpdb->prefix."wfb_forms where form_id='".$formid."' and type='primary'");

    $form = maybe_unserialize($result->config);
    qcbot_conv_cookies_data_delete( $formid.'_'.$session.'_data' );
    qcbot_conv_cookies( $formid.'_'.$session, json_encode( $result ) );
    $fields = $form['fields'];
    //print_r($form['layout_grid']['fields']);exit;
    if(isset($form['layout_grid']['fields']) && !empty($form['layout_grid']['fields'])){
        
        $firstfield = qc_get_first_field($form['layout_grid']['fields']);
        $field = $fields[$firstfield];
        return $field;
    }
    
}

/**
 * Handle form builder response
 * 
 * @param Qcld_WA_Request $request
 * 
 * @param int $formid
 *
 * @return void
 */
function qcld_wa_handle_formbuilder_response( Qcld_WA_Request $request, $get_formidby_keyword ) {
    
    qcld_wa_set_transient( $request->getWaId() . '_wa_conversational_form', 'active' );
    qcld_wa_set_transient( $request->getWaId() . '_wa_conversational_form_id', $get_formidby_keyword);
    
    $formresponse = qcwpbot_wa_get_form( $get_formidby_keyword, $request->getWaId() );
    
    $fieldid = $formresponse['ID'];
    $formtype = $formresponse['type'];
    $formlabel = $formresponse['label'];
    qcld_wa_set_transient( $request->getWaId() . '_wa_conversational_field_id', $fieldid );
    qcld_wa_set_transient( $request->getWaId() . '_wa_conversational_field_entry', 0 );
    
    if($formtype=='dropdown' || $formtype=='checkbox'){
        
        $fieldoptions = $formresponse['config']['option'];
        $all_faqs = array();
        foreach($fieldoptions as $fieldoption){
            $all_faqs[] = $fieldoption['value'];
        }

        $formlabel .= "\n";
        $formlabel .= qcld_wa_convert_command_to_number( $all_faqs );
        qcld_wa_set_transient( $request->getWaId() . '_wa_cf_buttons', $all_faqs );
        $text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        exit;

    }elseif($formtype=='html'){

        $formlabel = $formresponse['config']['default'];

        $text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        if ( $response ) {
            qcld_wa_handle_cfb_next( $request, '' );
        }
        
    }else{

        $text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        exit;
        
    }

}


/**
 * Handle next field
 * 
 * @param Qcld_WA_Request $request
 *
 * @param string $answer
 * 
 * @return void
 */
function qcld_wa_handle_cfb_next( Qcld_WA_Request $request, $answer='' ) {
	
	$formid = qcld_wa_get_transient( $request->getWaId() . '_wa_conversational_form_id' );
	$fieldid = qcld_wa_get_transient( $request->getWaId() . '_wa_conversational_field_id' );
	$entry = qcld_wa_get_transient( $request->getWaId() . '_wa_conversational_field_entry' );
	
	$formresponse = qcwpbot_capture_form_value_wa( $request, $formid, $fieldid, $answer, $entry );
	
	if( $answer != '' ){
		$ccommands = array_map( 'qc_wa_nestedLowercase', qc_get_formbuilder_form_commands() );
		$cformid = qc_get_formbuilder_form_ids();
		$cforms = array_map('qc_wa_nestedLowercase', qc_get_formbuilder_forms());
		$get_formidby_keyword = qc_wa_findformid($ccommands, $cforms, $cformid, strtolower($answer));
		if(!empty($cformid) && in_array($get_formidby_keyword, $cformid)){
			qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_field_entry' );
			qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_field_id' );
			qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_form_id' );
			qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_form' );
            qcld_wa_handle_formbuilder_response( $request, $get_formidby_keyword );
			exit;
		}
	}

	if($formresponse['status']=='incomplete'){

		qcld_wa_set_transient( $request->getWaId() . '_wa_conversational_field_entry', $formresponse['entry']);
		qcld_wa_set_transient( $request->getWaId() . '_wa_conversational_field_id', $formresponse['ID']);
		
		$formtype = $formresponse['type'];
		$formlabel = $formresponse['label'];
		
		if($formtype=='dropdown' || $formtype=='checkbox'){			
			$fieldoptions = $formresponse['config']['option'];
			$all_faqs = array();
			foreach($fieldoptions as $fieldoption){
				$all_faqs[] = $fieldoption['value'];
			}
			
			$formlabel .= "\n";
            $formlabel .= qcld_wa_convert_command_to_number( $all_faqs );
            qcld_wa_set_transient( $request->getWaId() . '_wa_cf_buttons', $all_faqs );
            $text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            exit;
			
		}elseif($formtype=='html'){

			$formlabel = $formresponse['config']['default'];
			$text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            if ( $response ) {
                qcld_wa_handle_cfb_next( $request, '' );
            }
			
		}elseif($formtype=='calculation'){
			
			$formlabel = $formresponse['calresult'];

			$text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            if ( $response ) {
                qcld_wa_handle_cfb_next( $request, $formresponse['calvalue'] );
            }
			
		}elseif($formtype=='hidden'){

            qcld_wa_handle_cfb_next( $request, $formresponse['config']['default'] );

			
		}else{
			
            $text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            exit;
		}
		
		
	}else{
		qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_field_entry');
		qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_field_id');
		qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_form_id');
		qcld_wa_delete_transient( $request->getWaId() . '_wa_conversational_form');
		exit;
	}
	
}

/**
 * Capture form value
 *
 * @param Qcld_WA_Request $request
 * @param string $formid
 * @param int $fieldid
 * @param mixed $answer
 * @param int $entry
 * 
 * @return void
 */
function qcwpbot_capture_form_value_wa(Qcld_WA_Request $request, $formid, $fieldid, $answer, $entry ){
    global $wpdb;

    $formid = sanitize_text_field($formid);
    $fieldid = sanitize_text_field($fieldid);
    $answer = $answer;
    $entry = sanitize_text_field($entry);


    /*
    if($entry==0){
        $wpdb->insert(
            $wpdb->prefix."wfb_form_entries",
            array(
                'datestamp'  => current_time( 'mysql' ),
                'user_id'   => 0,
                'form_id'	=> $formid,
                'status'	=> 'active'
            )
        );

        $entry = $wpdb->insert_id;
    }
    */
    

    $result = qcbot_conv_cookies_get( $formid . '_' . $request->getWaId() );
    if( ! $result || empty( $result ) ){
        $result = $wpdb->get_row("SELECT * FROM ". $wpdb->prefix."wfb_forms where form_id='".$formid."' and type='primary'");
    }
    $form = unserialize($result->config);
    
    $processors = (isset($form['processors'])?$form['processors']:array());
    
    $mailer = (isset($form['mailer'])?$form['mailer']:array());
    
    $variables = isset($form['variables'])?$form['variables']:array();

    $fieldetails = qc_get_details_by_fieldid_wa($form, $fieldid);
    
    if($answer!=''){
        $data = array();
        if($fieldetails['type']=='file'){
            
            $answers = explode(',', $answer);
            
            foreach($answers as $answer){
                $data[] = array(
                    'entry_id'  => $entry,
                    'field_id'   => $fieldid,
                    'slug'	=> (isset($fieldetails['slug'])?$fieldetails['slug']:''),
                    'value'	=> stripslashes($answer)
                );
            }
            qcbot_conv_cookies_data_set( $formid.'_'.$request->getWaId().'_data', $data );
        }else{
            $data[] = array(
                'entry_id'  => $entry,
                'field_id'   => $fieldid,
                'slug'	=> (isset($fieldetails['slug'])?$fieldetails['slug']:''),
                'value'	=> stripslashes($answer)
            );
            qcbot_conv_cookies_data_set( $formid.'_'.$request->getWaId().'_data', $data );
        }
        
    }
    $fields = $form['fields'];
    $conditions = array();
    if(isset($form['conditional_groups']['conditions'])){
        $conditions = $form['conditional_groups']['conditions'];
    }
    
    
    if(isset($form['layout_grid']['fields']) && !empty($form['layout_grid']['fields'])){
        
        $nextfield = qc_get_next_field($form, $fieldid, $entry, $request->getWaId());
        
        if($nextfield!='none' && $nextfield!='' && !empty($fields[$nextfield])){
            
            $field = $fields[$nextfield];
            $field = qc_check_field_variables($form, $field, $variables, $entry, $request->getWaId());
            $field['entry'] = $entry;
            $field['status'] = 'incomplete';
            if($field['type']=='calculation'){
                $field = qc_formbuilder_do_calculation($field, $entry, $form, $request->getWaId());
            }else if( $field['type']=='html' ){
                $field['config']['default'] =  $field['config']['default'];
            }
            
            return $field;

        }else{
            
            if(isset($mailer['on_insert']) && $mailer['on_insert']==1){
                $answers = qc_form_answer($form, $fields, $entry, $request->getWaId());
                if( !empty( $answers ) ){
                    qcld_wb_chatbot_send_form_query($answers, $mailer, $formid , $request->getWaId());
                }
                
            }
            
            if(!empty($processors) && isset($processors[qc_array_key_first($processors)]['runtimes'])){
                $entrydetails = qc_form_entry_details($form, $fields, $entry, $request->getWaId());
                qcld_wb_chatbot_send_autoresponse($entrydetails, $processors, $formid, $request->getWaId());
            }
            
            $wpdb->insert(
                $wpdb->prefix."wfb_form_entries",
                array(
                    'datestamp'  => current_time( 'mysql', 1 ),
                    'user_id'   => 0,
                    'form_id'	=> $formid,
                    'status'	=> 'active'
                )
            );

            $entry = $wpdb->insert_id;

            $all_answers = qcbot_conv_cookies_data_get( $formid.'_'.$request->getWaId().'_data' );
            
            if( $all_answers && ! empty( $all_answers ) ){
                foreach( $all_answers as $answer ){
                    
                    $table      = $wpdb->prefix . 'wfb_form_entry_values';
                    $valuecheck = $wpdb->get_results( "SELECT * FROM `$table` WHERE 1 and `entry_id` = '" . $entry . "' and `field_id` = '" . $answer->field_id . "'" );
                    if( empty( $valuecheck ) ){
                        $wpdb->insert(
                            $table,
                            array(
                                'entry_id' => $entry,
                                'field_id' => $answer->field_id,
                                'slug'     => ( $answer->slug ),
                                'value'    => stripslashes( $answer->value ),
                            )
                        );
                    }else{
                        $data = array('value'=> stripslashes( $answer->value ));
                        $where = array('entry_id'=>$entry, 'field_id'=> $answer->field_id);
                        $whereformat = array('%d', '%s');
                        $format = array('%s');
                        $wpdb->update( $table, $data, $where, $format, $whereformat );
                        
                    }

                }
            }
            
            return array('status'=>'complete');
        }
        
    }else{

        if(isset($mailer['on_insert']) && $mailer['on_insert']==1){
            $answers = qc_form_answer($form, $fields, $entry, $request->getWaId());
            qcld_wb_chatbot_send_form_query($answers, $mailer, $formid, $request->getWaId());
        }

        if(!empty($processors) && isset($processors[qc_array_key_first($processors)]['runtimes'])){
            $entrydetails = qc_form_entry_details($form, $fields, $entry, $request->getWaId());
            qcld_wb_chatbot_send_autoresponse($entrydetails, $processors, $formid, $request->getWaId());
        }
        
        $wpdb->insert(
            $wpdb->prefix."wfb_form_entries",
            array(
                'datestamp'  => current_time( 'mysql', 1 ),
                'user_id'   => 0,
                'form_id'	=> $formid,
                'status'	=> 'active'
            )
        );

        $entry = $wpdb->insert_id;
        $all_answers = qcbot_conv_cookies_data_get( $formid.'_'.$request->getWaId().'_data' );
        if( $all_answers && ! empty( $all_answers ) ){
            foreach( $all_answers as $answer ){
                
                $wpdb->insert(
                    $wpdb->prefix."wfb_form_entry_values",
                    array(
                        'entry_id'  => $entry,
                        'field_id'   => $answer->field_id,
                        'slug'	=> ($answer->slug),
                        'value'	=> stripslashes($answer->value)
                    )
                );

            }
        }
        qcbot_conv_cookies_data_delete( $formid.'_'.$request->getWaId().'_data' );
        qcbot_conv_cookies_data_delete( $formid.'_'.$request->getWaId() );
        
        return array('status'=>'complete');
    }
    
    die();
}

/**
 * Get field details by field id
 *
 * @param [type] $form
 * @param [type] $fieldid
 * @return void
 */
function qc_get_details_by_fieldid_wa($form, $fieldid){

    $fields = $form['fields'];
    if(isset($fields[$fieldid])){
        return $fields[$fieldid];
    }else{
        return array();
    }

}

/**
 * find STR responses
 *
 * @param Qcld_WA_Request $request
 * 
 * @return void
 */
function qcld_wa_findstrresponses( Qcld_WA_Request $request, $message ) {

    $responses = wpbot_wa_find_response_by_keyword( $message, qcld_wa_currentLanguage() );

    if ( $responses['status'] == 'success' ) {
        $data = $responses['data'];
        if ( $responses['multiple'] ) {
            //multiple

            $responses = array();
            foreach ( $data as $response ) {
                $responses[] = $response['query'];
            }

            
            $formlabel = ( qcld_wa_get_option( 'wa_choose_from_below' ) != '' ? qcld_wa_get_option( 'wa_choose_from_below' ) : esc_html__( 'Please choose from below', 'wpbot-wa' ) ) . "\n";
            $formlabel .= qcld_wa_convert_command_to_number( $responses );
            qcld_wa_set_transient( $request->getWaId() . '_wa_str_buttons', $responses );
            $text = apply_filters( 'qcld_wa_modify_content', $formlabel, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            exit;

        } else {
            //single
            $text = apply_filters( 'qcld_wa_modify_content', $data[0]['response'], $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );

            if( $response && $data[0]['followup'] != '' ){

                $text = apply_filters( 'qcld_wa_modify_content', $data[0]['followup'], $request );
                $response = qcld_wa_send_message( $text, $request->getFrom() );

            }
            exit;
        }
    }
    
}

/**
 * Find Response by Keyword
 * 
 * @param string $keyword
 * 
 * @param string $language
 *
 * @return array
 */
function wpbot_wa_find_response_by_keyword( $keyword, $language ) {

    global $wpdb;
	$table = $wpdb->prefix.'wpbot_response';
	

	$response_result = array();

	$status = array( 'status' => 'fail', 'multiple' => false );
	

	if ( empty( $response_result ) ) {
		$results = $wpdb->get_results( "SELECT `query`, `response`, `custom` FROM `$table` WHERE 1 and `query` = '".$keyword."' and lang='".$language."'" );
		if ( ! empty( $results ) ) {
			foreach ( $results as $result ) {
				
				$response_result[] = array( 'query' => $result->query, 'response' => $result->response, 'followup' => $result->custom, 'score' => 1 );
				
			}
		}
	}
	

	if ( empty( $response_result ) ) {

		$results = $wpdb->get_results( "SELECT * FROM `$table` WHERE 1 and ( CONCAT(',', keyword, ',') like '%,". $keyword .",%' or CONCAT(',', keyword, ',') like '%, ". $keyword .",%' or CONCAT(',', keyword, ',') like '%". $keyword .",%' or CONCAT(',', keyword, ',') like '%, ". $keyword ."%' or CONCAT(',', keyword, ',') like '%,". $keyword ."%' ) and lang = '".$language."' " );
		if ( ! empty( $results ) ) {
			foreach ( $results as $result ) {
				
				$response_result[] = array( 'query' => $result->query, 'response'=> $result->response, 'followup' => $result->custom, 'score' => 1 );
				
			}
		}
	}
	
	if ( empty( $response_result ) ) {
		$results = $wpdb->get_results( "SELECT * FROM `$table` WHERE `query` REGEXP '".$keyword."' and lang='".$language."'" );
		$weight = get_option( 'qc_bot_str_weight' ) != '' ? get_option( 'qc_bot_str_weight' ) : '0.4';
		
		if ( ! empty( $results ) ) {
			foreach ( $results as $result ) {
			
				$response_result[] = array( 'query' => $result->query, 'response' => $result->response, 'followup' => $result->custom, 'score' => 1 );
				
			}
		}
	}

	if ( class_exists( 'Qcld_str_pro' ) ) {
		if ( get_option( 'qc_bot_str_remove_stopwords' ) && get_option( 'qc_bot_str_remove_stopwords' ) == 1 ) {
			$keyword = qc_strpro_remove_stopwords( $keyword );
		}
	}
	
	
	if ( empty( $response_result ) ) {
		$keyword = qc_strpro_remove_stopwords( $keyword );
		$fields = get_option( 'qc_bot_str_fields' );
		if ( $fields && ! empty( $fields ) && class_exists( 'Qcld_str_pro' ) ) {
			$qfields = implode( ', ', $fields );
		} else {
			$qfields = '`query`,`keyword`';
		}

		$results = $wpdb->get_results( "SELECT `query`, `response`, `custom`, MATCH($qfields) AGAINST('".$keyword."' IN NATURAL LANGUAGE MODE) as score FROM $table WHERE MATCH($qfields) AGAINST('".$keyword."' IN NATURAL LANGUAGE MODE) and lang='".$language."' order by score desc limit 15" );

		$weight = get_option( 'qc_bot_str_weight' ) != '' ? get_option( 'qc_bot_str_weight' ) : '0.4';
		//$weight = 0;
		if ( ! empty( $results ) ) {
			foreach ( $results as $result ) {
				if ( $result->score >= $weight ) {
					$response_result[] = array( 'query' => $result->query, 'response' => $result->response, 'followup' => $result->custom, 'score' => $result->score );
				}
			}

			if ( empty( $response_result ) ) {
				if ( ! empty( $results ) ) {
					foreach ( $results as $result ) {
	
						$score_array = str_split( $result->score );
						$score_int = 0;
						foreach ( $score_array as $score ) {
							
							if ( $score != '.' && $score != '0' ) {
								$score_int = (int)$score;
								break;
							}
						}
						$main_score = $result->score;
						if ( $score_int > 0 ) {
							$main_score = '0.'.$score_int;
						}
						if ( $main_score >= $weight ) {
							$response_result[] = array( 'query' => $result->query, 'response' => $result->response, 'followup' => $result->custom, 'score' => $result->score);
						}
					}
				}
	
			}


		}
		
	}


	if ( ! empty( $response_result ) ) {

		if ( count( $response_result ) > 1 ) {
			$status = array( 'status' => 'success', 'multiple' => true, 'data' => $response_result );
		} else {
			$status = array( 'status' => 'success', 'multiple' => false, 'data' => $response_result );
		}

	}
	
    return $status;
}

/**
 * STR Categories
 * 
 * @param Qcld_WA_Request $request
 *
 * @return array
 */
function qcld_wa_strcategories( Qcld_WA_Request $request ) {
    
    $categories = wpbo_wa_search_response_catlist();

    if ( $categories['status'] == 'success' ) {

        $data = $categories['data'];
        if( ! empty( $data ) ) {

            $categories = array();
            foreach ( $data as $category ) {
                $categories[] = $category['name'];
            }

            $text = ( qcld_wa_get_option( 'wa_choose_from_below' ) != '' ? qcld_wa_get_option( 'wa_choose_from_below' ) : esc_html__( 'Please choose from below', 'wpbot-wa' ) ) . "\n";
            $text .= qcld_wa_convert_command_to_number( $categories );
            qcld_wa_set_transient( $request->getWaId() . '_wa_str_buttons', $categories );
            
            


        } else {
            $texts = qcld_wa_get_option( 'qlcd_wp_chatbot_no_result' );
            $text = $texts[array_rand( $texts )];
        }

    } else {

        $texts = qcld_wa_get_option( 'qlcd_wp_chatbot_no_result' );
        $text = $texts[array_rand( $texts )];

    }

    $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
    $response = qcld_wa_send_message( $text, $request->getFrom() );
    exit;

}

/**
 * Return STR Categories
 *
 * @return array $categories
 */
function wpbo_wa_search_response_catlist(){
	global $wpdb;
	$table = $wpdb->prefix.'wpbot_response_category';
	
	$status = array('status'=>'fail');
	$results = $wpdb->get_results("SELECT * FROM `$table` WHERE 1");
	$response_result = array();
	
	if(!empty($results)){
		foreach($results as $result){
			
			$response_result[] = array('name'=>$result->name);
			
		}
	}
	
	if(!empty($response_result)){

		$status = array('status'=>'success', 'data'=>$response_result);

	}
	
	return $status;
	
}

/**
 * STR response by category 
 * 
 * @param Qcld_WA_Request $request
 *
 * @return void
 */
function qcld_wa_strcategory( Qcld_WA_Request $request, $message ) {

    $responses = wpbot_wa_find_response_by_category( $message, qcld_wa_currentLanguage() );

    if ( $responses['status'] == 'success' ) {
        
        $data = $responses['data'];
        if( ! empty( $data ) ) {

            $responses = array();
            foreach ( $data as $response ) {
                $responses[] = $response['query'];
            }

            $text = ( qcld_wa_get_option( 'wa_choose_from_below' ) != '' ? qcld_wa_get_option( 'wa_choose_from_below' ) : esc_html__( 'Please choose from below', 'wpbot-wa' ) ) . "\n";
            $text .= qcld_wa_convert_command_to_number( $responses );
            qcld_wa_set_transient( $request->getWaId() . '_wa_str_buttons', $responses );
            

        } else {
            $texts = qcld_wa_get_option( 'qlcd_wp_chatbot_no_result' );
            $text = $texts[array_rand( $texts )];
        }

    } else {
        $texts = qcld_wa_get_option( 'qlcd_wp_chatbot_no_result' );
        $text = $texts[array_rand( $texts )];
    }

    $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
    $response = qcld_wa_send_message( $text, $request->getFrom() );
    exit;
    
}

/**
 * Find response by category
 *
 * @return void
 */
function wpbot_wa_find_response_by_category( $keyword, $language ) {
    global $wpdb;
	$table      = $wpdb->prefix.'wpbot_response';
    $status = array('status'=>'fail');
    $results    = $wpdb->get_results("SELECT `query`, `response`, `custom` FROM `$table` WHERE 1 and `category` like '%".$keyword."%' and lang='".$language."'");
    $response_result = array();
    if ( ! empty( $results ) ) {
        foreach ( $results as $result ) {
            $response_result[] = array( 'query' => $result->query );
        }
        $status = array( 'status' => 'success', 'data' => $response_result );
    }
    return $status;
}

/**
 * Remove stop words from string
 *
 * @param string $query
 * 
 * @param array $stopwords
 * @return string
 */
function qcpd_remove_wa_stopwords($query, $stopwords){
	return preg_replace('/\b('.implode('|',$stopwords).')\b/','',$query);
}

/**
 * Handle dialogflow responses
 * 
 * @param Qcld_WA_Request $request
 * 
 * @param string $message
 *
 * @return void
 */
function qcld_wa_handle_dialogflow( Qcld_WA_Request $request, $message ) {

    $query = $message;
    
    if($query!=''){

        $result = qc_df_v2_api_wa( $query );

        $result = json_decode( $result, true);
        if(isset($result['queryResult']) && !empty($result['queryResult'])){
        
            $intent = $result['queryResult']['intent']['displayName'];
            if($intent=='Default Fallback Intent'){
                
                //remove stop words
                
                if(qcld_wa_get_option('qlcd_wp_chatbot_stop_words') && qcld_wa_get_option('qlcd_wp_chatbot_stop_words')!=''){
                    
                    $stopwords = explode(',',qcld_wa_get_option('qlcd_wp_chatbot_stop_words'));
                    $query = qcpd_remove_wa_stopwords($query, $stopwords);
                    
                }
                
                //site search code. Checking if any result exists or not.
                $sitesearchresult = qcld_wpbo_search_site_fb($query);

                if($sitesearchresult['status']=='success'){

                    $results = $sitesearchresult['results'];
                    $text = qcld_wa_site_search_result( $results );

                    $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
                    $response = qcld_wa_send_message( $text, $request->getFrom() );
                    exit;
                    
                }else{
                    
                    $text = apply_filters( 'qcld_wa_modify_content', qcld_wa_get_option('qlcd_wp_chatbot_dialogflow_defualt_reply'), $request );
                    $response = qcld_wa_send_message( $text, $request->getFrom() );
                    if ( $response ) {
                        qcld_wa_showstartmenu( $request );
                    }
                    exit;

                }


            }elseif($intent=='faq'){

                qcld_wa_faq( $request, 'show_question' );

            }elseif($intent=='email'){

                qcld_wa_sendusemail( $request );

            }elseif($intent=='phone'){

                qcld_wa_callmeback( $request );

            }elseif($intent=='email subscription'){
                
                qcld_wa_emailsubscription( $request );

            }elseif(isset($result['queryResult']['fulfillmentMessages']) && !empty($result['queryResult']['fulfillmentMessages'])){
                
                $dfmessages = $result['queryResult']['fulfillmentMessages'];
                foreach($dfmessages as $key => $message){
                    
                    if(isset($message['text'])){
                        //text response

                        $text = apply_filters( 'qcld_wa_modify_content', $message['text']['text'][0], $request );
                        $response = qcld_wa_send_message( $text, $request->getFrom() );
                        exit;
                        
                    }elseif(isset($message['quickReplies'])){
                        //quick replies
                        
                        $title = strip_tags($message['quickReplies']['title']);
                        $replies = $message['quickReplies']['quickReplies'];

                        $title .= "\n";
                        $title .= qcld_wa_convert_command_to_number( $replies );
                        qcld_wa_set_transient( $request->getWaId() . '_wa_df_buttons', $replies );

                        $text = apply_filters( 'qcld_wa_modify_content', $title, $request );
                        $response = qcld_wa_send_message( $text, $request->getFrom() );
                        exit;
                        
                    }elseif(isset($message['card'])){
                        
                        $text = apply_filters( 'qcld_wa_modify_content', 'Sorry, Card response not supported yet.', $request );
                        $response = qcld_wa_send_message( $text, $request->getFrom() );
                        exit;
                        
                    }
                    
                }

            }
        }else{

            $text = apply_filters( 'qcld_wa_modify_content', qcld_wa_get_option('qlcd_wp_chatbot_dialogflow_defualt_reply'), $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            if ( $response ) {
                qcld_wa_showstartmenu( $request );
            }
            exit;
            
        }

    }

}

/**
 * display products to whatsapp
 *
 * @param Qcld_WA_Request $request
 * @param array $sitesearchresult
 * @param string $message
 * 
 * @return void
 */
function qcld_wa_display_products( Qcld_WA_Request $request, $sitesearchresult, $message ) {
    if ( isset( $sitesearchresult['status'] ) && $sitesearchresult['status'] == 'success' ) {
        qcld_wa_delete_transient( $request->getWaId() . '_wa_product_search' );
        
        $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_product_success');
        $reply_text = $reply_text[array_rand( $reply_text )];
        $text = apply_filters( 'qcld_wa_modify_content', $reply_text . ' ' . $message, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );

        //Response content
        $response_content = '';
        $product_buttons = array();
        foreach ( $sitesearchresult['results'] as $key => $product ) {
            $link = apply_filters( 'qcld_wa_modify_url', $product['link'], $request );
            $title = apply_filters( 'qcld_wa_modify_content', $product['title'], $request );

            $product_buttons[] = $title . ' - ' . $link;
            $response_content .= $title . "\n";
            $response_content .= $link . "\n";
            $response_content .= 'Price - '. html_entity_decode( $product['subtitle'] ) . "\n";
            $response_content .= 'To order, Press '. ( $key + 1 ) . "\n";
            $response_content .= "\n";
        }

        $text = apply_filters( 'qcld_wa_modify_content', $response_content, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        qcld_wa_set_transient( $request->getWaId() . '_wa_product_showing', 1 );
        qcld_wa_set_transient( $request->getWaId() . '_wa_product_buttons', $product_buttons );
        exit;

    } else {

        $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_product_fail');
        $reply_text = $reply_text[array_rand( $reply_text )];
        $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        exit;
        
    }
}

/**
 * Product search function
 *
 * @param Qcld_WA_Request $request
 * @param string $message
 * @param integer $step
 * @return void
 */
function qcld_wa_product_search( Qcld_WA_Request $request, $message, $step = 1 ) {

    if ( $step === 1 ) {
        
        qcld_wa_set_transient( $request->getWaId() . '_wa_product_search', 1 );
        $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_product_asking');
        $reply_text = $reply_text[array_rand( $reply_text )];
        $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        exit;

    } elseif ( $step === 2 ) {
        
        $sitesearchresult = qcld_wa_psearch_fnc($message);
        qcld_wa_display_products( $request, $sitesearchresult, $message );
    }
    
}

/**
 * Sale products
 *
 * @param Qcld_WA_Request $request
 * @param string $message
 * @return void
 */
function qcld_wa_sale_products( Qcld_WA_Request $request, $message ) {
    $searchresults = qcld_wa_sales_product();
    qcld_wa_display_products( $request, $searchresults, $message );
}

/* Sale Product */
function qcld_wa_sales_product() {

    $product_per_page = (qcld_fb_get_option('wppt_number_of_result')==''?'5':qcld_fb_get_option('wppt_number_of_result'));
	$product_orderby = (qcld_fb_get_option('wppt_result_orderby')==''?'title':qcld_fb_get_option('wppt_result_orderby'));
	$product_order = (qcld_fb_get_option('wppt_result_order')==''?'ASC':qcld_fb_get_option('wppt_result_order'));
    //get sale products query.
    $argu_params = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'ignore_sticky_posts' => 1,
        'posts_per_page' => $product_per_page,
        'orderby' => $product_orderby,
        'order' => $product_order,
        //'offset' => $offset,
        'meta_query' => WC()->query->get_meta_query(),
        'post__in' => array_merge(array(0), wc_get_product_ids_on_sale())
    );
	
	$response = array();
	$response['status'] = 'fail';
	
    /******
     *WP Query Operation to get products.*
     *******/
    $product_query = new WP_Query($argu_params);
    $product_num = $product_query->post_count;
    //Getting total product number by string.
    $total_argu = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'posts_per_page' => 100,
        'meta_query' => WC()->query->get_meta_query(),
        'post__in' => array_merge(array(0), wc_get_product_ids_on_sale())
    );
    $total_query = new WP_Query($total_argu);
    $total_product_num = $total_query->post_count;
    
    $_pf = new WC_Product_Factory();
    //repeating the products
    if ($product_num > 0) {
        
        $response['status'] = 'success';
		$response['results'] = array();
		
        while ($product_query->have_posts()) : $product_query->the_post();
            $product = $_pf->get_product(get_the_ID());
            if ($product->is_visible()) { // Display if visible

				$response['results'][] = array(
					'imgurl'=>get_the_post_thumbnail_url(get_the_ID(), 'full'),
					'link'=>get_permalink(get_the_ID()),
					'title'=>$product->get_title(),
					'subtitle'=>get_woocommerce_currency_symbol().wc_get_price_to_display( $product, array( 'price' => $product->get_price() ) )
				);
				
            }
        endwhile;
        wp_reset_postdata();
        
    }else{
		
		$response['message'] = '';
	}
    
	return $response;
    wp_die();
}

/**
 * Featured Products
 *
 * @param Qcld_WA_Request $request
 * @param string $message
 * @return void
 */
function qcld_wa_featured_products( Qcld_WA_Request $request, $message ) {

    $sitesearchresult = qcld_wa_chatbot_keyword_featured();
    qcld_wa_display_products( $request, $sitesearchresult, $message );

}

/**
 * Find all featured products
 *
 * @return void
 */
function qcld_wa_chatbot_keyword_featured()
{
	
	$product_per_page = (qcld_fb_get_option('wppt_number_of_result')==''?'5':qcld_fb_get_option('wppt_number_of_result'));
	$product_orderby = (qcld_fb_get_option('wppt_result_orderby')==''?'title':qcld_fb_get_option('wppt_result_orderby'));
	$product_order = (qcld_fb_get_option('wppt_result_order')==''?'ASC':qcld_fb_get_option('wppt_result_order'));

    //get featured products query.
    $argu_params = array(
        'posts_per_page' => $product_per_page,
        'post_type' => 'product',
        'post_status' => 'publish',
        'tax_query' => array(array('taxonomy' => 'product_visibility', 'field' => 'name', 'terms' => 'featured'))
    );
    /******
     *WP Query Operation to get products.*
     *******/
    $product_query = new WP_Query($argu_params);
    $product_num = $product_query->post_count;
    //Getting total product number by string.
    $total_argu = array(
        'posts_per_page' => 100,
        'post_type' => 'product',
        'post_status' => 'publish',
        'tax_query' => array(array('taxonomy' => 'product_visibility', 'field' => 'name', 'terms' => 'featured',),)
    );
    $total_query = new WP_Query($total_argu);
    $total_product_num = $total_query->post_count;
	
    $response = array();
	$response['status'] = 'fail';
	
    $_pf = new WC_Product_Factory();
    //repeating the products
    if ($product_num > 0) {
        $response['status'] = 'success';
		$response['results'] = array();
       
        while ($product_query->have_posts()) : $product_query->the_post();
            $product = $_pf->get_product(get_the_ID());
            if ($product->is_visible()) { // Display if visible
                
				$response['results'][] = array(
					'imgurl'=>get_the_post_thumbnail_url(get_the_ID(), 'full'),
					'link'=>get_permalink(get_the_ID()),
					'title'=>$product->get_title(),
					'subtitle'=>get_woocommerce_currency_symbol().wc_get_price_to_display( $product, array( 'price' => $product->get_price() ) )
				);
				
            }
        endwhile;
        wp_reset_postdata();
        
        
    }else{
		
		$response['message'] = '';
	}
	
	return $response;
    wp_die();
    
}

/**
 * Order status
 *
 * @param Qcld_WA_Request $request
 * @param string $message
 * @param integer $step
 * @return void
 */
function qcld_wa_order_status( Qcld_WA_Request $request, $message, $step = 1 ) {

    if ( $step === 1 ) {

        //qlcd_wp_chatbot_order_welcome
        $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_order_welcome');
        $reply_text = $reply_text[array_rand( $reply_text )];
        $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );

        $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_order_email');
        $reply_text = $reply_text[array_rand( $reply_text )];
        $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        qcld_wa_set_transient( $request->getWaId() . '_wa_order_status', 1 );
        exit;

    } elseif ( $step === 2 ) {

        qcld_wa_set_transient( $request->getWaId() . '_wa_order_status', 2 );
        qcld_wa_set_transient( $request->getWaId() . '_wa_order_status_email', $message );

        $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_order_id');
        $reply_text = $reply_text[array_rand( $reply_text )];
        $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        exit;

    } elseif ( $step === 3 ) {

        $order_id = $message;
        $email = qcld_wa_get_transient( $request->getWaId() . '_wa_order_status_email' );

        qcld_wa_delete_transient( $request->getWaId() . '_wa_order_status' );
        qcld_wa_delete_transient( $request->getWaId() . '_wa_order_status_email' );

        if ( $order_id != '' && $email != '' ) {
            $results = qcld_wa_find_orders( $email, $order_id );

            if ( isset( $results['status'] ) && $results['status'] == 'success' ) {

                
                $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_order_found');
                $reply_text = $reply_text[array_rand( $reply_text )];
                $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
                $response = qcld_wa_send_message( $text, $request->getFrom() );

                $orders = $results['orders'];
                $response_content = '';

                foreach ( $orders as $order ) {
                    $response_content .= 'Order ID: ' . $order->ID . "\n" ;
                    $response_content .= 'Order Date: ' . (date("m/d/Y", strtotime($order->post_date))) . "\n" ;

                    //order items
                    
                    $singleOrder = new WC_Order($order->ID);
                    $items = $singleOrder->get_items();
                    if ( !empty( $items ) ) {
                        $response_content .= 'Order Items:'. "\n";
                        $items_content = '';
                        foreach ($items as $item) {
                            $response_content .= ' -' . ($item["name"]) . ' X ' . ($item["qty"]) . "\n";
                        }
                    }

                    //Order Notes
                    $customernote = $singleOrder->get_customer_order_notes();
                    if(!empty($customernote)){
                        $response_content .= 'Order Notes:'."\n";
                        foreach($customernote as $cnote){
                            $response_content .= ' -'.($cnote->comment_content). "\n";
                        }
                    }

                    $response_content .= 'Order Status: ' . (strtoupper(end(explode("-", $order->post_status)))) . "\n" ;
                    $response_content .= "\n";
                }

                $text = apply_filters( 'qcld_wa_modify_content', $response_content, $request );
                $response = qcld_wa_send_message( $text, $request->getFrom() );
                exit;

            } else {

                $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_order_not_found');
                $reply_text = $reply_text[array_rand( $reply_text )];
                $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
                $response = qcld_wa_send_message( $text, $request->getFrom() );
                exit;     

            }

        } else {

            $reply_text = qcld_wa_get_option('qlcd_wp_chatbot_order_not_found');
            $reply_text = $reply_text[array_rand( $reply_text )];
            $text = apply_filters( 'qcld_wa_modify_content', $reply_text, $request );
            $response = qcld_wa_send_message( $text, $request->getFrom() );
            exit;

        }
        //

    }

}

/**
 * product order
 *
 * @param Qcld_WA_Request $request
 * @param string $message
 * @param integer $step
 * @return void
 */
function qcld_wa_product_order( Qcld_WA_Request $request, $message, $step = 1 ) {

    if ( $step === 1 ) {

        // ask email address
        if ( ! qcld_wa_get_transient( $request->getWaId() . '_wa_order_email' ) ) {
            qcld_wa_set_transient( $request->getWaId() . '_wa_order_email', 1 );
            qcld_wa_set_transient( $request->getWaId() . '_wa_order_product', $message );
        }
        $texts = maybe_unserialize( qcld_wa_get_option( 'qlcd_wp_chatbot_asking_email' ) );
        $text = $texts[array_rand( $texts )];
        $text = apply_filters( 'qcld_wa_modify_content', $text, $request );
        $response = qcld_wa_send_message( $text, $request->getFrom() );
        exit;

    } elseif ( $step === 2 ) {

        $result = qcld_wa_send_order_to_admin( $request, $message, qcld_wa_get_transient( $request->getWaId() . '_wa_order_product' ) );

        if ( isset( $result['status'] ) == 'success' ) {
            
            $text = apply_filters( 'qcld_wa_modify_content', ( qcld_wa_get_option( 'wa_order_complete_acknowledgement' ) != '' ? qcld_wa_get_option( 'wa_order_complete_acknowledgement' ) : esc_html__( 'Thank you for your order request. We will get in touch with you soon!' ) ), $request );

            $response = qcld_wa_send_message( $text, $request->getFrom() );
            if ( $response ) {
                qcld_wa_delete_transient( $request->getWaId() . '_wa_order_email' );
                qcld_wa_delete_transient( $request->getWaId() . '_wa_order_product' );
            }
            exit;
        }
    }

}

/**
 * Send order email to admin
 *
 * @param Qcld_WA_Request $request
 * @param string $email
 * @param string $product
 * @return array
 */
function qcld_wa_send_order_to_admin( Qcld_WA_Request $request, $email, $product ) {

    $name                   = $request->getProfileName();
    $subject                = 'Product order request from WhatsApp by ' . $name;

    $product = explode( ' - ', $product );
    $product_name = ( isset( $product[0] ) ? $product[0]: '' );
    $product_url = ( isset( $product[1] ) ? $product[1]: '' );

    //Extract Domain
    $url                    = get_site_url();
    $url                    = parse_url( $url );
    $domain                 = $url['host'];
    $admin_email            = qcld_wa_get_option( 'admin_email' );
    $toEmail                = qcld_wa_get_option( 'qlcd_wp_chatbot_admin_email' ) != '' ? qcld_wa_get_option( 'qlcd_wp_chatbot_admin_email' ) : $admin_email;
    $fromEmail              = "wordpress@" . $domain;
    //Starting messaging and status.
    $response['status']     = 'fail';
    $response['message']    = esc_html( str_replace( '\\', '', qcld_wa_get_option( 'qlcd_wp_chatbot_email_fail' ) ) );

    //build email body
    $bodyContent            = "";
    $bodyContent           .= '<p><strong>' . esc_html__( 'Order Details', 'wpbot-wa' ) . ':</strong></p><hr>';
    $bodyContent           .= '<p>' . esc_html__( 'Name', 'wpbot-wa' ) . ' : ' . esc_html( $name ) . '</p>';
    $bodyContent           .= '<p>' . esc_html__( 'Email', 'wpbot-wa' ) . ' : ' . esc_html( $email ) . '</p>';
    $bodyContent           .= '<p>' . esc_html__( 'Phone', 'wpbot-wa' ) . ' : ' . esc_html( $request->getWaId() ) . '</p>';
    $bodyContent           .= '<p>' . esc_html__( 'Product Name', 'wpbot-wa' ) . ' : ' . esc_html( $product_name ) . '</p>';
    $bodyContent           .= '<p>' . esc_html__( 'Product URL', 'wpbot-wa' ) . ' : <a href=" '. esc_url( $product_url ) .' ">' . esc_url( $product_url ) . '</a></p>';
    $bodyContent           .= '<p>' . esc_html__( 'Mail Generated on', 'wpchatbot' ) . ': ' . date( 'F j, Y, g:i a' ) . '</p>';
    $to                     = $toEmail;
    $body                   = $bodyContent;

    $headers                = array();
    $headers[]              = 'Content-Type: text/html; charset=UTF-8';
    $headers[]              = 'From: ' . esc_html( $name ) . ' <' . esc_html( $fromEmail ) . '>';

    wp_mail( $to, $subject, $body, $headers );
    $text = ( qcld_wa_get_option( 'qlcd_wp_chatbot_email_sent' ) != '' ? qcld_wa_get_option( 'qlcd_wp_chatbot_email_sent' ) : 'Your email was sent successfully. Thanks!' );
    
    $response['message'] = $text;
    $response['status']  = 'success';

    return $response;
}

/**
 * Find orders by email and order id
 *
 * @param string $email
 * @param string $order_id
 * @return array
 */
function qcld_wa_find_orders( $email, $order_id ) {

    $response = array();
    $response['status'] = 'failed';

    // The query arguments
    $customer_orders = get_posts(array(
        'numberposts' => -1,
        'meta_key' => '_billing_email',
        'meta_value' => $email,
        'post_type' => wc_get_order_types(),
        'post_status' => array_keys(wc_get_order_statuses()),
        'posts_per_page' => 10,
        'orderby' => 'date',
        'post__in' => array($order_id)
    ));

    $response['order_num'] = count($customer_orders);
    if ( $response['order_num'] > 0 ) {
        $response['status'] = 'success';
        $response['orders'] = $customer_orders;
    }

    return $response;
}

/**
 * Dialogflow API
 *
 * @param [type] $query
 * @param [type] $helper
 * @return string
 */
function qc_df_v2_api_wa( $query ){
	
	$session_id = 'asd2342sde';
    $language = qcld_wa_get_option('qlcd_wp_chatbot_dialogflow_agent_language');
    //project ID
    $project_ID = qcld_wa_get_option('qlcd_wp_chatbot_dialogflow_project_id');
    // Service Account Key json file
    $JsonFileContents = qcld_wa_get_option('qlcd_wp_chatbot_dialogflow_project_key');
    if($project_ID==''){
        return json_encode(array('error'=>'Project ID is empty'));
    }
    if($JsonFileContents==''){
        return json_encode(array('error'=>'Key is empty'));
    }
    if( $query==''){
        return json_encode(array('error'=>'Query text is not added!'));
    }
    $query = sanitize_text_field($query);
    if(isset($_POST['sessionid']) && $_POST['sessionid']!=''){
        $session_id = sanitize_text_field($_POST['sessionid']);
    }
    

    if(file_exists(QCLD_wpCHATBOT_GC_DIRNAME.'/autoload.php')){

        require(QCLD_wpCHATBOT_GC_DIRNAME.'/autoload.php');

        $client = new \Google_Client();
        $client->useApplicationDefaultCredentials();
        $client->setScopes (['https://www.googleapis.com/auth/dialogflow']);
        // Convert to array 
        $array = json_decode($JsonFileContents, true);
        $client->setAuthConfig($array);

        try {
            $httpClient = $client->authorize();
            $apiUrl = "https://dialogflow.googleapis.com/v2/projects/{$project_ID}/agent/sessions/{$session_id}:detectIntent";

            $response = $httpClient->request('POST', $apiUrl, [
                'json' => ['queryInput' => ['text' => ['text' => $query, 'languageCode' => $language]],
                    'queryParams' => ['timeZone' => '']]
            ]);
            
            $contents = $response->getBody()->getContents();
            return $contents;

        }catch(Exception $e) {
            return json_encode(array('error'=>$e->getMessage()));
        }

    }else{
        return json_encode(array('error'=>'API client not found'));
    }
	
}

/* WPBot Product Search function */
function qcld_wa_psearch_fnc($keyword){
	global $wpdb;
	
	$total_items = (qcld_fb_get_option('wppt_number_of_result')==''?'5':qcld_fb_get_option('wppt_number_of_result'));
	$orderby = (qcld_fb_get_option('wppt_result_orderby')==''?'none':qcld_fb_get_option('wppt_result_orderby'));
	$order = (qcld_fb_get_option('wppt_result_order')==''?'ASC':qcld_fb_get_option('wppt_result_order'));
	$thumb = (qcld_fb_get_option('wpbot_search_image_size')?qcld_fb_get_option('wpbot_search_image_size'):'thumbnail');
	//order by setup

	$searchkeyword = ($keyword);

	$response = array();
	$response['status'] = 'fail';


		$sql = "SELECT * FROM ". $wpdb->prefix."posts where post_type in ('product') and post_status='publish' and ((post_title REGEXP '[[:<:]]".$searchkeyword."[[:>:]]'))";
		$total_results = $wpdb->get_results($sql);

		if(!empty($total_results)){
			if($orderby=='title'){
				$orderby = 'post_title';
			}
			if($orderby=='date'){
				$orderby = 'post_date';
			}
			if($orderby=='modified'){
				$orderby = 'post_modified';
			}
			
			if($orderby!='none' and $orderby!='rand'){
				$sql .= " order by $orderby $order";
			}
			$limit = " Limit 0, $total_items";		
			$results = $wpdb->get_results($sql.$limit);
		}else{
			$query_arg = array(
				'post_type'     => 'product',
				'post_status'   => 'publish',
				'posts_per_page'=> $total_items,
				's'             => stripslashes( $keyword ),
				'paged'			=> 1,
				'orderby'		=> $orderby,
			);
			if($orderby!='none' or $orderby!='rand'){
				$query_arg['order'] = $order;
			}			

			$resultss = new WP_Query( $query_arg );
			$results = $resultss->posts;
			
		}

		$newresults = array();
		foreach($results as $result){
			if (qcld_wp_chatbot_product_controlling($result->ID) == true) {
				$newresults[] = $result;
			}
		}
		$results = $newresults;
		$_pf = new WC_Product_Factory();
		
		if (!empty( $results ) ) {
			$response['status'] = 'success';
			$response['results'] = array();
			
			foreach ( $results as $result ) {
				
				$product = $_pf->get_product($result->ID);
				
				$response['results'][] = array(
					'imgurl'=>get_the_post_thumbnail_url($result->ID, 'full'),
					'link'=>get_permalink($result->ID),
					'title'=>$product->get_title(),
					'subtitle'=> get_woocommerce_currency_symbol().wc_get_price_to_display( $product, array( 'price' => $product->get_price() ) )
				);

			}

		}
		wp_reset_query();
		
	
	return $response;
    wp_die();
	
}

/**
 * Undocumented function
 *
 * @param Qcld_WA_Request $request
 * @return void
 */
function qcld_wa_show_languages( Qcld_WA_Request $request ) {

    $title = qcld_wa_get_option( 'wa_choose_language' );

    $languages = qcld_wpbotml()->languages;

    $all_menu = array();
    foreach ( $languages as $language ) {
        $all_menu[] = $language;
    }

    $title .= "\n";
    $title .= qcld_wa_convert_command_to_number( $all_menu );
    qcld_wa_set_transient( $request->getWaId() . '_wa_languages', $all_menu );

    $text = apply_filters( 'qcld_wa_modify_content', $title, $request );
    $response = qcld_wa_send_message( $text, $request->getFrom() );
    exit;
}


Youez - 2016 - github.com/yon3zu
LinuXploit