| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Bot Control Panel CC</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <script defer src="https://unpkg.com/alpinejs@3.10.2/dist/cdn.min.js"></script> |
| <style> |
| @keyframes fadeIn { |
| from { opacity: 0; transform: translateY(10px); } |
| to { opacity: 1; transform: translateY(0); } |
| } |
| .fade-in { animation: fadeIn 0.5s ease-out; } |
| |
| @keyframes fadeOut { |
| from { opacity: 1; transform: scale(1); } |
| to { opacity: 0; transform: scale(0); } |
| } |
| .fade-out { animation: fadeOut 0.5s ease-out forwards; } |
| |
| @keyframes spin { |
| 100% { transform: rotate(360deg); } |
| } |
| .loading-circle { |
| border: 4px solid rgba(255, 255, 255, 0.3); |
| border-top-color: white; |
| border-radius: 50%; |
| width: 40px; |
| height: 40px; |
| animation: spin 1s linear infinite; |
| } |
| |
| .popup { |
| position: fixed; |
| bottom: 20px; |
| left: 50%; |
| transform: translateX(-50%); |
| background-color: rgba(0, 0, 0, 0.8); |
| color: white; |
| padding: 12px 20px; |
| border-radius: 8px; |
| box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); |
| opacity: 0; |
| transition: opacity 0.5s ease-out; |
| } |
| .popup.show { opacity: 1; } |
| |
| #ping { |
| position: fixed; |
| bottom: 10px; |
| left: 50%; |
| transform: translateX(-50%); |
| font-size: 14px; |
| color: rgba(255, 255, 255, 0.6); |
| font-weight: 500; |
| font-style: italic; |
| pointer-events: none; |
| } |
| </style> |
| </head> |
| <body class="bg-gray-900 text-white flex flex-col items-center justify-center min-h-screen p-6"> |
|
|
| <div class="w-full max-w-3xl space-y-6 fade-in"> |
| <h1 class="text-3xl font-bold text-center">Bot Control Panel</h1> |
|
|
| <div class="bg-gray-800 p-6 rounded-lg shadow-lg"> |
| <label class="block text-lg font-medium mb-2">Paste JSON:</label> |
| <textarea id="jsonInput" class="w-full p-3 rounded-lg bg-gray-700 text-white border border-gray-600 focus:ring focus:ring-blue-500 transition" rows="6" placeholder="Paste JSON here..."></textarea> |
| <button onclick="askPasscode('updateAppState')" class="mt-4 w-full bg-blue-600 hover:bg-blue-700 transition px-4 py-2 rounded-lg font-semibold shadow-lg">Proceed</button> |
| </div> |
|
|
| <div class="bg-gray-800 p-6 rounded-lg shadow-lg fade-in"> |
| <button onclick="askPasscode('restartBot')" class="w-full bg-red-600 hover:bg-red-700 transition px-4 py-2 rounded-lg font-semibold shadow-lg">Restart Bot</button> |
| </div> |
|
|
| <div class="bg-gray-800 p-6 rounded-lg shadow-lg fade-in"> |
| <label class="block text-lg font-medium mb-2">Execute Command:</label> |
| <input type="text" id="commandInput" class="w-full p-3 rounded-lg bg-gray-700 text-white border border-gray-600 focus:ring focus:ring-blue-500 transition" placeholder="Enter a command..."> |
| <button onclick="askPasscode('executeCommand')" class="mt-4 w-full bg-yellow-600 hover:bg-yellow-700 transition px-4 py-2 rounded-lg font-semibold shadow-lg">Execute</button> |
| </div> |
|
|
| </div> |
|
|
| <div id="ping" class="fade-in">Ping: <span id="pingValue">Loading...</span></div> |
|
|
| <div id="loading" class="fixed inset-0 bg-black bg-opacity-50 flex justify-center items-center hidden"> |
| <div class="loading-circle"></div> |
| </div> |
|
|
| <div id="popupNotification" class="popup"></div> |
|
|
| <script> |
| function showPopup(message) { |
| const popup = document.getElementById("popupNotification"); |
| popup.textContent = message; |
| popup.classList.add("show"); |
| setTimeout(() => popup.classList.remove("show"), 3000); |
| } |
| |
| function askPasscode(action) { |
| const passcode = prompt("Enter Passcode:"); |
| if (!passcode) { |
| showPopup("Passcode is required."); |
| return; |
| } |
| window[action](passcode); |
| } |
| |
| function updateAppState(passcode) { |
| const jsonInput = document.getElementById("jsonInput").value; |
| |
| try { |
| JSON.parse(jsonInput); |
| } catch { |
| showPopup("Invalid JSON format."); |
| return; |
| } |
| |
| document.getElementById("loading").classList.remove("hidden"); |
| |
| fetch("/update-appstate", { |
| method: "POST", |
| headers: { "Content-Type": "application/json" }, |
| body: JSON.stringify({ passcode, jsonData: JSON.parse(jsonInput) }) |
| }).then(res => res.text()).then(message => { |
| document.getElementById("loading").classList.add("hidden"); |
| showPopup(message); |
| }).catch(() => { |
| document.getElementById("loading").classList.add("hidden"); |
| showPopup("Error updating AppState."); |
| }); |
| } |
| |
| function restartBot(passcode) { |
| document.getElementById("loading").classList.remove("hidden"); |
| |
| fetch(`/restart?passcode=${encodeURIComponent(passcode)}`) |
| .then(res => res.text()) |
| .then(message => { |
| document.getElementById("loading").classList.add("hidden"); |
| showPopup(message); |
| }) |
| .catch(() => { |
| document.getElementById("loading").classList.add("hidden"); |
| showPopup("Error restarting bot."); |
| }); |
| } |
| |
| function executeCommand(passcode) { |
| const commandInput = document.getElementById("commandInput").value; |
| if (!commandInput) { |
| showPopup("Please enter a command."); |
| return; |
| } |
| |
| document.getElementById("loading").classList.remove("hidden"); |
| |
| fetch("/execute-command", { |
| method: "POST", |
| headers: { "Content-Type": "application/json" }, |
| body: JSON.stringify({ passcode, command: commandInput }) |
| }).then(res => res.text()).then(output => { |
| document.getElementById("loading").classList.add("hidden"); |
| showPopup(output); |
| }).catch(() => { |
| document.getElementById("loading").classList.add("hidden"); |
| showPopup("Error executing command."); |
| }); |
| } |
| |
| function updatePing() { |
| fetch("/ping") |
| .then(res => res.json()) |
| .then(data => { |
| document.getElementById("pingValue").textContent = data.ping + " ms"; |
| }) |
| .catch(() => { |
| document.getElementById("pingValue").textContent = "Error"; |
| }); |
| } |
| |
| setInterval(updatePing, 5000); |
| updatePing(); |
| </script> |
| </body> |
| </html> |