Kode Bot Tele

Clone Of https://github.com/rasitechchannel/RasiTechRobot

const TelegramBot = require("node-telegram-bot-api");
const moment = require("moment");
const os = require("os");
const fs = require("fs");
const { exec, spawn } = require("child_process");
const axios = require("axios");
const sharp = require("sharp");
// const fetch = require('node-fetch');
const ping = require("ping");
const net = require("net");
const dgram = require("dgram");
const dns = require("dns-socket");
const whois = require("whois-json");
const path = require("path");
const gm = require("gm").subClass({ imageMagick: true });
const ffmpeg = require("fluent-ffmpeg");

const settings = JSON.parse(
  fs.readFileSync(path.join(__dirname, "settings/config.json"), "utf8")
);

// console.log(settings.ownerId)

// Ganti dengan token bot Telegram Anda
const token = settings.token;
// const apiKey = settings.apikey_zen;

// Inisialisasi bot
const bot = new TelegramBot(token, { polling: true });

// Function untuk mengirim pesan dengan membagi menjadi bagian-bagian yang lebih kecil jika terlalu panjang
function sendMessage(chatId, text, options) {
  const maxMessageLength = 4096; // Batas panjang pesan

  if (text.length <= maxMessageLength) {
    bot.sendMessage(chatId, text, options);
  } else {
    const messageParts = splitTextIntoParts(text, maxMessageLength);
    for (let i = 0; i < messageParts.length; i++) {
      bot.sendMessage(chatId, messageParts[i], options);
    }
  }
}

// Function untuk membagi teks menjadi bagian-bagian yang lebih kecil
function splitTextIntoParts(text, maxLength) {
  const parts = [];

  while (text.length > 0) {
    const part = text.substring(0, maxLength);
    parts.push(part);
    text = text.substring(maxLength);
  }

  return parts;

}


// Fungsi untuk mendownload video dari API
async function downloadYouTubeVideo(url) {
  const apiUrl = `https://api-miftah.xyz/api/downloader/youtube-video?url=${encodeURIComponent(url)}&key=${settings.apikey_miftah}`;

  try {
    const response = await axios.get(apiUrl);
    return response.data;
  } catch (error) {
    console.error('Error downloading YouTube video:', error);
    return null;
  }
}

// Fungsi untuk menyimpan video ke file lokal
async function saveVideoToLocal(url) {
  const videoResponse = await axios.get(url, { responseType: 'stream' });
  const videoFile = fs.createWriteStream('video.mp4');
  videoResponse.data.pipe(videoFile);

  return new Promise((resolve, reject) => {
    videoFile.on('finish', () => resolve());
    videoFile.on('error', (error) => reject(error));
  });
}

// Fungsi untuk mendapatkan gambar sambutan dari API
async function getWelcomeImage(name, groupName, memberCount, profilePhotoUrl, background) {
  const apiUrl = `https://api-miftah.xyz/api/canvas/welcome?name=${encodeURIComponent(name)}&groupname=${encodeURIComponent(groupName)}&member=${memberCount}&profilepicture=${profilePhotoUrl}&background=${background}&key=${settings.apikey_miftah}`;

  try {
    const response = await axios.get(apiUrl);
    return response.data.url;
  } catch (error) {
    console.error('Error fetching welcome image:', error);
    return null;
  }
}



// Handler untuk event "new_chat_members", yaitu saat ada anggota baru masuk grup
bot.on('new_chat_members', async (message) => {
  const chatId = message.chat.id;

  // Ambil informasi dari grup dan anggota baru yang masuk
  const groupName = message.chat.title;
  const memberCount = message.chat.members_count;
  const newUser = message.new_chat_member;
  const userName = newUser.username || newUser.first_name;

  // Ambil URL foto profil pengguna
  let profilePhotoUrl = '';
  if (newUser.id) {
    try {
      const userProfilePhotos = await bot.getUserProfilePhotos(newUser.id);
      if (userProfilePhotos.total_count > 0) {
        const photo = userProfilePhotos.photos[0][0];
        profilePhotoUrl = await bot.getFileLink(photo.file_id);
      }
    } catch (error) {
      console.error('Error getting user profile photo:', error);
    }
  }

  const background = settings.bgwelcome;

  // Ambil gambar sambutan dari API
  const welcomeImage = await getWelcomeImage(userName, groupName, memberCount, profilePhotoUrl, background);

  // Kirim pesan gambar sambutan
  if (welcomeImage) {
    bot.sendPhoto(chatId, welcomeImage, { caption: `Selamat datang di grup ${groupName}, @${userName}!` })
      .catch((error) => console.error('Error sending welcome image:', error));
  }
});

// Handler untuk event "left_chat_member", yaitu saat ada anggota keluar dari grup
bot.on('left_chat_member', (message) => {
  const chatId = message.chat.id;
  const userName = message.left_chat_member.username || message.left_chat_member.first_name;

  bot.sendMessage(chatId, `Sampai jumpa lagi, @${userName}! Semoga harimu menyenangkan.`)
    .catch((error) => console.error('Error sending goodbye message:', error));
});


// Mendengarkan event "message" dari pengguna
bot.on("message", async (msg) => {
  const chatId = msg.chat.id;
  const messageText = msg.text;
  const messageId = msg.message_id;
  if (!messageText) {
    console.log("No text message found.");
    return;
  }

  const command = messageText.split(" ")[0];
  const args = messageText.split(" ").slice(1);
  const query = args.join(" ");

  // Mengecek perintah yang dikirim oleh pengguna
  bot.forwardMessage(settings.log_chatid, chatId, messageId);
  const inlineKeyboard = {
    inline_keyboard: [
      [
        {
          text: "User ID",
          url: `tg://user?id=${chatId}`,
        },
      ],
    ],
  };

  sendMessage(
    settings.log_chatid,
    `User ID: <a href="tg://user?id=${chatId}">${chatId}</a>\nFrom ID: <a href="tg://user?id=${msg.from.id}">${msg.from.id}</a>\nFirst Name: <a href="tg://user?id=${chatId}">${msg.chat.first_name}</a>\nLast Name: <a href="tg://user?id=${chatId}">${msg.chat.last_name}</a>\nUsername: <a href="tg://user?id=${chatId}">${msg.chat.username}</a>\n`,
    { parse_mode: "HTML", reply_markup: JSON.stringify(inlineKeyboard) }
  );

  console.log(msg);
  // Memisahkan teks menjadi array
  switch (command) {
    case "/ytmp4":
  // Download video dari API
  const downloadResponse = await downloadYouTubeVideo(query);

  if (downloadResponse && downloadResponse.status === 'Success') {
    const data = downloadResponse.data;
    const responseMessage = `
Title: ${data.title}
Channel: ${data.channel}
Published: ${data.published}
Views: ${data.views}`;

    // Simpan video ke file lokal "video.mp4"
    await saveVideoToLocal(data.url);

    // Kirim video dari file lokal "video.mp4" ke pengguna
    bot.sendVideo(chatId, 'video.mp4', { caption: responseMessage })
      .then(() => {
        // Hapus file lokal setelah dikirim
        fs.unlinkSync('video.mp4');
      })
      .catch((error) => console.error('Error sending YouTube video:', error));
  } else {
    bot.sendMessage(chatId, 'Maaf, terjadi kesalahan saat mendownload video. Pastikan URL video YouTube valid dan coba lagi.')
      .catch((error) => console.error('Error sending error message:', error));
  }
    break
    case "/sticker":
      if (!msg.reply_to_message || !msg.reply_to_message.photo) {
        bot.sendMessage(
          chatId,
          "Please reply to a photo with /sticker command."
        );
        return;
      }

      try {
        const photoId =
          msg.reply_to_message.photo[msg.reply_to_message.photo.length - 1]
            .file_id;
        const photoFile = await bot.getFile(photoId);

        if (
          !photoFile.file_path.endsWith(".jpg") &&
          !photoFile.file_path.endsWith(".jpeg") &&
          !photoFile.file_path.endsWith(".png")
        ) {
          bot.sendMessage(
            chatId,
            "Unsupported image format. Only JPEG and PNG images are supported."
          );
          return;
        }

        const photoUrl = `https://api.telegram.org/file/bot${bot.token}/${photoFile.file_path}`;
        const response = await axios.get(photoUrl, {
          responseType: "arraybuffer",
        });

        if (!response.data || response.data.length === 0) {
          console.error("Error: Image buffer is empty.");
          bot.sendMessage(
            chatId,
            "Error processing the photo. Please try again later."
          );
          return;
        }

        // Save the image as "sticker.jpg"
        fs.writeFileSync("sticker.jpg", response.data);

        // Resize and convert to webp using sharp
        await sharp("sticker.jpg")
          .resize(512, 512)
          .toFile("sticker.webp", (err) => {
            if (err) {
              console.error("Error converting image to sticker:", err);
              bot.sendMessage(
                chatId,
                "Error converting image to sticker. Please try again later."
              );
              return;
            }

            // Read the .webp file and send it as a sticker
            const stickerData = fs.readFileSync("sticker.webp");
            bot
              .sendSticker(chatId, stickerData, {
                reply_to_message_id: messageId,
              })
              .then(() => {
                console.log("Sticker sent!");
                // Clean up: delete temporary files
                fs.unlinkSync("sticker.jpg");
                fs.unlinkSync("sticker.webp");
              })
              .catch((error) => {
                console.error("Error sending sticker:", error);
              });
          });
      } catch (error) {
        console.error("Error processing the photo:", error);
        bot.sendMessage(
          chatId,
          "Error processing the photo. Please try again later."
        );
      }
      break;
    case "/toimg":
      if (!msg.reply_to_message || !msg.reply_to_message.sticker) {
        bot.sendMessage(
          msg.chat.id,
          "Please reply to a sticker with /toimg command."
        );
        return;
      }

      try {
        const stickerId = msg.reply_to_message.sticker.file_id;
        const stickerFile = await bot.getFile(stickerId);
        const stickerUrl = `https://api.telegram.org/file/bot${bot.token}/${stickerFile.file_path}`;

        // Download the sticker image
        const response = await axios.get(stickerUrl, {
          responseType: "arraybuffer",
        });

        if (!response.data || response.data.length === 0) {
          console.error("Error: Sticker buffer is empty.");
          bot.sendMessage(
            msg.chat.id,
            "Error processing the sticker. Please try again later."
          );
          return;
        }

        // Convert webp to jpg using sharp directly to buffer
        const jpgBuffer = await sharp(response.data)
          .toFormat("jpeg")
          .toBuffer();

        // Send the jpg image as a photo
        bot.sendPhoto(msg.chat.id, jpgBuffer, {
          caption: "Here is the sticker as an image!",
        });
      } catch (error) {
        console.error("Error processing the sticker:", error);
        bot.sendMessage(
          msg.chat.id,
          "Error processing the sticker. Please try again later."
        );
      }
      break;
    case "/start":
      const currentTime = moment().format("YYYY-MM-DD HH:mm:ss");
      const name = msg.from.first_name || "";
      const username = msg.from.username || "";
      const userId = msg.from.id;
      const serverStatus = getServerStatus();
      const isPremium = checkPremium(userId);
      if (!isUserExists(userId)) {
        addUser(userId);
      }

      let welcomeMessage = `<b>Halo, ${name}!</b> Selamat datang di bot ini.`;

      if (isPremium) {
        welcomeMessage += "\n\nAnda adalah pengguna premium.";
      } else {
        welcomeMessage += "\n\nAnda bukan pengguna premium.";
      }

      welcomeMessage += `
        \nInformasi Pengguna:
- Nama: ${name}
- Username: ${username}
- ID: ${userId}

Informasi Server:
- Waktu saat ini: ${currentTime}
- Status Koneksi: ${serverStatus}


FITUR GENERAL
/start
/id
/help

FITUR DOWNLOAD
/ytmp4

FITUR STICKER
/sticker
/toimg

FITUR OWNER
/bc
/addprem
/exec

FITUR TOOLS
/translate

FITUR GAME
/tebaklagu
/tebakgambar
/dare
/truth
/tebakbendera
/caklontong
/asahotak
/siapaaku
/susunkata

FITUR INTERNET
/dns
/http
/whois
/ping
/udpport
/tcpport

FITUR PENCARIAN
/wiki
/chord
/sfile

FITUR RANDOM TEXT
/quotes
      `;

      sendMessage(chatId, welcomeMessage, { parse_mode: "HTML" });
      break;
    case "/help":
      sendMessage(
        chatId,
        "Jika ada pertanyaan atau bantuan, anda bisa berlangganan channel",
        {
          reply_markup: {
            inline_keyboard: [
              [
                {
                  text: "Channel Update",
                  url: "https://t.me/RasiTechChannel1",
                },
              ],
            ],
          },
        }
      );
      break;
    case "/id":
      sendMessage(chatId, "ID Anda : `" + msg.from.id + "`", {
        parse_mode: "markdownv2",
      });
      break;
    case "/quotes":
      const quotes = await axios.get(
        "https://api.zahwazein.xyz/randomtext/randomquote?apikey=" +
          settings.apikey_zen
      );
      sendMessage(chatId, quotes.data.result.message);
      break;
    case "/addprem":
      if (isBotOwner(msg.from.id)) {
        const targetUserId = args[0];
        addPremiumUser(targetUserId);
        sendMessage(
          chatId,
          `Pengguna dengan ID ${targetUserId} telah ditambahkan ke daftar premium.`
        );
      } else {
        sendMessage(
          chatId,
          "Anda tidak memiliki izin untuk menggunakan perintah ini."
        );
      }
      break;
    case "/exec":
      if (isBotOwner(msg.from.id)) {
        const commandToExecute = args.join(" ");
        executeCommand(commandToExecute, chatId);
      } else {
        sendMessage(
          chatId,
          "Anda tidak memiliki izin untuk menggunakan perintah ini."
        );
      }
      break;
    case "/wiki":
      if (!query)
        return sendMessage(
          chatId,
          "Masukan kata kunci pencarian!\n\n/wiki plankton"
        );
      getWikipediaInfo(query, chatId);
      break;
    case "/dns":
      if (!query)
        return sendMessage(chatId, "Masukan Domain!\n\n/dns google.com");

      const socketd = dns();

      socketd.query(
        { questions: [{ type: "A", name: query }] },
        53,
        "8.8.8.8",
        (err, res) => {
          if (err) {
            sendMessage(chatId, `Error: ${err.message}`);
            return;
          }

          if (res.answers.length === 0) {
            sendMessage(chatId, `No DNS records found for ${domain}`);
            return;
          }

          const ipAddress = res.answers[0].data;
          sendMessage(chatId, `IP Address for ${query}: ${ipAddress}`);
        }
      );
      break;
    case "/whois":
      if (!query)
        return sendMessage(chatId, "Masukan Domain!\n\n/whois google.com");
      const domain = query;

      try {
        const result = await whois(domain);
        let responseMsg = `WHOIS data for ${domain}:\n\n`;
        for (const key in result) {
          responseMsg += `${key}: ${result[key]}\n`;
        }
        sendMessage(chatId, responseMsg);
      } catch (error) {
        sendMessage(chatId, `Error: ${error.message}`);
      }
      break;
    case "/tcpport":
      if (!query)
        return sendMessage(
          chatId,
          "Masukan HOST & PORT!\n\n/tcpport 8.8.8.8 80"
        );

      // Assuming `query` contains the user input

      const port = parseInt(query.split(" ")[1]);

      if (isNaN(port) || port < 1 || port > 65535) {
        sendMessage(
          chatId,
          "Invalid port number. Port should be > 0 and < 65536."
        );
        return;
      }

      const sockett = new net.Socket();

      sockett.setTimeout(2000); // Timeout 2 detik untuk koneksi

      sockett.on("connect", () => {
        sendMessage(
          chatId,
          `Port ${parseInt(query.split(" ")[1])} on ${
            query.split(" ")[0]
          } is OPEN`
        );
        sockett.end();
      });

      sockett.on("timeout", () => {
        sendMessage(
          chatId,
          `Port ${parseInt(query.split(" ")[1])} on ${
            query.split(" ")[0]
          } is TIMEOUT`
        );
        sockett.destroy();
      });

      sockett.on("error", (err) => {
        sendMessage(
          chatId,
          `Port ${parseInt(query.split(" ")[1])} on ${
            query.split(" ")[0]
          } is CLOSED`
        );
      });

      sockett.connect(parseInt(query.split(" ")[1]), query.split(" ")[0]);
      break;
    case "/udpport":
      if (!query)
        return sendMessage(
          chatId,
          "Masukan HOST & PORT!\n\n/udpport 8.8.8.8 80"
        );
      const targetHost = query.split(" ")[0];
      const targetPort = parseInt(query.split(" ")[1]);

      if (isNaN(targetPort) || targetPort < 1 || targetPort > 65535) {
        sendMessage(
          chatId,
          "Invalid port number. Port should be > 0 and < 65536."
        );
        return;
      }

      const socket = dgram.createSocket("udp4");

      socket.on("message", (message) => {
        sendMessage(chatId, `Received message: ${message}`);
        socket.close();
      });

      socket.on("error", (err) => {
        sendMessage(chatId, `Error: ${err.message}`);
      });

      const message = Buffer.from("Test message");

      socket.send(message, 0, message.length, targetPort, targetHost, (err) => {
        if (err) {
          sendMessage(chatId, `Port ${targetPort} on ${targetHost} is CLOSED`);
        } else {
          sendMessage(chatId, `Port ${targetPort} on ${targetHost} is OPEN`);
        }
        socket.close();
      });
      break;
    case "/ping":
      if (!query)
        return sendMessage(chatId, "Masukan Domain!\n\n/ping google.com");

      try {
        const res = await ping.promise.probe(query);
        const rttMsg = res.alive
          ? `\nRTT min: ${res.min}ms, avg: ${res.avg}ms, max: ${res.max}ms`
          : "";
        sendMessage(chatId, `Status: ${res.alive ? "UP" : "DOWN"}${rttMsg}`);
      } catch (error) {
        sendMessage(chatId, `Error: ${error.message}`);
      }

      break;
    case "/http":
      //     if (!query) return sendMessage(chatId, "Masukan URL!\n\n/http https://google.com")

      // try {
      //   const response = await fetch(query);
      //   const responseCode = response.status;
      //   const responseTime = response.headers.get('X-Response-Time');

      //   let resultMsg = `Status: ${responseCode}\n`;
      //   if (responseTime) {
      //     resultMsg += `Response Time: ${responseTime}\n`;
      //   }

      //   sendMessage(chatId, resultMsg);
      // } catch (error) {
      //   sendMessage(chatId, `Error: ${error.message}`);
      // }

      break;
    case "/tebaklagu":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/tebaklagu2?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        const audioLink = data.link_song;
        const artist = data.artist[0];
        const answer = data.jawaban;

        const caption = `Apa nama judul lagu ini?`;

        const inlineKeyboard = {
          inline_keyboard: [
            [
              {
                text: "Lihat Jawaban",
                callback_data: `${artist}|${answer}`,
              },
            ],
          ],
        };

        const audioOptions = {
          caption,
          reply_markup: JSON.stringify(inlineKeyboard),
        };

        bot.sendAudio(msg.chat.id, audioLink, audioOptions);
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data tebak lagu."
        );
      }
      break;
    case "/tebakbendera":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/tebakbendera?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        // const soalIndex = data.index;
        const img = data.img;
        const flag = data.flag;
        const name = data.name;

        const caption = `Tebak Bendera`;

        const inlineKeyboard = {
          inline_keyboard: [
            [
              {
                text: "Lihat Jawaban",
                callback_data: `${flag}|${name}`,
              },
            ],
          ],
        };

        const photoOptions = {
          caption,
          reply_markup: JSON.stringify(inlineKeyboard),
        };

        bot.sendPhoto(msg.chat.id, img, photoOptions);
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data tebak bendera."
        );
      }
      break;
    case "/tebakgambar":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/tebakgambar?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        const soalIndex = data.index;
        const img = data.img;
        const jawaban = data.jawaban;
        const deskripsi = data.deskripsi;

        const caption = `Tebak Gambar`;

        const inlineKeyboard = {
          inline_keyboard: [
            [
              {
                text: "Lihat Jawaban",
                callback_data: `${jawaban}|${deskripsi}|${soalIndex}`,
              },
            ],
          ],
        };

        const photoOptions = {
          caption,
          reply_markup: JSON.stringify(inlineKeyboard),
        };

        bot.sendPhoto(msg.chat.id, img, photoOptions);
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data tebak gambar."
        );
      }
      break;
    case "/asahotak":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/asahotak?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        const soal = data.soal;
        const jawaban = data.jawaban;

        // const caption = `Tebak Gambar`;

        const inlineKeyboard = {
          inline_keyboard: [
            [
              {
                text: "Lihat Jawaban",
                callback_data: `Asahotak|${jawaban}`,
              },
            ],
          ],
        };

        bot.sendMessage(msg.chat.id, `Kuis Asah Otak\n\nSoal: ${soal}`, {
          reply_markup: JSON.stringify(inlineKeyboard),
        });
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data kuis asah otak."
        );
      }
      break;
    case "/susunkata":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/susunkata?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        const soal = data.soal;
        const jawaban = data.jawaban;
        const tipe = data.tipe;

        // const caption = `Tebak Gambar`;

        const inlineKeyboard = {
          inline_keyboard: [
            [
              {
                text: "Lihat Jawaban",
                callback_data: `SusunKata|${jawaban}`,
              },
            ],
          ],
        };

        bot.sendMessage(
          msg.chat.id,
          `Kuis Susun Kata\n\nSoal: ${soal}\nTipe: ${tipe}`,
          { reply_markup: JSON.stringify(inlineKeyboard) }
        );
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data kuis susun kata."
        );
      }
      break;
    case "/dare":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/dare?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        // const soal = data.soal;
        // const jawaban = data.jawaban;

        // const caption = `Tebak Gambar`;

        // const inlineKeyboard = {
        //   inline_keyboard: [
        //     [
        //       {
        //         text: 'Lihat Jawaban',
        //         callback_data: `Asahotak|${jawaban}`,
        //       },
        //     ],
        //   ],
        // };

        bot.sendMessage(msg.chat.id, `Dare: ${data}`);
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data Dare."
        );
      }
      break;
    case "/truth":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/truth?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        // const soal = data.soal;
        // const jawaban = data.jawaban;

        // const caption = `Tebak Gambar`;

        // const inlineKeyboard = {
        //   inline_keyboard: [
        //     [
        //       {
        //         text: 'Lihat Jawaban',
        //         callback_data: `Asahotak|${jawaban}`,
        //       },
        //     ],
        //   ],
        // };

        bot.sendMessage(msg.chat.id, `Truth: ${data}`);
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data Truth."
        );
      }
      break;
    case "/siapaaku":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/siapakah?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        const soal = data.soal;
        const jawaban = data.jawaban;

        // const caption = `Tebak Gambar`;

        const inlineKeyboard = {
          inline_keyboard: [
            [
              {
                text: "Lihat Jawaban",
                callback_data: `SiapaAku|${jawaban}`,
              },
            ],
          ],
        };

        bot.sendMessage(msg.chat.id, `Kuis Siapakah Aku\n\nSoal: ${soal}`, {
          reply_markup: JSON.stringify(inlineKeyboard),
        });
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data kuis siapakah aku."
        );
      }
      break;
    case "/caklontong":
      try {
        const response = await axios.get(
          "https://api.zahwazein.xyz/entertainment/caklontong?apikey=" +
            settings.apikey_zen
        );
        const data = response.data.result;
        const soal = data.soal;
        const jawaban = data.jawaban;
        const deskripsi = data.deskripsi;

        // const caption = `Tebak Gambar`;

        const inlineKeyboard = {
          inline_keyboard: [
            [
              {
                text: "Lihat Jawaban",
                callback_data: `CakLontong|${jawaban}|${deskripsi}`,
              },
            ],
          ],
        };

        bot.sendMessage(msg.chat.id, `Kuis Cak Lontong\n\nSoal: ${soal}`, {
          reply_markup: JSON.stringify(inlineKeyboard),
        });
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat mengambil data kuis cak lontong."
        );
      }
      break;
    case "/gbard":
      if (!query)
        return bot.sendMessage(
          chatId,
          "Masukan kata kunci pencarian!\n\n/gbard apa itu ikan"
        );
      getBardInfo(query, chatId);
      break;
    case "/translate":
      if (!query)
        return bot.sendMessage(
          chatId,
          "Masukan kata kunci terjemah!\n\n/translate how are you"
        );
      try {
        // Mengirim permintaan ke API terjemahan
        const response = await axios.get(
          `https://api.zahwazein.xyz/information/translate/id?query=${encodeURIComponent(
            query
          )}&apikey=` + settings.apikey_zen
        );

        if (response.data.status === "OK") {
          const result = response.data.result;

          // Mengirim balasan ke pengguna
          bot.sendMessage(msg.chat.id, result);
        } else {
          // Menangani jika tidak ada hasil terjemahan
          bot.sendMessage(msg.chat.id, "Tidak ada hasil terjemahan.");
        }
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat memproses permintaan."
        );
      }
      break;
    case "/kbbi":
      if (!query)
        return bot.sendMessage(
          chatId,
          "Masukan kata kunci pencarian!\n\n/kbbi rumah"
        );
      try {
        // Mengirim permintaan ke API KBBI
        const response = await axios.get(
          `https://api.zahwazein.xyz/information/kbbi?query=${query}&apikey=` +
            settings.apikey_zen
        );

        if (response.data.status === "OK") {
          const result = response.data.result;
          const message = `<b>${result.title}</b>\n\n${result.arti}`;

          // Mengirim balasan ke pengguna
          bot.sendMessage(msg.chat.id, message, { parse_mode: "HTML" });
        } else {
          // Menangani jika tidak ada hasil dari KBBI
          bot.sendMessage(msg.chat.id, "Tidak ada hasil yang ditemukan.");
        }
      } catch (error) {
        console.error(error);
        bot.sendMessage(
          msg.chat.id,
          "Terjadi kesalahan saat memproses permintaan."
        );
      }
      break;
    case "/play":
      if (!query)
        return bot.sendMessage(
          chatId,
          "Masukan kata kunci pencarian!\n\n/play lathi"
        );
      bot.sendMessage(chatId, "Sedang mencari musik...");

      // Panggil API untuk mencari musik
      axios
        .get(
          "https://api.zahwazein.xyz/downloader/ytplay?apikey=" +
            settings.apikey_zen +
            "&query=" +
            encodeURIComponent(query)
        )
        .then((response) => {
          const result = response.data.result;

          // Jika status OK dan audio tersedia
          if (response.data.status === "OK" && result.getAudio.audioAvailable) {
            const audioUrl = result.getAudio.url;
            const audioSize = result.getAudio.formattedSize;
            const thumbnailUrl = result.thumbnail;
            const duration = result.duration;
            const title = result.title;
            const videoUrl = result.url;
            const quality = result.getAudio.quality;
            const extension = result.getAudio.extension;
            const formattedSize = result.getAudio.formattedSize;

            const message =
              `Durasi: ${duration}\n` +
              `Judul: ${title}\n` +
              `URL: ${videoUrl}\n` +
              `Kualitas: ${quality}\n` +
              `Ekstensi: ${extension}\n` +
              `Ukuran: ${formattedSize}`;

            // Simpan file audio dengan nama "audio.m4a"
            const filePath = "audio.m4a";
            const writer = fs.createWriteStream(filePath);

            axios({
              url: audioUrl,
              method: "GET",
              responseType: "stream",
            }).then((response) => {
              response.data.pipe(writer);

              writer.on("finish", () => {
                // Kirim file audio beserta thumbnail dan informasi lainnya ke pengguna
                const audioStream = fs.createReadStream(filePath);
                bot
                  .sendAudio(chatId, audioStream, {
                    caption: message,
                    thumb: thumbnailUrl,
                  })
                  .then(() => {
                    bot
                      .sendMessage(chatId, `File audio ditemukan: ${audioSize}`)
                      .catch((error) => {
                        console.log("Error sending message:", error);
                      });
                  })
                  .catch((error) => {
                    console.log("Error sending audio:", error);
                  });
              });

              writer.on("error", (error) => {
                console.log("Error saving audio:", error);
                bot.sendMessage(
                  chatId,
                  "Terjadi kesalahan saat menyimpan file audio."
                );
              });
            });
          } else {
            bot.sendMessage(
              chatId,
              "Maaf, tidak ada audio yang ditemukan untuk query tersebut."
            );
          }
        })
        .catch((error) => {
          console.log("Error searching music:", error);
          bot.sendMessage(chatId, "Terjadi kesalahan saat mencari musik.");
        });

      break;
    case "/chord":
      if (!query)
        return bot.sendMessage(
          chatId,
          "Masukan kata kunci pencarian!\n\n/chord asal kau bahagia"
        );
      getChordInfo(query, chatId);
      break;
    case "/sfile":
      if (!query)
        return bot.sendMessage(
          chatId,
          "Masukan kata kunci pencarian!\n\n/sfile youtube"
        );
      // Membuat URL API pencarian file dengan query yang diberikan
      const apiUrl = `https://api.zahwazein.xyz/searching/sfilesearch?apikey=${settings.apikey_zen}&query=${query}`;

      // Mengambil data dari API
      axios
        .get(apiUrl)
        .then((response) => {
          const data = response.data;

          // Memeriksa status respons API
          if (data.status === "OK") {
            const results = data.result;

            // Memilih hasil acak dari array hasil
            const randomResult =
              results[Math.floor(Math.random() * results.length)];

            // Memeriksa apakah hasil memiliki ikon, nama, dan tautan
            if (randomResult.icon && randomResult.name && randomResult.link) {
              // Mengirim stiker dan tombol tautan inline
              sendStickerWithInlineButton(
                chatId,
                randomResult.icon,
                randomResult.name,
                randomResult.link
              );
            } else {
              bot.sendMessage(chatId, "Tidak ada hasil yang valid ditemukan.");
            }
          } else {
            bot.sendMessage(chatId, "Terjadi kesalahan dalam mencari file.");
          }
        })
        .catch((error) => {
          console.log("Error:", error);
          bot.sendMessage(chatId, "Terjadi kesalahan dalam mencari file.");
        });
      break;
    case "/bc":
      if (isBotOwner(msg.from.id)) {
        const broadcastMessage = args.join(" ");
        sendBroadcastMessage(broadcastMessage);
      } else {
        bot.sendMessage(
          chatId,
          "Anda tidak memiliki izin untuk menggunakan perintah ini."
        );
      }
      break;
    default:
      sendMessage(chatId, "Perintah tidak dikenali. Silakan coba lagi.");
      break;
  }
});

bot.on("callback_query", (query) => {
  const chatId = query.message.chat.id;
  const messageId = query.message.message_id;
  const data = query.data;
  console.log(query);
  const buttons = [
    [
      { text: "Naik ⬆️", callback_data: "transpose_up" },
      { text: "Turun ⬇️", callback_data: "transpose_down" },
    ],
  ];

  const inlineKeyboard = {
    inline_keyboard: buttons,
  };

  // Pastikan Anda mengganti `sendMessage` dengan `bot.sendMessage` jika menggunakan library "node-telegram-bot-api".

  // Dapatkan tipe kuis dari query.data.split('|')[0]
  const dataParts = data.split("|"); // Pecah string query.data menjadi array

  if (dataParts[0] === "SusunKata") {
    const replyOptions = {
      reply_to_message_id: messageId, // Menyertakan ID pesan yang akan di-reply
    };
    bot.sendMessage(
      chatId,
      `Jawaban Kuis Susun Kata: ${dataParts[1]}`,
      replyOptions
    );
  } else if (dataParts[0] === "AsahOtak") {
    const replyOptions = {
      reply_to_message_id: messageId, // Menyertakan ID pesan yang akan di-reply
    };
    bot.sendMessage(
      chatId,
      `Jawaban Kuis Asah Otak: ${dataParts[1]}`,
      replyOptions
    );
  } else if (dataParts[0] === "SiapaAku") {
    const replyOptions = {
      reply_to_message_id: messageId, // Menyertakan ID pesan yang akan di-reply
    };
    bot.sendMessage(
      chatId,
      `Jawaban Kuis Siapakah Aku: ${dataParts[1]}`,
      replyOptions
    );
  } else if (dataParts[0] === "CakLontong") {
    const replyOptions = {
      reply_to_message_id: messageId, // Menyertakan ID pesan yang akan di-reply
    };
    bot.sendMessage(
      chatId,
      `Jawaban Kuis Cak Lontong: ${dataParts[1]}\n\nPenjelasan: ${dataParts[2]}`,
      replyOptions
    );
  }

  if (query.message.caption === "Tebak Gambar") {
    const data = query.data.split("|");
    const answerMessage = `Jawaban tebak gambar adalah:\n\nJawaban: <b>${data[0]}</b>\nDeskripsi: <b>${data[1]}</b>\nSoal Index: <b>${data[2]}</b>`;
    bot.sendMessage(query.message.chat.id, answerMessage, {
      parse_mode: "HTML",
      reply_to_message_id: messageId,
    });
  }
  if (query.message.caption === "Tebak Bendera") {
    const data = query.data.split("|");
    const answerMessage = `Jawaban tebak bendera adalah:\n\nJawaban: <b>${data[1]}</b>\nKode: <b>${data[0]}</b>`;
    bot.sendMessage(query.message.chat.id, answerMessage, {
      parse_mode: "HTML",
      reply_to_message_id: messageId,
    });
  }
  if (query.message.caption === "Apa nama judul lagu ini?") {
    const data = query.data.split("|");
    const answerMessage = `Jawaban tebak lagu adalah:\n\nArtist: <b>${data[0]}</b>\nLagu: <b>${data[1]}</b>`;
    bot.sendMessage(query.message.chat.id, answerMessage, {
      parse_mode: "HTML",
      reply_to_message_id: messageId,
    });
  }

  // Check the callback data and perform corresponding actions
  if (data === "transpose_up") {
    // Transpose chords up
    const transposedText = transposeTab(query.message.text, 1);
    bot.editMessageText(`*${transposedText}*`, {
      chat_id: chatId,
      message_id: messageId,
      parse_mode: "Markdown",
      reply_markup: JSON.stringify(inlineKeyboard),
    });
  } else if (data === "transpose_down") {
    // Transpose chords down
    const transposedText = transposeTab(query.message.text, -1);
    bot.editMessageText(`*${transposedText}*`, {
      chat_id: chatId,
      message_id: messageId,
      parse_mode: "Markdown",
      reply_markup: JSON.stringify(inlineKeyboard),
    });
  }
});

// Fungsi untuk mengirim stiker dan tombol tautan inline
async function sendStickerWithInlineButton(chatId, icon, name, link) {
  try {
    // Mengambil stiker dari URL icon
    const response = await axios.get(icon, { responseType: "arraybuffer" });

    // Konversi ke format stiker yang didukung (WEBP)
    const convertedStickerBuffer = await sharp(response.data)
      .toFormat("webp")
      .toBuffer();

    // Mengirim stiker
    await bot.sendSticker(chatId, convertedStickerBuffer);

    // Mengirim pesan teks dengan tombol tautan inline
    await bot.sendMessage(chatId, `${name}\n\n${link}`, {
      reply_markup: {
        inline_keyboard: [
          [
            {
              text: "Download",
              url: link,
            },
          ],
        ],
      },
    });
  } catch (error) {
    console.log("Error sending sticker:", error);
  }
}

// Mendapatkan informasi dari Wikipedia menggunakan API
function getWikipediaInfo(query, chatId) {
  const apiUrl = `https://api.zahwazein.xyz/information/wikipedia?query=${encodeURIComponent(
    query
  )}&apikey=${settings.apikey_zen}`;

  axios
    .get(apiUrl)
    .then((response) => {
      const result = response.data.result;

      if (result) {
        const message = `
            *${result.judul}*
            
            ${result.isi}
          `;

        sendMessage(chatId, message, { parse_mode: "Markdown" });
      } else {
        sendMessage(chatId, "Tidak ada informasi yang ditemukan.");
      }
    })
    .catch((error) => {
      console.error(error);
      sendMessage(
        chatId,
        "Terjadi kesalahan saat mengambil informasi dari Wikipedia."
      );
    });
}

// Mendapatkan informasi dari Wikipedia menggunakan API
function getBardInfo(query, chatId) {
  const apiUrl = `https://api.akuari.my.id/ai/gbard?chat=${encodeURIComponent(
    query
  )}`;

  axios
    .get(apiUrl)
    .then((response) => {
      const result = response.data;

      if (result) {
        sendMessage(chatId, result.respon);
      } else {
        sendMessage(chatId, "Tidak ada informasi yang ditemukan.");
      }
    })
    .catch((error) => {
      console.error(error);
      sendMessage(
        chatId,
        "Terjadi kesalahan saat mengambil informasi dari Wikipedia."
      );
    });
}

// Mendapatkan status koneksi ke server
function getServerStatus() {
  const networkInterfaces = os.networkInterfaces();
  const hasInternetConnection =
    networkInterfaces["en0"]?.some(
      (iface) => iface.family === "IPv4" && !iface.internal
    ) ||
    networkInterfaces["eth0"]?.some(
      (iface) => iface.family === "IPv4" && !iface.internal
    );

  return hasInternetConnection ? "Terhubung" : "Tidak Terhubung";
}

// Memeriksa apakah pengguna adalah pemilik bot
function isBotOwner(userId) {
  // Ganti dengan ID pengguna Anda sebagai pemilik bot
  const ownerUserId = settings.ownerId;
  return userId.toString() === ownerUserId;
}

// Memeriksa apakah pengguna adalah pengguna premium
function checkPremium(userId) {
  const premiumData = getPremiumData();
  return premiumData.includes(userId);
}

// Menambahkan pengguna ke daftar premium
function addPremiumUser(userId) {
  const premiumData = getPremiumData();
  premiumData.push(parseInt(userId));
  savePremiumData(premiumData);
}

// Mendapatkan data premium dari file premium.json
function getPremiumData() {
  const data = fs.readFileSync("premium.json", "utf8");
  return JSON.parse(data);
}

// Menyimpan data premium ke file premium.json
function savePremiumData(data) {
  fs.writeFileSync("premium.json", JSON.stringify(data));
}

// Menjalankan perintah terminal
function executeCommand(command, chatId) {
  exec(command, (error, stdout, stderr) => {
    if (error) {
      sendMessage(chatId, `Terjadi kesalahan:\n${error.message}`);
      return;
    }

    if (stderr) {
      sendMessage(chatId, `Output error:\n${stderr}`);
      return;
    }

    const output = stdout.toString();

    sendMessage(chatId, `Output:\n${output}`);
  });
}

// Mengecek apakah ID pengguna sudah ada dalam file user.json
function isUserExists(userId) {
  const users = getUsers();
  return users.includes(userId);
}

// Menambahkan ID pengguna ke dalam file user.json
function addUser(userId) {
  const users = getUsers();
  users.push(userId);
  saveUsers(users);
}

// Mendapatkan daftar ID pengguna dari file user.json
function getUsers() {
  try {
    const data = fs.readFileSync("users.json", "utf8");
    return JSON.parse(data);
  } catch (error) {
    return [];
  }
}

// Menyimpan daftar ID pengguna ke dalam file user.json
function saveUsers(users) {
  fs.writeFileSync("users.json", JSON.stringify(users));
}

// Mengirim pesan broadcast ke seluruh ID pengguna dalam file users.json dengan delay 3 detik
function sendBroadcastMessage(message) {
  const users = getUsers();
  users.forEach((userId, index) => {
    setTimeout(() => {
      sendMessage(userId, message);
    }, index * 3000); // Delay 3 detik (3000 ms) antara pengiriman pesan
  });
}

var noteIds = {
  A: 0,
  "A#": 1,
  Bb: 1,
  B: 2,
  C: 3,
  "C#": 4,
  Db: 4,
  D: 5,
  "D#": 6,
  Eb: 6,
  E: 7,
  F: 8,
  "F#": 9,
  Gb: 9,
  G: 10,
  "G#": 11,
  Ab: 11,
};

var noteNames = [
  "A",
  "A#",
  "B",
  "C",
  "C#",
  "D",
  "D#",
  "E",
  "F",
  "F#",
  "G",
  "G#",
];

var chordRegex = /\b[A-Ga-g][#b]?(sus|m|maj)?[2-9]?(\/[A-G][#b]?)?(?=\s|$)/g;
var noteRegex = /\b[A-G][#b]?/g;

function isChords(line) {
  var chordText = (line.match(chordRegex) || []).join("");
  var chords = chordText.length;
  var notChordText = line.replace(chordRegex, "").replace(/\s/g, "");
  var notChords = notChordText.length;
  return chords > notChords;
}

function transpose(chord, distance) {
  return chord.replace(noteRegex, function (note) {
    const noteId = noteIds[note.toUpperCase()];
    if (typeof noteId !== "undefined") {
      return noteNames[(noteId + distance + 12) % 12];
    } else {
      // Jika kunci nada tidak terdefinisi, kembalikan kunci nada yang sama
      return note;
    }
  });
}

function transposeTab(text, distance) {
  return text
    .split("\n")
    .map(function (line) {
      return isChords(line)
        ? line.replace(chordRegex, function (chord) {
            return transpose(chord, distance);
          })
        : line;
    })
    .join("\n");
}

function getChordInfo(query, chatId) {
  const apiUrl = `https://api.zahwazein.xyz/searching/chordlagu?query=${encodeURIComponent(
    query
  )}&apikey=${settings.apikey_zen}`;

  axios
    .get(apiUrl)
    .then((response) => {
      const result = response.data.result;

      if (result) {
        const message = `
            *${result.chord}*
          `;

        const buttons = [
          [
            { text: "Naik ⬆️", callback_data: "transpose_up" },
            { text: "Turun ⬇️", callback_data: "transpose_down" },
          ],
        ];

        const inlineKeyboard = {
          inline_keyboard: buttons,
        };

        const options = {
          parse_mode: "Markdown",
          reply_markup: JSON.stringify(inlineKeyboard),
        };

        bot.sendMessage(chatId, message, options);
      } else {
        bot.sendMessage(chatId, "Tidak ada informasi yang ditemukan.");
      }
    })
    .catch((error) => {
      console.error(error);
      bot.sendMessage(
        chatId,
        "Terjadi kesalahan saat mengambil informasi chord."
      );
    });
}

Views: 102

Created At: 2024-12-09 13:35:01

View Raw Download Clone