diff --git a/admin.php b/admin.php
index 70bd43b..4c4acce 100644
--- a/admin.php
+++ b/admin.php
@@ -16,12 +16,24 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$stmt = db()->prepare("DELETE FROM faqs WHERE id = ?");
$stmt->execute([$id]);
}
+ } elseif (isset($_POST['action']) && $_POST['action'] === 'update_settings') {
+ $token = $_POST['telegram_token'] ?? '';
+ $stmt = db()->prepare("INSERT INTO settings (setting_key, setting_value) VALUES ('telegram_token', ?) ON DUPLICATE KEY UPDATE setting_value = ?");
+ $stmt->execute([$token, $token]);
}
header("Location: admin.php");
exit;
}
$faqs = db()->query("SELECT * FROM faqs ORDER BY created_at DESC")->fetchAll();
+$messages = db()->query("SELECT * FROM messages ORDER BY created_at DESC LIMIT 50")->fetchAll();
+
+$telegramToken = '';
+$stmt = db()->query("SELECT setting_value FROM settings WHERE setting_key = 'telegram_token'");
+$row = $stmt->fetch();
+if ($row) {
+ $telegramToken = $row['setting_value'];
+}
?>
@@ -64,6 +76,21 @@ $faqs = db()->query("SELECT * FROM faqs ORDER BY created_at DESC")->fetchAll();
Back to Chat
+
+
Telegram Bot Settings
+
+
+
diff --git a/api/chat.php b/api/chat.php
index c3bc6ba..dbe026c 100644
--- a/api/chat.php
+++ b/api/chat.php
@@ -1,6 +1,7 @@
query("SELECT keywords, answer FROM faqs")->fetchAll();
+try {
+ // 1. Fetch Knowledge Base (FAQs)
+ $stmt = db()->query("SELECT keywords, answer FROM faqs");
+ $faqs = $stmt->fetchAll(PDO::FETCH_ASSOC);
-$bestMatch = null;
-$maxOverlap = 0;
-
-$userWords = preg_split('/\W+/', strtolower($message), -1, PREG_SPLIT_NO_EMPTY);
-
-foreach ($faqs as $faq) {
- $keywords = preg_split('/[\s,]+/', strtolower($faq['keywords']), -1, PREG_SPLIT_NO_EMPTY);
- $overlap = count(array_intersect($userWords, $keywords));
-
- if ($overlap > $maxOverlap) {
- $maxOverlap = $overlap;
- $bestMatch = $faq['answer'];
+ $knowledgeBase = "Here is the knowledge base for this website:\n\n";
+ foreach ($faqs as $faq) {
+ $knowledgeBase .= "Q: " . $faq['keywords'] . "\nA: " . $faq['answer'] . "\n---\n";
}
-}
-if ($bestMatch) {
- echo json_encode(['reply' => $bestMatch]);
-} else {
- // Default fallback
- echo json_encode(['reply' => "I'm sorry, I don't have an answer for that yet. You can try asking about 'pricing' or 'support'."]);
+ // 2. Construct Prompt for AI
+ $systemPrompt = "You are a helpful, friendly AI assistant for this website. " .
+ "Use the provided Knowledge Base to answer user questions accurately. " .
+ "If the answer is found in the Knowledge Base, rephrase it naturally. " .
+ "If the answer is NOT in the Knowledge Base, use your general knowledge to help, " .
+ "but politely mention that you don't have specific information about that if it seems like a site-specific question. " .
+ "Keep answers concise and professional.\n\n" .
+ $knowledgeBase;
+
+ // 3. Call AI API
+ $response = LocalAIApi::createResponse([
+ 'model' => 'gpt-4o-mini',
+ 'input' => [
+ ['role' => 'system', 'content' => $systemPrompt],
+ ['role' => 'user', 'content' => $message],
+ ]
+ ]);
+
+ if (!empty($response['success'])) {
+ $aiReply = LocalAIApi::extractText($response);
+
+ // 4. Save to Database
+ try {
+ $stmt = db()->prepare("INSERT INTO messages (user_message, ai_response) VALUES (?, ?)");
+ $stmt->execute([$message, $aiReply]);
+ } catch (Exception $e) {
+ error_log("DB Save Error: " . $e->getMessage());
+ // Continue even if save fails, so the user still gets a reply
+ }
+
+ echo json_encode(['reply' => $aiReply]);
+ } else {
+ // Fallback if AI fails
+ error_log("AI Error: " . ($response['error'] ?? 'Unknown'));
+ echo json_encode(['reply' => "I'm having trouble connecting to my brain right now. Please try again later."]);
+ }
+
+} catch (Exception $e) {
+ error_log("Chat Error: " . $e->getMessage());
+ echo json_encode(['reply' => "An internal error occurred."]);
}
diff --git a/api/telegram_webhook.php b/api/telegram_webhook.php
new file mode 100644
index 0000000..fa4899c
--- /dev/null
+++ b/api/telegram_webhook.php
@@ -0,0 +1,91 @@
+query("SELECT setting_value FROM settings WHERE setting_key = 'telegram_token'");
+$token = $stmt->fetchColumn();
+
+if (!$token) {
+ error_log("Telegram Error: No bot token found in settings.");
+ exit;
+}
+
+function sendTelegramMessage($chatId, $text, $token) {
+ $url = "https://api.telegram.org/bot$token/sendMessage";
+ $data = [
+ 'chat_id' => $chatId,
+ 'text' => $text,
+ 'parse_mode' => 'Markdown'
+ ];
+
+ $options = [
+ 'http' => [
+ 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
+ 'method' => 'POST',
+ 'content' => http_build_query($data),
+ ],
+ ];
+ $context = stream_context_create($options);
+ return file_get_contents($url, false, $context);
+}
+
+// Process with AI (Similar logic to api/chat.php)
+try {
+ // 1. Fetch Knowledge Base
+ $stmt = db()->query("SELECT keywords, answer FROM faqs");
+ $faqs = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+ $knowledgeBase = "Here is the knowledge base for this website:\n\n";
+ foreach ($faqs as $faq) {
+ $knowledgeBase .= "Q: " . $faq['keywords'] . "\nA: " . $faq['answer'] . "\n---\n";
+ }
+
+ $systemPrompt = "You are a helpful AI assistant integrated with Telegram. " .
+ "Use the provided Knowledge Base to answer user questions. " .
+ "Keep answers concise for mobile reading. Use Markdown for formatting.\n\n" .
+ $knowledgeBase;
+
+ // 2. Call AI
+ $response = LocalAIApi::createResponse([
+ 'model' => 'gpt-4o-mini',
+ 'input' => [
+ ['role' => 'system', 'content' => $systemPrompt],
+ ['role' => 'user', 'content' => $text],
+ ]
+ ]);
+
+ if (!empty($response['success'])) {
+ $aiReply = LocalAIApi::extractText($response);
+
+ // 3. Save History
+ try {
+ $stmt = db()->prepare("INSERT INTO messages (user_message, ai_response) VALUES (?, ?)");
+ $stmt->execute(["[Telegram] " . $text, $aiReply]);
+ } catch (Exception $e) {}
+
+ // 4. Send back to Telegram
+ sendTelegramMessage($chatId, $aiReply, $token);
+ } else {
+ sendTelegramMessage($chatId, "I'm sorry, I encountered an error processing your request.", $token);
+ }
+
+} catch (Exception $e) {
+ error_log("Telegram Webhook Error: " . $e->getMessage());
+}