PluginProbe
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services / 8.2.0
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services v8.2.0
8.7.8 8.7.7 8.7.6 8.7.5 8.7.4 8.7.3 8.7.2 8.7.1 8.7.0 8.6.9 8.6.8 8.6.7 8.6.6 8.6.5 8.6.4 8.6.2 8.6.1 8.6.0 8.5.9 8.5.8 8.5.7 8.5.6 8.5.5 8.5.4 8.5.3 All 534 releases
chatbot / includes / class-common-function.php

class-common-function.php in WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services 8.2.0, at includes/class-common-function.php

354 lines 13.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if (!defined('ABSPATH')) exit; // Exit if accessed directly
3 /**
4 * Common functions class
5 */
6 class Qcld_WPBot_Common_Functions {
7
8
9 private static $instance = null;
10
11 public static function instance() {
12 if ( is_null( self::$instance ) ) {
13 self::$instance = new self();
14 }
15 return self::$instance;
16 }
17
18 private function __construct() {
19 add_action('wp_ajax_wpbot_save_feedback', array( $this, 'wpbot_save_feedback') );
20 add_action('wp_ajax_nopriv_wpbot_save_feedback', array( $this,'wpbot_save_feedback') );
21 add_action( 'wp_ajax_wpbot_save_report', array( $this, 'wpbot_save_report') );
22 add_action( 'wp_ajax_nopriv_wpbot_save_report', array( $this, 'wpbot_save_report') );
23 add_action('wp_ajax_nopriv_get_relevant_pages', array($this, 'qcld_get_relevant_pages_ajax'));
24 add_action('wp_ajax_rate_limit_settings_option', array($this, 'rate_limit_settings_option_callback'));
25 register_activation_hook(__FILE__, array('qcld_wpopenai_addons', 'schedule_rate_limit_reset_events'));
26 add_filter('cron_schedules', array($this, 'qcld_user_role_rate_cron_schedule'));
27 add_action('rate_limit_checker', array($this, 'rate_limit_checker'));
28 add_action('qcld_openai_user_rate_cal', array($this, 'qcld_openai_user_rate_cal'));
29 add_action('reset_rate_limit_used_counts', [$this, 'reset_rate_limit_used_counts'], 10, 1);
30
31 }
32 /**
33 * Remove stopwords from search query
34 *
35 * @param string $query The search query
36 * @param array $stopwords Array of stopwords to remove
37 * @return string Query with stopwords removed
38 */
39 public static function qcpd_remove_wa_stopwords($query, $stopwords) {
40 return preg_replace('/\b('.implode('|',$stopwords).')\b/','',$query);
41 }
42
43 /**
44 * Get relevant page links based on search query
45 *
46 * @param string $search_query The search query
47 * @return array Array of relevant page links
48 */
49 public static function qcpd_relevant_pagelink($search_query) {
50 $stopwords = explode(',', get_option('qlcd_wp_chatbot_stop_words'));
51
52 $finalQueryWordsWithoutStopWords = self::qcpd_remove_wa_stopwords(strtolower($search_query), $stopwords);
53
54 $cleanWordsWithoutPunctuationMarks = preg_replace('/[\p{P}]/u', '', $finalQueryWordsWithoutStopWords);
55
56 $q = trim($cleanWordsWithoutPunctuationMarks);
57
58 $links = [];
59
60 $post_type_array = get_option('qcld_openai_relevant_post');
61
62 $the_query = new WP_Query(array(
63 'post_status' => 'publish',
64 'posts_per_page' => 5,
65 's' => esc_attr($q),
66 'post_type' => $post_type_array
67 ));
68
69 if($the_query->have_posts()) {
70 while($the_query->have_posts()) {
71 $the_query->the_post();
72
73 $url = esc_url(get_permalink());
74 $link = '<a href=' . $url . ' target="_blank">' . get_the_title() . '</a>';
75 array_push($links, $link);
76 }
77 wp_reset_postdata();
78 }
79
80 $links = array_unique($links);
81 return $links;
82 }
83
84
85 public function wpbot_save_feedback() {
86 check_ajax_referer('wp_chatbot', 'nonce');
87 global $wpdb;
88
89 $table = $wpdb->prefix . 'wpbot_chat_report';
90
91 $user_id = intval(wp_unslash($_POST['user_id']));
92 $conversation_id= intval(wp_unslash($_POST['conversation_id']));
93 $message = sanitize_text_field(wp_unslash($_POST['message']));
94 $feedback = sanitize_text_field(wp_unslash($_POST['feedback'])); // "like" or "dislike"
95 $meta_info = sanitize_textarea_field(wp_unslash($_POST['meta_info']));
96 $date = current_time('mysql');
97
98 $inserted = $wpdb->insert($table, array(
99 'user_id' => $user_id,
100 'conversation_id'=> $conversation_id,
101 'message' => $message,
102 'feedback' => $feedback,
103 'meta_info' => $meta_info,
104 'created_at' => $date
105 ));
106
107 if ($inserted !== false) {
108 wp_send_json_success(array('message' => 'Feedback saved.'));
109 } else {
110 wp_send_json_error(array('message' => 'Failed to save feedback.'));
111 }
112 }
113
114 /**
115 * Save report func
116 *
117 */
118
119
120 public function wpbot_save_report() {
121 check_ajax_referer('wp_chatbot', 'nonce');
122 global $wpdb;
123 $table_report = $wpdb->prefix . 'wpbot_chat_report';
124
125 $email = sanitize_email(wp_unslash($_POST['email']));
126 $message = sanitize_textarea_field(wp_unslash($_POST['message']));
127 $report_text = sanitize_textarea_field(wp_unslash($_POST['report_text']));
128
129 $wpdb->insert(
130 $table_report,
131 [
132 'user_id' => get_current_user_id(), // or match from wpbot_user.
133 'message' => $message,
134 'meta_info' => maybe_serialize( [ 'email' => $email, 'report_text' => $report_text ] ),
135 ],
136 [ '%d', '%s', '%s' ]
137 );
138
139 // Send report email to admin
140 $admin_email = get_option( 'admin_email' );
141 $subject = "New Chat Report";
142 $body = "Reported Message:\n{$message}\n\nReport Text:\n{$report_text}\n\nUser Email: {$email}";
143 wp_mail( $admin_email, $subject, $body );
144
145 wp_send_json_success();
146 }
147 public function rate_limit_settings_option_callback()
148 {
149 // Check is admin and verify nonce
150 if (! current_user_can('manage_options')) {
151 wp_send_json_error('Unauthorized');
152 wp_die();
153 }
154 check_ajax_referer( 'wp_chatbot_admin', 'nonce' );
155 // Save the rate limiting enabled/disabled setting
156 if (isset($_POST['is_rate_limiting_enabled'])) {
157 $is_rate_limiting_enabled = intval( wp_unslash( $_POST['is_rate_limiting_enabled'] ) );
158 update_option('is_rate_limiting_enabled', $is_rate_limiting_enabled);
159 }
160 // Save the rate limits for each role
161 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
162 if (isset($_POST['rate_limits']) && is_array( $_POST['rate_limits'] )) {
163 $rate_limits = array_map( 'sanitize_text_field', wp_unslash( $_POST['rate_limits'] ) );
164 foreach ($rate_limits as $role => $limit) {
165 $option_name = 'rate_limit_' . sanitize_key( $role );
166 $limit_value = intval($limit);
167 update_option($option_name, $limit_value);
168 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
169 $timeframe_raw = isset( $_POST['rate_limit_timeframes'][ $role ] ) ? sanitize_text_field( wp_unslash( $_POST['rate_limit_timeframes'][ $role ] ) ) : '24';
170 $timeframe = intval($timeframe_raw) * 3600; // Convert hours to seconds
171 update_option('rate_limit_timeframe_' . $role, $timeframe);
172 }
173 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
174 $guest_timeframe_raw = isset( $_POST['rate_limit_timeframes']['guest'] ) ? sanitize_text_field( wp_unslash( $_POST['rate_limit_timeframes']['guest'] ) ) : '24';
175 $timeframe = intval($guest_timeframe_raw) * 3600; // Convert hours to seconds
176 update_option('rate_limit_timeframe_guest', $timeframe);
177 }
178 // In your rate_limit_settings_option_callback(), after updating options:
179 $this->schedule_rate_limit_reset_events();
180 wp_send_json_success('Settings saved');
181 wp_die();
182 }
183 public function qcld_user_role_rate_cron_schedule($schedules)
184 {
185 $roles = wp_roles()->roles;
186 foreach ($roles as $role => $details) {
187 $timeframe = intval(get_option('rate_limit_timeframe_' . $role, true));
188 // Minimum 3600 seconds
189 $schedules['session_schedules_rate_limit_' . $role] = array(
190 'interval' => $timeframe,
191 'display' => esc_html( 'session_schedules_rate_limit_' . $role ),
192 );
193 // Schedule the cron job for each role if not already scheduled);
194 }
195 return $schedules;
196 }
197 // wpshedule event to reset the rate limit used counts
198 public function schedule_rate_limit_reset_events()
199 {
200 // Ensure WordPress cron functions are available
201 if (! function_exists('wp_schedule_event')) {
202 require_once ABSPATH . 'wp-includes/wp-cron.php';
203 }
204 $roles = wp_roles()->roles;
205 foreach ($roles as $role => $d) {
206 // Unschedule all existing events for this role
207 $timestamp = wp_next_scheduled('reset_rate_limit_used_counts', array($role));
208 while ($timestamp) {
209 wp_unschedule_event($timestamp, 'reset_rate_limit_used_counts', array($role));
210 $timestamp = wp_next_scheduled('reset_rate_limit_used_counts', array($role));
211 }
212 // Schedule new event with updated interval
213 wp_schedule_event(time(), 'session_schedules_rate_limit_' . $role, 'reset_rate_limit_used_counts', array($role));
214 }
215 }
216 public function qcld_wpsession_cron_deactivation()
217 {
218 $timestamp = wp_next_scheduled('reset_rate_limit_used_counts');
219 wp_unschedule_event($timestamp, 'reset_rate_limit_used_counts');
220 }
221 public function rate_limit_checker()
222 {
223 $qlcd_wp_chatbot_ai_rate_limiting_message = qcld_wb_chatbot_func_str_replace(
224 maybe_unserialize(get_option('qlcd_wp_chatbot_ai_rate_limiting_message', true))
225 );
226 if (get_option('is_stream_enabled') == 1) {
227 $response = array(
228 'status' => 'error',
229 'message' => esc_html__((is_array($qlcd_wp_chatbot_ai_rate_limiting_message) && !empty($qlcd_wp_chatbot_ai_rate_limiting_message[0]) ? $qlcd_wp_chatbot_ai_rate_limiting_message[0] : 'Rate limit exceeded. Please try again later.'), 'chatbot'),
230
231 );
232 } else {
233 $response = array(
234 'status' => 'success',
235 'message' => esc_html__((is_array($qlcd_wp_chatbot_ai_rate_limiting_message) && !empty($qlcd_wp_chatbot_ai_rate_limiting_message[0]) ? $qlcd_wp_chatbot_ai_rate_limiting_message[0] : 'Rate limit exceeded. Please try again later.'), 'chatbot'),
236 );
237 }
238 if (is_user_logged_in()) {
239 $user = wp_get_current_user();
240 if (! empty($user->roles) && is_array($user->roles)) {
241 $role = $user->roles[0];
242 $option_name = 'rate_limit_' . $role;
243 $limit = get_option($option_name);
244 $rate_limit = get_user_meta(get_current_user_id(), 'qcld_openai_user_rate_limit', true);
245 if (($limit >= $rate_limit) || $limit == 0) {
246 return; // allowed
247 } else {
248 if (get_option('is_stream_enabled') == 1) {
249 wp_send_json($response); //Proper JSON with header.
250 } else {
251 echo json_encode($response);
252 wp_die();
253 }
254 }
255 }
256 } else {
257 $option_name = 'rate_limit_guest';
258 $limit = get_option($option_name);
259
260 if (session_status() == PHP_SESSION_NONE) {
261 session_start();
262 }
263
264 $guest_rate_limit = isset($_SESSION['guest_rate_limit']) ? intval($_SESSION['guest_rate_limit']) : 0;
265
266 if ($limit >= $guest_rate_limit || $limit == 0) {
267 return; // allowed
268 } else {
269 if (get_option('is_stream_enabled') == 1) {
270 wp_send_json($response); //Proper JSON with header.
271 } else {
272 echo json_encode($response);
273 // Return role if limit exceeded
274 wp_die();
275 }
276 }
277 }
278 }
279
280 public function reset_rate_limit_used_counts($role)
281 {
282 if (empty($role)) {
283 return;
284 }
285 // Resetting rate limit used counts for role.
286 // loop through each role
287 // for each role get all users with that role
288 $roles = wp_roles()->roles;
289 foreach ($roles as $list_roll => $details) {
290 if ($list_roll != $role) {
291 continue;
292 } else {
293 $option_name = 'rate_limit_' . $role;
294 $limit = get_option($option_name); // Default to if not set
295 $users = get_users(array('role' => $role));
296 foreach ($users as $user) {
297 update_user_meta($user->ID, 'qcld_openai_user_rate_limit', 0);
298 }
299 }
300 }
301 }
302 public function qcld_openai_user_rate_cal($update)
303 {
304 if (is_user_logged_in()) {
305 $rate_limit = get_user_meta(get_current_user_id(), 'qcld_openai_user_rate_limit', true);
306 if ($update != '') {
307 $rate_limit = intval($rate_limit) + intval($update);
308 }
309 update_user_meta(get_current_user_id(), 'qcld_openai_user_rate_limit', $rate_limit);
310 return;
311 } else {
312 // for guest users we will use session to store the rate limit
313 // if session is not started then start it
314 if (session_status() == PHP_SESSION_NONE) {
315 session_start();
316 }
317 // we will use guest_id to identify the guest user
318 if (! isset($_SESSION['guest_id'])) {
319 $user_ip = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : '';
320 $session_id = md5($user_ip . time());
321 $_SESSION['guest_id'] = $session_id;
322 $_SESSION['guest_id_time'][$session_id] = time();
323 get_option('rate_', 10);
324 // if guest_id_time is set and it is older than 24 hours then unset the guest_id
325 // we will store the time when the guest_id was created in session
326 $timeframe = get_option('rate_limit_timeframe_guest', true);
327 $timeframe = intval($timeframe) * 3600; // convert hours to seconds
328 if (isset($_SESSION['guest_id_time'][$session_id]) && (time() - $_SESSION['guest_id_time'][$session_id]) > $timeframe) {
329 unset($_SESSION['guest_id']);
330 unset($_SESSION['guest_id_time']);
331 }
332 // we will store the time when the guest_id was created in session
333 $_SESSION['guest_id_time'][$session_id] = time();
334 $_SESSION['guest_rate_limit'] = 0;
335 }
336 // update the rate limit
337 // if update is not empty then add it to the existing rate limit else set it
338 if ($update != '') {
339 $guest_rate_limit = isset($_SESSION['guest_rate_limit']) ? intval($_SESSION['guest_rate_limit']) : 0;
340 // add the update to the existing rate limit
341 // set the rate limit in session
342 $_SESSION['guest_rate_limit'] = $guest_rate_limit + $update;
343 return;
344 }
345 }
346 }
347
348 }
349
350 /**
351 * Instantiate the class
352 */
353 Qcld_WPBot_Common_Functions::instance();
354