tes-wc-bot
Version:
๐ Advanced Telegram Bot for Cloudflare Wildcard Domain Management with Telegram Notifications
292 lines (249 loc) โข 11.2 kB
JavaScript
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,
};