| <!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> |