File size: 4,903 Bytes
d1c7d23 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
/* script.js */
// Variabel global untuk sistem antrian pesan dan pengelolaan sesi
let messageQueue = [];
let processing = false;
let id_user;
let inactivityTimeout;
const INACTIVITY_LIMIT = 30 * 60 * 1000; // 30 menit
document.addEventListener("DOMContentLoaded", () => {
initializeSession();
setupEventListeners();
resetInactivityTimer();
});
// --- SISTEM SESI & USER ID UNIK --- //
function initializeSession() {
// Jika belum ada sessionID di sessionStorage, buat ID baru
if (!sessionStorage.getItem("sessionID")) {
const sessionID = generateSessionID();
sessionStorage.setItem("sessionID", sessionID);
id_user = sessionID;
console.log("Session ID dibuat:", sessionID);
} else {
const sesi_id = sessionStorage.getItem("sessionID");
id_user = sesi_id;
console.log("Session ID yang ada:", sesi_id);
}
// Reset session ID saat user meninggalkan halaman
window.addEventListener("beforeunload", () => {
sessionStorage.removeItem("sessionID");
});
}
function generateSessionID() {
// Pembuatan ID sederhana (bisa disesuaikan)
return "user-" + Math.random().toString(36).substr(2, 9) + "-" + Date.now();
}
// Reset timer inaktivitas
function resetInactivityTimer() {
clearTimeout(inactivityTimeout);
inactivityTimeout = setTimeout(() => {
// Hapus sessionID setelah 30 menit tidak aktif
sessionStorage.removeItem("sessionID");
console.log("Session ID dihapus karena inaktivitas.");
}, INACTIVITY_LIMIT);
}
// --- EVENT LISTENERS --- //
function setupEventListeners() {
const chatForm = document.getElementById("chat-form");
const chatInput = document.getElementById("chat-input");
// Penanganan pengiriman pesan
chatForm.addEventListener("submit", e => {
e.preventDefault();
const message = chatInput.value.trim();
if (message === "") return;
addUserMessage(message);
chatInput.value = "";
// Reset timer inaktivitas saat ada aktivitas user
resetInactivityTimer();
});
// Penanganan event keyboard: Enter untuk kirim, Shift+Enter untuk newline
chatInput.addEventListener("keydown", e => {
if (e.key === "Enter" && !e.shiftKey) {
e.preventDefault();
chatForm.dispatchEvent(new Event("submit"));
}
});
}
// --- MENANGANI PESAN --- //
// Tambah pesan user ke tampilan chat
function addUserMessage(text) {
addMessageToChat(text, "user");
// Masukkan respon bot ke dalam antrian
enqueueBotResponse(text);
}
// Fungsi untuk menambahkan pesan ke container chat
function addMessageToChat(text, sender) {
const chatContainer = document.getElementById("chat-container");
const messageElement = document.createElement("div");
messageElement.classList.add("message", sender);
// Menggunakan textContent untuk menjaga format string dan mencegah injeksi HTML
messageElement.textContent = text;
chatContainer.appendChild(messageElement);
// Auto-scroll ke pesan terbaru
messageElement.scrollIntoView({ behavior: "smooth" });
}
// Menambahkan pesan ke antrian dan memulai pemrosesan
function enqueueBotResponse(userMessage) {
messageQueue.push(userMessage);
processQueue();
}
// Memproses antrian pesan satu per satu
function processQueue() {
if (processing || messageQueue.length === 0) return;
processing = true;
blockUserInput(true);
showTypingIndicator(true);
// Simulasikan delay mengetik bot (misal: 2 detik)
const userMessage = messageQueue.shift();
generateBotResponse(userMessage, id_user).then(botResponse => {
addMessageToChat(botResponse, "bot");
showTypingIndicator(false);
blockUserInput(false);
processing = false;
});
}
// Generator respon bot sederhana (misalnya, echo pesan user)
async function generateBotResponse(userMessage, user_ID) {
const url = "/chat"; // Ganti dengan URL API Anda
const data = {
message: userMessage,
user_id: user_ID
};
const options = {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
};
const res = await (await fetch(url, options)).json();
return res.reply;
}
// Memblokir atau membuka input user saat bot sedang merespons
function blockUserInput(block) {
const chatInput = document.getElementById("chat-input");
const sendButton = document.getElementById("send-button");
chatInput.disabled = block;
sendButton.disabled = block;
}
// Menampilkan atau menyembunyikan typing indicator
function showTypingIndicator(show) {
const indicator = document.getElementById("typing-indicator");
if (show) {
indicator.classList.remove("hidden");
} else {
indicator.classList.add("hidden");
}
} |