UNPKG

tes-wc-bot

Version:

๐ŸŒ Advanced Telegram Bot for Cloudflare Wildcard Domain Management with Telegram Notifications

292 lines (249 loc) โ€ข 11.2 kB
const { readConfig } = require('../utils/fileUtils'); const { ADMIN_IDS } = require('../config/default'); const NotificationService = require('../services/NotificationService'); /** * Handler untuk command /start * Menampilkan welcome message dan panduan penggunaan */ async function startCommand(ctx) { const userId = String(ctx.from.id); const configData = readConfig(); const isRegistered = !!configData[userId]; let welcomeMessage = '๐ŸŽ‰ **SELAMAT DATANG!**\n\n'; welcomeMessage += '๐Ÿš€ Bot untuk mengelola wildcard domain dengan mudah!\n\n'; if (!isRegistered) { welcomeMessage += '๐Ÿ“ **MULAI DENGAN REGISTRASI:**\n'; welcomeMessage += '```\n/addcf <global_api_key> <email>\n```\n\n'; welcomeMessage += '๐Ÿ”‘ **Cara mendapat Global API Key:**\n'; welcomeMessage += '1๏ธโƒฃ Buka [Cloudflare Dashboard](https://dash.cloudflare.com)\n'; welcomeMessage += '2๏ธโƒฃ Klik profil โ†’ **My Profile** โ†’ **API Tokens**\n'; welcomeMessage += '3๏ธโƒฃ Di **Global API Key**, klik **"View"** dan copy\n\n'; } else { welcomeMessage += 'โœ… **Anda sudah terdaftar! Siap digunakan** ๐ŸŽฏ\n\n'; } welcomeMessage += '๐Ÿ“‹ **COMMANDS TERSEDIA:**\n\n'; if (!isRegistered) { welcomeMessage += '๐Ÿ”ง **Setup:** `/addcf` - Daftar akun Cloudflare\n'; welcomeMessage += '๐Ÿ“Š **Info:** `/cfconfig` - Lihat status registrasi\n\n'; welcomeMessage += '๐Ÿ’ก **Setelah registrasi, semua fitur akan terbuka!**'; } else { welcomeMessage += '๐Ÿ”ง **Konfigurasi:**\n'; welcomeMessage += 'โ€ข `/cfconfig` - Lihat konfigurasi\n'; welcomeMessage += 'โ€ข `/updatecf` - Update konfigurasi\n'; welcomeMessage += 'โ€ข `/deletecf` - Hapus konfigurasi\n\n'; welcomeMessage += '๐ŸŒ **Domain Management:**\n'; welcomeMessage += 'โ€ข `/setupwildcard <domain>` - Setup wildcard\n'; welcomeMessage += 'โ€ข `/listdomain` - Lihat domain tersedia\n'; welcomeMessage += 'โ€ข `/new <subdomain>` - Tambah subdomain\n'; welcomeMessage += 'โ€ข `/mysub` - Lihat subdomain Anda\n'; welcomeMessage += 'โ€ข `/searchdomain <keyword>` - Cari domain\n'; welcomeMessage += 'โ€ข `/delsub <subdomain>` - Hapus subdomain\n\n'; welcomeMessage += 'โšก **QUICK START:** Gunakan `/listdomain` untuk melihat domain yang tersedia!'; } return ctx.reply(welcomeMessage, { parse_mode: 'Markdown', disable_web_page_preview: true, }); } /** * Handler untuk command /help * Menampilkan bantuan dan daftar commands */ async function helpCommand(ctx) { const userId = String(ctx.from.id); const configData = readConfig(); const isRegistered = !!configData[userId]; let helpMessage = '๐Ÿ“š **BANTUAN & PANDUAN**\n\n'; if (!isRegistered) { helpMessage += 'โš ๏ธ **Anda belum terdaftar!**\n\n'; helpMessage += '๐Ÿ”ง **Setup Awal:**\n'; helpMessage += 'โ€ข `/addcf <api_key> <email>` - Daftar dengan Cloudflare\n'; helpMessage += 'โ€ข `/cfconfig` - Cek status registrasi\n\n'; helpMessage += '๐Ÿ’ก **Setelah registrasi, semua fitur akan tersedia!**'; } else { helpMessage += 'โœ… **Anda sudah terdaftar! Fitur lengkap tersedia**\n\n'; helpMessage += '๐Ÿ”ง **Management Konfigurasi:**\n'; helpMessage += 'โ€ข `/cfconfig` - Lihat konfigurasi aktif\n'; helpMessage += 'โ€ข `/updatecf <api_key> <email>` - Update konfigurasi\n'; helpMessage += 'โ€ข `/deletecf` - Hapus konfigurasi\n\n'; helpMessage += '๐ŸŒ **Management Domain:**\n'; helpMessage += 'โ€ข `/listdomain` - Daftar domain tersedia\n'; helpMessage += 'โ€ข `/setupwildcard <domain>` - Setup wildcard domain\n'; helpMessage += 'โ€ข `/new <subdomain.domain>` - Tambah subdomain\n'; helpMessage += 'โ€ข `/mysub` - Lihat subdomain Anda\n'; helpMessage += 'โ€ข `/searchdomain <keyword>` - Cari domain\n'; helpMessage += 'โ€ข `/delsub <subdomain>` - Hapus subdomain\n\n'; helpMessage += '๐ŸŽฏ **Tips Penggunaan:**\n'; helpMessage += 'โ€ข Gunakan `/listdomain` untuk melihat domain available\n'; helpMessage += 'โ€ข Format subdomain: `nama.domain.com`\n'; helpMessage += 'โ€ข Setup wildcard dulu sebelum add subdomain\n'; helpMessage += 'โ€ข Gunakan `/mysub` untuk monitor subdomain Anda\n\n'; } helpMessage += '๐Ÿ“ž **Butuh Bantuan?**\n'; helpMessage += 'Hubungi admin jika ada kendala teknis.'; return ctx.reply(helpMessage, { parse_mode: 'Markdown', disable_web_page_preview: true, }); } /** * Handler untuk command yang tidak dikenali */ async function handleUnknownCommand(ctx) { const command = ctx.message.text; const userId = String(ctx.from.id); const configData = readConfig(); let unknownMsg = 'โ“ **COMMAND TIDAK DIKENAL**\n\n'; unknownMsg += `๐Ÿ” Command yang Anda masukkan: \`${command}\`\n\n`; if (!configData[userId]) { unknownMsg += 'โš ๏ธ **ANDA BELUM TERDAFTAR**\n\n'; unknownMsg += '๐Ÿ“ Langkah pertama: Daftar dengan command:\n'; unknownMsg += '```\n/addcf <global_api_key> <email>\n```\n\n'; unknownMsg += '๐Ÿ’ก **Command yang tersedia:**\n'; unknownMsg += 'โ€ข `/addcf` - Daftar dengan Cloudflare\n'; unknownMsg += 'โ€ข `/cfconfig` - Lihat konfigurasi\n'; } else { unknownMsg += '๐Ÿ“‹ **DAFTAR COMMAND TERSEDIA:**\n\n'; unknownMsg += '๐Ÿ”ง **Konfigurasi:**\n'; unknownMsg += 'โ€ข `/cfconfig` - Lihat konfigurasi\n'; unknownMsg += 'โ€ข `/updatecf` - Update konfigurasi\n'; unknownMsg += 'โ€ข `/deletecf` - Hapus konfigurasi\n\n'; unknownMsg += '๐ŸŒ **Domain Management:**\n'; unknownMsg += 'โ€ข `/setupwildcard` - Setup wildcard domain\n'; unknownMsg += 'โ€ข `/listdomain` - Lihat semua domain\n'; unknownMsg += 'โ€ข `/new` - Tambah custom subdomain\n'; unknownMsg += 'โ€ข `/mysub` - Lihat subdomain Anda\n'; unknownMsg += 'โ€ข `/searchdomain` - Cari domain\n'; unknownMsg += 'โ€ข `/delsub` - Hapus subdomain Anda\n\n'; if (ADMIN_IDS.includes(Number(userId))) { unknownMsg += '๐Ÿ‘‘ **Admin Only:**\n'; unknownMsg += 'โ€ข `/broadcast` - Broadcast pesan ke semua user\n\n'; } } unknownMsg += '๐Ÿ’ก **Tips:** Command harus diawali dengan `/` dan pastikan ejaan benar'; unknownMsg += '๐Ÿ“ Command harus diawali dengan `/`\n'; unknownMsg += '๐Ÿ”ค Pastikan ejaan command benar'; return ctx.reply(unknownMsg, { parse_mode: 'Markdown' }); } /** * Handler untuk command broadcast (admin only) */ async function handleBroadcast(ctx) { const userId = String(ctx.from.id); if (!ADMIN_IDS.includes(Number(userId))) { return ctx.reply( 'โš ๏ธ *Akses ditolak!*\n\n' + '๐Ÿ”’ Hanya admin yang dapat menggunakan fitur broadcast.\n' + '๐Ÿ’ก Hubungi admin jika ada keperluan.', { parse_mode: 'Markdown' } ); } const message = ctx.message.text.replace('/broadcast', '').trim(); if (!message) { return ctx.reply( 'โŒ *Format tidak valid!*\n\n' + '๐Ÿ“ Format: `/broadcast <pesan>`\n' + '๐Ÿ“– Contoh: `/broadcast Server akan maintenance dalam 1 jam`\n\n' + '๐Ÿ’ก Pesan akan dikirim ke semua user yang terdaftar.', { parse_mode: 'Markdown' } ); } const configData = readConfig(); const userIds = Object.keys(configData); if (userIds.length === 0) { return ctx.reply( 'โš ๏ธ *Tidak ada user terdaftar*\n\n' + '๐Ÿ“ Belum ada user yang terdaftar di sistem.', { parse_mode: 'Markdown' } ); } const statusMsg = await ctx.reply( 'โณ *Mengirim broadcast...*\n\n' + `๐Ÿ“จ Target: ${userIds.length} user\n` + `๐Ÿ“ Pesan: "${message.substring(0, 50)}${message.length > 50 ? '...' : ''}"` ); let sentCount = 0; let failCount = 0; for (const targetUserId of userIds) { try { await ctx.telegram.sendMessage( targetUserId, '๐Ÿ“ข *Pesan dari Admin*\n\n' + `${message}\n\n` + '๐Ÿค– Pesan ini dikirim otomatis oleh WildCard Bot', { parse_mode: 'Markdown' } ); sentCount++; await new Promise((resolve) => setTimeout(resolve, 100)); // Rate limiting } catch (error) { console.error(`Failed to send to user ${targetUserId}:`, error.message); failCount++; } } await ctx.reply( '๐Ÿ“ข **BROADCAST BERHASIL DIKIRIM**\n\n' + '๐Ÿ“Š **Statistik pengiriman:**\n' + 'โ€ข Total pengguna: ' + sentCount + '\n' + 'โ€ข Berhasil dikirim: ' + sentCount + '\n' + 'โ€ข Gagal: ' + failCount + '\n' + 'โ€ข Waktu kirim: ' + new Date().toLocaleString('id-ID') + '\n\n' + '๐Ÿ’ฌ **Pesan yang dikirim:**\n' + message.substring(11), { parse_mode: 'Markdown' } ); } /** * Test notifikasi ke Telegram grup */ async function testNotification(ctx) { try { console.log('๐Ÿงช Testing Telegram notification...'); await ctx.reply( '๐Ÿงช **Menguji notifikasi...**\n\nโณ Mengirim pesan test ke Telegram grup...' ); // Send test notification using ctx.telegram const results = await NotificationService.sendTestNotification(ctx.telegram); let resultMessage = '๐Ÿงช **TEST NOTIFICATION RESULTS**\n\n'; // Check Telegram results if (results.telegram) { resultMessage += 'โœ… **Telegram Group:** Berhasil terkirim\n'; } else { resultMessage += 'โŒ **Telegram Group:** Gagal terkirim\n'; } // Status if (results.telegram) { resultMessage += '\n๐Ÿ“Š **Status:** Notifikasi berfungsi dengan baik โœ…\n\n'; } else { resultMessage += '\n๐Ÿ“Š **Status:** Notifikasi tidak berfungsi โŒ\n\n'; } // Tips resultMessage += '๐Ÿ’ก **Tips:**\n'; resultMessage += 'โ€ข Pastikan bot sudah ditambahkan ke grup Telegram\n'; resultMessage += 'โ€ข Verifikasi TELEGRAM_GROUP_ID di environment variables\n'; resultMessage += 'โ€ข Periksa koneksi internet bot'; await ctx.reply(resultMessage, { parse_mode: 'Markdown' }); console.log('โœ… Test notification completed'); } catch (error) { console.error('โŒ Test notification error:', error); await ctx.reply( 'โŒ **Gagal menguji notifikasi**\n\n' + 'Terjadi kesalahan saat menguji sistem notifikasi. ' + 'Silakan periksa log server untuk detail error.' ); } } module.exports = { startCommand, helpCommand, handleUnknownCommand, handleBroadcast, testNotification, };