PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.9.95
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.9.95
3.5.9 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 / files.php
ai-engine / classes / modules Last commit date
assistants.php 3 years ago chatbot.php 2 years ago chatbot_legacy.php 2 years ago discussions.php 2 years ago files.php 2 years ago security.php 3 years ago
files.php
218 lines
1 <?php
2
3 class Meow_MWAI_Modules_Files {
4 private $core = null;
5 private $wpdb = null;
6 private $namespace = 'mwai-ui/v1';
7 private $db_check = false;
8 private $table_files = null;
9
10 public function __construct( $core ) {
11 global $wpdb;
12 $this->core = $core;
13 $this->wpdb = $wpdb;
14 $this->table_files = $this->wpdb->prefix . 'mwai_files';
15 add_action( 'rest_api_init', [ $this, 'rest_api_init' ] );
16 if ( !wp_next_scheduled( 'mwai_files_cleanup' ) ) {
17 wp_schedule_event( time(), 'hourly', 'mwai_files_cleanup' );
18 }
19 add_action( 'mwai_files_cleanup', [ $this, 'cleanup_expired_files' ] );
20 }
21
22 public function cleanup_expired_files() {
23 $current_time = current_time( 'mysql' );
24 $expired_files = $this->wpdb->get_results(
25 "SELECT * FROM $this->table_files WHERE expires IS NOT NULL AND expires < '{$current_time}'"
26 );
27 $expired_posts = get_posts( [
28 'post_type' => 'attachment',
29 'meta_key' => '_mwai_file_expires',
30 'meta_value' => $current_time,
31 'meta_compare' => '<'
32 ] );
33 $fileIds = [];
34 foreach ( $expired_files as $file ) {
35 $fileIds[] = $file->fileId;
36 }
37 foreach ( $expired_posts as $post ) {
38 $fileIds[] = get_post_meta( $post->ID, '_mwai_file_id', true );
39 }
40 $this->files_processed( $fileIds );
41 }
42
43 public function files_processed( $fileIds ) {
44 if ( !is_array( $fileIds ) ) {
45 $fileIds = [ $fileIds ];
46 }
47 foreach ( $fileIds as $fileId ) {
48 $file = $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM $this->table_files WHERE fileId = %s", $fileId ) );
49 if ( $file ) {
50 $this->wpdb->delete( $this->table_files, [ 'fileId' => $fileId ] );
51 if ( file_exists( $file->path ) ) {
52 unlink( $file->path );
53 }
54 }
55 else {
56 $posts = get_posts( [ 'post_type' => 'attachment', 'meta_key' => '_mwai_file_id', 'meta_value' => $fileId ] );
57 if ( $posts ) {
58 foreach ( $posts as $post ) {
59 wp_delete_attachment( $post->ID, true );
60 }
61 }
62 }
63 }
64 }
65
66 public function get_path( $fileId ) {
67 $file = $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM $this->table_files WHERE fileId = %s", $fileId ) );
68 if ( $file ) {
69 return $file->path;
70 }
71 else {
72 $posts = get_posts( [ 'post_type' => 'attachment', 'meta_key' => '_mwai_file_id', 'meta_value' => $fileId ] );
73 if ( $posts ) {
74 foreach ( $posts as $post ) {
75 return get_attached_file( $post->ID );
76 }
77 }
78 }
79 return null;
80 }
81
82 public function get_base64_data( $fileId ) {
83 $path = $this->get_path( $fileId );
84 if ( $path ) {
85 $content = file_get_contents( $path );
86 $data = base64_encode( $content );
87 return $data;
88 }
89 return null;
90 }
91
92 public function get_url( $fileId ) {
93 $file = $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM $this->table_files WHERE fileId = %s", $fileId ) );
94 if ( $file ) {
95 return $file->url;
96 }
97 else {
98 $posts = get_posts( [ 'post_type' => 'attachment', 'meta_key' => '_mwai_file_id', 'meta_value' => $fileId ] );
99 if ( $posts ) {
100 foreach ( $posts as $post ) {
101 return wp_get_attachment_url( $post->ID );
102 }
103 }
104 }
105 return null;
106 }
107
108 #region REST endpoints
109
110 public function rest_api_init() {
111 register_rest_route( $this->namespace, '/files/upload', array(
112 'methods' => 'POST',
113 'callback' => array( $this, 'rest_upload' ),
114 'permission_callback' => '__return_true'
115 ) );
116 register_rest_route( $this->namespace, '/files/delete', array(
117 'methods' => 'POST',
118 'callback' => array( $this, 'rest_delete' ),
119 'permission_callback' => '__return_true'
120 ) );
121 }
122
123 public function rest_upload() {
124 require_once( ABSPATH . 'wp-admin/includes/image.php' );
125 require_once( ABSPATH . 'wp-admin/includes/file.php' );
126 require_once( ABSPATH . 'wp-admin/includes/media.php' );
127 $file = $_FILES['file'];
128 $error = null;
129 if ( empty( $file ) ) {
130 return new WP_REST_Response( [ 'success' => false, 'message' => 'No file provided.' ], 400 );
131 }
132 $local_upload = $this->core->get_option( 'image_local_upload' );
133 $image_expires_seconds = $this->core->get_option( 'image_expires' );
134 $expires = ( empty( $image_expires_seconds ) || $image_expires_seconds === 'never' ) ? null :
135 date( 'Y-m-d H:i:s', time() + $image_expires_seconds );
136 $fileId = null;
137 $url = null;
138 if ( $local_upload === 'uploads' ) {
139 if ( !$this->check_db() ) {
140 return new WP_REST_Response( [ 'success' => false, 'message' => 'Could not create database table.' ], 500 );
141 }
142 $upload_dir = wp_upload_dir();
143 $filename = wp_unique_filename( $upload_dir['path'], $file['name'] );
144 $path = $upload_dir['path'] . '/' . $filename;
145 if ( !move_uploaded_file( $file['tmp_name'], $path ) ) {
146 return new WP_REST_Response( [ 'success' => false, 'message' => 'Could not move the file.' ], 500 );
147 }
148 $url = $upload_dir['url'] . '/' . $filename;
149 $fileId = md5( $url );
150 $this->wpdb->insert( $this->table_files, [
151 'fileId' => $fileId,
152 'type' => 'image',
153 'status' => 'uploaded',
154 'created' => date( 'Y-m-d H:i:s' ),
155 'updated' => date( 'Y-m-d H:i:s' ),
156 'expires' => $expires,
157 'path' => $path,
158 'url' => $url
159 ]);
160 }
161 else if ( $local_upload === 'library' ) {
162 $id = media_handle_upload( 'file', 0 );
163 if ( is_wp_error( $id ) ) {
164 $error = $id->get_error_message();
165 return new WP_REST_Response([ 'success' => false, 'message' => $error ], 500);
166 }
167 $url = wp_get_attachment_url( $id );
168 $fileId = md5( $url );
169 update_post_meta( $id, '_mwai_file_id', $fileId );
170 update_post_meta( $id, '_mwai_file_expires', $expires );
171 }
172 return new WP_REST_Response( [
173 'success' => true,
174 'data' => [ 'id' => $fileId, 'url' => $url ]
175 ], 200 );
176 }
177
178 #endregion
179
180 #region Database functions
181
182 function create_db() {
183 $charset_collate = $this->wpdb->get_charset_collate();
184 $sql = "CREATE TABLE $this->table_files (
185 id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
186 fileId VARCHAR(64) NOT NULL,
187 type VARCHAR(32) NULL,
188 status VARCHAR(32) NULL,
189 created DATETIME NOT NULL,
190 updated DATETIME NOT NULL,
191 expires DATETIME NULL,
192 path TEXT NOT NULL,
193 url TEXT NULL,
194 metadata TEXT NULL,
195 PRIMARY KEY (id),
196 UNIQUE KEY unique_file_id (fileId)
197 ) $charset_collate;";
198 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
199 dbDelta( $sql );
200 }
201
202 function check_db() {
203 if ( $this->db_check ) {
204 return true;
205 }
206 $sql = $this->wpdb->prepare( "SHOW TABLES LIKE %s", $this->table_files );
207 $table_exists = strtolower( $this->wpdb->get_var( $sql )) === strtolower( $this->table_files );
208 if ( !$table_exists ) {
209 $this->create_db();
210 $table_exists = strtolower( $this->wpdb->get_var( $sql ) ) === strtolower( $this->table_files );
211 }
212 $this->db_check = $table_exists;
213 return $this->db_check;
214 }
215
216 #endregion
217
218 }