tes-wc-bot
Version:
đ Advanced Telegram Bot for Cloudflare Wildcard Domain Management with Telegram Notifications
265 lines (240 loc) ⢠10.9 kB
JavaScript
const CloudflareManager = require('../services/CloudflareManager');
const { readConfig, readAdminUsage, writeAdminUsage } = require('../utils/fileUtils');
const { isValidDomain } = require('../utils/validation');
const NotificationService = require('../services/NotificationService');
/**
* Handler untuk command /setupwildcard
* Setup wildcard domain dengan semua subdomain
*/
async function handleSetupWildcard(ctx) {
const userId = String(ctx.from.id);
const configData = readConfig();
if (!configData[userId]) {
return ctx.reply(
'â **AKSES DITOLAK**\n\n' +
'đ Anda belum terdaftar di sistem\n\n' +
'đĄ **Cara registrasi:**\n' +
'⢠Gunakan `/addcf <global_api_key> <email>`\n' +
'⢠Dapatkan API key dari Cloudflare dashboard\n\n' +
'đ Link: https://dash.cloudflare.com/profile/api-tokens',
{ parse_mode: 'Markdown' }
);
}
const domain = ctx.message.text.replace('/setupwildcard', '').trim().toLowerCase();
if (!domain) {
return ctx.reply(
'â *Format tidak valid!*\n\n' +
'đ Format: `/setupwildcard <domain>`\n' +
'đ Contoh: `/setupwildcard example.com`\n\n' +
'đĄ *Tips:*\n' +
'⢠Pastikan domain sudah terdaftar di Cloudflare\n' +
'⢠Domain harus aktif dan tidak dalam maintenance',
{ parse_mode: 'Markdown' }
);
}
// Validasi domain
const domainValidation = isValidDomain(domain);
if (!domainValidation.valid) {
return ctx.reply(`â ${domainValidation.message}`);
}
const statusMsg = await ctx.reply(
'đ§ **SETTING UP WILDCARD**\n\n' +
'```\n' +
'âââââââââââââââââââ 45%\n' +
'```\n' +
'⥠Initializing connection...\n' +
'đĄ Connecting to Cloudflare API\n\n' +
'âł Please wait...',
{ parse_mode: 'Markdown' }
);
try {
const cf = new CloudflareManager(userId);
// Clean animation sequence
await new Promise((resolve) => setTimeout(resolve, 800));
// Step 1: Authentication
await ctx.telegram.editMessageText(
ctx.chat.id,
statusMsg.message_id,
null,
'đ **AUTHENTICATING**\n\n' +
'```\n' +
'ââââââââââââââââââââ 65%\n' +
'```\n' +
'â
API credentials verified\n' +
'đ Establishing secure connection\n\n' +
'âł Validating domain...',
{ parse_mode: 'Markdown' }
);
await new Promise((resolve) => setTimeout(resolve, 1000));
// Step 2: Domain validation
await ctx.telegram.editMessageText(
ctx.chat.id,
statusMsg.message_id,
null,
'đ **VALIDATING DOMAIN**\n\n' +
'```\n' +
'ââââââââââââââââââââ 85%\n' +
'```\n' +
'â
Domain found in Cloudflare\n' +
'â
DNS zones accessible\n\n' +
'âł Creating wildcard records...',
{ parse_mode: 'Markdown' }
);
await new Promise((resolve) => setTimeout(resolve, 1200));
// Step 3: Final deployment with multiple spinner variations
const spinners = {
dots: {
frames: ['â ', 'â ', 'â š', 'â ¸', 'â ź', 'â ´', 'â Ś', 'â §', 'â ', 'â '],
name: 'Classic Dots',
},
circle: { frames: ['â', 'â', 'â', 'â'], name: 'Circle Rotation' },
arrows: {
frames: ['â', 'â', 'â', 'â', 'â', 'â', 'â', 'â'],
name: 'Arrow Direction',
},
bounce: { frames: ['â ', 'â ', 'â ', 'â '], name: 'Bounce Effect' },
pulseDot: { frames: ['⣞', '⣽', '⣝', '⢿', '⥿', 'âŁ', '⣯', '⣡'], name: 'Pulse Dot' },
growVertical: {
frames: ['â', 'â', 'â', 'â
', 'â', 'â', 'â', 'â', 'â', 'â
', 'â', 'â'],
name: 'Grow Vertical',
},
growHorizontal: {
frames: ['â', 'â', 'â', 'â', 'â', 'â', 'â', 'â', 'â', 'â', 'â', 'â', 'â', 'â'],
name: 'Grow Horizontal',
},
clock: {
frames: ['đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ'],
name: 'Clock Animation',
},
moon: { frames: ['đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ', 'đ'], name: 'Moon Phases' },
weather: {
frames: ['âď¸', 'đ¤', 'â
', 'đĽ', 'âď¸', 'đŚ', 'đ§', 'â', 'đŠ', 'đ¨'],
name: 'Weather Cycle',
},
};
// Randomly select a spinner style
const spinnerKeys = Object.keys(spinners);
const randomSpinnerKey = spinnerKeys[Math.floor(Math.random() * spinnerKeys.length)];
const selectedSpinner = spinners[randomSpinnerKey];
let spinIndex = 0;
const spinnerInterval = setInterval(
async () => {
try {
await ctx.telegram.editMessageText(
ctx.chat.id,
statusMsg.message_id,
null,
`${selectedSpinner.frames[spinIndex]} **DEPLOYING WILDCARD**\n\n` +
'```\n' +
'ââââââââââââââââââââââ' +
selectedSpinner.frames[spinIndex] +
'\n' +
'```\n' +
` ${selectedSpinner.frames[spinIndex]} Creating DNS records\n` +
` ${selectedSpinner.frames[spinIndex]} Configuring wildcard routing\n` +
` ${selectedSpinner.frames[spinIndex]} Applying configuration\n\n` +
` ${selectedSpinner.frames[spinIndex]} Almost done...`,
{ parse_mode: 'Markdown' }
);
spinIndex = (spinIndex + 1) % selectedSpinner.frames.length;
} catch (error) {
// Ignore edit errors
}
},
randomSpinnerKey === 'clock' || randomSpinnerKey === 'weather' ? 400 : 200
);
const result = await cf.setupwildcard(domain);
// Stop spinner
clearInterval(spinnerInterval);
if (result.success) {
// Track admin usage
const adminUsage = readAdminUsage();
if (!adminUsage[userId]) {
adminUsage[userId] = { count: 0, domains: [], lastUsed: new Date() };
}
adminUsage[userId].count++;
adminUsage[userId].lastUsed = new Date();
if (!adminUsage[userId].domains.includes(domain)) {
adminUsage[userId].domains.push(domain);
}
writeAdminUsage(adminUsage);
// Send notifications to Telegram group and WhatsApp
try {
const userInfo = {
userId: userId,
firstName: ctx.from.first_name,
lastName: ctx.from.last_name,
username: ctx.from.username,
email: configData[userId]?.email,
};
// Send notifications in the background (don't block user response)
NotificationService.notifyWildcardSuccess(ctx.telegram, userInfo, domain)
.then((results) => {
console.log('đ˛ Notification results:', results);
})
.catch((error) => {
console.error('â Notification error:', error.message);
});
} catch (notificationError) {
console.error('â Notification setup error:', notificationError.message);
}
const successMessage =
'⨠**WILDCARD SETUP COMPLETE!** â¨\n\n' +
'đ **Domain Terdaftar**\n' +
'âââââââââââââââââââ\n' +
'â đ° **Domain:** `' +
domain +
'`\n' +
'â đŻ **Type:** Wildcard DNS\n' +
'â đ **Record:** `*.' +
domain +
'`\n' +
'âââââââââââââââââââ\n\n' +
'đ **Status & Info**\n' +
'âââââââââââââââââââ\n' +
'â â
Status: Ready to use\n' +
'â ⥠Propagasi: 1-5 menit\n' +
'âââââââââââââââââââ\n\n' +
'đ **Panduan Penggunaan**\n' +
'âââââââââââââââââââ\n' +
'â ⢠Semua Wildcard `*.' +
domain +
'` aktif\n' +
'â ⢠Contoh: `support.zoom.us.' +
domain +
'`\n' +
'âââââââââââââââââââ\n\n' +
'⥠**Quick Actions**\n' +
'⢠`/new` - Buat subdomain Wildcard\n' +
'⢠`/mysub` - Lihat subdomain Wildcard\n' +
'⢠`/listdomain` - Daftar domain Wildcard';
await ctx.telegram.editMessageText(
ctx.chat.id,
statusMsg.message_id,
null,
successMessage,
{ parse_mode: 'Markdown' }
);
}
} catch (error) {
console.error('â Error in setupwildcard:', error);
await ctx.telegram.editMessageText(
ctx.chat.id,
statusMsg.message_id,
null,
'â Gagal setup wildcard domain\n\n' +
`đ Error: ${error.message}\n\n` +
'đĄ Kemungkinan penyebab:\n' +
'⢠Domain tidak terdaftar di Cloudflare\n' +
'⢠Global API Key tidak memiliki permission\n' +
'⢠Domain sedang maintenance\n' +
'⢠Koneksi internet bermasalah\n\n' +
'đ Silakan coba lagi dalam beberapa menit.',
{ parse_mode: 'Markdown' }
);
}
}
module.exports = {
handleSetupWildcard,
setupWildcard: handleSetupWildcard,
};