PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.4.8
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.4.8
3.5.8 3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / modules / chatbot.php
ai-engine / classes / modules Last commit date
chatbot-chatgpt.css 3 years ago chatbot-chatgpt.scss 3 years ago chatbot.php 3 years ago
chatbot.php
473 lines
1 <?php
2
3 class Meow_MWAI_Modules_Chatbot {
4 private $core = null;
5 private $namespace = 'ai-engine/v1';
6
7 public function __construct() {
8 global $mwai_core;
9 $this->core = $mwai_core;
10 if ( is_admin() ) { return; }
11 add_shortcode( 'mwai_chat', array( $this, 'chat' ) );
12 add_shortcode( 'mwai_chatbot', array( $this, 'chat' ) );
13 add_shortcode( 'mwai_imagesbot', array( $this, 'imageschat' ) );
14 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
15 if ( $this->core->get_option( 'shortcode_chat_inject' ) ) {
16 add_action( 'wp_body_open', array( $this, 'inject_chat' ) );
17 }
18
19 // Only for test now, but later we should probably import the JS/CSS
20 if ( $this->core->get_option( 'shortcode_chat_syntax_highlighting' ) ) {
21 wp_enqueue_script( 'mwai_chatbot',
22 '//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js', [], null, false );
23 wp_enqueue_style( 'mwai_chatbot',
24 '//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/stackoverflow-dark.min.css' );
25 }
26
27 if ( $this->core->get_option( 'shortcode_chat_styles' ) ) {
28 add_filter( 'mwai_chatbot_style', [ $this, 'apply_chat_styles' ], 10, 2 );
29 }
30
31 }
32
33 function rest_api_init() {
34 try {
35 register_rest_route( $this->namespace, '/chat', array(
36 'methods' => 'POST',
37 'callback' => array( $this, 'rest_chat' ),
38 'permission_callback' => '__return_true'
39 ) );
40 register_rest_route( $this->namespace, '/imagesbot', array(
41 'methods' => 'POST',
42 'callback' => array( $this, 'rest_imagesbot' ),
43 'permission_callback' => '__return_true'
44 ) );
45 }
46 catch ( Exception $e ) {
47 var_dump( $e );
48 }
49 }
50
51 function chatgpt_style( $id ) {
52 $css = file_get_contents( MWAI_PATH . '/classes/modules/chatbot-chatgpt.css' );
53 $css = str_replace( '#mwai-chat-id', "#mwai-chat-{$id}", $css );
54 return "<style>" . $css . "</style>";
55 }
56
57 function rest_chat( $request ) {
58 try {
59 $params = $request->get_json_params();
60 $session = $params['session'];
61 $env = $params['env'];
62 $prompt = $params['prompt'];
63 $model = $params['model'];
64 $temperature = $params['temperature'];
65 $maxTokens = intval( $params['maxTokens'] );
66 $apiKey = $params['apiKey'];
67 $stop = $params['stop'];
68 $query = new Meow_MWAI_QueryText( $prompt, 1024 );
69 if ( $model ) {
70 $query->setModel( $model );
71 }
72 if ( $temperature ) {
73 $query->setTemperature( $temperature );
74 }
75 if ( $maxTokens ) {
76 $query->setMaxTokens( $maxTokens );
77 }
78 if ( $stop ) {
79 $query->setStop( $stop );
80 }
81 if ( $apiKey ) {
82 $query->setApiKey( $apiKey );
83 }
84 if ( $env ) {
85 $query->setEnv( $env );
86 }
87 if ( $session ) {
88 $query->setSession( $session );
89 }
90 $answer = $this->core->ai->run( $query );
91 $rawText = $answer->result;
92 $html = apply_filters( 'mwai_chatbot_answer', $rawText );
93 $html = $this->core->markdown_to_html( $rawText );
94 return new WP_REST_Response([ 'success' => true, 'answer' => $rawText,
95 'html' => $html, 'usage' => $answer->usage ], 200 );
96 }
97 catch ( Exception $e ) {
98 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
99 }
100 }
101
102 function rest_imagesbot( $request ) {
103 try {
104 $params = $request->get_json_params();
105 $session = $params['session'];
106 $env = $params['env'];
107 $prompt = $params['prompt'];
108 $maxResults = $params['maxResults'];
109 $apiKey = $params['apiKey'];
110 $query = new Meow_MWAI_QueryImage( $prompt );
111 if ( $maxResults ) {
112 $query->setMaxResults( $maxResults );
113 }
114 if ( $apiKey ) {
115 $query->setApiKey( $apiKey );
116 }
117 if ( $env ) {
118 $query->setEnv( $env );
119 }
120 if ( $session ) {
121 $query->setSession( $session );
122 }
123 $answer = $this->core->ai->run( $query );
124 return new WP_REST_Response([ 'success' => true, 'images' => $answer->results, 'usage' => $answer->usage ], 200 );
125 }
126 catch ( Exception $e ) {
127 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
128 }
129 }
130
131 function apply_chat_styles( $css, $chatbotId ) {
132 $chatStyles = $this->core->get_option( 'shortcode_chat_styles' );
133 return preg_replace_callback( '/--mwai-(\w+):\s*([^;]+);/', function ( $matches ) use ($chatStyles ) {
134 if( isset( $chatStyles[$matches[1]] ) ) {
135 return "--mwai-" . $matches[1] . ": " . $chatStyles[$matches[1]] . ";";
136 }
137 return $matches[0];
138 }, $css );
139 }
140
141 function inject_chat() {
142 $params = $this->core->get_option( 'shortcode_chat_params' );
143 echo $this->chat( $params );
144 }
145
146 function imageschat( $atts ) {
147 $atts['mode'] = 'images';
148 return $this->chat( $atts );
149 }
150
151 function chat( $atts ) {
152 // Use the core default parameters, or the user default parameters
153 $override = $this->core->get_option( 'shortcode_chat_params_override' );
154 $defaults_params = $override ? $this->core->get_option( 'shortcode_chat_params' ) :
155 $this->core->get_option( 'shortcode_chat_default_params' );
156 $defaults_params['id'] = uniqid();
157
158 // Give a chance to modify the default parameters one last time
159 $defaults = apply_filters( 'mwai_chatbot_params_defaults', $defaults_params );
160
161 // Make sure all the mandatory params are set
162 foreach ( $this->core->defaultChatbotParams as $key => $value ) {
163 if ( !isset( $defaults[$key] ) ) {
164 $defaults[$key] = $value;
165 }
166 }
167
168 // Override with the shortcode, and before/after filters
169 $atts = apply_filters( 'mwai_chatbot_params_before', $atts );
170 $atts = shortcode_atts( $defaults, $atts );
171 $atts = apply_filters( 'mwai_chatbot_params', $atts );
172
173 // UI Parameters
174 $aiName = addslashes( trim($atts['ai_name']) );
175 $userName = addslashes( trim($atts['user_name']) );
176 $sysName = addslashes( trim($atts['sys_name']) );
177 $context = addslashes( $atts['context'] );
178 $context = preg_replace( '/\v+/', "\\n", $context );
179 $textSend = addslashes( trim( $atts['text_send'] ) );
180 $textInputPlaceholder = addslashes( trim( $atts['text_input_placeholder'] ) );
181 $startSentence = addslashes( trim( $atts['start_sentence'] ) );
182 $window = filter_var( $atts['window'], FILTER_VALIDATE_BOOLEAN );
183 $fullscreen = filter_var( $atts['fullscreen'], FILTER_VALIDATE_BOOLEAN );
184 $style = $atts['style'];
185
186 // Validade & Enhance UI Parameters
187 if ( empty( $aiName ) ) {
188 $aiName = '<div class="mwai-avatar mwai-svg"><img src="' .
189 MWAI_URL . '/images/avatar-ai.svg" /></div>';
190 }
191 if ( empty( $userName ) ) {
192 // if is connected, get gravatar from user
193 if ( is_user_logged_in() ) {
194 $user = wp_get_current_user();
195 $userName = '<div class="mwai-avatar"><img src="' .
196 get_avatar_url( $user->user_email ) . '" /></div>';
197 }
198 else {
199 $userName = '<div class="mwai-avatar mwai-svg"><img src="' .
200 MWAI_URL . '/images/avatar-user.svg" /></div>';
201 }
202 }
203
204 // Chatbot System Parameters
205 $id = $atts['id'];
206 $env = $atts['env'];
207 $mode = $atts['mode'];
208 $maxResults = $atts['max_results'];
209 $sessionId = $this->core->get_session_id();
210 $rest_nonce = wp_create_nonce( 'wp_rest' );
211 $casuallyFineTuned = boolval( $atts['casually_fined_tuned'] );
212 $promptEnding = addslashes( trim( $atts['prompt_ending'] ) );
213 $completionEnding = addslashes( trim( $atts['completion_ending'] ) );
214 if ( $casuallyFineTuned ) {
215 $promptEnding = "\\n\\n===\\n\\n";
216 $completionEnding = "\\n\\n";
217 }
218
219 // OpenAI Parameters
220 $model = $atts['model'];
221 $temperature = $atts['temperature'];
222 $maxTokens = $atts['max_tokens'];
223 $apiKey = $atts['api_key'];
224
225 // Named functions
226 $onSentClickFn = "mwai_{$id}_onSendClick";
227 $addReplyFn = "mwai_{$id}_addReply";
228 $initChatBotFn = "mwai_{$id}_initChatBot";
229
230 // Variables
231 $apiUrl = get_rest_url( null, $mode === 'images' ? 'ai-engine/v1/imagesbot' : 'ai-engine/v1/chat' );
232 $onGoingPrompt = "mwai_{$id}_onGoingPrompt";
233 $baseClasses = "mwai-chat";
234 $baseClasses .= ( $window ? " mwai-window" : "" );
235 $baseClasses .= ( !$window && $fullscreen ? " mwai-fullscreen" : "" );
236
237 // Output CSS
238 ob_start();
239 $style_content = "";
240 if ( $style === 'chatgpt' ) {
241 $style_content = $this->chatgpt_style( $id, $style );
242 }
243 echo apply_filters( 'mwai_chatbot_style', $style_content, $id );
244
245 // Output HTML & CSS
246 ?>
247 <div id="mwai-chat-<?= $id ?>" class="<?= $baseClasses ?>">
248 <?php if ( $window ) { ?>
249 <div class="mwai-open-button">
250 <img width="64" height="64" src="<?= plugins_url( '../../images/chat-green.svg', __FILE__ ) ?>" />
251 </div>
252 <div class="mwai-header">
253 <?php if ( $window ) { ?>
254 <div class="mwai-resize-button"></div>
255 <?php } ?>
256 <div class="mwai-close-button"></div>
257 </div>
258 <?php } ?>
259 <div class="mwai-content">
260 <div class="mwai-conversation">
261 </div>
262 <div class="mwai-input">
263 <textarea rows="1" placeholder="<?= $textInputPlaceholder ?>"></textarea>
264 <button><span><?= $textSend ?></span></button>
265 </div>
266 </div>
267 </div>
268
269 <script>
270 (function () {
271 let <?= $onGoingPrompt ?> = '<?= $context ?>' + '\n\n';
272 let isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;
273 let isWindow = <?= $window ? 'true' : 'false' ?>;
274 let mode = '<?= $mode ?>';
275
276 // Push the reply in the conversation
277 function <?= $addReplyFn ?>(text, type = 'user') {
278 var conversation = document.querySelector('#mwai-chat-<?= $id ?> .mwai-conversation');
279
280 // If text is array, then it's image URLs. Let's create a simple gallery in HTML in $text.
281 if (Array.isArray(text)) {
282 var newText = '<div class="mwai-gallery">';
283 for (var i = 0; i < text.length; i++) {
284 newText += '<a href="' + text[i] + '" target="_blank"><img src="' + text[i] + '" />';
285 }
286 text = newText + '</div>';
287 }
288
289 var mwaiClasses = 'mwai-reply';
290 if (type === 'ai') {
291 mwaiClasses += ' mwai-ai';
292 }
293 else if (type === 'system') {
294 mwaiClasses += ' mwai-system';
295 }
296 else {
297 mwaiClasses += ' mwai-user';
298 }
299 var html = '<div class="' + mwaiClasses + '">';
300 if (type === 'ai') {
301 html += '<span class="mwai-name"><?= $aiName ?></span>';
302 }
303 else if (type === 'system') {
304 html += '<span class="mwai-name"><?= $sysName ?></span>';
305 }
306 else {
307 html += '<span class="mwai-name"><?= $userName ?></span>';
308 }
309 html += '<span class="mwai-text">' + text + '</span>';
310 html += '</div>';
311 conversation.innerHTML += html;
312 conversation.scrollTop = conversation.scrollHeight;
313
314 // Syntax coloring
315 if (typeof hljs !== 'undefined') {
316 document.querySelectorAll('pre code').forEach((el) => {
317 hljs.highlightElement(el);
318 });
319 }
320 }
321
322 // Function to request the completion
323 function <?= $onSentClickFn ?>() {
324 let input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
325 let inputText = input.value.trim();
326
327 if (inputText === '') {
328 return;
329 }
330
331 // Disable the button
332 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
333 button.disabled = true;
334
335 // Add the user reply
336 <?= $addReplyFn ?>(inputText, 'user');
337 <?= $onGoingPrompt ?> += '<?= $userName ?>' + inputText + '\n';
338 input.value = '';
339 input.setAttribute('rows', 1);
340 input.disabled = true;
341
342 // Let's build the prompt depending on the "system"
343 <?= $onGoingPrompt ?> += '<?= $aiName ?>';
344 let prompt = <?= $onGoingPrompt ?>;
345 if (<?= $casuallyFineTuned ? 1 : 0 ?>) {
346 prompt = inputText + '<?= $promptEnding ?>';
347 }
348
349 // Prompt for the images
350 const data = mode === 'images' ? {
351 env: '<?= $env ?>',
352 session: '<?= $sessionId ?>',
353 prompt: inputText,
354 maxResults: <?= $maxResults ?>,
355 model: '<?= $atts['model'] ?>',
356 apiKey: '<?= $atts['api_key'] ?>',
357 // Prompt for the chat
358 } : {
359 env: '<?= $env ?>',
360 session: '<?= $sessionId ?>',
361 prompt: prompt,
362 userName: '<?= $userName ?>',
363 aiName: '<?= $aiName ?>',
364 model: '<?= $model ?>',
365 temperature: '<?= $temperature ?>',
366 maxTokens: '<?= $maxTokens ?>',
367 stop: '<?= $completionEnding ?>',
368 maxResults: '<?= $maxResults ?>',
369 apiKey: '<?= $apiKey ?>',
370 };
371 console.log('[BOT] Sent: ', data);
372 fetch('<?= $apiUrl ?>', { method: 'POST', headers: {
373 'Content-Type': 'application/json',
374 'X-WP-Nonce': '<?= $rest_nonce ?>'
375 },
376 body: JSON.stringify(data)
377 })
378 .then(response => response.json())
379 .then(data => {
380 console.log('[BOT] Recv: ', data);
381 if (!data.success) {
382 <?= $addReplyFn ?>(data.message, 'system');
383 }
384 else {
385 <?= $addReplyFn ?>(data.images ? data.images : data.html, 'ai');
386 <?= $onGoingPrompt ?> += data.answer + '\n';
387 }
388 button.disabled = false;
389 input.disabled = false;
390
391 // Only focus only on desktop (to avoid the mobile keyboard to kick-in)
392 if (!isMobile) {
393 input.focus();
394 }
395 })
396 .catch(error => {
397 console.error(error);
398 button.disabled = false;
399 input.disabled = false;
400 });
401 }
402
403 // Keep the textarea height in sync with the content
404 function mwaiSetTextAreaHeight(textarea, lines) {
405 var rows = textarea.getAttribute('rows');
406 if (lines !== rows) {
407 textarea.setAttribute('rows', lines > 5 ? 5 : lines);
408 }
409 }
410
411 // Init the chatbot
412 function <?= $initChatBotFn ?>() {
413 var input = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input textarea');
414 input.addEventListener('keypress', (event) => {
415 if (event.keyCode === 13 && !event.shiftKey) {
416 <?= $onSentClickFn ?>();
417 }
418 });
419 input.addEventListener('keydown', (event) => {
420 var rows = input.getAttribute('rows');
421 if (event.keyCode === 13 && event.shiftKey) {
422 var lines = input.value.split('\n').length + 1;
423 mwaiSetTextAreaHeight(input, lines);
424 }
425 });
426 input.addEventListener('keyup', (event) => {
427 var rows = input.getAttribute('rows');
428 var lines = input.value.split('\n').length ;
429 mwaiSetTextAreaHeight(input, lines);
430 });
431 var button = document.querySelector('#mwai-chat-<?= $id ?> .mwai-input button');
432 button.addEventListener('click', (event) => {
433 <?= $onSentClickFn ?>();
434 });
435
436 // If window, add event listener to mwai-open-button and mwai-close-button
437 if ( isWindow ) {
438 var openButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-open-button');
439 openButton.addEventListener('click', (event) => {
440 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
441 chat.classList.add('mwai-open');
442 // Only focus only on desktop (to avoid the mobile keyboard to kick-in)
443 if (!isMobile) {
444 input.focus();
445 }
446 });
447 var closeButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-close-button');
448 closeButton.addEventListener('click', (event) => {
449 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
450 chat.classList.remove('mwai-open');
451 });
452 var resizeButton = document.querySelector('#mwai-chat-<?= $id ?> .mwai-resize-button');
453 resizeButton.addEventListener('click', (event) => {
454 var chat = document.querySelector('#mwai-chat-<?= $id ?>');
455 chat.classList.toggle('mwai-fullscreen');
456 });
457 }
458
459 <?= $addReplyFn ?>('<?= $startSentence ?>', 'ai');
460 }
461
462 // Let's go totally meoooow on this!
463 <?= $initChatBotFn ?>();
464 })();
465 </script>
466
467 <?php
468 $output = ob_get_contents();
469 ob_end_clean();
470 $output = apply_filters( 'mwai_chatbot', $output, $atts );
471 return $output;
472 }
473 }