101 lines
4.1 KiB
PHP
101 lines
4.1 KiB
PHP
<?php
|
|
session_start();
|
|
header('Content-Type: application/json');
|
|
require_once __DIR__ . '/../db/config.php';
|
|
require_once __DIR__ . '/../ai/LocalAIApi.php';
|
|
|
|
if (!isset($_SESSION['user_id'])) {
|
|
http_response_code(401);
|
|
echo json_encode(['success' => false, 'error' => 'Unauthorized']);
|
|
exit;
|
|
}
|
|
|
|
try {
|
|
$pdo = db();
|
|
$user_id = $_SESSION['user_id'];
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
$message = $input['message'] ?? '';
|
|
$context = $input['context'] ?? null; // New: get context
|
|
|
|
if (empty(trim($message))) {
|
|
echo json_encode(['success' => false, 'error' => 'Message cannot be empty.']);
|
|
exit;
|
|
}
|
|
|
|
// New: Handle simulation context
|
|
if ($context === 'vpn' || $context === 'antivirus') {
|
|
$ai_input = [['role' => 'user', 'content' => $message]];
|
|
$ai_response = LocalAIApi::createResponse(['input' => $ai_input]);
|
|
$ai_message = LocalAIApi::extractText($ai_response);
|
|
|
|
if (!empty($ai_message)) {
|
|
echo json_encode(['success' => true, 'data' => $ai_message]);
|
|
} else {
|
|
echo json_encode(['success' => false, 'error' => 'Failed to get AI response.']);
|
|
}
|
|
exit; // Stop execution for simulations
|
|
}
|
|
|
|
// --- Existing Chat Logic ---
|
|
$personality = $input['personality'] ?? '';
|
|
|
|
$stmt = $pdo->prepare("INSERT INTO messages (user_id, message) VALUES (?, ?)");
|
|
$stmt->execute([$user_id, $message]);
|
|
|
|
// --- AI CONTEXT PREPARATION ---
|
|
|
|
// 1. Prepare the system prompt (personality)
|
|
$final_ai_input = [];
|
|
if (!empty(trim($personality))) {
|
|
$final_ai_input[] = ['role' => 'system', 'content' => $personality];
|
|
}
|
|
|
|
// 2. Get last 5 messages for conversation history
|
|
$stmt = $pdo->query("SELECT m.message, u.username FROM messages m JOIN users u ON m.user_id = u.id ORDER BY m.created_at DESC LIMIT 5");
|
|
$recent_messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
$conversation_history = array_map(function($msg) {
|
|
return ['role' => $msg['username'] === 'AI' ? 'assistant' : 'user', 'content' => $msg['message']];
|
|
}, array_reverse($recent_messages));
|
|
|
|
// 3. Combine system prompt with conversation history
|
|
$final_ai_input = array_merge($final_ai_input, $conversation_history);
|
|
|
|
// --- CALL THE AI ---
|
|
$ai_response = LocalAIApi::createResponse(['input' => $final_ai_input]);
|
|
$ai_message = LocalAIApi::extractText($ai_response);
|
|
|
|
if (!empty($ai_message)) {
|
|
$stmt = $pdo->prepare("SELECT id FROM users WHERE username = 'AI'");
|
|
$stmt->execute();
|
|
$ai_user = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if ($ai_user) {
|
|
$stmt = $pdo->prepare("INSERT INTO messages (user_id, message) VALUES (?, ?)");
|
|
$stmt->execute([$ai_user['id'], $ai_message]);
|
|
}
|
|
}
|
|
|
|
echo json_encode(['success' => true, 'message' => 'Message saved.']);
|
|
|
|
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
|
if (isset($_GET['action']) && $_GET['action'] === 'reset') {
|
|
// Truncate the messages table to reset the chat
|
|
$pdo->query("TRUNCATE TABLE messages");
|
|
echo json_encode(['success' => true, 'message' => 'Chat history has been cleared.']);
|
|
} else {
|
|
$stmt = $pdo->query("SELECT m.id, m.message, m.created_at, u.username, LEFT(u.username, 1) as user_initial FROM messages m JOIN users u ON m.user_id = u.id ORDER BY m.created_at ASC");
|
|
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['success' => true, 'messages' => $messages, 'currentUser' => $_SESSION['username']]);
|
|
}
|
|
} else {
|
|
http_response_code(405);
|
|
echo json_encode(['success' => false, 'error' => 'Method Not Allowed']);
|
|
}
|
|
|
|
} catch (PDOException $e) {
|
|
http_response_code(500);
|
|
echo json_encode(['success' => false, 'error' => 'Database error: ' . $e->getMessage()]);
|
|
}
|
|
?>
|