* @package WP Security Question
*/
class WP_AI_KIT extends FC_Plugin_Base
{
var $pluginPrefix = '';
/**
* Intialize variables, files and call actions.
*
* @var array
*/
public function __construct()
{
parent::__construct($this->wai_plugin_definition());
$this->wai_register_hooks();
}
function wai_plugin_definition()
{
$this->pluginPrefix = 'wai';
$pluginClasses = array('wai-form.php', 'wai-controller.php', 'wai-model.php', 'wai-fresh-settings.php');
$pluginModules = array('overview', 'prompt', 'settings');
$pluginCssFilesFrontEnd = array();
$pluginCssFilesBackendEnd = array('flippercode-ui.css');
$pluginJsFilesFrontEnd = array('frontend.js');
$pluginJsFilesBackEnd = array('backend.js', 'select2.js', 'flippercode-ui.js');
$pluginData = array(
'childFileRefrence' => __FILE__,
'childClassRefrence' => __CLASS__,
'pluginPrefix' => 'wai',
'pluginDirectory' => plugin_dir_path(__FILE__),
'pluginTextDomain' => 'text-prompter',
'pluginURL' => plugin_dir_url(__FILE__),
'dboptions' => 'aicontent_settings',
'controller' => 'WAI_Controller',
'model' => 'WAI_Model',
'pluginLabel' => esc_html__('Text Prompter', 'text-prompter'),
'pluginClasses' => $pluginClasses,
'pluginmodules' => $pluginModules,
'pluginmodulesprefix' => 'WAI_Model_',
'pluginCssFilesFrontEnd' => $pluginCssFilesFrontEnd,
'pluginCssFilesBackEnd' => $pluginCssFilesBackendEnd,
'pluginJsFilesFrontEnd' => $pluginJsFilesFrontEnd,
'pluginJsFilesBackEnd' => $pluginJsFilesBackEnd,
'loadCustomizer' => false,
'pluginDirectoryBaseName' => basename(dirname(__FILE__)),
'settingsPageSlug' => 'wai_manage_settings',
'plugin_row_links' => array('Docs' => admin_url('admin.php?page=wai_how_overview')),
);
return $pluginData;
}
function wai_register_hooks()
{
if (is_admin()) {
add_action('fc_plugin_module_to_load', array($this, 'wai_plugin_module_to_load'));
add_action('wpgmp_form_header_html', [$this, 'wai_add_custom_loader']);
add_action('admin_init', [$this, 'aicontent_export_data']);
add_action('admin_init', [$this, 'wai_sample_csv_download']);
}
// Register endpoint for REST
add_action(
'rest_api_init',
function () {
register_rest_route(
'aicontent/v1',
'/text',
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array($this, 'aicontent_rest_openai_autocomplete'),
'permission_callback' => function () {
return current_user_can('edit_others_posts');
},
)
);
}
);
add_action('enqueue_block_editor_assets', array($this, 'aicontent_block_assets'));
add_action('plugins_loaded', array($this, 'wai_load_plugin_languages'));
add_shortcode('text_prompter', array($this, 'wai_prompt_shortcode'));
if (! function_exists('is_plugin_active_for_network')) {
require_once ABSPATH . '/wp-admin/includes/plugin.php';
}
}
//Shortcode handler function
function wai_prompt_shortcode($atts, $content)
{
$defaults = array(
'model' => 'text-davinci-002',
'temperature' => 0.5,
'max_tokens' => 50,
'transist' => 86400,
'attributes' => ''
);
$args = shortcode_atts($defaults, $atts);
// Sanitize the attributes
$args['model'] = sanitize_text_field($args['model']); // Sanitize text input
$args['temperature'] = floatval($args['temperature']); // Ensure temperature is a float
$args['max_tokens'] = intval($args['max_tokens']); // Ensure max_tokens is an integer
$args['transist'] = intval($args['transist']); // Ensure transist is an integer
$args['attributes'] = sanitize_text_field($args['attributes']); // Sanitize additional attributes
// Sanitize and process the content
$content = wp_kses_post($content); // Allow basic HTML in the content
// Construct the request data
$data = array(
'model' => $args['model'],
'prompt' => $content,
'temperature' => $args['temperature'],
'max_tokens' => $args['max_tokens'],
'transist' => $args['transist'],
);
// Check if there is an existing cache for this prompt
$transist = intval($data['transist']);
$cache_key = md5(json_encode($data));
$cache_value = get_transient($cache_key);
// If there is no cache, make the API request and cache the result
if (!$cache_value) {
$options = [
'model' => $data['model'],
'prompt' => $data['prompt'],
'temperature' => floatVal($data['temperature']) ?? .7,
'max_tokens' => intval($data['max_tokens']),
];
$response = $this->aicontent_call_openai($options); // replace with your function that generates the OpenAI response
$response = $response->data;
$cache_value = $response['message'];
if ($response['error'] === false) {
set_transient($cache_key, $cache_value, $transist);
}
}
// Add any additional attributes to the output
$attributes = $args['attributes'];
// Return the result with any specified attributes also with Escaped HTML
return '
' . wp_kses_post($cache_value) . '
';
}
function wai_sample_csv_download()
{
if (empty($_GET['do_action']) || $_GET['do_action'] !== 'sample_csv_download') {
return;
}
// 1. Capability check first
if (!current_user_can('manage_options')) {
wp_die(__('Unauthorized access.', 'text-prompter'));
}
// 2. Nonce verification
if (
!isset($_GET['sample_csv_download_nonce']) ||
!wp_verify_nonce($_GET['sample_csv_download_nonce'], 'sample_csv_download_action')
) {
wp_die(__('Something went wrong. Please refresh and try again.', 'text-prompter'));
}
// 3. File existence check
$sample_csv = WAI_DIR . 'assets/sample.csv';
if (!file_exists($sample_csv) || !is_readable($sample_csv)) {
wp_die(__('Sample file not found.', 'text-prompter'));
}
// 4. Send correct headers and file
if (headers_sent()) {
wp_die(__('Cannot send file: headers already sent.', 'text-prompter'));
}
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="sample.csv"');
header('Content-Length: ' . filesize($sample_csv));
header('Pragma: no-cache');
header('Expires: 0');
readfile($sample_csv);
exit();
}
/**
* Export data into csv,xml,json or excel file
*/
function aicontent_export_data()
{
if (isset($_POST['action']) && isset($_REQUEST['_wpnonce']) && $_POST['action'] == 'export_prompt_csv') {
$nonce = sanitize_text_field(wp_unslash($_REQUEST['_wpnonce']));
if (isset($nonce) and ! wp_verify_nonce($nonce, 'wpgmp-nonce')) {
die('Cheating...');
}
if (isset($_POST['action']) and false != strstr($_POST['action'], 'export_')) {
$export_action = explode('_', sanitize_text_field($_POST['action']));
if (3 == count($export_action) and 'export' == $export_action[0]) {
$model_class = 'WAI_Model_' . ucwords($export_action[1]);
$entity = new $model_class();
$entity->export($export_action[2]);
}
}
}
}
// dont
function aicontent_block_assets($hook)
{
$settings = get_option('wai_settings');
$language = $settings['wai_language'] ?? 'en';
// Create any data in PHP that we may need to use in our JS file
$nonce = wp_create_nonce('wp_rest');
$modelFactory = new WAI_Model();
$prompt_obj = $modelFactory->create_object('prompt');
$all_prompts = $prompt_obj->fetch();
$models = [];
foreach ($all_prompts as $prompt) {
$models[$prompt->id] = $prompt->title;
}
$aiKitScriptVars = array(
'nonce' => $nonce,
'rest_nonce' => wp_create_nonce('wp_rest'),
'siteUrl' => get_site_url(),
'selectedLanguage' => $language,
'prompts' => $models,
);
wp_enqueue_script(
'aicontent-block-script',
plugins_url('build/index.js', __FILE__),
['wp-edit-post']
);
wp_add_inline_script('aicontent-block-script', 'var aicontent =' . json_encode($aiKitScriptVars));
}
// dont
function aicontent_rest_openai_autocomplete($data)
{
set_time_limit(0);
if (! isset($data['text'])) {
return new WP_Error('missing_param', 'Missing reference text.', array('status' => 400));
}
if (! isset($data['type'])) {
return new WP_Error('missing_param', 'Missing Text Prompt.', array('status' => 400));
}
$modelFactory = new WAI_Model();
$location_obj = $modelFactory->create_object('prompt');
if (isset($data['type'])) {
$location_obj = $location_obj->fetch(array(array('id', '=', intval(wp_unslash($data['type'])))));
$prompt_detail = $location_obj[0];
$language = $data['language'] ?? 'en';
$settings = get_option('wai_settings');
$model = $data['model'] ?? $prompt_detail->model;
#$prompt = str_replace( '[text_placeholder]', $data['text'], $prompt_detail->prompts );
$prompt = $prompt_detail->prompts . ":" . $data['text'];
$max_tokens = intval($prompt_detail->words * 1.33) ?? 100;
$options = [
'model' => $model,
'prompt' => $prompt,
'temperature' => floatVal($prompt_detail->temperature) ?? .7,
'max_tokens' => $max_tokens,
'top_p' => floatVal($prompt_detail->top_p) ?? 1,
'frequency_penalty' => floatVal($prompt_detail->frequency_penalty) ?? 0,
'presence_penalty' => floatVal($prompt_detail->presence_penalty) ?? 0,
];
return $this->aicontent_call_openai($options);
} else {
return new WP_Error('missing_param', 'Missing Text Prompt.', array('status' => 400));
}
}
// dont
function aicontent_call_openai($options)
{
$settings = get_option('wai_settings');
$options['messages'] = [
[
'role' => 'user',
'content' => [
array(
'type' => 'text',
'text' => $options['prompt']
)
]
]
];
unset($options['prompt']);
try {
$res = wp_remote_post(
'https://api.openai.com/v1/chat/completions',
array(
'body' => json_encode($options),
'headers' => array(
'Authorization' => 'Bearer ' . $settings['wai_openai_key'],
'Content-Type' => 'application/json',
),
'timeout' => 45,
)
);
if (is_wp_error($res)) {
$result = array(
'error' => true,
'message' => $res->get_error_message(),
);
} else {
$response = json_decode($res['body']);
if (isset($response->error)) {
$result = array(
'error' => true,
'message' => $response->error->message,
);
} else {
$choices = $response->choices;
if (count($choices) == 0) {
$result = array(
'error' => true,
'message' => 'No result. Please try again using different text or check the prompt.',
);
} else {
$message = nl2br(trim($choices[0]->message->content));
$result = array(
'error' => false,
'message' => $message,
);
}
}
}
} catch (Exception $e) {
$result = array(
'error' => false,
'message' => $e->getMessage(),
);
}
return new WP_REST_Response($result, 200);
}
function wai_add_custom_loader($form_container_html)
{
if (isset($_GET['page']) && strpos($_GET['page'], 'wai') !== false) {
$form_container_html = $form_container_html . '';
}
return $form_container_html;
}
function wai_plugin_module_to_load($module)
{
if ($this->fc_is_backend_plugin_page()) {
$data = maybe_unserialize(get_option('wpr_security_ques_setting'));
if (! isset($data) || ! isset($data['wai_enabled'])) {
$module = 'debug';
}
}
return $module;
}
/**
* Create backend navigation.
*/
function wai_define_admin_menu()
{
$pagehook = add_menu_page(
esc_html__('Text Prompter', 'text-prompter'),
esc_html__('Text Prompter', 'text-prompter'),
'wai_admin_overview',
WAI_SLUG,
array($this, 'fc_plugin_processor'),
WAI_IMAGES . 'fc-small-logo.png'
);
return $pagehook;
}
/**
* Eneque scripts in the backend.
*/
function wai_backend_script_localisation()
{
$wai_js_lang = array();
$wai_js_lang['site_url'] = get_site_url();
$wai_js_lang['ajax_url'] = admin_url('admin-ajax.php');
$wai_js_lang['nonce'] = wp_create_nonce('wpgmp-nonce');
$wai_js_lang['rest_nonce'] = wp_create_nonce('wp_rest');
$wai_js_lang['confirm'] = esc_html__(
'Are you sure to delete item?',
'text-prompter'
);
$wai_js_lang['cancel_msg'] = esc_html__(
'Are you sure to cancel import process?',
'text-prompter'
);
wp_localize_script('backend.js', 'wai_js_lang', $wai_js_lang);
$core_script_args = apply_filters(
'fc_ui_script_args',
array(
'ajax_url' => esc_url(admin_url('admin-ajax.php')),
'language' => 'en',
'urlforajax' => esc_url(admin_url('admin-ajax.php')),
'hide' => esc_html__('Hide', 'text-prompter'),
'nonce' => wp_create_nonce('fc_communication'),
)
);
wp_localize_script('flippercode-ui.js', 'fc_ui_obj', $core_script_args);
}
/**
* Load plugin language file.
*/
function wai_load_plugin_languages()
{
load_plugin_textdomain('text-prompter', false, basename(dirname(__FILE__)) . '/lang/');
}
/**
* Perform tasks on plugin deactivation.
*/
function wai_plugin_activation_work()
{
if (false == get_option('wai_settings')) {
// To Do
}
}
/**
* Define constant if not already set.
*
* @param string $name Constant name.
* @param string|bool $value Constant value.
*/
private function wai_define($name, $value)
{
if (! defined($name)) {
define($name, $value);
}
}
/**
* Define all plugin constants.
*/
protected function wai_define_constants()
{
$this->wai_define('WAI_SLUG', 'wai_view_overview');
$this->wai_define('WAI_VERSION', '1.0.8');
$this->wai_define('WAI_TEXT_DOMAIN', 'text-prompter');
$this->wai_define('WAI_TBL_PROMPTS', 'wai_prompts');
$this->wai_define('WAI_FOLDER', basename(dirname(__FILE__)));
$this->wai_define('WAI_DIR', plugin_dir_path(__FILE__));
$this->wai_define('WAI_CORE_CLASSES', WAI_DIR . 'core/');
$this->wai_define('WAI_PLUGIN_CLASSES', WAI_DIR . 'classes/');
$this->wai_define('WAI_CONTROLLER', WAI_CORE_CLASSES);
$this->wai_define('WAI_Model', WAI_DIR . 'modules/');
$this->wai_define('WAI_URL', plugin_dir_url(WAI_FOLDER) . WAI_FOLDER . '/');
$this->wai_define('WAI_CSS', WAI_URL . '/assets/css/');
$this->wai_define('WAI_JS', WAI_URL . '/assets/js/');
$this->wai_define('WAI_IMAGES', WAI_URL . '/assets/images/');
}
}
}
new WP_AI_KIT();