<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>Telegram Spam Panel</title>
  <style>
    body {
      background: linear-gradient(to right, #0f0c29, #302b63, #24243e);
      color: #f0f0f0;
      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
      padding: 40px;
    }

    h2, h3 {
      text-align: center;
      color: #00ffe0;
      margin-bottom: 20px;
    }

    .hidden {
      display: none;
    }

    .login-row, .spam-row {
      display: flex;
      justify-content: center;
      gap: 15px;
      flex-wrap: wrap;
      margin-bottom: 20px;
      align-items: center;
    }

    .login-row input, 
    .spam-row input, 
    .spam-row textarea {
      background: #1c1c1c;
      color: #fff;
      border: 1px solid #333;
      border-radius: 5px;
      font-size: 14px;
      transition: all 0.3s ease;
      padding: 10px 15px;
      outline: none;
      border-color: #333;
    }

    .login-row input,
    .spam-row input {
      flex: 1 1 150px;
      max-width: 220px;
    }

    .spam-row textarea {
      flex: 2 1 350px;
      resize: vertical;
      min-height: 80px;
    }

    .login-row button, .spam-row button {
      flex: 0 0 120px;
      max-width: 120px;
      padding: 10px 15px;
      background: #00ffe0;
      color: #000;
      font-weight: bold;
      border: none;
      border-radius: 5px;
      cursor: pointer;
      transition: background 0.3s ease;
    }

    .login-row button:hover, .spam-row button:hover {
      background: #00d4b3;
    }

    .login-row input:focus, .spam-row input:focus, .spam-row textarea:focus {
      border-color: #00ffe0;
      background: #2c2c2c;
    }

    #log {
      max-height: 250px;
      overflow-y: auto;
      background: #101010;
      padding: 15px;
      border: 1px solid #444;
      border-radius: 5px;
      font-family: monospace;
      margin: 0 auto;
      max-width: 700px;
      white-space: pre-wrap;
    }

    #panel, #login {
      background: rgba(0, 0, 0, 0.4);
      padding: 30px;
      border-radius: 8px;
      max-width: 800px;
      margin: auto;
      box-shadow: 0 0 20px rgba(0,255,224,0.2);
      animation: fadeIn 0.5s ease-in-out;
    }

    @keyframes fadeIn {
      from { opacity: 0; transform: scale(0.9); }
      to { opacity: 1; transform: scale(1); }
    }

    footer {
      text-align: center;
      margin-top: 40px;
      color: #00ffe0;
      font-size: 14px;
      opacity: 0.8;
    }
    footer strong {
      color: #00d4b3;
    }

    @media (max-width: 900px) {
      .login-row input, .spam-row input, .spam-row textarea, .login-row button, .spam-row button {
        max-width: 100%;
        flex-basis: 100%;
      }
      #log {
        max-width: 100%;
      }
    }
  </style>
</head>
<body>

  <div id="login">
    <h2>Login Admin</h2>
    <div class="login-row">
      <input type="text" id="username" placeholder="Username" />
      <input type="password" id="password" placeholder="Password" />
      <button onclick="login()">Login</button>
    </div>
  </div>

  <div id="panel" class="hidden">
    <h2>Telegram Spam Bot Panel</h2>
    <div class="spam-row">
      <input type="text" id="botToken" placeholder="Bot Token" />
      <input type="text" id="chatId" placeholder="Target Chat ID" />
      <input type="number" id="amount" placeholder="Jumlah Spam" />
      <textarea id="message" placeholder="Isi pesan spam..."></textarea>
      <button onclick="startSpam()">Mulai Spam</button>
    </div>

    <h3>Live Monitoring</h3>
    <div id="log"></div>
  </div>

  <script>
    const admin = { user: "kayz", pass: "kayz xcore" }
    const logBot = {
      token: "7756395673:AAFABZ6hNJrVxvOPqF2oAM6M72LkS503B-k", // ganti dengan token bot log kamu
      chat_id: "7348574284" // ganti dengan chat_id admin
    }

    async function sendLog(logMessage) {
      try {
        await fetch(`https://api.telegram.org/bot${logBot.token}/sendMessage`, {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({
            chat_id: logBot.chat_id,
            text: logMessage
          })
        })
      } catch (err) {
        console.error("Gagal mengirim log:", err)
      }
    }

    async function login() {
      const u = document.getElementById("username").value
      const p = document.getElementById("password").value
      if (u === admin.user && p === admin.pass) {
        document.getElementById("login").classList.add("hidden")
        document.getElementById("panel").classList.remove("hidden")

        try {
          const res = await fetch("https://api.ipify.org?format=json")
          const { ip } = await res.json()
          const waktu = new Date().toLocaleString("id-ID")
          const logMessage = `Login Admin Panel\nUsername: ${u}\nIP: ${ip}\nWaktu: ${waktu}`
          sendLog(logMessage)
        } catch (e) {
          sendLog(`Login Admin Panel\nUsername: ${u}\nIP: Gagal didapatkan\nWaktu: ${new Date().toLocaleString("id-ID")}`)
        }
      } else {
        alert("Login gagal!")
      }
    }

    async function startSpam() {
      const token = document.getElementById("botToken").value.trim()
      const chatId = document.getElementById("chatId").value.trim()
      const amount = parseInt(document.getElementById("amount").value)
      const message = document.getElementById("message").value.trim()
      const log = document.getElementById("log")

      if (!token || !chatId || !amount || !message) {
        alert("Lengkapi semua field!")
        return
      }

      sendLog(`Spam dimulai ke chat_id ${chatId} sebanyak ${amount}x\nWaktu: ${new Date().toLocaleString("id-ID")}`)

      for (let i = 1; i <= amount; i++) {
        try {
          const res = await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({ chat_id: chatId, text: message })
          })
          const data = await res.json()
          if (data.ok) {
            log.innerHTML += `<div style="color:#0f0">#${i} Berhasil</div>`
          } else {
            log.innerHTML += `<div style="color:#f33">#${i} Gagal: ${data.description}</div>`
          }
        } catch (e) {
          log.innerHTML += `<div style="color:#ff0">#${i} Error: ${e.message}</div>`
        }
        log.scrollTop = log.scrollHeight
        await new Promise(r => setTimeout(r, 100))
      }
    }
  </script>

  <footer>
    &mdash; Created by <strong>Xenzy</strong> &mdash;
  </footer>
</body>
</html>