Case ordcrot

by S

14
Raw
case 'depos': 
case 'depo': 
case 'deposit': {
    try {
        const nomor = sender.replace("@s.whatsapp.net", "");
        const userData = JSON.parse(fs.readFileSync('./db/users.json'));
        const userProfile = userData.find((user) => user.nomor === nomor);

        if (!userProfile) {
            return m.reply(`Kamu belum terdaftar, silahkan ketik : *Daftar*\nuntuk bisa mengakses`);
        }
        const { role } = userProfile;

        if (!text) return m.reply(`*DEPOSIT SALDO OTOMATIS*\n\nSilahkan gunakan dengan cara :\n${prefix + command} nominalnya\n\nContoh :\n${prefix + command} 10000\n\nMinimal deposit otomatis adalah Rp 10.000 dan maksimal Rp 2.000.000`);

        const amount = args[0];
        const minimalDepo = 1; 
        const maximalDepo = 499000; 

        if (!amount || isNaN(parseInt(amount))) return m.reply('Deposit Harus Berupa Angka!');
        if (parseInt(amount) < minimalDepo) return m.reply(`Minimal deposit saldo otomatis adalah Rp ${rupiah(minimalDepo)}. Jika kamu ingin deposit dibawah itu silahkan ketik ${prefix}depomanual atau hubungi Admin`);
        if (parseInt(amount) > maximalDepo) return m.reply(`Maksimal deposit saldo otomatis adalah Rp ${rupiah(maximalDepo)}. Jika kamu ingin deposit diatas itu silahkan ketik ${prefix}depomanual atau hubungi Admin`);
        try {
            const checkPhoneResponse = await axios.get(
                `https://xstbot.apiorkut.my.id/check-phone/${nomor}`
            );

            if (checkPhoneResponse.data.success && checkPhoneResponse.data.hasPending) {
                const sessionData = checkPhoneResponse.data.session;
                const timeLeftMinutes = Math.floor(sessionData.timeLeft / 60);
                return m.reply(`Kamu masih memiliki transaksi deposit aktif dengan total Rp ${rupiah(sessionData.totalAmount)}.\n\nSisa waktu: ${timeLeftMinutes} menit\nSilakan selesaikan pembayaran sebelumnya atau tunggu hingga kedaluwarsa.`);
            }
        } catch (error) {
            console.log('Error checking phone status:', error.response?.data?.message || error.message);
        }

        try {
            const createTopupResponse = await axios.post(
                'https://xstbot.apiorkut.my.id/create-topup',
                {
                    amount: parseInt(amount),
                    phone: nomor,
                    customerInfo: `${userProfile.name || "Deposit Bot User"} - Topup Saldo`
                },
                {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }
            );

            if (!createTopupResponse.data.success) {
                if (createTopupResponse.data.existingSessionId) {
                    return m.reply(`${createTopupResponse.data.message}`);
                }
                return m.reply("Gagal membuat sesi topup. Silahkan coba lagi nanti.");
            }

            const sessionId = createTopupResponse.data.sessionId;
            const statusResponse = await axios.get(
                `https://xstbot.apiorkut.my.id/status/${sessionId}`
            );

            if (!statusResponse.data.success) {
                return m.reply("Gagal mendapatkan detail transaksi. Silahkan coba lagi.");
            }

            const transactionData = statusResponse.data;
            const uniqueCode = transactionData.uniqueCode;
            const totalAmount = transactionData.totalAmount;
            const qrisImageUrl = `https://xstbot.apiorkut.my.id/qris/qris_${sessionId}.jpg`;
            const expiredAt = new Date(transactionData.expiredAt);
            const timeLeftMinutes = Math.floor(transactionData.timeLeft / 60);

            let depositSaldoBot = `[ *Deposit Saldo Otomatis* ]\n\n`;
            depositSaldoBot += `-> Jumlah Deposit: ${rupiah(parseInt(amount))}\n`;
            depositSaldoBot += `-> Kode Unik: ${uniqueCode}\n`;
            depositSaldoBot += `-> Total Bayar: ${rupiah(totalAmount)}\n`;
            depositSaldoBot += `-> ID: ${sessionId}\n\n`;
            depositSaldoBot += `Silahkan Scan QR ini untuk melakukan pembayaran, berlaku selama ${timeLeftMinutes} menit.`;

            const sentMessage = await xstbot.sendMessage(
                m.chat,
                { image: { url: qrisImageUrl }, caption: depositSaldoBot },
                { quoted: m }
            );

            const startTime = Date.now();
            const maxWaitTime = transactionData.timeLeft * 1000; 
            const checkPayment = async () => {
                try {
                    while (true) {
                        await new Promise(resolve => setTimeout(resolve, 10000));
                        const elapsed = Date.now() - startTime;

                        if (elapsed >= maxWaitTime) {
                            await xstbot.sendMessage(m.chat, { text: "Pembayaran QRIS telah kedaluwarsa." }, { quoted: m });
                            return;
                        }

                        const currentStatusResponse = await axios.get(
                            `https://xstbot.apiorkut.my.id/status/${sessionId}`
                        );

                        if (!currentStatusResponse.data.success) {
                            console.log('Error checking status:', currentStatusResponse.data.message);
                            continue;
                        }

                        const currentStatus = currentStatusResponse.data;
                        if (currentStatus.status === "expired" || currentStatus.timeLeft <= 0) {
                            await xstbot.sendMessage(m.chat, { text: "Pembayaran QRIS telah kedaluwarsa." }, { quoted: m });
                            return;
                        }
                        if (currentStatus.status === "paid" && currentStatus.paidAt) {
                            try {
                                const pathUser = './db/users.json';
                                const target = nomor;
                                const amountToAdd = currentStatus.totalAmount; 
                                let userData = [];
                                if (fs.existsSync(pathUser)) {
                                    const rawData = fs.readFileSync(pathUser, 'utf8');
                                    userData = JSON.parse(rawData);
                                }

                                const targetUserIndex = userData.findIndex((user) => user.nomor === target);

                                if (targetUserIndex !== -1) {
                                    const sebelum = userData[targetUserIndex].saldo;
                                    userData[targetUserIndex].saldo += amountToAdd;
                                    const akhir = userData[targetUserIndex].saldo;

                                    fs.writeFileSync(pathUser, JSON.stringify(userData, null, 2));

                                    await xstbot.sendMessage(m.chat, {
                                        text: `───〔 *Deposit Berhasil* 〕───\n\n*Nomor :* ${target}\n*Jumlah Deposit :* ${rupiah(parseInt(amount))}\n*Kode Unik :* ${currentStatus.uniqueCode}\n*Total Dibayar :* ${rupiah(currentStatus.totalAmount)}\n*Saldo Masuk :* ${rupiah(amountToAdd)}\n*Saldo Sebelumnya :* ${formatSaldo(sebelum)}\n*Saldo Sekarang :* ${formatSaldo(akhir)}\n*Waktu :* ${hariini}, ${time1} WIB\n*ID Transaksi :* ${sessionId}`
                                    }, { quoted: m });
                                } else {
                                    await xstbot.sendMessage(m.chat, {
                                        text: `*Deposit Berhasil* tapi gagal mengupdate saldo. Silahkan hubungi admin dengan menyertakan ID Transaksi: ${sessionId}`
                                    }, { quoted: m });
                                }

                                break;
                            } catch (error) {
                                console.error('Error updating user balance:', error);
                                await xstbot.sendMessage(m.chat, {
                                    text: `*Deposit Berhasil* tapi gagal mengupdate saldo. Silahkan hubungi admin dengan menyertakan ID Transaksi: ${sessionId}`
                                }, { quoted: m });
                                break;
                            }
                        }
                    }
                } catch (error) {
                    console.error('Payment check error:', error);
                    m.reply("Terjadi kesalahan saat memeriksa status pembayaran. Silakan hubungi admin jika pembayaran sudah dilakukan.");
                }
            };

            checkPayment();

        } catch (error) {
            console.error('Create topup error:', error);
            
            if (error.response) {
                const errorData = error.response.data;
                if (!errorData.success) {
                    if (errorData.existingSessionId) {
                        m.reply(errorData.message);
                    } else if (errorData.message.includes("Amount must be between")) {
                        m.reply('Jumlah deposit tidak valid. Minimal Rp 10.000 dan maksimal Rp 499.000.');
                    } else if (errorData.message.includes("Invalid phone number")) {
                        m.reply('Format nomor telepon tidak valid.');
                    } else {
                        m.reply(`Gagal membuat sesi topup: ${errorData.message}`);
                    }
                } else {
                    m.reply('Terjadi kesalahan saat memproses permintaan deposit. Silakan coba lagi nanti.');
                }
            } else {
                m.reply('Terjadi kesalahan koneksi. Silakan coba lagi nanti.');
            }
        }
    } catch (error) {
        console.error('User verification error:', error);
        m.reply('Terjadi kesalahan saat memverifikasi data pengguna. Silakan coba lagi nanti atau hubungi admin.');
    }
    break;
}