Skip to content
View remyweb's full-sized avatar
๐ŸŸฉ
๐ŸŸฉ
Block or Report

Block or report remyweb

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Please don't include any personal information such as legal names or email addresses. Maximum 100 characters, markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this userโ€™s behavior. Learn more about reporting abuse.

Report abuse

Pinned Loading

  1. json json
    1
    {"success":true,"error":"","purchase_type":"extend","data":"<?php\n\/**\n * Share by HoaBinh(babiato) @package QuickAI - OpenAI Content & Image Generator\n * @author Bylancer\n * @version 3.3\n * @Updated Date: 08\/May\/2023\n * @Copyright 2015-23 Bylancer\n *\/\n\ndefine(\"ROOTPATH\", dirname(__DIR__));\ndefine(\"APPPATH\", ROOTPATH.\"\/php\/\");\n\nrequire_once ROOTPATH . '\/includes\/autoload.php';\nrequire_once ROOTPATH . '\/includes\/lang\/lang_'.$config['lang'].'.php';\n\n$con = db_connect();\nadmin_session_start();\nif (!checkloggedadmin()) {\n    exit('Access Denied.');\n}\n\/\/Admin Ajax Function\nif(isset($_REQUEST['action'])){\n    if ($_REQUEST['action'] == \"deleteAIDocument\") { deleteAIDocument(); }\n    if ($_REQUEST['action'] == \"deleteAIImages\") { deleteAIImages(); }\n    if ($_REQUEST['action'] == \"deleteAICustomTemplates\") { deleteAICustomTemplates(); }\n    if ($_REQUEST['action'] == \"deleteAITplCategories\") { deleteAITplCategories(); }\n    if ($_REQUEST['action'] == \"loginAsUser\") {loginAsUser();}\n    if ($_REQUEST['action'] == \"deleteMembershipPlan\") { deleteMembershipPlan(); }\n    if ($_REQUEST['action'] == \"deleteTaxes\") { deleteTaxes(); }\n    if ($_REQUEST['action'] == \"deleteTransaction\") { deleteTransaction(); }\n    if ($_REQUEST['action'] == \"deleteCurrency\") { deleteCurrency(); }\n    if ($_REQUEST['action'] == \"deleteTimezone\") { deleteTimezone(); }\n    if ($_REQUEST['action'] == \"blogCatPosition\") { blogCatPosition(); }\n    if ($_REQUEST['action'] == \"installPayment\") { installPayment(); }\n    if ($_REQUEST['action'] == \"uninstallPayment\") { uninstallPayment(); }\n    if ($_REQUEST['action'] == \"deleteTestimonial\") { deleteTestimonial(); }\n    if ($_REQUEST['action'] == \"deleteLanguage\") { deleteLanguage(); }\n    if ($_REQUEST['action'] == \"deleteSubscriber\") { deleteSubscriber(); }\n    if ($_REQUEST['action'] == \"deleteusers\") { deleteUsers(); }\n    if ($_REQUEST['action'] == \"deleteAdmin\") { deleteAdmin(); }\n    if ($_REQUEST['action'] == \"deleteStaticPage\") { deleteStaticPage(); }\n    if ($_REQUEST['action'] == \"deletefaq\") { deletefaq(); }\n    if ($_REQUEST['action'] == \"addPlanCustom\") {addPlanCustom(); }\n    if ($_REQUEST['action'] == \"editPlanCustom\") {editPlanCustom(); }\n    if ($_REQUEST['action'] == \"delPlanCustom\") {delPlanCustom(); }\n    if ($_REQUEST['action'] == \"langTranslation_PlanCustom\") { langTranslation_PlanCustom(); }\n    if ($_REQUEST['action'] == \"edit_langTranslation_PlanCustom\") { edit_langTranslation_PlanCustom(); }\n    if ($_REQUEST['action'] == \"edit_langTranslation\") { edit_langTranslation(); }\n    if ($_REQUEST['action'] == \"langTranslation_FormFields\") { langTranslation_FormFields(); }\n    if ($_REQUEST['action'] == \"editLanguageFile\") { editLanguageFile(); }\n    if ($_REQUEST['action'] == \"saveBlog\") { saveBlog(); }\n    if ($_REQUEST['action'] == \"deleteBlog\") { deleteBlog(); }\n    if ($_REQUEST['action'] == \"approveComment\") { approveComment(); }\n    if ($_REQUEST['action'] == \"deleteComment\") { deleteComment(); }\n    if ($_REQUEST['action'] == \"addBlogCat\") { addBlogCat(); }\n    if ($_REQUEST['action'] == \"delBlogCat\") { delBlogCat(); }\n    if ($_REQUEST['action'] == \"quickad_update_maincat_position\") { quickad_update_maincat_position(); }\n    if ($_REQUEST['action'] == \"quickad_update_subcat_position\") { quickad_update_subcat_position(); }\n    if ($_REQUEST['action'] == \"quickad_update_plan_custom_position\") { quickad_update_plan_custom_position(); }\n    if ($_REQUEST['action'] == \"aiTplCategoryPosition\") { aiTplCategoryPosition(); }\n    if ($_REQUEST['action'] == \"aiChatBotsPosition\") { aiChatBotsPosition(); }\n    if ($_REQUEST['action'] == \"aiChatPromptsPosition\") { aiChatPromptsPosition(); }\n    if ($_REQUEST['action'] == \"aiTplPosition\") { aiTplPosition(); }\n\n    if ($_REQUEST['action'] == \"deleteAPIKeys\") { deleteAPIKeys(); }\n    if ($_REQUEST['action'] == \"deleteAIChatBots\") { deleteAIChatBots(); }\n    if ($_REQUEST['action'] == \"deleteAIChatPrompts\") { deleteAIChatPrompts(); }\n    if ($_REQUEST['action'] == \"deleteAISpeeches\") { deleteAISpeeches(); }\n\n}\n\n\nfunction loginAsUser(){\n    global $config, $link;\n    if(check_allow()) {\n        $user = ORM::for_table($config['db']['pre'] . 'user')\n            ->find_one($_POST['id']);\n        if (isset($user['id'])) {\n            unset($_SESSION['user']);\n            create_user_session($user['id'], $user['username'], $user['password_hash'], $user['user_type']);\n\n            die($link['DASHBOARD']);\n        }\n    }\n    die(0);\n}\n\nfunction deleteAIDocument(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        ORM::for_table($config['db']['pre'] . 'ai_documents')\n            ->where_id_in($ids)\n            ->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAICustomTemplates(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        ORM::for_table($config['db']['pre'] . 'ai_custom_templates')\n            ->where_id_in($ids)\n            ->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAITplCategories(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n\n    $templates = ORM::for_table($config['db']['pre'] . 'ai_templates')\n        ->where_in('category_id', $ids)\n        ->count();\n\n    $custom_templates = ORM::for_table($config['db']['pre'] . 'ai_custom_templates')\n        ->where_in('category_id', $ids)\n        ->count();\n\n    if($templates + $custom_templates) {\n        $result = array('success' => false, 'message' => __('You can not delete a category if it is assigned to any template.'));\n        echo json_encode($result);\n        die();\n    }\n\n    if(check_allow()) {\n        ORM::for_table($config['db']['pre'] . 'ai_template_categories')\n            ->where_id_in($ids)\n            ->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAIImages() {\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        $images = ORM::for_table($config['db']['pre'] . 'ai_images')\n            ->select('image')\n            ->where_id_in($ids);\n        foreach ($images->find_array() as $row) {\n            $image_dir = \"..\/storage\/ai_images\/\";\n            $main_image = trim((string) $row['image']);\n            \/\/ delete Image\n            if (!empty($main_image)) {\n                $file = $image_dir . $main_image;\n                if (file_exists($file))\n                    unlink($file);\n\n                $file = $image_dir . 'small_'.$main_image;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n\n        $images->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAPIKeys(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        ORM::for_table($config['db']['pre'] . 'api_keys')\n            ->where_id_in($ids)\n            ->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAIChatBots(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        $bot = ORM::for_table($config['db']['pre'] . 'ai_chat_bots')\n            ->select('image')\n            ->where_id_in($ids);\n\n        foreach ($bot->find_array() as $row) {\n            $image_dir = \"..\/storage\/chat-bots\/\";\n            $main_image = $row['image'];\n            \/\/ delete Image\n            if (trim($main_image) != \"\") {\n                $file = $image_dir . $main_image;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n\n        $bot->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAIChatPrompts(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        ORM::for_table($config['db']['pre'] . 'ai_chat_prompts')\n            ->where_id_in($ids)\n            ->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAISpeeches() {\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        $speeches = ORM::for_table($config['db']['pre'] . 'ai_speeches')\n            ->select('file_name')\n            ->where_id_in($ids);\n\n        foreach ($speeches->find_array() as $row) {\n            $dir = \"..\/storage\/ai_audios\/\";\n            $main = $row['image'];\n            \/\/ delete Image\n            if (trim($main) != \"\") {\n                $file = $dir . $main;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n\n        $speeches->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteTaxes(){\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'taxes')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteTransaction(){\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'transaction')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteMembershipPlan(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'plans')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteCurrency(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'currencies')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteTimezone(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'time_zones')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteTestimonial(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        $testimonials = ORM::for_table($config['db']['pre'] . 'testimonials')\n            ->select('image')\n            ->where_id_in($ids);\n        foreach ($testimonials->find_array() as $row) {\n            $image_dir = \"..\/storage\/testimonials\/\";\n            $main_image = $row['image'];\n            \/\/ delete Image\n            if (trim($main_image) != \"\" && $main_image != \"default.png\") {\n                $file = $image_dir . $main_image;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n        \/\/ delete\n        $testimonials->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteLanguage(){\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        $languages = ORM::for_table($config['db']['pre'] . 'languages')\n            ->select('file_name')\n            ->where_id_in($ids);\n        foreach ($languages->find_array() as $row) {\n            $file_name = $row['file_name'];\n            $file = '..\/includes\/lang\/lang_'.$file_name.'.php';\n            if(file_exists($file))\n                unlink($file);\n        }\n        \/\/ delete languages\n        $languages->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteSubscriber() {\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    ORM::for_table($config['db']['pre'].'subscriber')\n        ->where_raw(\"id IN (\" . implode(',', $ids) . \")\")\n        ->delete_many();\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteAdmin(){\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    \/* admin with id 1 can't be deleted *\/\n    $ids = array_diff($ids, [1]);\n    if (check_allow()) {\n        $admin = ORM::for_table($config['db']['pre'].'admins')\n            ->select('image')\n            ->where_raw(\"id IN (\" . implode(',', $ids) . \")\");\n\n        foreach ($admin->find_array() as $row) {\n            $uploaddir = \"..\/storage\/profile\/\";\n            \/\/ delete images\n            if (trim($row['image']) != \"\" && $row['image'] != \"default_user.png\") {\n                $file = $uploaddir . $row['image'];\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n\n        \/\/ delete admins\n        $admin->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteUsers(){\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if (check_allow()) {\n        $users = ORM::for_table($config['db']['pre'].'user')\n            ->select('image')\n            ->where_raw(\"id IN (\" . implode(',', $ids) . \")\");\n\n        foreach ($users->find_array() as $row) {\n            $uploaddir = \"..\/storage\/profile\/\";\n            \/\/ delete images\n            if (trim($row['image']) != \"\" && $row['image'] != \"default_user.png\") {\n                $file = $uploaddir . $row['image'];\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n\n        \/\/ delete documents of user\n        ORM::for_table($config['db']['pre'] . 'ai_documents')\n            ->where_raw(\"user_id IN (\" . implode(',', $ids) . \")\")\n            ->delete_many();\n        ORM::for_table($config['db']['pre'] . 'word_used')\n            ->where_raw(\"user_id IN (\" . implode(',', $ids) . \")\")\n            ->delete_many();\n\n        \/\/ delete images of user\n        $images = ORM::for_table($config['db']['pre'] . 'ai_images')\n            ->select('image')\n            ->where_raw(\"user_id IN (\" . implode(',', $ids) . \")\");\n        foreach ($images->find_array() as $row) {\n            $image_dir = \"..\/storage\/ai_images\/\";\n            $main_image = trim((string) $row['image']);\n            \/\/ delete Image\n            if (!empty($main_image)) {\n                $file = $image_dir . $main_image;\n                if (file_exists($file))\n                    unlink($file);\n\n                $file = $image_dir . 'small_'.$main_image;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n        $images->delete_many();\n        ORM::for_table($config['db']['pre'] . 'image_used')\n            ->where_raw(\"user_id IN (\" . implode(',', $ids) . \")\")\n            ->delete_many();\n\n        \/\/ delete audios of user\n        $speeches = ORM::for_table($config['db']['pre'] . 'ai_speeches')\n            ->select('file_name')\n            ->where_raw(\"user_id IN (\" . implode(',', $ids) . \")\");\n        foreach ($speeches->find_array() as $row) {\n            $dir = \"..\/storage\/ai_audios\/\";\n            $main_file = $row['file_name'];\n\n            if (trim($main_file) != \"\") {\n                $file = $dir . $main_file;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n        $speeches->delete_many();\n        ORM::for_table($config['db']['pre'] . 'text_to_speech_used')\n            ->where_raw(\"user_id IN (\" . implode(',', $ids) . \")\")\n            ->delete_many();\n\n        \/\/ delete speech_to_text_used of user\n        ORM::for_table($config['db']['pre'] . 'speech_to_text_used')\n            ->where_raw(\"user_id IN (\" . implode(',', $ids) . \")\")\n            ->delete_many();\n\n        \/\/ Delete Users\n        $users->delete_many();\n\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction blogCatPosition() {\n    global $config;\n\n    $data = array_map('intval', $_POST['position']);\n    foreach ($data as $position => $id) {\n        $plan = ORM::for_table($config['db']['pre'].'blog_categories')\n            ->find_one($id);\n        $plan->set('position',$position);\n        $plan->save();\n    }\n    $result = array('success' => true, 'message' => __('Updated successfully.'));\n    echo json_encode($result);\n}\n\nfunction installPayment()\n{\n    global $config;\n    if(isset($_POST['id']) && $_POST['folder']){\n        $id = $_POST['id'];\n        $folder = $_POST['folder'];\n\n        if(check_allow()) {\n            if (is_dir(ROOTPATH . '\/includes\/payments\/' . $folder)) {\n\n                $payment = ORM::for_table($config['db']['pre'].'payments')\n                    ->use_id_column('payment_id')\n                    ->find_one($id);\n                $payment->set('payment_install', '1');\n                $payment->save();\n\n                if($payment->id())\n                    $result = array('success' => true, 'message' => __('Installed.'));\n                else\n                    $result = array('success' => false, 'message' => __('Error : Please try again.'));\n            } else {\n                $result = array('success' => false, 'message' => __('Plugin directory not exist.'));\n            }\n        }\n    }\n\n    echo json_encode($result);\n    die();\n}\n\nfunction uninstallPayment()\n{\n    global $config;\n    if(isset($_POST['id'])){\n        $id = $_POST['id'];\n\n        if(check_allow()) {\n            $payment = ORM::for_table($config['db']['pre'].'payments')\n                ->use_id_column('payment_id')\n                ->find_one($id);\n            $payment->set('payment_install', '0');\n\n            if($payment->save())\n                $result = array('success' => true, 'message' => __('Uninstalled.'));\n            else\n                $result = array('success' => false, 'message' => __('Error : Please try again.'));\n        }\n    }\n\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteStaticPage(){\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    ORM::for_table($config['db']['pre'].'pages')\n        ->where_raw(\"parent_id IN (\" . implode(',', $ids) . \")\")\n        ->delete_many();\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deletefaq(){\n    global $config;\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        ORM::for_table($config['db']['pre'] . 'faq_entries')\n            ->where_raw(\"parent_id IN (\" . implode(',', $ids) . \")\")\n            ->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction addPlanCustom(){\n    global $config;\n    $name = validate_input($_POST['name']);\n    if (trim($name) != '' && is_string($name)) {\n        if(check_allow()){\n            $custom = ORM::for_table($config['db']['pre'].'plan_options')->create();\n            $custom->title = $name;\n            $custom->save();\n            $id = $custom->id();\n\n            $query = ORM::for_table($config['db']['pre'].'plan_options')->find_one($id);\n            $query->position = $id;\n            $query->save();\n        }\n        else{\n            $id =1;\n        }\n        $result = array();\n        $result['name'] = $name;\n        $result['id'] = $id;\n        echo json_encode($result);\n        die();\n    } else {\n        echo 0;\n        die();\n    }\n}\n\nfunction editPlanCustom(){\n    global $config;\n\n    $name = validate_input($_GET['title']);\n    $status = $_GET['status'];\n    $id = $_GET['id'];\n    if (trim($name) != '' && is_string($name) && trim($id) != '') {\n        if(check_allow()){\n            $plan = ORM::for_table($config['db']['pre'].'plan_options')\n                ->where('id',$id)\n                ->find_one();\n            $plan->set('title',$name);\n            $plan->set('active', $status);\n            $plan->save();\n        }\n        echo '{\"status\" : \"success\",\"message\" : \"' . __('Successfully edited.') . '\"}';\n        die();\n    } else {\n        echo 0;\n        die();\n    }\n}\n\nfunction delPlanCustom(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'plan_options')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction approveComment(){\n    global $config;\n    if(check_allow()){\n        $comment = ORM::for_table($config['db']['pre'].'blog_comment')\n            ->find_one(validate_input($_POST['id']));\n        $comment->set('active', '1');\n        $comment->save();\n    }\n    $result = array('success' => true, 'message' => __('Saved successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteComment(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'blog_comment')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction addBlogCat(){\n    global $config;\n    $_POST = validate_input($_POST);\n    $name = $_POST['name'];\n    if (trim($name) != '' && is_string($name)) {\n        $slug = create_blog_cat_slug($name);\n        if(check_allow()){\n            $blog_cat = ORM::for_table($config['db']['pre'].'blog_categories')->create();\n            $blog_cat->title = $name;\n            $blog_cat->slug = $slug;\n            $blog_cat->save();\n\n            $id = $blog_cat->id();\n            if($id){\n                $blog_pos = ORM::for_table($config['db']['pre'].'blog_categories')->find_one($id);\n                $blog_pos->position = validate_input($id);\n                $blog_pos->save();\n            }\n        }\n        $status = \"success\";\n        $message = __(\"Saved Successfully\");\n    } else{\n        $status = \"error\";\n        $message = __(\"Error: Please try again.\");\n    }\n\n    echo $json = '{\"status\" : \"' . $status . '\",\"message\" : \"' . $message . '\"}';\n    die();\n}\n\nfunction delBlogCat(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow())\n        ORM::for_table($config['db']['pre'].'blog_categories')->where_id_in($ids)->delete_many();\n\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction deleteBlog(){\n    global $config;\n\n    if(isset($_POST['id'])) {\n        $_POST['ids'][] = $_POST['id'];\n    }\n    $ids = array_map('intval', $_POST['ids']);\n    if(check_allow()) {\n        $blogs = ORM::for_table($config['db']['pre'] . 'blog')\n            ->select('image')\n            ->where_id_in($ids);\n        foreach ($blogs->find_array() as $row) {\n            $image_dir = \"..\/storage\/blog\/\";\n            $main_image = $row['image'];\n            \/\/ delete Image\n            if (trim($main_image) != \"\" && $main_image != \"default.png\") {\n                $file = $image_dir . $main_image;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n        \/\/ delete\n        $blogs->delete_many();\n    }\n    $result = array('success' => true, 'message' => __('Deleted successfully.'));\n    echo json_encode($result);\n    die();\n}\n\nfunction saveBlog(){\n    global $config;\n\n    $title = validate_input($_POST['title']);\n\n    $tags = mb_strtolower(validate_input($_POST['tags']));\n    $image = null;\n    $description = validate_input($_POST['description'],true);\n    $error = array();\n\n    if(empty($title)){\n        $error[] = __('Title required.');\n    }\n    if(empty($description)){\n        $error[] = __('Description required.');\n    }\n\n    if (empty($error)) {\n        if (isset($_FILES['image']['name']) && $_FILES['image']['name'] != \"\") {\n            $target_dir = ROOTPATH . \"\/storage\/blog\/\";\n            $result = quick_file_upload('image', $target_dir);\n            if ($result['success']) {\n                $image = $result['file_name'];\n                resizeImage(900, $target_dir . $image, $target_dir . $image);\n                if (isset($_POST['id'])) {\n                    \/\/ remove old image\n                    $info = ORM::for_table($config['db']['pre'] . 'blog')\n                        ->select('image')\n                        ->find_one($_POST['id']);\n\n                    if (!empty(trim($info['image'])) && $info['image'] != \"default.png\") {\n                        if (file_exists($target_dir . $info['image'])) {\n                            unlink($target_dir . $info['image']);\n                        }\n                    }\n                }\n            } else {\n                $error[] = $result['error'];\n            }\n        }\n    }\n\n    if (empty($error)) {\n        $id = 1;\n        if(check_allow()){\n            $now = date(\"Y-m-d H:i:s\");\n            if(!empty($_POST['id'])){\n                $blog = ORM::for_table($config['db']['pre'].'blog')\n                    ->where('id',validate_input($_POST['id']))\n                    ->where('author',$_SESSION['admin']['id'])\n                    ->find_one();\n\n                if($blog){\n                    if(!empty($image)){\n                        $blog->set('image', $image);\n                    }\n                    $blog->set('title',$title);\n                    $blog->set('description',$description);\n                    $blog->set('tags', $tags);\n                    $blog->set('status', validate_input($_POST['status']));\n                    $blog->set('updated_at', $now);\n                    $blog->save();\n                    $id = $_POST['id'];\n                }\n\n                ORM::for_table($config['db']['pre'].'blog_cat_relation')\n                    ->where('blog_id',$_POST['id'])\n                    ->delete_many();\n            }else{\n\n                $blog = ORM::for_table($config['db']['pre'].'blog')->create();\n                $blog->title = $title;\n                $blog->image = $image;\n                $blog->description = ($description);\n                $blog->author = $_SESSION['admin']['id'];\n                $blog->status = validate_input($_POST['status']);\n                $blog->tags = $tags;\n                $blog->created_at = $now;\n                $blog->updated_at = $now;\n                $blog->save();\n                $id = $blog->id();\n            }\n\n            if(!empty($_POST['category']) && is_array($_POST['category'])){\n                foreach($_POST['category'] as $cat){\n                    $blog_cat = ORM::for_table($config['db']['pre'].'blog_cat_relation')->create();\n                    $blog_cat->blog_id = $id;\n                    $blog_cat->category_id = $cat;\n                    $blog_cat->save();\n                }\n            }\n        }\n        $result = array();\n        $result['status'] = 'success';\n        $result['id'] = $id;\n        $result['message'] = __(\"Saved Successfully.\");\n        echo json_encode($result);\n\n    } else {\n        $result = array();\n        $result['status'] = 'error';\n        $result['message'] = implode('<br>',$error);\n        echo json_encode($result);\n    }\n    die();\n}\n\nfunction langTranslation_PlanCustom(){\n    global $config;\n\n    $id = $_POST['id'];\n    $field_tpl = '<input type=\"hidden\" name=\"id\" id=\"field_id\" value=\"'.$id.'\">';\n    if ($id) {\n        $info = ORM::for_table($config['db']['pre'] . 'plan_options')->find_one($id);\n        $translation_lang = explode(',', (string) $info['translation_lang']);\n        $translation_name = explode(',',(string) $info['translation_name']);\n        $count = 0;\n        foreach($translation_lang as $key=>$value)\n        {\n            if($value != '')\n            {\n                $translation[$translation_lang[$key]] = $translation_name[$key];\n\n                $count++;\n            }\n        }\n\n        $orm = ORM::for_table($config['db']['pre'] . 'languages')\n            ->where('active','1')\n            ->where_not_equal('code','en');\n        $languages = $orm->find_many();\n        $num = $orm->count();\n        if($num){\n            foreach($languages as $fetch){\n                $trans_name = (isset($translation[$fetch['code']]))? $translation[$fetch['code']] : '';\n                $count = 0;\n                $field_tpl .= '\n                <div class=\"form-group\">\n                <div class=\"row align-items-center\">\n                <div class=\"col-md-3\">\n                <label class=\"m-0\" for=\"id_'.$fetch['code'].'\">'.$fetch['name'].'<\/label>\n                <\/div>\n                <div class=\"col-md-9\">\n                <input type=\"hidden\" name=\"trans_lang[]\" value=\"'.$fetch['code'].'\">\n                <input type=\"text\" id=\"id_'.$fetch['code'].'\" value=\"'.$trans_name.'\" data-lang-code=\"'.$fetch['code'].'\" class=\"form-control title_code\" name=\"trans_name[]\">\n                <\/div>\n                <\/div>\n                <\/div>';\n            }\n        }else{\n            $field_tpl .= '<div class=\"alert alert-success\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">\u00d7<\/button>\n            '.__(\"No language activated. Your site run with single language.\").'<\/div>';\n        }\n\n        echo $field_tpl;\n        die();\n    } else {\n        echo 0;\n        die();\n    }\n}\n\nfunction edit_langTranslation_PlanCustom(){\n    global $config;\n\n    $id = $_POST['id'];\n    $trans_lang = implode(',', $_POST['trans_lang']);\n    $trans_name = implode(',', $_POST['trans_name']);\n\n    if($_POST['id']){\n        if(check_allow()){\n            $trans_lang = validate_input($trans_lang);\n            $trans_name = validate_input($trans_name);\n\n            $options = ORM::for_table($config['db']['pre'] . 'plan_options')->find_one($id);\n            $options->translation_lang = $trans_lang;\n            $options->translation_name = $trans_name;\n            $options->save();\n\n            echo '{\"status\" : \"success\",\"message\" : \"' . __('Successfully edited.') . '\"}';\n            die();\n        }\n    }\n    echo 0;\n    die();\n}\n\nfunction edit_langTranslation(){\n    global $config;\n    $_POST = validate_input($_POST);\n\n    $id = $_POST['id'];\n    $cattype = $_POST['cat_type'];\n    if(check_allow()){\n        foreach ($_POST['value'] as $items) {\n            $code = $items['code'];\n            $title = $items['title'];\n            $slug = $items['slug'];\n            $title = validate_input($title);\n\n            $source = 'en';\n            $target = $code;\n\n            \/*$trans = new GoogleTranslate();\n            $title = $trans->translate($source, $target, $title);*\/\n\n            if($slug == \"\")\n                $slug = create_category_slug($title);\n            else\n                $slug = create_category_slug($slug);\n\n            $orm = ORM::for_table($config['db']['pre'] . 'category_translation')\n                ->where(array(\n                    'translation_id' => $id,\n                    'lang_code' => $code,\n                    'category_type' => $cattype\n                ));\n\n            $rowcount = $orm->count();\n\n            if($rowcount){\n                $info = $orm->find_one();\n                $cat_translation = ORM::for_table($config['db']['pre'] . 'category_translation')->find_one($info['id']);\n                $cat_translation->title = $title;\n                $cat_translation->slug = $slug;\n                $cat_translation->save();\n\n            }else{\n                $cat_translation = ORM::for_table($config['db']['pre'] . 'category_translation')->create();\n                $cat_translation->lang_code = $code;\n                $cat_translation->title = $title;\n                $cat_translation->slug = $slug;\n                $cat_translation->category_type = $cattype;\n                $cat_translation->translation_id = $id;\n                $cat_translation->save();\n            }\n        }\n        echo 1;\n        die();\n    }\n    echo 0;\n    die();\n}\n\nfunction langTranslation_FormFields(){\n    global $config;\n    $_POST = validate_input($_POST);\n\n    $id = $_POST['id'];\n    $cattype = $_POST['cat_type'];\n    $field_tpl = '<input type=\"hidden\" id=\"category_id\" value=\"'.$id.'\"><input type=\"hidden\" id=\"category_type\" value=\"'.$type.'\">';\n    if ($id) {\n        $orm = ORM::for_table($config['db']['pre'] . 'languages')\n            ->where('active','1')\n            ->where_not_equal('code','en');\n        $info = $orm->find_many();\n        $rows = $orm->count();\n        if($rows){\n            foreach($info as $fetch){\n\n                $info = ORM::for_table($config['db']['pre'] . 'category_translation')\n                    ->where(array(\n                        'translation_id' => $id,\n                        'lang_code' => $fetch['code'],\n                        'category_type' => $cattype\n                    ))\n                    ->find_one();\n\n                if($type == \"custom_option\"){\n                    $field_tpl .= '\n<div class=\"row translate_row\">\n    <div class=\"col-md-12 col-sm-12\">\n        <div class=\"form-group\">\n            <label class=\"col-md-3 control-label\">' . $fetch['name'] . '<\/label>\n            <div class=\"col-md-9\">\n                <input type=\"text\" value=\"' . $info['title'] . '\" class=\"form-control cat_title\" placeholder=\"In ' . $fetch['name'] . '\">\n                <input type=\"hidden\" class=\"lang_code\" value=\"' . $fetch['code'] . '\">\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n';\n                }else{\n                    $field_tpl .= '\n<div class=\"row translate_row\">\n    <div class=\"col-md-6 col-sm-12\">\n        <div class=\"form-group\">\n            <label class=\"col-md-3 control-label\">' . $fetch['name'] . '<\/label>\n            <div class=\"col-md-9\">\n                <input type=\"text\" value=\"' . $info['title'] . '\" class=\"form-control cat_title\" placeholder=\"In ' . $fetch['name'] . '\">\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"col-md-6 col-sm-12\">\n        <div class=\"form-group\">\n            <label class=\"col-md-3 control-label\">'.__(\"Slug\").'<\/label>\n            <div class=\"col-md-9\">\n                <input type=\"text\" value=\"' . $info['slug'] . '\" class=\"form-control cat_slug\" placeholder=\"Slug\">\n            <\/div>\n        <\/div>\n    <\/div>\n    <input type=\"hidden\" class=\"lang_code\" value=\"' . $fetch['code'] . '\">\n<\/div>\n';\n                }\n\n            }\n        }else{\n            $field_tpl .= '<div class=\"alert alert-success\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">\u00d7<\/button>\n             '.__(\"No language activated. Your site run with single language.\").'<\/div>';\n        }\n        echo $field_tpl;\n        die();\n    } else {\n        echo 0;\n        die();\n    }\n}\n\nfunction quickad_update_plan_custom_position(){\n    global $config;\n\n    if(isset($_POST['position'])){\n        $position = $_POST['position'];\n        if (is_array($position)) {\n            $count = 0;\n            foreach($position as $id){\n                $plan = ORM::for_table($config['db']['pre'].'plan_options')\n                    ->where('id',$id)\n                    ->find_one();\n                $plan->set('position',$count);\n                $plan->save();\n\n                $count++;\n            }\n            $result = array('success' => true, 'message' => __(\"Updated Successfully\"));\n        } else {\n\n            $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n        }\n    }else{\n        $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n    }\n    echo json_encode($result);\n    die();\n}\n\nfunction aiTplCategoryPosition(){\n    global $config;\n\n    if(isset($_POST['position'])){\n        $position = $_POST['position'];\n        if (is_array($position)) {\n            $count = 0;\n            if(check_allow()) {\n                foreach ($position as $id) {\n                    $plan = ORM::for_table($config['db']['pre'] . 'ai_template_categories')\n                        ->find_one($id);\n                    $plan->set('position', $count);\n                    $plan->save();\n\n                    $count++;\n                }\n            }\n            $result = array('success' => true, 'message' => __(\"Updated Successfully\"));\n        } else {\n\n            $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n        }\n    }else{\n        $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n    }\n    echo json_encode($result);\n    die();\n}\n\nfunction aiChatBotsPosition(){\n    global $config;\n\n    if(isset($_POST['position'])){\n        $position = $_POST['position'];\n        if (is_array($position)) {\n            $count = 0;\n            if(check_allow()) {\n                foreach ($position as $id) {\n                    $plan = ORM::for_table($config['db']['pre'] . 'ai_chat_bots')\n                        ->find_one($id);\n                    $plan->set('position', $count);\n                    $plan->save();\n\n                    $count++;\n                }\n            }\n            $result = array('success' => true, 'message' => __(\"Updated Successfully\"));\n        } else {\n\n            $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n        }\n    }else{\n        $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n    }\n    echo json_encode($result);\n    die();\n}\n\nfunction aiChatPromptsPosition(){\n    global $config;\n\n    if(isset($_POST['position'])){\n        $position = $_POST['position'];\n        if (is_array($position)) {\n            $count = 0;\n            if(check_allow()) {\n                foreach ($position as $id) {\n                    $plan = ORM::for_table($config['db']['pre'] . 'ai_chat_prompts')\n                        ->find_one($id);\n                    $plan->set('position', $count);\n                    $plan->save();\n\n                    $count++;\n                }\n            }\n            $result = array('success' => true, 'message' => __(\"Updated Successfully\"));\n        } else {\n\n            $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n        }\n    }else{\n        $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n    }\n    echo json_encode($result);\n    die();\n}\n\nfunction aiTplPosition(){\n    global $config;\n\n    if(isset($_POST['position'])){\n        $position = $_POST['position'];\n        if (is_array($position)) {\n            $count = 0;\n            if(check_allow()) {\n                foreach ($position as $id) {\n                    $plan = ORM::for_table($config['db']['pre'] . 'ai_templates')\n                        ->find_one($id);\n                    $plan->set('position', $count);\n                    $plan->save();\n\n                    $count++;\n                }\n            }\n            $result = array('success' => true, 'message' => __(\"Updated Successfully\"));\n        } else {\n\n            $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n        }\n    }else{\n        $result = array('success' => false, 'message' => __(\"Problem in saving, Please try again.\"));\n    }\n    echo json_encode($result);\n    die();\n}\n\nfunction editLanguageFile(){\n    if(isset($_POST['file_name']) && $_POST['file_name'] != \"\"){\n        $file_name = $_POST['file_name'];\n        $filePath = '..\/includes\/lang\/lang_'.$file_name.'.php';\n\n        if(isset($_POST['key'])){\n            if(check_allow()){\n                $value = validate_input($_POST['value'], true);\n                $newLangArray = array(\n                    $_POST['key'] => $value\n                );\n                if(file_exists($filePath)){\n                    change_language_file_settings($filePath, $newLangArray);\n                    echo 1;\n                    die();\n                }\n            }\n        }\n    }else{\n        echo 0;\n        die();\n    }\n    echo 0;\n    die();\n}\n\nfunction change_language_file_settings($filePath, $newArray)\n{\n    $file_lang = getLanguageFileVariable($filePath);\n\n    \/\/ Find the difference - after this, $fileSettings contains only the variables\n    \/\/ declared in the file\n    \/\/$fileSettings = array_diff($file_lang, $newArray);\n\n    \/\/ Update $fileSettings with any new values\n    $fileSettings = array_merge($file_lang, $newArray);\n    \/\/ Build the new file as a string\n    $newFileStr = \"<?php\\n\";\n    foreach ($fileSettings as $name => $val) {\n        \/\/ Using var_export() allows you to set complex values such as arrays and also\n        \/\/ ensures types will be correct\n        $newFileStr .= '$lang['. var_export($name, true) .'] = ' . var_export($val, true) . \";\\n\";\n    }\n    \/\/ Closing tag intentionally omitted, you can add one if you want\n\n    \/\/ Write it back to the file\n    file_put_contents($filePath, $newFileStr);\n}\n\n\/**\n * @param $filename\n * @return string\n *\/\nfunction getFile($filename)\n{\n    $file = fopen($filename, 'r') or die('Unable to open file getFile!');\n    $buffer = fread($file, filesize($filename));\n    fclose($file);\n\n    return $buffer;\n}\n\n\/**\n * @param $filename\n * @param $buffer\n *\/\nfunction writeFile($filename, $buffer)\n{\n    \/\/ Delete the file before writing\n    if (file_exists($filename)) {\n        unlink($filename);\n    }\n    \/\/ Write the new file\n    $file = fopen($filename, 'w') or die('Unable to open file writeFile!');\n    fwrite($file, $buffer);\n    fclose($file);\n}\n\/**\n * @param $rawFilePath\n * @param $filePath\n * @param $con\n * @return mixed|string\n *\/\nfunction setSqlWithDbPrefix($rawFilePath, $filePath, $prefix)\n{\n    if (!file_exists($rawFilePath)) {\n        return '';\n    }\n\n    \/\/ Read and replace prefix\n    $sql = getFile($rawFilePath);\n    $sql = str_replace('<<prefix>>', $prefix, $sql);\n\n    \/\/ Write file\n    writeFile($filePath, $sql);\n\n    return $sql;\n}\n\n\/**\n * @param $con\n * @param $filePath\n * @return bool\n *\/\n\nfunction importSql($con, $filePath)\n{\n\n    try {\n        $errorDetect = false;\n\n        \/\/ Temporary variable, used to store current query\n        $tmpline = '';\n        \/\/ Read in entire file\n        $lines = file($filePath);\n        \/\/ Loop through each line\n        foreach ($lines as $line) {\n            \/\/ Skip it if it's a comment\n            if (substr($line, 0, 2) == '--' || trim($line) == '') {\n                continue;\n            }\n            if (substr($line, 0, 2) == '\/*') {\n                continue;\n            }\n\n            \/\/ Add this line to the current segment\n            $tmpline .= $line;\n            \/\/ If it has a semicolon at the end, it's the end of the query\n            if (substr(trim($line), -1, 1) == ';') {\n                \/\/ Perform the query\n                if (!$con->query($tmpline)) {\n                    echo \"<pre>Error performing query '<strong>\" . $tmpline . \"<\/strong>' : \" . $con->error . \" - Code: \" . $con->errno . \"<\/pre><br \/>\";\n                    $errorDetect = true;\n                }\n                \/\/ Reset temp variable to empty\n                $tmpline = '';\n            }\n        }\n        \/\/ Check if error is detected\n        if ($errorDetect) {\n            \/\/dd('ERROR');\n        }\n    } catch (\\Exception $e) {\n        $msg = __('Error when importing required data : ') . $e->getMessage();\n        echo '<pre>';\n        print_r($msg);\n        echo '<\/pre>';\n        exit();\n    }\n\n\n    \/\/ Delete the SQL file\n    if (file_exists($filePath)) {\n        unlink($filePath);\n    }\n\n    return true;\n}\n\n\/**\n * Import Geonames Default country database\n * @param $con\n * @param $site_info\n * @return bool\n *\/\nfunction importGeonamesSql($con,$config,$default_country)\n{\n    if (!isset($default_country)) return false;\n\n    \/\/ Default country SQL file\n    $filename = 'database\/countries\/' . strtolower($default_country) . '.sql';\n    $rawFilePath = '..\/storage\/'.$filename;\n    $filePath = '..\/storage\/installed-db\/' . $filename;\n\n    setSqlWithDbPrefix($rawFilePath, $filePath, $config['db']['pre']);\n\n    return importSql($con, $filePath);\n}","user_data":"<?php\n\/**\n * @package QuickAI - OpenAI Content & Image Generator\n * @author Bylancer\n * @version 3.3\n * @Updated Date: 08\/May\/2023\n * @Copyright 2015-23 Bylancer\n *\/\n\ndefine(\"ROOTPATH\", dirname(__DIR__));\ndefine(\"APPPATH\", ROOTPATH . \"\/php\/\");\n\nrequire_once ROOTPATH . '\/includes\/autoload.php';\nrequire_once ROOTPATH . '\/includes\/lang\/lang_' . $config['lang'] . '.php';\n\nsec_session_start();\n\nif (isset($_GET['action'])) {\n    if ($_GET['action'] == \"submitBlogComment\") {\n        submitBlogComment();\n    }\n    if ($_GET['action'] == \"generate_content\") {\n        generate_content();\n    }\n    if ($_GET['action'] == \"generate_image\") {\n        generate_image();\n    }\n    if ($_GET['action'] == \"save_document\") {\n        save_document();\n    }\n    if ($_GET['action'] == \"delete_document\") {\n        delete_document();\n    }\n    if ($_GET['action'] == \"delete_image\") {\n        delete_image();\n    }\n\n    \/\/ AI chat\n    if ($_GET['action'] == \"load_ai_chats\") {\n        load_ai_chats();\n    }\n    if ($_GET['action'] == \"edit_conversation_title\") {\n        edit_conversation_title();\n    }\n    if ($_GET['action'] == \"send_ai_message\") {\n        send_ai_message();\n    }\n    if ($_GET['action'] == \"chat_stream\") {\n        chat_stream();\n    }\n    if ($_GET['action'] == \"delete_ai_chats\") {\n        delete_ai_chats();\n    }\n    if ($_GET['action'] == \"export_ai_chats\") {\n        export_ai_chats();\n    }\n\n    \/\/ speech to text\n    if ($_GET['action'] == \"speech_to_text\") {\n        speech_to_text();\n    }\n\n    \/\/ ai code\n    if ($_GET['action'] == \"ai_code\") {\n        ai_code();\n    }\n\n    \/\/ text to speech\n    if ($_GET['action'] == \"text_to_speech\") {\n        text_to_speech();\n    }\n    if ($_GET['action'] == \"delete_speech\") {\n        delete_speech();\n    }\n    die(0);\n}\n\nif (isset($_POST['action'])) {\n    if ($_POST['action'] == \"ajaxlogin\") {\n        ajaxlogin();\n    }\n    if ($_POST['action'] == \"email_verify\") {\n        email_verify();\n    }\n    die(0);\n}\n\nfunction ajaxlogin()\n{\n    global $config, $lang, $link;\n    $loggedin = userlogin($_POST['username'], $_POST['password']);\n    $result['success'] = false;\n    $result['message'] = __(\"Error: Please try again.\");\n    if (!is_array($loggedin)) {\n        $result['message'] = __(\"Username or Password not found\");\n    } elseif ($loggedin['status'] == 2) {\n        $result['message'] = __(\"This account has been banned\");\n    } else {\n        create_user_session($loggedin['id'], $loggedin['username'], $loggedin['password'], $loggedin['user_type']);\n        update_lastactive();\n\n        $redirect_url = get_option('after_login_link');\n        if (empty($redirect_url)) {\n            $redirect_url = $link['DASHBOARD'];\n        }\n\n        $result['success'] = true;\n        $result['message'] = $redirect_url;\n    }\n    die(json_encode($result));\n}\n\nfunction email_verify()\n{\n    global $config, $lang;\n\n    if (checkloggedin()) {\n        \/*SEND CONFIRMATION EMAIL*\/\n        email_template(\"signup_confirm\", $_SESSION['user']['id']);\n\n        $respond = __('Sent');\n        echo '<a class=\"button gray\" href=\"javascript:void(0);\">' . $respond . '<\/a>';\n        die();\n\n    } else {\n        exit;\n    }\n}\n\nfunction submitBlogComment()\n{\n    global $config, $lang;\n    $comment_error = $name = $email = $user_id = $comment = null;\n    $result = array();\n    $is_admin = '0';\n    $is_login = false;\n    if (checkloggedin()) {\n        $is_login = true;\n    }\n    $avatar = $config['site_url'] . 'storage\/profile\/default_user.png';\n    if (!($is_login || isset($_SESSION['admin']['id']))) {\n        if (empty($_POST['user_name']) || empty($_POST['user_email'])) {\n            $comment_error = __('All fields are required.');\n        } else {\n            $name = validate_input($_POST['user_name']);\n            $email = validate_input($_POST['user_email']);\n\n            $regex = '\/^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})$\/';\n            if (!preg_match($regex, $email)) {\n                $comment_error = __('This is not a valid email address.');\n            }\n        }\n    } else if ($is_login && isset($_SESSION['admin']['id'])) {\n        $commenting_as = 'admin';\n        if (!empty($_POST['commenting-as'])) {\n            if (in_array($_POST['commenting-as'], array('admin', 'user'))) {\n                $commenting_as = $_POST['commenting-as'];\n            }\n        }\n        if ($commenting_as == 'admin') {\n            $is_admin = '1';\n            $info = ORM::for_table($config['db']['pre'] . 'admins')->find_one($_SESSION['admin']['id']);\n            $user_id = $_SESSION['admin']['id'];\n            $name = $info['name'];\n            $email = $info['email'];\n            if (!empty($info['image'])) {\n                $avatar = $config['site_url'] . 'storage\/profile\/' . $info['image'];\n            }\n        } else {\n            $user_id = $_SESSION['user']['id'];\n            $user_data = get_user_data(null, $user_id);\n            $name = $user_data['name'];\n            $email = $user_data['email'];\n            if (!empty($user_data['image'])) {\n                $avatar = $config['site_url'] . 'storage\/profile\/' . $user_data['image'];\n            }\n        }\n    } else if ($is_login) {\n        $user_id = $_SESSION['user']['id'];\n        $user_data = get_user_data(null, $user_id);\n        $name = $user_data['name'];\n        $email = $user_data['email'];\n        if (!empty($user_data['image'])) {\n            $avatar = $config['site_url'] . 'storage\/profile\/' . $user_data['image'];\n        }\n    } else if (isset($_SESSION['admin']['id'])) {\n        $is_admin = '1';\n        $info = ORM::for_table($config['db']['pre'] . 'admins')->find_one($_SESSION['admin']['id']);\n        $user_id = $_SESSION['admin']['id'];\n        $name = $info['name'];\n        $email = $info['email'];\n        if (!empty($info['image'])) {\n            $avatar = $config['site_url'] . 'storage\/profile\/' . $info['image'];\n        }\n    } else {\n        $comment_error = __('Please login to post a comment.');\n    }\n\n    if (empty($_POST['comment'])) {\n        $comment_error = __('All fields are required.');\n    } else {\n        $comment = validate_input($_POST['comment']);\n    }\n\n    $duplicates = ORM::for_table($config['db']['pre'] . 'blog_comment')\n        ->where('blog_id', $_POST['comment_post_ID'])\n        ->where('name', $name)\n        ->where('email', $email)\n        ->where('comment', $comment)\n        ->count();\n\n    if ($duplicates > 0) {\n        $comment_error = __('Duplicate Comment: This comment is already exists.');\n    }\n\n    if (!$comment_error) {\n        if ($is_admin) {\n            $approve = '1';\n        } else {\n            if ($config['blog_comment_approval'] == 1) {\n                $approve = '0';\n            } else if ($config['blog_comment_approval'] == 2) {\n                if ($is_login) {\n                    $approve = '1';\n                } else {\n                    $approve = '0';\n                }\n            } else {\n                $approve = '1';\n            }\n        }\n\n        $blog_cmnt = ORM::for_table($config['db']['pre'] . 'blog_comment')->create();\n        $blog_cmnt->blog_id = $_POST['comment_post_ID'];\n        $blog_cmnt->user_id = $user_id;\n        $blog_cmnt->is_admin = $is_admin;\n        $blog_cmnt->name = $name;\n        $blog_cmnt->email = $email;\n        $blog_cmnt->comment = $comment;\n        $blog_cmnt->created_at = date('Y-m-d H:i:s');\n        $blog_cmnt->active = $approve;\n        $blog_cmnt->parent = $_POST['comment_parent'];\n        $blog_cmnt->save();\n\n        $id = $blog_cmnt->id();\n        $date = date('d, M Y');\n        $approve_txt = '';\n        if ($approve == '0') {\n            $approve_txt = '<em><small>' . __('Comment is posted, wait for the reviewer to approve.') . '<\/small><\/em>';\n        }\n\n        $html = '<li id=\"li-comment-' . $id . '\"';\n        if ($_POST['comment_parent'] != 0) {\n            $html .= 'class=\"children-2\"';\n        }\n        $html .= '>\n                   <div class=\"comments-box\" id=\"comment-' . $id . '\">\n                        <div class=\"comments-avatar\">\n                            <img src=\"' . $avatar . '\" alt=\"' . $name . '\">\n                        <\/div>\n                        <div class=\"comments-text\">\n                            <div class=\"avatar-name\">\n                                <h5>' . $name . '<\/h5>\n                                <span>' . $date . '<\/span>\n                            <\/div>\n                            ' . $approve_txt . '\n                            <p>' . nl2br(stripcslashes($comment)) . '<\/p>\n                        <\/div>\n                    <\/div>\n                <\/li>';\n\n        $result['success'] = true;\n        $result['html'] = $html;\n        $result['id'] = $id;\n    } else {\n        $result['success'] = false;\n        $result['error'] = $comment_error;\n    }\n    die(json_encode($result));\n}\n\nfunction generate_content()\n{\n    $result = array();\n    global $config;\n\n    \/\/ if disabled by admin\n    if (!get_option(\"enable_ai_templates\", 1)) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die(json_encode($result));\n    }\n\n    if (checkloggedin()) {\n\n        if (!$config['non_active_allow']) {\n            $user_data = get_user_data(null, $_SESSION['user']['id']);\n            if ($user_data['status'] == 0) {\n                $result['success'] = false;\n                $result['error'] = __('Verify your email address to use the AI.');\n                die(json_encode($result));\n            }\n        }\n\n        set_time_limit(0);\n\n        $_POST = validate_input($_POST);\n\n        if (!empty($_POST['ai_template'])) {\n\n            $prompt = '';\n            $text = array();\n            $max_tokens = (int)$_POST['max_results'];\n            $max_results = (int)$_POST['no_of_results'];\n            $temperature = (float)$_POST['quality'];\n\n            $membership = get_user_membership_detail($_SESSION['user']['id']);\n            $words_limit = $membership['settings']['ai_words_limit'];\n            $plan_templates = $membership['settings']['ai_templates'];\n\n            if (get_option('single_model_for_plans'))\n                $model = get_option('open_ai_model', 'gpt-3.5-turbo');\n            else\n                $model = $membership['settings']['ai_model'];\n\n            $start = date('Y-m-01');\n            $end = date_create(date('Y-m-t'))->modify('+1 day')->format('Y-m-d');\n            $total_words_used = ORM::for_table($config['db']['pre'] . 'word_used')\n                ->where('user_id', $_SESSION['user']['id'])\n                ->where_raw(\"(`date` BETWEEN '$start' AND '$end')\")\n                ->sum('words');\n\n            $total_words_used = $total_words_used ?: 0;\n\n            \/\/ check if user's membership have the template\n            if (!in_array($_POST['ai_template'], $plan_templates)) {\n                $result['success'] = false;\n                $result['error'] = __('Upgrade your membership plan to use this template');\n                die(json_encode($result));\n            }\n\n            \/\/ check user's word limit\n            if ($words_limit != -1 && (($words_limit - $total_words_used) < $max_tokens)) {\n                $result['success'] = false;\n                $result['error'] = __('Words limit exceeded, Upgrade your membership plan.');\n                die(json_encode($result));\n            }\n\n            switch ($_POST['ai_template']) {\n                case 'blog-ideas':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_blog_idea_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'blog-intros':\n                    if (!empty($_POST['title']) && !empty($_POST['description'])) {\n                        $prompt = create_blog_intros_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'blog-titles':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_blog_titles_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'blog-section':\n                    if (!empty($_POST['title']) && !empty($_POST['description'])) {\n                        $prompt = create_blog_section_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'blog-conclusion':\n                    if (!empty($_POST['title']) && !empty($_POST['description'])) {\n                        $prompt = create_blog_conclusion_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'article-writer':\n                    if (!empty($_POST['title']) && !empty($_POST['description'])) {\n                        $prompt = create_article_writer_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'article-rewriter':\n                    if (!empty($_POST['description']) && !empty($_POST['keywords'])) {\n                        $prompt = create_article_rewriter_prompt($_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'article-outlines':\n                    if (!empty($_POST['title']) && !empty($_POST['description'])) {\n                        $prompt = create_article_outlines_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'talking-points':\n                    if (!empty($_POST['title']) && !empty($_POST['description'])) {\n                        $prompt = create_talking_points_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'paragraph-writer':\n                    if (!empty($_POST['description']) && !empty($_POST['keywords'])) {\n                        $prompt = create_paragraph_writer_prompt($_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'content-rephrase':\n                    if (!empty($_POST['description']) && !empty($_POST['keywords'])) {\n                        $prompt = create_content_rephrase_prompt($_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'facebook-ads':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_facebook_ads_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'facebook-ads-headlines':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_facebook_ads_headlines_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'google-ad-titles':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_google_ads_titles_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'google-ad-descriptions':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_google_ads_descriptions_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'linkedin-ad-headlines':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_linkedin_ads_headlines_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'linkedin-ad-descriptions':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_linkedin_ads_descriptions_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'app-and-sms-notifications':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_app_sms_notifications_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'text-extender':\n                    if (!empty($_POST['description']) && !empty($_POST['keywords'])) {\n                        $prompt = create_text_extender_prompt($_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'content-shorten':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_content_shorten_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'quora-answers':\n                    if (!empty($_POST['title']) && !empty($_POST['description'])) {\n                        $prompt = create_quora_answers_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'summarize-for-2nd-grader':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_summarize_2nd_grader_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'stories':\n                    if (!empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_stories_prompt($_POST['audience'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'bullet-point-answers':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_bullet_point_answers_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'definition':\n                    if (!empty($_POST['keyword'])) {\n                        $prompt = create_definition_prompt($_POST['keyword'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'answers':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_answers_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'questions':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_questions_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'passive-active-voice':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_passive_active_voice_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'pros-cons':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_pros_cons_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'rewrite-with-keywords':\n                    if (!empty($_POST['description']) && !empty($_POST['keywords'])) {\n                        $prompt = create_rewrite_with_keywords_prompt($_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'emails':\n                    if (!empty($_POST['recipient']) && !empty($_POST['recipient-position']) && !empty($_POST['description'])) {\n                        $prompt = create_emails_prompt($_POST['recipient'], $_POST['recipient-position'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'emails-v2':\n                    if (!empty($_POST['from']) && !empty($_POST['to']) && !empty($_POST['goal']) && !empty($_POST['description'])) {\n                        $prompt = create_emails_v2_prompt($_POST['from'], $_POST['to'], $_POST['goal'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'email-subject-lines':\n                    if (!empty($_POST['description']) && !empty($_POST['title'])) {\n                        $prompt = create_email_subject_lines_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'startup-name-generator':\n                    if (!empty($_POST['description']) && !empty($_POST['title'])) {\n                        $prompt = create_startup_name_generator_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'company-bios':\n                    if (!empty($_POST['description']) && !empty($_POST['title']) && !empty($_POST['platform'])) {\n                        $prompt = create_company_bios_prompt($_POST['title'], $_POST['description'], $_POST['platform'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'company-mission':\n                    if (!empty($_POST['description']) && !empty($_POST['title'])) {\n                        $prompt = create_company_mission_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'company-vision':\n                    if (!empty($_POST['description']) && !empty($_POST['title'])) {\n                        $prompt = create_company_vision_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'product-name-generator':\n                    if (!empty($_POST['description']) && !empty($_POST['title'])) {\n                        $prompt = create_product_name_generator_prompt($_POST['description'], $_POST['title'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'product-descriptions':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_product_descriptions_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'amazon-product-titles':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_amazon_product_titles_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'amazon-product-descriptions':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_amazon_product_descriptions_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'amazon-product-features':\n                    if (!empty($_POST['title']) && !empty($_POST['audience']) && !empty($_POST['description'])) {\n                        $prompt = create_amazon_product_features_prompt($_POST['title'], $_POST['description'], $_POST['audience'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'social-post-personal':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_social_post_personal_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'social-post-business':\n                    if (!empty($_POST['title']) && !empty($_POST['information']) && !empty($_POST['description'])) {\n                        $prompt = create_social_post_business_prompt($_POST['title'], $_POST['information'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'instagram-captions':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_instagram_captions_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'instagram-hashtags':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_instagram_hashtags_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'twitter-tweets':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_twitter_tweets_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'youtube-titles':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_youtube_titles_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'youtube-descriptions':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_youtube_descriptions_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'youtube-outlines':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_youtube_outlines_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                case 'linkedin-posts':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_linkedin_posts_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'tiktok-video-scripts':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_tiktok_video_scripts_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'meta-tags-blog':\n                    if (!empty($_POST['title']) && !empty($_POST['keywords']) && !empty($_POST['description'])) {\n                        $prompt = create_meta_tags_blog_prompt($_POST['title'], $_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'meta-tags-homepage':\n                    if (!empty($_POST['title']) && !empty($_POST['keywords']) && !empty($_POST['description'])) {\n                        $prompt = create_meta_tags_homepage_prompt($_POST['title'], $_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'meta-tags-product':\n                    if (!empty($_POST['title']) && !empty($_POST['keywords']) && !empty($_POST['description']) && !empty($_POST['company_name'])) {\n                        $prompt = create_meta_tags_product_prompt($_POST['company_name'], $_POST['title'], $_POST['description'], $_POST['keywords'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'tone-changer':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_tone_changer_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'song-lyrics':\n                    if (!empty($_POST['genre']) && !empty($_POST['title'])) {\n                        $prompt = create_song_lyrics_prompt($_POST['title'], $_POST['genre'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'translate':\n                    if (!empty($_POST['description'])) {\n                        $prompt = create_translate_prompt($_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'faqs':\n                    if (!empty($_POST['description']) && !empty($_POST['title'])) {\n                        $prompt = create_faqs_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'faq-answers':\n                    if (!empty($_POST['description']) && !empty($_POST['title']) && !empty($_POST['question'])) {\n                        $prompt = create_faq_answers_prompt($_POST['title'], $_POST['description'], $_POST['question'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                case 'testimonials-reviews':\n                    if (!empty($_POST['description']) && !empty($_POST['title'])) {\n                        $prompt = create_testimonials_reviews_prompt($_POST['title'], $_POST['description'], $_POST['language'], $_POST['tone']);\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('All fields with (*) are required.');\n                        die(json_encode($result));\n                    }\n                    break;\n                default:\n                    \/\/ check for custom template\n                    $ai_template = ORM::for_table($config['db']['pre'] . 'ai_custom_templates')\n                        ->where('active', '1')\n                        ->where('slug', $_POST['ai_template'])\n                        ->find_one();\n                    if (!empty($ai_template)) {\n                        $prompt = $ai_template['prompt'];\n\n                        if ($_POST['language'] == 'en') {\n                            $prompt = $ai_template['prompt'];\n                        } else {\n                            $languages = get_ai_languages();\n                            $prompt = \"Provide response in \" . $languages[$_POST['language']] . \".\\n\\n \" . $ai_template['prompt'];\n                        }\n\n                        if (!empty($ai_template['parameters'])) {\n                            $parameters = json_decode($ai_template['parameters'], true);\n                            foreach ($parameters as $key => $parameter) {\n                                if (!empty($_POST['parameter'][$key])) {\n                                    if (strpos($prompt, '{{' . $parameter['title'] . '}}') !== false) {\n                                        $prompt = str_replace('{{' . $parameter['title'] . '}}', $_POST['parameter'][$key], $prompt);\n                                    } else {\n                                        $prompt .= \"\\n\\n \" . $parameter['title'] . \": \" . $_POST['parameter'][$key];\n                                    }\n                                }\n                            }\n                        }\n\n                        $prompt .= \" \\n\\n Voice of tone of the response must be \" . $_POST['tone'] . '.';\n                    } else {\n                        $result['success'] = false;\n                        $result['error'] = __('Unexpected error, please try again.');\n                        die(json_encode($result));\n                    }\n\n                    break;\n            }\n\n            \/\/ check bad words\n            if ($word = check_bad_words($prompt)) {\n                $result['success'] = false;\n                $result['error'] = __('Your request contains a banned word:') . ' ' . $word;\n                die(json_encode($result));\n            }\n\n            require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/OpenAi.php';\n            require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/Url.php';\n\n            $open_ai = new Orhanerday\\OpenAi\\OpenAi(get_api_key());\n\n            if ($model == 'gpt-3.5-turbo' || $model == 'gpt-4') {\n                $complete = $open_ai->chat([\n                    'model' => $model,\n                    'messages' => [\n                        [\n                            \"role\" => \"user\",\n                            \"content\" => $prompt\n                        ],\n                    ],\n                    'temperature' => $temperature,\n                    'frequency_penalty' => 0,\n                    'presence_penalty' => 0,\n                    'max_tokens' => $max_tokens,\n                    'n' => $max_results,\n                    'user' => $_SESSION['user']['id']\n                ]);\n            } else {\n                $complete = $open_ai->completion([\n                    'model' => $model,\n                    'prompt' => $prompt,\n                    'temperature' => $temperature,\n                    'frequency_penalty' => 0,\n                    'presence_penalty' => 0,\n                    'max_tokens' => $max_tokens,\n                    'n' => $max_results,\n                    'user' => $_SESSION['user']['id']\n                ]);\n            }\n\n            $response = json_decode($complete, true);\n\n            if (isset($response['choices'])) {\n                if ($model == 'gpt-3.5-turbo' || $model == 'gpt-4') {\n                    if (count($response['choices']) > 1) {\n                        foreach ($response['choices'] as $value) {\n                            $text[] = nl2br(trim($value['message']['content'])) . \"<br><br><br><br>\";\n                        }\n                    } else {\n                        $text[] = nl2br(trim($response['choices'][0]['message']['content']));\n                    }\n                } else {\n                    if (count($response['choices']) > 1) {\n                        foreach ($response['choices'] as $value) {\n                            $text[] = nl2br(trim($value['text'])) . \"<br><br><br><br>\";\n                        }\n                    } else {\n                        $text[] = nl2br(trim($response['choices'][0]['text']));\n                    }\n                }\n\n                $tokens = $response['usage']['completion_tokens'];\n\n                $word_used = ORM::for_table($config['db']['pre'] . 'word_used')->create();\n                $word_used->user_id = $_SESSION['user']['id'];\n                $word_used->words = $tokens;\n                $word_used->date = date('Y-m-d H:i:s');\n                $word_used->save();\n\n                $result['success'] = true;\n                $result['text'] = implode(\"<br><br><hr><br><br>\", $text);\n                $result['old_used_words'] = $total_words_used;\n                $result['current_used_words'] = $total_words_used + $tokens;\n            } else {\n                \/\/ error log default message\n                if (!empty($response['error']['message']))\n                    error_log('OpenAI: ' . $response['error']['message']);\n\n                $result['success'] = false;\n                $result['api_error'] = $response['error']['message'];\n                $result['error'] = get_api_error_message($open_ai->getCURLInfo()['http_code']);\n                die(json_encode($result));\n            }\n            die(json_encode($result));\n        }\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction generate_image()\n{\n    $result = array();\n    if (checkloggedin()) {\n        global $config;\n\n        \/\/ if disabled by admin\n        if (!$config['enable_ai_images']) {\n            $result['success'] = false;\n            $result['error'] = __('This feature is disabled by the admin.');\n            die(json_encode($result));\n        }\n\n        if (!$config['non_active_allow']) {\n            $user_data = get_user_data(null, $_SESSION['user']['id']);\n            if ($user_data['status'] == 0) {\n                $result['success'] = false;\n                $result['error'] = __('Verify your email address to use the AI.');\n                die(json_encode($result));\n            }\n        }\n\n        set_time_limit(0);\n\n        $_POST = validate_input($_POST);\n\n        if (!empty($_POST['description'])) {\n\n            $membership = get_user_membership_detail($_SESSION['user']['id']);\n            $images_limit = $membership['settings']['ai_images_limit'];\n\n            $start = date('Y-m-01');\n            $end = date_create(date('Y-m-t'))->modify('+1 day')->format('Y-m-d');\n            $total_images_used = ORM::for_table($config['db']['pre'] . 'image_used')\n                ->where('user_id', $_SESSION['user']['id'])\n                ->where_raw(\"(`date` BETWEEN '$start' AND '$end')\")\n                ->sum('images');\n\n            $total_images_used = $total_images_used ?: 0;\n\n            \/\/ check user's images limit\n            if ($images_limit != -1 && (($images_limit - $total_images_used) < $_POST['no_of_images'])) {\n                $result['success'] = false;\n                $result['error'] = __('Images limit exceeded, Upgrade your membership plan.');\n                die(json_encode($result));\n            }\n\n            $prompt = $_POST['description'];\n            $prompt .= !empty($_POST['style']) ? ', ' . $_POST['style'] . ' style' : '';\n            $prompt .= !empty($_POST['lighting']) ? ', ' . $_POST['lighting'] . ' lighting' : '';\n            $prompt .= !empty($_POST['mood']) ? ', ' . $_POST['mood'] . ' mood' : '';\n\n            \/\/ check bad words\n            if ($word = check_bad_words($prompt)) {\n                $result['success'] = false;\n                $result['error'] = __('Your request contains a banned word:') . ' ' . $word;\n                die(json_encode($result));\n            }\n\n            \/\/ check image api\n            $image_api = get_option('ai_image_api');\n            if ($image_api == 'any') {\n                \/\/ check random\n                $data = ['openai', 'stable-diffusion'];\n                $image_api = $data[array_rand($data)];\n            }\n\n            if ($image_api == 'stable-diffusion') {\n                include ROOTPATH . '\/includes\/lib\/StableDiffusion.php';\n\n                $stableDiffusion = new StableDiffusion(get_image_api_key($image_api));\n\n                $width = 512;\n                $height = 512;\n\n                $response = $stableDiffusion->image([\n                    \"text_prompts\" => [\n                        [\"text\" => $prompt]\n                    ],\n                    \"height\" => $height,\n                    \"width\" => $width,\n                    \"samples\" => (int)$_POST['no_of_images'],\n                    \"steps\" => 50,\n                ]);\n                $response = json_decode($response, true);\n                if (isset($response['artifacts'])) {\n                    foreach ($response['artifacts'] as $image) {\n\n                        $name = uniqid() . '.png';\n                        $target_dir = ROOTPATH . '\/storage\/ai_images\/';\n                        file_put_contents($target_dir . $name, base64_decode($image['base64']));\n                        resizeImage(200, $target_dir . 'small_' . $name, $target_dir . $name);\n                        $content = ORM::for_table($config['db']['pre'] . 'ai_images')->create();\n                        $content->user_id = $_SESSION['user']['id'];\n                        $content->title = $_POST['title'];\n                        $content->description = $_POST['description'];\n                        $content->resolution = $_POST['resolution'];\n                        $content->image = $name;\n                        $content->created_at = date('Y-m-d H:i:s');\n                        $content->save();\n\n                        $array = [\n                            'small' => $config['site_url'] . 'storage\/ai_images\/small_' . $name,\n                            'large' => $config['site_url'] . 'storage\/ai_images\/' . $name,\n                        ];\n                        $images[] = $array;\n                    }\n\n                    $image_used = ORM::for_table($config['db']['pre'] . 'image_used')->create();\n                    $image_used->user_id = $_SESSION['user']['id'];\n                    $image_used->images = (int)$_POST['no_of_images'];\n                    $image_used->date = date('Y-m-d H:i:s');\n                    $image_used->save();\n\n                    $result['success'] = true;\n                    $result['data'] = $images;\n                    $result['description'] = $_POST['description'];\n                    $result['old_used_images'] = $total_images_used;\n                    $result['current_used_images'] = $total_images_used + $_POST['no_of_images'];\n                } else {\n                    \/\/ error log default message\n                    if (!empty($response['message']))\n                        error_log('Stable Diffusion: ' . $response['message']);\n\n                    $result['success'] = false;\n                    $result['api_error'] = $response['message'];\n                    $result['error'] = get_api_error_message($stableDiffusion->getCURLInfo()['http_code']);\n                    die(json_encode($result));\n                }\n            } else {\n                \/\/ openai\n                require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/OpenAi.php';\n                require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/Url.php';\n\n                $open_ai = new Orhanerday\\OpenAi\\OpenAi(get_image_api_key($image_api));\n\n                $complete = $open_ai->image([\n                    'prompt' => $prompt,\n                    'size' => $_POST['resolution'],\n                    'n' => (int)$_POST['no_of_images'],\n                    \"response_format\" => \"url\",\n                    'user' => $_SESSION['user']['id']\n                ]);\n\n                $response = json_decode($complete, true);\n\n                if (isset($response['data'])) {\n                    $images = array();\n\n                    foreach ($response['data'] as $key => $value) {\n                        $url = $value['url'];\n\n                        $name = uniqid() . '.png';\n\n                        $image = file_get_contents($url);\n\n                        $target_dir = ROOTPATH . '\/storage\/ai_images\/';\n                        file_put_contents($target_dir . $name, $image);\n\n                        resizeImage(200, $target_dir . 'small_' . $name, $target_dir . $name);\n\n                        $content = ORM::for_table($config['db']['pre'] . 'ai_images')->create();\n                        $content->user_id = $_SESSION['user']['id'];\n                        $content->title = $_POST['title'];\n                        $content->description = $_POST['description'];\n                        $content->resolution = $_POST['resolution'];\n                        $content->image = $name;\n                        $content->created_at = date('Y-m-d H:i:s');\n                        $content->save();\n\n                        $array = [\n                            'small' => $config['site_url'] . 'storage\/ai_images\/small_' . $name,\n                            'large' => $config['site_url'] . 'storage\/ai_images\/' . $name,\n                        ];\n                        $images[] = $array;\n                    }\n\n                    $image_used = ORM::for_table($config['db']['pre'] . 'image_used')->create();\n                    $image_used->user_id = $_SESSION['user']['id'];\n                    $image_used->images = (int)$_POST['no_of_images'];\n                    $image_used->date = date('Y-m-d H:i:s');\n                    $image_used->save();\n\n                    $result['success'] = true;\n                    $result['data'] = $images;\n                    $result['description'] = $_POST['description'];\n                    $result['old_used_images'] = $total_images_used;\n                    $result['current_used_images'] = $total_images_used + $_POST['no_of_images'];\n                } else {\n                    \/\/ error log default message\n                    if (!empty($response['error']['message']))\n                        error_log('OpenAI: ' . $response['error']['message']);\n\n                    $result['success'] = false;\n                    $result['api_error'] = $response['error']['message'];\n                    $result['error'] = get_api_error_message($open_ai->getCURLInfo()['http_code']);\n                    die(json_encode($result));\n                }\n            }\n            die(json_encode($result));\n        }\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction save_document()\n{\n    $result = array();\n    if (checkloggedin()) {\n        global $config;\n\n        $content = validate_input($_POST['content'], true);\n        $_POST = validate_input($_POST);\n        $_POST['content'] = $content;\n\n        if (!empty($_POST['id'])) {\n            $content = ORM::for_table($config['db']['pre'] . 'ai_documents')->find_one($_POST['id']);\n        } else {\n            $content = ORM::for_table($config['db']['pre'] . 'ai_documents')->create();\n        }\n\n        $content->user_id = $_SESSION['user']['id'];\n        $content->title = $_POST['title'];\n\n        if (!empty($_POST['content']))\n            $content->content = $_POST['content'];\n\n        $content->template = $_POST['ai_template'];\n        $content->created_at = date('Y-m-d H:i:s');\n        $content->save();\n\n        $result['success'] = true;\n        $result['id'] = $content->id();\n        $result['message'] = __('Successfully Saved.');\n        die(json_encode($result));\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction delete_document()\n{\n    $result = array();\n    if (checkloggedin()) {\n        global $config;\n\n        $data = ORM::for_table($config['db']['pre'] . 'ai_documents')\n            ->where(array(\n                'id' => $_POST['id'],\n                'user_id' => $_SESSION['user']['id'],\n            ))\n            ->delete_many();\n\n        if ($data) {\n            $result['success'] = true;\n            $result['message'] = __('Deleted Successfully');\n            die(json_encode($result));\n        }\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction delete_image()\n{\n    $result = array();\n    if (checkloggedin()) {\n        global $config;\n\n        $images = ORM::for_table($config['db']['pre'] . 'ai_images')\n            ->select('image')\n            ->where(array(\n                'id' => $_POST['id'],\n                'user_id' => $_SESSION['user']['id'],\n            ));\n\n        foreach ($images->find_array() as $row) {\n            $image_dir = \"..\/storage\/ai_images\/\";\n            $main_image = trim((string) $row['image']);\n            \/\/ delete Image\n            if (!empty($main_image)) {\n                $file = $image_dir . $main_image;\n                if (file_exists($file))\n                    unlink($file);\n\n                $file = $image_dir . 'small_'.$main_image;\n                if (file_exists($file))\n                    unlink($file);\n            }\n        }\n\n        if ($images->delete_many()) {\n            $result['success'] = true;\n            $result['message'] = __('Deleted Successfully');\n            die(json_encode($result));\n        }\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction load_ai_chats()\n{\n    $result = array();\n    global $config;\n\n    \/\/ if disabled by admin\n    if (!$config['enable_ai_chat']) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die(json_encode($result));\n    }\n\n    if (checkloggedin()) {\n\n        if (empty($_POST['conv_id'])) {\n            $result['success'] = false;\n            $result['error'] = __('Unexpected error, please try again.');\n            die(json_encode($result));\n        }\n\n        \/* load chats *\/\n        $data = ORM::for_table($config['db']['pre'] . 'ai_chat')\n            ->where('user_id', $_SESSION['user']['id']);\n\n        if ($_POST['conv_id'] == 'default') {\n            $data->where_null('conversation_id');\n\n            if (!empty($_POST['bot_id']))\n                $data->where('bot_id', $_POST['bot_id']);\n            else\n                $data->where_null('bot_id');\n\n        } else {\n            $data->where('conversation_id', $_POST['conv_id']);\n        }\n\n        $chats = $data->find_array();\n\n        \/\/ format date\n        foreach ($chats as &$chat) {\n            $chat['date_formatted'] = date('F d, Y', strtotime($chat['date']));\n        }\n\n        $result['success'] = true;\n        $result['chats'] = $chats;\n        die(json_encode($result));\n    }\n}\n\nfunction edit_conversation_title()\n{\n    $result = array();\n    global $config;\n\n    \/\/ if disabled by admin\n    if (!$config['enable_ai_chat']) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die(json_encode($result));\n    }\n\n    if (checkloggedin()) {\n\n        $_POST = validate_input($_POST);\n\n        if (!empty($_POST['id'])) {\n            $conversations = ORM::for_table($config['db']['pre'] . 'ai_chat_conversations')\n                ->where('user_id', $_SESSION['user']['id'])\n                ->find_one($_POST['id']);\n            $conversations->set('title', $_POST['title']);\n\n            $conversations->save();\n        }\n\n        $result['success'] = true;\n        die(json_encode($result));\n    }\n}\n\nfunction send_ai_message()\n{\n    $result = array();\n    global $config;\n\n    \/\/ if disabled by admin\n    if (!$config['enable_ai_chat']) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die(json_encode($result));\n    }\n\n    if (checkloggedin()) {\n\n        if (!$config['non_active_allow']) {\n            $user_data = get_user_data(null, $_SESSION['user']['id']);\n            if ($user_data['status'] == 0) {\n                $result['success'] = false;\n                $result['error'] = __('Verify your email address to use the AI.');\n                die(json_encode($result));\n            }\n        }\n\n        set_time_limit(0);\n\n        $membership = get_user_membership_detail($_SESSION['user']['id']);\n        $words_limit = $membership['settings']['ai_words_limit'];\n        $plan_ai_chat = $membership['settings']['ai_chat'];\n\n        if (!$plan_ai_chat) {\n            $result['success'] = false;\n            $result['error'] = __('Upgrade your membership plan to use this feature.');\n            die(json_encode($result));\n        }\n\n        if (get_option('single_model_for_plans'))\n            $model = get_option('open_ai_model', 'gpt-3.5-turbo');\n        else\n            $model = $membership['settings']['ai_model'];\n\n        if ($model != 'gpt-3.5-turbo' && $model != 'gpt-4') {\n            $result['success'] = false;\n            $result['error'] = __('You can not use the chat feature with your OpenAI model. ChatGPT model is required.');\n            die(json_encode($result));\n        }\n\n        $start = date('Y-m-01');\n        $end = date_create(date('Y-m-t'))->modify('+1 day')->format('Y-m-d');\n        $total_words_used = ORM::for_table($config['db']['pre'] . 'word_used')\n            ->where('user_id', $_SESSION['user']['id'])\n            ->where_raw(\"(`date` BETWEEN '$start' AND '$end')\")\n            ->sum('words');\n\n        $total_words_used = $total_words_used ?: 0;\n        $total_available_words = $words_limit - $total_words_used;\n\n        $max_tokens = (int)get_option(\"ai_chat_max_token\", '-1');\n        \/\/ check user's word limit\n        $max_tokens_limit = $max_tokens == -1 ? 500 : $max_tokens;\n        if ($words_limit != -1 && (($words_limit - $total_words_used) < $max_tokens_limit)) {\n            $result['success'] = false;\n            $result['error'] = __('Words limit exceeded, Upgrade your membership plan.');\n            die(json_encode($result));\n        }\n\n        \/* check bad words *\/\n        if ($word = check_bad_words($_POST['msg'])) {\n            $result['success'] = false;\n            $result['error'] = __('Your request contains a banned word:') . ' ' . $word;\n            die(json_encode($result));\n        }\n\n        $conversation_id = null;\n        if (empty($_POST['conv_id']) || (!empty($_POST['conv_id']) && $_POST['conv_id'] == 'default')) {\n            $conversations = ORM::for_table($config['db']['pre'] . 'ai_chat_conversations')->create();\n            $conversations->title = __('New Conversation');\n            $conversations->user_id = $_SESSION['user']['id'];\n            $conversations->last_message = '...';\n            $conversations->updated_at = date('Y-m-d H:i:s');\n\n            if (!empty($_POST['bot_id']))\n                $conversations->bot_id = $_POST['bot_id'];\n\n            $conversations->save();\n\n            $conversation_id = $conversations->id();\n\n            if (!empty($_POST['conv_id']) && $_POST['conv_id'] == 'default') {\n                $data = ORM::for_table($config['db']['pre'] . 'ai_chat')\n                    ->where('user_id', $_SESSION['user']['id'])\n                    ->where_null('conversation_id');\n\n                if (!empty($_POST['bot_id']))\n                    $data->where('bot_id', $_POST['bot_id']);\n                else\n                    $data->where_null('bot_id');\n\n                $chats = $data->find_result_set();\n\n                $chats->set('conversation_id', $conversation_id);\n                $chats->save();\n            }\n        } else {\n            $conversation_id = $_POST['conv_id'];\n        }\n\n        \/* save user message *\/\n        $chat = ORM::for_table($config['db']['pre'] . 'ai_chat')->create();\n        $chat->user_id = $_SESSION['user']['id'];\n        $chat->user_message = $_POST['msg'];\n        $chat->conversation_id = $conversation_id;\n        $chat->date = date('Y-m-d H:i:s');\n\n        if (!empty($_POST['bot_id']))\n            $chat->bot_id = $_POST['bot_id'];\n\n        $chat->save();\n\n        $result['success'] = true;\n        $result['conversation_id'] = $conversation_id;\n        $result['last_message_id'] = $chat->id();\n        die(json_encode($result));\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction chat_stream()\n{\n    $result = array();\n    global $config;\n\n    @ini_set('memory_limit', '256M');\n    @ini_set('output_buffering', 'on');\n    session_write_close(); \/\/ make session read-only\n\n    \/\/ disable default disconnect checks\n    ignore_user_abort(true);\n\n    \/\/Disable time limit\n    @set_time_limit(0);\n\n    \/\/Initialize the output buffer\n    if(function_exists('apache_setenv')){\n        @apache_setenv('no-gzip', 1);\n    }\n    @ini_set('zlib.output_compression', 0);\n    @ini_set('implicit_flush', 1);\n    while (ob_get_level() != 0) {\n        ob_end_flush();\n    }\n    ob_implicit_flush(1);\n    ob_start();\n\n    \/\/ connection_aborted() use this\n\n    header('Content-type: text\/event-stream');\n    header('Cache-Control: no-cache');\n    header('X-Accel-Buffering: no');\n    header(\"Content-Encoding: none\");\n\n    \/\/ if disabled by admin\n    if (!$config['enable_ai_chat']) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die('data: '. json_encode($result).PHP_EOL);\n    }\n\n    if (checkloggedin()) {\n        if (!$config['non_active_allow']) {\n            $user_data = get_user_data(null, $_SESSION['user']['id']);\n            if ($user_data['status'] == 0) {\n                $result['success'] = false;\n                $result['error'] = __('Verify your email address to use the AI.');\n                die('data: '. json_encode($result).PHP_EOL);\n            }\n        }\n\n        $membership = get_user_membership_detail($_SESSION['user']['id']);\n        $words_limit = $membership['settings']['ai_words_limit'];\n        $plan_ai_chat = $membership['settings']['ai_chat'];\n\n        if (!$plan_ai_chat) {\n            $result['success'] = false;\n            $result['error'] = __('Upgrade your membership plan to use this feature.');\n            die('data: '. json_encode($result).PHP_EOL);\n        }\n\n        if (get_option('single_model_for_plans'))\n            $model = get_option('open_ai_model', 'gpt-3.5-turbo');\n        else\n            $model = $membership['settings']['ai_model'];\n\n        if ($model != 'gpt-3.5-turbo' && $model != 'gpt-4') {\n            $result['success'] = false;\n            $result['error'] = __('You can not use the chat feature with your OpenAI model. ChatGPT model is required.');\n            die('data: '. json_encode($result).PHP_EOL);\n        }\n\n        $start = date('Y-m-01');\n        $end = date_create(date('Y-m-t'))->modify('+1 day')->format('Y-m-d');\n        $total_words_used = ORM::for_table($config['db']['pre'] . 'word_used')\n            ->where('user_id', $_SESSION['user']['id'])\n            ->where_raw(\"(`date` BETWEEN '$start' AND '$end')\")\n            ->sum('words');\n\n        $total_words_used = $total_words_used ?: 0;\n        $total_available_words = $words_limit - $total_words_used;\n\n        $max_tokens = (int)get_option(\"ai_chat_max_token\", '-1');\n        \/\/ check user's word limit\n        $max_tokens_limit = $max_tokens == -1 ? 500 : $max_tokens;\n        if ($words_limit != -1 && (($words_limit - $total_words_used) < $max_tokens_limit)) {\n            $result['success'] = false;\n            $result['error'] = __('Words limit exceeded, Upgrade your membership plan.');\n            die('data: '. json_encode($result).PHP_EOL);\n        }\n\n        if(is_numeric($_GET['conv_id'])) {\n            $conversation_id = (int) $_GET['conv_id'];\n        } else{\n            $result['success'] = false;\n            $result['error'] = __('Unexpected error, please try again.');\n            die('data: '. json_encode($result).PHP_EOL);\n        }\n\n        \/* create message history *\/\n        $ROLE = \"role\";\n        $CONTENT = \"content\";\n        $USER = \"user\";\n        $SYS = \"system\";\n        $ASSISTANT = \"assistant\";\n\n        $system_prompt = \"You are a helpful assistant.\";\n        if (!empty($_GET['bot_id'])) {\n            $bot_sql = \"and `bot_id` = {$_GET['bot_id']}\";\n\n            $chat_bot = ORM::for_table($config['db']['pre'] . 'ai_chat_bots')\n                ->find_one($_GET['bot_id']);\n\n            \/* Check bot exist *\/\n            if (empty($chat_bot['id'])) {\n                $result['success'] = false;\n                $result['error'] = __('Unexpected error, please try again.');\n                die('data: '. json_encode($result).PHP_EOL);\n            }\n\n            if (!empty($chat_bot['prompt'])) {\n                $system_prompt = $chat_bot['prompt'];\n            }\n        } else {\n            $bot_sql = \"and `bot_id` IS NULL\";\n        }\n\n        \/\/ get last 8 messages\n        $sql = \"SELECT * FROM\n                (\n                 SELECT * FROM \" . $config['db']['pre'] . 'ai_chat' . \" \n                 WHERE `user_id` = {$_SESSION['user']['id']} \n                 AND `conversation_id` = $conversation_id \n                 $bot_sql ORDER BY id DESC LIMIT 8\n                ) AS sub\n                ORDER BY id ASC;\";\n        $chats = ORM::for_table($config['db']['pre'] . 'ai_chat')\n            ->raw_query($sql)\n            ->find_array();\n\n        $used_tokens = 0;\n\n        require_once ROOTPATH . '\/includes\/lib\/Tokenizer-GPT3\/autoload.php';\n        $tokenizer = new \\Ze\\TokenizerGpt3\\Gpt3Tokenizer(new \\Ze\\TokenizerGpt3\\Gpt3TokenizerConfig());\n\n        $history[] = [$ROLE => $SYS, $CONTENT => $system_prompt];\n        foreach ($chats as $chat) {\n            $history[] = [$ROLE => $USER, $CONTENT => $chat['user_message']];\n            if (!empty($chat['ai_message'])) {\n                $history[] = [$ROLE => $ASSISTANT, $CONTENT => $chat['ai_message']];\n            }\n        }\n\n        require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/OpenAi.php';\n        require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/Url.php';\n\n        $open_ai = new Orhanerday\\OpenAi\\OpenAi(get_api_key());\n\n        $opts = [\n            'model' => $model,\n            'messages' => $history,\n            'temperature' => 1.0,\n            'frequency_penalty' => 0,\n            'presence_penalty' => 0,\n            'user' => $_SESSION['user']['id'],\n            'stream' => true\n        ];\n        if ($max_tokens != -1) {\n            $opts['max_tokens'] = $max_tokens;\n        }\n\n        $txt = \"\";\n        $complete = $open_ai->chat($opts, function ($curl_info, $data) use (&$txt) {\n            if ($obj = json_decode($data) and $obj->error->message != \"\") {\n                $result = [];\n                $result['api_error'] = $obj->error->message;\n                $result['error'] = get_api_error_message( curl_getinfo($curl_info, CURLINFO_HTTP_CODE));\n                echo $data = 'data: '. json_encode($result).PHP_EOL;\n            } else {\n                echo $data;\n\n                $array = explode('data: ', $data);\n                foreach ($array as $ar){\n                    $ar = json_decode($ar, true);\n                    if(isset($ar[\"choices\"][0][\"delta\"][\"content\"])) {\n                        $txt .= $ar[\"choices\"][0][\"delta\"][\"content\"];\n                    }\n                }\n            }\n\n            echo PHP_EOL;\n            while(ob_get_level() > 0) {\n                ob_end_flush();\n            }\n            ob_flush();\n            flush();\n            return strlen($data);\n        });\n\n        $ai_message = $txt;\n        if (!empty($ai_message)) {\n\n            \/\/ save chat\n            $chat = ORM::for_table($config['db']['pre'] . 'ai_chat')\n                ->where('user_id', $_SESSION['user']['id'])\n                ->find_one($_GET['last_message_id']);\n\n            $chat->set('ai_message', $ai_message);\n            $chat->set('date', date('Y-m-d H:i:s'));\n            $chat->save();\n\n            \/* update conversation *\/\n            $last_message = strlimiter(strip_tags($ai_message), 100);\n            $update_conversation = ORM::for_table($config['db']['pre'] . 'ai_chat_conversations')\n                ->find_one($conversation_id);\n            $update_conversation->set('updated_at', date('Y-m-d H:i:s'));\n            $update_conversation->set('last_message', $last_message);\n            $update_conversation->save();\n\n            $used_tokens += $tokenizer->count($ai_message);\n            \/* GPT 4 uses more tokens *\/\n            if($model == 'gpt-4'){\n                $used_tokens *= ceil(1.1);\n            }\n\n            $word_used = ORM::for_table($config['db']['pre'] . 'word_used')->create();\n            $word_used->user_id = $_SESSION['user']['id'];\n            $word_used->words = $used_tokens;\n            $word_used->date = date('Y-m-d H:i:s');\n            $word_used->save();\n        }\n    }\n}\n\nfunction delete_ai_chats()\n{\n    $result = array();\n    if (checkloggedin()) {\n        global $config;\n\n        if (!empty($_GET['conv_id'])) {\n            \/* Delete chats *\/\n            $data = ORM::for_table($config['db']['pre'] . 'ai_chat')\n                ->where('user_id', $_SESSION['user']['id']);\n\n            if ($_GET['conv_id'] == 'default')\n                $data->where_null('conversation_id');\n            else\n                $data->where('conversation_id', $_GET['conv_id']);\n\n            if (!empty($_GET['bot_id']))\n                $data->where('bot_id', $_GET['bot_id']);\n\n            $data->delete_many();\n\n            \/* Delete conversation *\/\n            if ($_GET['conv_id'] != 'default') {\n                ORM::for_table($config['db']['pre'] . 'ai_chat_conversations')\n                    ->where('user_id', $_SESSION['user']['id'])\n                    ->where('id', $_GET['conv_id'])\n                    ->delete_many();\n            }\n\n            if ($data) {\n                $result['success'] = true;\n                $result['message'] = __('Deleted Successfully');\n                die(json_encode($result));\n            }\n        }\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction export_ai_chats()\n{\n    $result = array();\n    if (checkloggedin()) {\n        global $config;\n\n        $text = '';\n\n        if (!empty($_GET['conv_id'])) {\n\n            $data = ORM::for_table($config['db']['pre'] . 'ai_chat')\n                ->table_alias('c')\n                ->select_many_expr('c.*', 'u.name full_name')\n                ->where('c.user_id', $_SESSION['user']['id'])\n                ->join($config['db']['pre'] . 'user', 'u.id = c.user_id', 'u');\n\n            if ($_GET['conv_id'] == 'default')\n                $data->where_null('conversation_id');\n            else\n                $data->where('conversation_id', $_GET['conv_id']);\n\n            if (!empty($_GET['bot_id'])) {\n                $data->where('bot_id', $_GET['bot_id']);\n\n                $chat_bot = ORM::for_table($config['db']['pre'] . 'ai_chat_bots')\n                    ->find_one($_GET['bot_id']);\n\n                \/* Check bot exist *\/\n                if (empty($chat_bot['id'])) {\n                    $result['success'] = false;\n                    $result['error'] = __('Unexpected error, please try again.');\n                    die(json_encode($result));\n                }\n\n                $ai_name = $chat_bot['name'];\n            } else {\n                $ai_name = get_option('ai_chat_bot_name', __('AI Chat Bot'));\n            }\n\n            foreach ($data->find_array() as $chat) {\n                \/\/ user\n                $text .= \"[{$chat['date']}] \";\n                $text .= $chat['full_name'] . ': ';\n                $text .= $chat['user_message'] . \"\\n\\n\";\n\n                \/\/ ai\n                if (!empty($chat['ai_message'])) {\n                    $text .= \"[{$chat['date']}] \";\n                    $text .= $ai_name . ': ';\n                    $text .= $chat['ai_message'] . \"\\n\\n\";\n                }\n            }\n        }\n\n        $result['success'] = true;\n        $result['text'] = $text;\n        die(json_encode($result));\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction speech_to_text()\n{\n    $result = array();\n    global $config;\n\n    \/\/ if disabled by admin\n    if (!$config['enable_speech_to_text']) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die(json_encode($result));\n    }\n\n    if (checkloggedin()) {\n        if (!$config['non_active_allow']) {\n            $user_data = get_user_data(null, $_SESSION['user']['id']);\n            if ($user_data['status'] == 0) {\n                $result['success'] = false;\n                $result['error'] = __('Verify your email address to use the AI.');\n                die(json_encode($result));\n            }\n        }\n\n        set_time_limit(0);\n\n        $_POST = validate_input($_POST);\n\n        if (!empty($_FILES['file']['tmp_name'])) {\n\n            $membership = get_user_membership_detail($_SESSION['user']['id']);\n            $speech_to_text_limit = $membership['settings']['ai_speech_to_text_limit'];\n            $speech_text_file_limit = $membership['settings']['ai_speech_to_text_file_limit'];\n\n            $start = date('Y-m-01');\n            $end = date_create(date('Y-m-t'))->modify('+1 day')->format('Y-m-d');\n            $total_speech_used = ORM::for_table($config['db']['pre'] . 'speech_to_text_used')\n                ->where('user_id', $_SESSION['user']['id'])\n                ->where_raw(\"(`date` BETWEEN '$start' AND '$end')\")\n                ->count();\n\n            $total_speech_used = $total_speech_used ?: 0;\n\n            \/\/ check user's images limit\n            if ($speech_to_text_limit != -1 && (($speech_to_text_limit - $total_speech_used) < 1)) {\n                $result['success'] = false;\n                $result['error'] = __('Audio transcription limit exceeded, Upgrade your membership plan.');\n                die(json_encode($result));\n            }\n\n            if ($speech_text_file_limit != -1 && ($_FILES['file']['size'] > $speech_text_file_limit * 1024 * 1024)) {\n                $result['success'] = false;\n                $result['error'] = __('File size limit exceeded, Upgrade your membership plan.');\n                die(json_encode($result));\n            }\n\n            \/\/ check bad words\n            if ($word = check_bad_words($_POST['description'])) {\n                $result['success'] = false;\n                $result['error'] = __('Your request contains a banned word:') . ' ' . $word;\n                die(json_encode($result));\n            }\n\n            require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/OpenAi.php';\n            require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/Url.php';\n\n            $open_ai = new Orhanerday\\OpenAi\\OpenAi(get_api_key());\n\n            $tmp_file = $_FILES['file']['tmp_name'];\n            $file_name = basename($_FILES['file']['name']);\n            $c_file = curl_file_create($tmp_file, $_FILES['file']['type'], $file_name);\n            $complete = $open_ai->transcribe([\n                \"model\" => \"whisper-1\",\n                \"file\" => $c_file,\n                \"prompt\" => $_POST['description'],\n                'user' => $_SESSION['user']['id']\n            ]);\n\n            $response = json_decode($complete, true);\n\n            if (isset($response['text'])) {\n                $response['text'] = nl2br(trim($response['text']));\n\n                $content = ORM::for_table($config['db']['pre'] . 'ai_documents')->create();\n                $content->user_id = $_SESSION['user']['id'];\n                $content->title = !empty($_POST['title']) ? $_POST['title'] : __('Untitled Document');\n                $content->content = $response['text'];\n                $content->template = 'quickai-speech-to-text';\n                $content->created_at = date('Y-m-d H:i:s');\n                $content->save();\n\n                $speech_used = ORM::for_table($config['db']['pre'] . 'speech_to_text_used')->create();\n                $speech_used->user_id = $_SESSION['user']['id'];\n                $speech_used->date = date('Y-m-d H:i:s');\n                $speech_used->save();\n\n                $result['success'] = true;\n                $result['text'] = $response['text'];\n                $result['old_used_speech'] = $speech_to_text_limit;\n                $result['current_used_speech'] = $total_speech_used + 1;\n            } else {\n                \/\/ error log default message\n                if (!empty($response['error']['message']))\n                    error_log('OpenAI: ' . $response['error']['message']);\n\n                $result['success'] = false;\n                $result['api_error'] = $response['error']['message'];\n                $result['error'] = get_api_error_message($open_ai->getCURLInfo()['http_code']);\n                die(json_encode($result));\n            }\n            die(json_encode($result));\n        }\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction ai_code()\n{\n    $result = array();\n\n    global $config;\n\n    \/\/ if disabled by admin\n    if (!$config['enable_ai_code']) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die(json_encode($result));\n    }\n\n    if (checkloggedin()) {\n\n        if (!$config['non_active_allow']) {\n            $user_data = get_user_data(null, $_SESSION['user']['id']);\n            if ($user_data['status'] == 0) {\n                $result['success'] = false;\n                $result['error'] = __('Verify your email address to use the AI.');\n                die(json_encode($result));\n            }\n        }\n\n        set_time_limit(0);\n\n        $_POST = validate_input($_POST);\n\n        if (!empty($_POST['description'])) {\n\n            $prompt = $_POST['description'];\n            $max_tokens = (int)get_option(\"ai_code_max_token\", '-1');\n\n            $membership = get_user_membership_detail($_SESSION['user']['id']);\n            $words_limit = $membership['settings']['ai_words_limit'];\n            $plan_ai_code = $membership['settings']['ai_code'];\n\n            if (get_option('single_model_for_plans'))\n                $model = get_option('open_ai_model', 'gpt-3.5-turbo');\n            else\n                $model = $membership['settings']['ai_model'];\n\n            $start = date('Y-m-01');\n            $end = date_create(date('Y-m-t'))->modify('+1 day')->format('Y-m-d');\n            $total_words_used = ORM::for_table($config['db']['pre'] . 'word_used')\n                ->where('user_id', $_SESSION['user']['id'])\n                ->where_raw(\"(`date` BETWEEN '$start' AND '$end')\")\n                ->sum('words');\n\n            $total_words_used = $total_words_used ?: 0;\n\n            \/\/ check if user's membership have the template\n            if (!$plan_ai_code) {\n                $result['success'] = false;\n                $result['error'] = __('Upgrade your membership plan to use this feature');\n                die(json_encode($result));\n            }\n\n            \/\/ check user's word limit\n            $max_tokens_limit = $max_tokens == -1 ? 500 : $max_tokens;\n            if ($words_limit != -1 && (($words_limit - $total_words_used) < $max_tokens_limit)) {\n                $result['success'] = false;\n                $result['error'] = __('Words limit exceeded, Upgrade your membership plan.');\n                die(json_encode($result));\n            }\n\n            \/\/ check bad words\n            if ($word = check_bad_words($prompt)) {\n                $result['success'] = false;\n                $result['error'] = __('Your request contains a banned word:') . ' ' . $word;\n                die(json_encode($result));\n            }\n\n            require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/OpenAi.php';\n            require_once ROOTPATH . '\/includes\/lib\/orhanerday\/open-ai\/src\/Url.php';\n\n            $open_ai = new Orhanerday\\OpenAi\\OpenAi(get_api_key());\n\n            if ($model == 'gpt-3.5-turbo' || $model == 'gpt-4') {\n                $opt = [\n                    'model' => $model,\n                    'messages' => [\n                        [\n                            \"role\" => \"user\",\n                            \"content\" => $prompt\n                        ],\n                    ],\n                    'temperature' => 1,\n                    'n' => 1,\n                    'user' => $_SESSION['user']['id']\n                ];\n                if ($max_tokens != -1) {\n                    $opt['max_tokens'] = $max_tokens;\n                }\n                $complete = $open_ai->chat($opt);\n            } else {\n                $opt = [\n                    'model' => $model,\n                    'prompt' => $prompt,\n                    'temperature' => 1,\n                    'n' => 1,\n                ];\n                if ($max_tokens != -1) {\n                    $opt['max_tokens'] = $max_tokens;\n                }\n                $complete = $open_ai->completion($opt);\n            }\n\n            $response = json_decode($complete, true);\n\n            if (isset($response['choices'])) {\n                if ($model == 'gpt-3.5-turbo' || $model == 'gpt-4') {\n                    $text = trim($response['choices'][0]['message']['content']);\n                } else {\n                    $text = trim($response['choices'][0]['text']);\n                }\n\n                $tokens = $response['usage']['completion_tokens'];\n\n                $content = ORM::for_table($config['db']['pre'] . 'ai_documents')->create();\n                $content->user_id = $_SESSION['user']['id'];\n                $content->title = !empty($_POST['title']) ? $_POST['title'] : __('Untitled Document');\n                $content->content = $text;\n                $content->template = 'quickai-ai-code';\n                $content->created_at = date('Y-m-d H:i:s');\n                $content->save();\n\n                $word_used = ORM::for_table($config['db']['pre'] . 'word_used')->create();\n                $word_used->user_id = $_SESSION['user']['id'];\n                $word_used->words = $tokens;\n                $word_used->date = date('Y-m-d H:i:s');\n                $word_used->save();\n\n                $result['success'] = true;\n                $result['text'] = filter_ai_response($text);\n                $result['old_used_words'] = $total_words_used;\n                $result['current_used_words'] = $total_words_used + $tokens;\n            } else {\n                \/\/ error log default message\n                if (!empty($response['error']['message']))\n                    error_log('OpenAI: ' . $response['error']['message']);\n\n                $result['success'] = false;\n                $result['api_error'] = $response['error']['message'];\n                $result['error'] = get_api_error_message($open_ai->getCURLInfo()['http_code']);\n                die(json_encode($result));\n            }\n            die(json_encode($result));\n        }\n    }\n    $result['success'] = false;\n    $result['error'] = __('Unexpected error, please try again.');\n    die(json_encode($result));\n}\n\nfunction text_to_speech()\n{\n    $result = array();\n    global $config;\n\n    \/\/ if disabled by admin\n    if (!get_option('enable_text_to_speech', 0)) {\n        $result['success'] = false;\n        $result['error'] = __('This feature is disabled by the admin.');\n        die(json_encode($result));\n    }\n\n    if (checkloggedin()) {\n\n\n        if (!$config['non_active_allow']) {\n            $user_data = get_user_data(null, $_SESSION['user']['id']);\n            if ($user_data['status'] == 0) {\n                $result['success'] = false;\n                $result['error'] = __('Verify your email address to use the AI.');\n                die(json_encode($result));\n            }\n        }\n\n        set_time_limit(0);\n\n        $_POST = validate_input($_POST);\n\n        if (!empty($_POST['description'])) {\n            $no_ssml_tags = preg_replace('\/<[\\s\\S]+?>\/',
    2
    '', $_POST['description']);\n $text_characters = mb_strlen($no_ssml_tags, 'UTF-8');\n\n $membership =
    3
    get_user_membership_detail($_SESSION['user']['id']);\n $characters_limit =
    4
    $membership['settings']['ai_text_to_speech_limit'];\n\n $start = date('Y-m-01');\n $end =
    5
    date_create(date('Y-m-t'))->modify('+1 day')->format('Y-m-d');\n\n $total_character_used =