PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.6.78
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.6.78
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 / discussions.php
ai-engine / classes / modules Last commit date
assistants.php 3 years ago chatbot.php 3 years ago chatbot_legacy.php 3 years ago chatbot_logs.php 3 years ago discussions.php 3 years ago security.php 3 years ago
discussions.php
212 lines
1 <?php
2
3 class Meow_MWAI_Modules_Discussions {
4 private $wpdb = null;
5 private $core = null;
6 private $table_chats = null;
7 private $db_check = false;
8 private $namespace = 'mwai/v1';
9
10 public function __construct() {
11 global $wpdb;
12 global $mwai_core;
13 $this->core = $mwai_core;
14 $this->wpdb = $wpdb;
15 $this->table_chats = $wpdb->prefix . 'mwai_chats';
16
17 if ( $this->core->get_option( 'shortcode_chat_discussions' ) ) {
18 add_filter( 'mwai_chatbot_reply', [ $this, 'chatbot_reply' ], 10, 4 );
19 add_action( 'rest_api_init', array( $this, 'rest_api_init' ) );
20 }
21 }
22
23 public function rest_api_init() {
24 register_rest_route( $this->namespace, '/discussions/list', array(
25 'methods' => 'POST',
26 'callback' => [ $this, 'rest_discussions_list' ],
27 'permission_callback' => '__return_true'
28 ) );
29 register_rest_route( $this->namespace, '/discussions/delete', array(
30 'methods' => 'POST',
31 'callback' => [ $this, 'rest_discussions_delete' ],
32 'permission_callback' => '__return_true'
33 ) );
34 }
35
36 function rest_discussions_list( $request ) {
37 try {
38 $params = $request->get_json_params();
39 $offset = $params['offset'];
40 $limit = $params['limit'];
41 $filters = $params['filters'];
42 $sort = $params['sort'];
43 $chats = $this->chats_query( [], $offset, $limit, $filters, $sort );
44 return new WP_REST_Response([ 'success' => true, 'total' => $chats['total'], 'chats' => $chats['rows'] ], 200 );
45 }
46 catch ( Exception $e ) {
47 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
48 }
49 }
50
51 function rest_discussions_delete( $request ) {
52 try {
53 $params = $request->get_json_params();
54 $chatsIds = $params['chatIds'];
55 if ( is_array( $chatsIds ) ) {
56 if ( count( $chatsIds ) === 0 ) {
57 $this->wpdb->query( "TRUNCATE TABLE $this->table_chats" );
58 }
59 foreach( $chatsIds as $chatId ) {
60 $this->wpdb->delete( $this->table_chats, [ 'chatId' => $chatId ] );
61 }
62 }
63 return new WP_REST_Response([ 'success' => true ], 200 );
64 }
65 catch ( Exception $e ) {
66 return new WP_REST_Response([ 'success' => false, 'message' => $e->getMessage() ], 500 );
67 }
68 }
69
70 function chats_query( $chats = [], $offset = 0, $limit = null, $filters = null, $sort = null ) {
71 $this->check_db();
72 $offset = !empty( $offset ) ? intval( $offset ) : 0;
73 $limit = !empty( $limit ) ? intval( $limit ) : 5;
74 $filters = !empty( $filters ) ? $filters : [];
75 $sort = !empty( $sort ) ? $sort : [ 'accessor' => 'time', 'by' => 'desc' ];
76 $query = "SELECT * FROM $this->table_chats";
77
78 // Filters
79 if ( is_array( $filters ) ) {
80 $where = array();
81 foreach ( $filters as $filter ) {
82 if ( $filter['accessor'] === 'user' ) {
83 $value = esc_sql( $filter['value'] );
84 if ( empty( $value ) ) {
85 continue;
86 }
87 $isIP = filter_var( $value, FILTER_VALIDATE_IP );
88 if ( $isIP ) {
89 $where[] = "extra LIKE '%\"ip\":\"{$value}\"%'";
90 }
91 else {
92 $where[] = "extra LIKE '%\"userId\":{$value}%'";
93 }
94 }
95 if ( $filter['accessor'] === 'preview' ) {
96 $value = $filter['value'];
97 if ( empty( $value ) ) {
98 continue;
99 }
100 $where[] = "messages LIKE '%{$value}%'";
101 }
102 }
103 if ( count( $where ) > 0 ) {
104 $query .= " WHERE " . implode( " AND ", $where );
105 }
106 }
107
108 // Count based on this query
109 $chats['total'] = $this->wpdb->get_var( "SELECT COUNT(*) FROM ($query) AS t" );
110
111 // Order by
112 $query .= " ORDER BY " . esc_sql( $sort['accessor'] ) . " " . esc_sql( $sort['by'] );
113
114 // Limits
115 if ( $limit > 0 ) {
116 $query .= " LIMIT $offset, $limit";
117 }
118
119 $chats['rows'] = $this->wpdb->get_results( $query, ARRAY_A );
120 return $chats;
121 }
122
123 function chatbot_reply( $rawText, $query, $params, $extra ) {
124 global $mwai_core;
125 $userIp = $mwai_core->get_ip_address();
126 $userId = $mwai_core->get_user_id();
127 $chatClientId = isset( $params['clientId'] ) ? $params['clientId'] : $query->session;
128 $ssChatId = hash( 'sha256', $userIp . $userId . $chatClientId );
129 $this->check_db();
130 $chat = $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM $this->table_chats WHERE chatId = %s", $ssChatId ) );
131 $extra = [
132 'embeddings' => isset( $extra['embeddings'] ) ? $extra['embeddings'] : null
133 ];
134 if ( $chat ) {
135 $chat->messages = json_decode( $chat->messages );
136 $chat->messages[] = [
137 'type' => 'user',
138 'text' => $params['newMessage']
139 ];
140 $chat->messages[] = [
141 'type' => 'ai',
142 'text' => $rawText,
143 'extra' => $extra
144 ];
145 $chat->messages = json_encode( $chat->messages );
146 $this->wpdb->update( $this->table_chats, [
147 'messages' => $chat->messages,
148 'updated' => date( 'Y-m-d H:i:s' )
149 ], [ 'id' => $chat->id ] );
150 }
151 else {
152 $chat = [
153 'chatId' => $ssChatId,
154 'messages' => json_encode( [
155 [
156 'type' => 'user',
157 'text' => $params['newMessage']
158 ],
159 [
160 'type' => 'ai',
161 'text' => $rawText,
162 'extra' => $extra
163 ]
164 ] ),
165 'extra' => json_encode( [
166 'ip' => $userIp,
167 'userId' => $userId,
168 'session' => $query->session,
169 'model' => $query->model,
170 'temperature' => $query->temperature
171 ] ),
172 'created' => date( 'Y-m-d H:i:s' ),
173 'updated' => date( 'Y-m-d H:i:s' )
174 ];
175 $this->wpdb->insert( $this->table_chats, $chat );
176 }
177 return $rawText;
178 }
179
180 function check_db() {
181 if ( $this->db_check ) {
182 return true;
183 }
184 $this->db_check = !( strtolower(
185 $this->wpdb->get_var( "SHOW TABLES LIKE '$this->table_chats'" ) ) != strtolower( $this->table_chats )
186 );
187 if ( !$this->db_check ) {
188 $this->create_db();
189 $this->db_check = !( strtolower(
190 $this->wpdb->get_var( "SHOW TABLES LIKE '$this->table_chats'" ) ) != strtolower( $this->table_chats )
191 );
192 }
193 return $this->db_check;
194 }
195
196 function create_db() {
197 $charset_collate = $this->wpdb->get_charset_collate();
198 $sqlLogs = "CREATE TABLE $this->table_chats (
199 id BIGINT(20) NOT NULL AUTO_INCREMENT,
200 chatId VARCHAR(64) NOT NULL NULL,
201 messages TEXT NOT NULL NULL,
202 extra TEXT NOT NULL NULL,
203 created DATETIME NOT NULL,
204 updated DATETIME NOT NULL,
205 PRIMARY KEY (id),
206 INDEX chatId (chatId)
207 ) $charset_collate;";
208 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
209 dbDelta( $sqlLogs );
210 }
211
212 }