|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> |
|
|
<title>AI Chatbot</title> |
|
|
<style> |
|
|
* { |
|
|
box-sizing: border-box; |
|
|
margin: 0; |
|
|
padding: 0; |
|
|
} |
|
|
|
|
|
body { |
|
|
font-family: 'Arial', sans-serif; |
|
|
background-color: #f0f0f0; |
|
|
height: 100vh; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
} |
|
|
|
|
|
#chat-container { |
|
|
flex-grow: 1; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
max-width: 600px; |
|
|
width: 100%; |
|
|
margin: 0 auto; |
|
|
background-color: white; |
|
|
box-shadow: 0 0 10px rgba(0,0,0,0.1); |
|
|
} |
|
|
|
|
|
#chat-messages { |
|
|
flex-grow: 1; |
|
|
overflow-y: auto; |
|
|
padding: 15px; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
} |
|
|
|
|
|
.message { |
|
|
max-width: 80%; |
|
|
margin: 5px 0; |
|
|
padding: 10px; |
|
|
border-radius: 10px; |
|
|
clear: both; |
|
|
word-wrap: break-word; |
|
|
line-height: 1.4; |
|
|
} |
|
|
|
|
|
.user-message { |
|
|
background-color: #007bff; |
|
|
color: white; |
|
|
align-self: flex-end; |
|
|
margin-left: auto; |
|
|
} |
|
|
|
|
|
.bot-message { |
|
|
background-color: #e9ecef; |
|
|
color: black; |
|
|
align-self: flex-start; |
|
|
} |
|
|
|
|
|
.bot-message strong { |
|
|
color: #007bff; |
|
|
} |
|
|
|
|
|
#input-container { |
|
|
display: flex; |
|
|
padding: 10px; |
|
|
background-color: white; |
|
|
border-top: 1px solid #e0e0e0; |
|
|
} |
|
|
|
|
|
#user-input { |
|
|
flex-grow: 1; |
|
|
padding: 10px; |
|
|
border: 1px solid #ddd; |
|
|
border-radius: 20px; |
|
|
margin-right: 10px; |
|
|
outline: none; |
|
|
} |
|
|
|
|
|
#send-btn { |
|
|
background-color: #007bff; |
|
|
color: white; |
|
|
border: none; |
|
|
border-radius: 50%; |
|
|
width: 40px; |
|
|
height: 40px; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
cursor: pointer; |
|
|
} |
|
|
|
|
|
|
|
|
.typing-indicator { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
background-color: #e9ecef; |
|
|
padding: 10px; |
|
|
border-radius: 10px; |
|
|
align-self: flex-start; |
|
|
margin-bottom: 10px; |
|
|
} |
|
|
|
|
|
.typing-indicator span { |
|
|
height: 8px; |
|
|
width: 8px; |
|
|
background-color: #888; |
|
|
border-radius: 50%; |
|
|
margin: 0 3px; |
|
|
animation: typing 1.4s infinite; |
|
|
} |
|
|
|
|
|
.typing-indicator span:nth-child(2) { |
|
|
animation-delay: 0.2s; |
|
|
} |
|
|
|
|
|
.typing-indicator span:nth-child(3) { |
|
|
animation-delay: 0.4s; |
|
|
} |
|
|
|
|
|
@keyframes typing { |
|
|
0%, 100% { opacity: 0.4; } |
|
|
50% { opacity: 1; } |
|
|
} |
|
|
|
|
|
@media (max-width: 600px) { |
|
|
body { |
|
|
margin: 0; |
|
|
} |
|
|
|
|
|
#chat-container { |
|
|
width: 100%; |
|
|
height: 100vh; |
|
|
max-width: none; |
|
|
} |
|
|
|
|
|
#input-container { |
|
|
padding: 10px; |
|
|
} |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
<div id="chat-container"> |
|
|
<div id="chat-messages"></div> |
|
|
<div id="input-container"> |
|
|
<input type="text" id="user-input" placeholder="Ketik pesan..."> |
|
|
<button id="send-btn">➤</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<script> |
|
|
const chatMessages = document.getElementById('chat-messages'); |
|
|
const userInput = document.getElementById('user-input'); |
|
|
const sendBtn = document.getElementById('send-btn'); |
|
|
|
|
|
|
|
|
function addMessage(message, type, isHTML = false) { |
|
|
|
|
|
removeTypingIndicator(); |
|
|
|
|
|
const messageElement = document.createElement('div'); |
|
|
messageElement.classList.add('message', type); |
|
|
|
|
|
if (isHTML) { |
|
|
messageElement.innerHTML = message; |
|
|
} else { |
|
|
messageElement.textContent = message; |
|
|
} |
|
|
|
|
|
chatMessages.appendChild(messageElement); |
|
|
scrollToBottom(); |
|
|
} |
|
|
|
|
|
|
|
|
function addTypingIndicator() { |
|
|
|
|
|
removeTypingIndicator(); |
|
|
|
|
|
const typingIndicator = document.createElement('div'); |
|
|
typingIndicator.classList.add('typing-indicator'); |
|
|
typingIndicator.innerHTML = ` |
|
|
<span></span> |
|
|
<span></span> |
|
|
<span></span> |
|
|
`; |
|
|
chatMessages.appendChild(typingIndicator); |
|
|
scrollToBottom(); |
|
|
} |
|
|
|
|
|
|
|
|
function removeTypingIndicator() { |
|
|
const existingIndicator = document.querySelector('.typing-indicator'); |
|
|
if (existingIndicator) { |
|
|
existingIndicator.remove(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function scrollToBottom() { |
|
|
chatMessages.scrollTop = chatMessages.scrollHeight; |
|
|
} |
|
|
|
|
|
|
|
|
function formatAnswer(answer) { |
|
|
|
|
|
return answer.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>'); |
|
|
} |
|
|
|
|
|
|
|
|
async function sendMessage() { |
|
|
const message = userInput.value.trim(); |
|
|
if (message === '') return; |
|
|
|
|
|
|
|
|
addMessage(message, 'user-message'); |
|
|
userInput.value = ''; |
|
|
|
|
|
|
|
|
addTypingIndicator(); |
|
|
|
|
|
try { |
|
|
|
|
|
function generateRandomNumberString(length) { |
|
|
let result = ''; |
|
|
const characters = '0123456789'; |
|
|
const charactersLength = characters.length; |
|
|
for (let i = 0; i < length; i++) { |
|
|
result += characters.charAt(Math.floor(Math.random() * charactersLength)); |
|
|
} |
|
|
return result; |
|
|
} |
|
|
const response = await fetch(`https://btch.us.kg/prompt/gpt?text=${encodeURIComponent(message)}&prompt=${encodeURIComponent("gunakan bahasa indonesia dalam merespon dan jawab langsung ke intinya, tidak perlu bertele-tele atau terlalu banyak basa-basi")}&id=${generateRandomNumberString(5)}&apiKey=yanzdev`); |
|
|
const data = await response.json(); |
|
|
|
|
|
|
|
|
if (data.result) { |
|
|
|
|
|
const formattedAnswer = formatAnswer(data.result); |
|
|
addMessage(formattedAnswer, 'bot-message', true); |
|
|
} else { |
|
|
addMessage('Maaf, saya tidak dapat memproses permintaan Anda.', 'bot-message'); |
|
|
} |
|
|
} catch (error) { |
|
|
console.error('Error:', error); |
|
|
addMessage('Terjadi kesalahan saat mengambil respons.', 'bot-message'); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
sendBtn.addEventListener('click', sendMessage); |
|
|
|
|
|
|
|
|
userInput.addEventListener('keypress', (event) => { |
|
|
if (event.key === 'Enter') { |
|
|
sendMessage(); |
|
|
} |
|
|
}); |
|
|
</script> |
|
|
</body> |
|
|
</html> |